From 64f0c97c3adaa28edf6f1da3264621a18c1d1adb Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Wed, 27 Jul 2011 19:00:12 +0000
Subject: Release-1.7.4-20110727

---
 INSTALL                     |    4 +-
 Makefile.in                 |    4 +-
 README                      |    4 +-
 configure                   |    2 +-
 doc/commands.doc            |   15 +
 doc/config.doc              |   34 +-
 doc/docblocks.doc           |    6 +-
 doc/language.doc            |   68 +-
 doc/translator_report.txt   |  428 +++--
 qtools/Doxyfile             |    8 +-
 qtools/qthread_unix.cpp     |    1 +
 src/cite.cpp                |  356 +++++
 src/cite.h                  |  104 ++
 src/classdef.cpp            |  156 +-
 src/classdef.h              |    6 +-
 src/classlist.cpp           |   43 +-
 src/classlist.h             |    4 +-
 src/cmdmapper.cpp           |    1 +
 src/cmdmapper.h             |    1 +
 src/commentscan.l           |   43 +-
 src/config.xml              |   50 +-
 src/configoptions.cpp       |   63 +-
 src/definition.cpp          |    9 +-
 src/dirdef.cpp              |    6 +-
 src/docparser.cpp           |   85 +-
 src/docparser.h             |   27 +-
 src/doctokenizer.h          |    1 +
 src/doctokenizer.l          |   24 +-
 src/docvisitor.h            |    2 +
 src/dot.cpp                 |    1 +
 src/doxygen.bst             | 1414 +++++++++++++++++
 src/doxygen.cpp             |   54 +-
 src/doxygen.css             |   69 +
 src/doxygen.h               |    2 +
 src/doxygen_bst.h           | 1414 +++++++++++++++++
 src/doxygen_css.h           |   69 +
 src/entry.cpp               |    6 +
 src/entry.h                 |   27 +-
 src/filedef.cpp             |   10 +
 src/filedef.h               |    1 +
 src/footer.html             |   16 +
 src/footer_html.h           |   16 +
 src/fortranscanner.l        |   46 +-
 src/groupdef.cpp            |  183 +--
 src/header.html             |   48 +
 src/header_html.h           |   48 +
 src/htmldocvisitor.cpp      |   25 +-
 src/htmldocvisitor.h        |    1 +
 src/htmlgen.cpp             |  606 +++----
 src/htmlgen.h               |   14 +-
 src/index.cpp               |  318 ++--
 src/language.cpp            |    2 +-
 src/latexdocvisitor.cpp     |   21 +-
 src/latexdocvisitor.h       |    1 +
 src/latexgen.cpp            |  141 +-
 src/latexgen.h              |   11 +-
 src/layout.cpp              |   15 +
 src/layout.h                |    4 +-
 src/layout_default.h        |    3 +
 src/layout_default.xml      |    3 +
 src/libdoxygen.pro.in       |    8 +-
 src/libdoxygen.t            |   16 +-
 src/mandocvisitor.cpp       |   13 +-
 src/mandocvisitor.h         |    1 +
 src/mangen.cpp              |   57 +-
 src/mangen.h                |   12 +-
 src/memberdef.cpp           |   60 +-
 src/memberdef.h             |    1 +
 src/memberlist.cpp          |   16 +
 src/memberlist.h            |    1 +
 src/namespacedef.cpp        |   10 +
 src/namespacedef.h          |    1 +
 src/outputgen.h             |   11 +-
 src/outputlist.h            |   22 +-
 src/perlmodgen.cpp          |    9 +
 src/pre.l                   |    9 +-
 src/printdocvisitor.h       |    9 +
 src/rtfdocvisitor.cpp       |   28 +-
 src/rtfdocvisitor.h         |    1 +
 src/rtfgen.cpp              |   85 +-
 src/rtfgen.h                |   10 +-
 src/search.php              |  317 ----
 src/search_functions.php    |  374 +++++
 src/search_functions_php.h  |  374 +++++
 src/search_opensearch.php   |  127 ++
 src/search_opensearch_php.h |  127 ++
 src/search_php.h            |  317 ----
 src/textdocvisitor.h        |    1 +
 src/translator.h            |    6 +
 src/translator_adapter.h    |   19 +-
 src/translator_am.h         | 3670 +++++++++++++++++++++----------------------
 src/translator_br.h         |    2 +-
 src/translator_cn.h         |    2 +-
 src/translator_cz.h         |    2 +-
 src/translator_de.h         |    2 +-
 src/translator_dk.h         |    2 +-
 src/translator_en.h         |   15 +
 src/translator_eo.h         |    2 +-
 src/translator_es.h         |    2 +-
 src/translator_fa.h         |    2 +-
 src/translator_fr.h         |   11 +
 src/translator_gr.h         |    2 +-
 src/translator_hr.h         |    2 +-
 src/translator_it.h         |    2 +-
 src/translator_nl.h         |    2 +-
 src/translator_ru.h         |    2 +-
 src/translator_sk.h         |    2 +-
 src/translator_tr.h         |    2 +-
 src/translatordecoder.h     |   10 +
 src/util.cpp                |   29 +
 src/util.h                  |    1 +
 src/vhdlscanner.l           |    2 +-
 src/xmldocvisitor.cpp       |    8 +
 src/xmldocvisitor.h         |    1 +
 winbuild/Doxygen.vcproj     |   20 +
 115 files changed, 8489 insertions(+), 3494 deletions(-)
 create mode 100644 src/cite.cpp
 create mode 100644 src/cite.h
 create mode 100644 src/doxygen.bst
 create mode 100644 src/doxygen_bst.h
 create mode 100644 src/footer.html
 create mode 100644 src/footer_html.h
 create mode 100644 src/header.html
 create mode 100644 src/header_html.h
 delete mode 100644 src/search.php
 create mode 100644 src/search_functions.php
 create mode 100644 src/search_functions_php.h
 create mode 100644 src/search_opensearch.php
 create mode 100644 src/search_opensearch_php.h
 delete mode 100644 src/search_php.h

diff --git a/INSTALL b/INSTALL
index a9978b7..c5abb84 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.7.4-20110629
+DOXYGEN Version 1.7.4-20110727
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (29 June 2011)
+Dimitri van Heesch (27 July 2011)
diff --git a/Makefile.in b/Makefile.in
index 781d359..b326561 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -10,7 +10,7 @@ clean: FORCE
 	cd qtools ; $(MAKE) clean
 	cd src ; $(MAKE) clean
 	cd libmd5 ; $(MAKE) clean
-	cd addon/doxywizard ; $(MAKE) clean
+	-cd addon/doxywizard ; $(MAKE) clean
 	cd addon/doxmlparser/src ; $(MAKE) clean
 	cd addon/doxmlparser/test ; $(MAKE) clean
 	cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
@@ -20,7 +20,7 @@ clean: FORCE
 distclean: clean
 	cd src ; $(MAKE) distclean
 	cd libmd5 ; $(MAKE) distclean
-	cd addon/doxywizard ; $(MAKE) distclean
+	-cd addon/doxywizard ; $(MAKE) distclean
 	cd addon/doxmlparser/src ; $(MAKE) distclean
 	cd addon/doxmlparser/test ; $(MAKE) distclean
 	cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
diff --git a/README b/README
index d59d4c4..3af697d 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.7.4_20110629
+DOXYGEN Version 1.7.4_20110727
 
 Please read INSTALL for compilation instructions.
 
@@ -26,4 +26,4 @@ forum.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (29 June 2011)
+Dimitri van Heesch (dimitri@stack.nl) (27 July 2011)
diff --git a/configure b/configure
index b209027..42ee6d7 100755
--- a/configure
+++ b/configure
@@ -20,7 +20,7 @@ doxygen_version_minor=7
 doxygen_version_revision=4
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
-doxygen_version_mmn=20110629
+doxygen_version_mmn=20110727
 
 bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
 
diff --git a/doc/commands.doc b/doc/commands.doc
index 9e1a787..7bd90e2 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -51,6 +51,7 @@ documentation:
 \refitem cmdcallgraph \\callgraph
 \refitem cmdcallergraph \\callergraph
 \refitem cmdcategory \\category
+\refitem cmdcite \\cite
 \refitem cmdclass \\class
 \refitem cmdcode \\code
 \refitem cmdcond \\cond
@@ -1658,6 +1659,18 @@ Commands to create links
   \sa section \ref cmdref "\\ref".
 
 <hr>
+\section cmdcite \\cite <label>
+
+  \addindex \\cite
+  Adds a bibliographic reference in the text and in the list of bibliographic
+  references. The \<label\> must be a valid BibTeX label that can be found 
+  in one of the .bib files listed in \ref cfg_cite_bib_files "CITE_BIB_FILES".  
+  For the LaTeX output the formatting of the reference in the text can be 
+  configured with \ref cfg_latex_bib_style "LATEX_BIB_STYLE". For other
+  output formats a fixed representation is used. Note that using this
+  command requires the \c bibtex tool to be present in the search path.
+
+<hr>
 \section cmdendlink \\endlink
 
   \addindex \\endlink
@@ -2399,11 +2412,13 @@ class Receiver
   \note The second { is optional and is only to help editors (such as Vim) to
   do proper syntax highlighting by making the number of opening and closing braces
   the same.
+  \sa section \ref cmdfcurlyclose "\\f}" and section \ref formulas "formulas".
 
 <hr>
 \section cmdfcurlyclose \\f}
 
   Marks the end of a formula that is in a specific environment.
+  \sa section \ref cmdfcurlyopen "\\f{" and section \ref formulas "formulas".
 
 <hr>
 \section cmdhtmlonly \\htmlonly
diff --git a/doc/config.doc b/doc/config.doc
index c39befa..21b8262 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -68,6 +68,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_case_sense_names CASE_SENSE_NAMES 
 \refitem cfg_chm_file CHM_FILE
 \refitem cfg_chm_index_encoding CHM_INDEX_ENCODING
+\refitem cfg_cite_bib_files CITE_BIB_FILES
 \refitem cfg_class_diagrams CLASS_DIAGRAMS 
 \refitem cfg_class_graph CLASS_GRAPH
 \refitem cfg_collaboration_graph COLLABORATION_GRAPH
@@ -187,6 +188,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_internal_docs INTERNAL_DOCS
 \refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
 \refitem cfg_latex_batchmode LATEX_BATCHMODE
+\refitem cfg_latex_bib_style LATEX_BIB_STYLE
 \refitem cfg_latex_cmd_name LATEX_CMD_NAME
 \refitem cfg_latex_footer LATEX_FOOTER
 \refitem cfg_latex_header LATEX_HEADER
@@ -199,6 +201,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_man_extension MAN_EXTENSION
 \refitem cfg_man_links MAN_LINKS
 \refitem cfg_man_output MAN_OUTPUT
+\refitem cfg_mathjax_extensions MATHJAX_EXTENSIONS
 \refitem cfg_mathjax_relpath MATHJAX_RELPATH
 \refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
 \refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
@@ -951,6 +954,17 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  a file called DoxygenLayout.xml, doxygen will parse it automatically even if 
  the \c LAYOUT_FILE tag is left empty.
 
+\anchor cfg_cite_bib_files
+<dt>\c CITE_BIB_FILES <dd>
+ \addindex CITE_BIB_FILES
+ The \c CITE_BIB_FILES tag can be used to specify one or more bib files 
+ containing the reference definitions. This must be a list of .bib files. The 
+ .bib extension is automatically appended if omitted. This requires the 
+ bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX 
+ for more info. For LaTeX the style of the bibliography can be controlled 
+ using \ref cfg_latex_bib_style "LATEX_BIB_STYLE". See 
+ also \ref cmdcite "\\cite" for info how to create references.
+
 </dl>
 
 \section messages_input Options related to warning and progress messages 
@@ -1782,6 +1796,15 @@ and Class Hierarchy pages using a tree view instead of an ordered list.
  the http://www.mathjax.org site, so you can quickly see the result without installing 
  MathJax, but it is strongly recommended to install a local copy of MathJax 
  before deployment.
+
+\anchor cfg_mathjax_extensions
+<dt>\c MATHJAX_EXTENSIONS <dd>
+ \addindex MATHJAX_EXTENSIONS
+ The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
+ names that should be enabled during MathJax rendering. For example
+\verbatim
+MATHJAX_EXTENSIONS     = TeX/AMSmath TeX/AMSsymbols
+\endverbatim
  
 </dl>
 \section latex_output LaTeX related options
@@ -1907,6 +1930,15 @@ EXTRA_PACKAGES = times
  asking the user for help. This option is also used when generating formulas 
  in HTML.
 
+\anchor cfg_latex_bib_style 
+<dt>\c LATEX_BIB_STYLE <dd>
+ \addindex LATEX_BIB_STYLE
+
+ The \c LATEX_BIB_STYLE tag can be used to specify the style to use for the 
+ bibliography, e.g. \c plainnat, or \c ieeetr. The default style is 
+ \c plain. See http://en.wikipedia.org/wiki/BibTeX and \ref cmdcite "\\cite"
+ for more info.
+
 \anchor cfg_latex_hide_indices
 <dt>\c LATEX_HIDE_INDICES <dd>
  \addindex LATEX_HIDE_INDICES
@@ -2426,7 +2458,7 @@ The default size is 10pt.
  visible in IE 9+ (other browsers do not have this requirement).
 
 \anchor cfg_interactive_svg
-<dt>\c INTERACTIVE_SVG
+<dt>\c INTERACTIVE_SVG <dd>
  If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
  enable generation of interactive SVG images that allow zooming and panning. 
  Note that this requires a modern browser other than Internet Explorer. 
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index 8d6f569..e28328c 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -20,9 +20,9 @@
 
 A special documentation block is a C or C++ style comment block with some 
 additional markings, so doxygen knows it is a piece of documentation that
-needs to end up in the generated documentation. For Python and VHDL
-code there are a different comment conventions, which can be found in section 
-\ref pythonblocks and \ref vhdlblocks respectively.
+needs to end up in the generated documentation. For Python, VHDL, and Fortran
+code there are different comment conventions, which can be found in sections
+\ref pythonblocks, \ref vhdlblocks, and \ref fortranblocks respectively.
 
 For each code item there are two (or in some cases three) types of descriptions, 
 which together form the documentation: a \e brief description and \e detailed
diff --git a/doc/language.doc b/doc/language.doc
index de6ebba..17d38f6 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -68,13 +68,13 @@ when the translator was updated.
     <td>Armenian</td>
     <td>Armen Tangamyan</td>
     <td>armen dot tangamyan at anu dot edu dot au</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <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.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Catalan</td>
@@ -86,7 +86,7 @@ when the translator was updated.
     <td>Chinese</td>
     <td>Lang Yang<br/>Li Daobing<br/>Wei Liu</td>
     <td>lian dot yang dot cn at gmail dot com<br/>lidaobing at gmail dot com<br/>liuwei at asiainfo dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese Traditional</td>
@@ -98,25 +98,25 @@ when the translator was updated.
     <td>Croatian</td>
     <td>Boris Bralo</td>
     <td>boris dot bralo at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Czech</td>
     <td>Petr Přikryl</td>
     <td>prikrylp at skil dot cz</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Danish</td>
     <td>Poul-Erik Hansen<br/>Erik Søe Sørensen</td>
     <td>pouhan at gnotometrics dot dk<br/>eriksoe+doxygen at daimi dot au dot dk</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Dutch</td>
     <td>Dimitri van Heesch</td>
     <td>dimitri at stack dot nl</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>English</td>
@@ -128,7 +128,7 @@ when the translator was updated.
     <td>Esperanto</td>
     <td>Ander Martinez</td>
     <td>dwarfnauko at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Finnish</td>
@@ -146,13 +146,13 @@ when the translator was updated.
     <td>German</td>
     <td>Peter Grotrian<br/>Jens Seidel</td>
     <td>Peter dot Grotrian at pdv-FS dot de<br/>jensseidel at users dot sf dot net</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Greek</td>
     <td>Paul Gessos</td>
     <td>gessos dot paul at yahoo dot gr</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Hungarian</td>
@@ -170,7 +170,7 @@ when the translator was updated.
     <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.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Japanese</td>
@@ -188,7 +188,7 @@ when the translator was updated.
     <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/><span style="color: brown">[unreachable]</span></td>
-    <td>up-to-date</td>
+    <td>1.7.05</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>KoreanEn</td>
@@ -218,7 +218,7 @@ when the translator was updated.
     <td>Persian</td>
     <td>Ali Nadalizadeh</td>
     <td>nadalizadeh at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Polish</td>
@@ -242,7 +242,7 @@ when the translator was updated.
     <td>Russian</td>
     <td>Alexandr Chelpanov</td>
     <td>cav at cryptopro dot ru</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Serbian</td>
@@ -260,7 +260,7 @@ when the translator was updated.
     <td>Slovak</td>
     <td>Kali+Laco Švec<br/>Petr Přikryl</td>
     <td>the Slovak language advisors<br/>prikrylp at skil dot cz</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Slovene</td>
@@ -272,7 +272,7 @@ when the translator was updated.
     <td>Spanish</td>
     <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td>
     <td>bartomeu at loteria3cornella dot com<br/><span style="color: brown">[unreachable]</span><br/>david at grupoikusnet dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Swedish</td>
@@ -284,7 +284,7 @@ when the translator was updated.
     <td>Turkish</td>
     <td>Emin Ilker Cetinbas</td>
     <td>niw3 at yahoo dot com</td>
-    <td>up-to-date</td>
+    <td>1.7.5</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Ukrainian</td>
@@ -319,48 +319,48 @@ when the translator was updated.
   Arabic & Moaz Reyad & {\tt\tiny [resigned] moazreyad at yahoo dot com} & 1.4.6 \\
   ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
   \hline
-  Armenian & Armen Tangamyan & {\tt\tiny armen dot tangamyan at anu dot edu dot au} & up-to-date \\
+  Armenian & Armen Tangamyan & {\tt\tiny armen dot tangamyan at anu dot edu dot au} & 1.7.5 \\
   \hline
-  Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & up-to-date \\
+  Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & 1.7.5 \\
   \hline
   Catalan & Maximiliano Pin & {\tt\tiny max dot pin at bitroit dot com} & 1.6.3 \\
   ~ & Albert Mora & {\tt\tiny [unreachable] amora at iua dot upf dot es} & ~ \\
   \hline
-  Chinese & Lang Yang & {\tt\tiny lian dot yang dot cn at gmail dot com} & up-to-date \\
+  Chinese & Lang Yang & {\tt\tiny lian dot yang dot cn at gmail dot com} & 1.7.5 \\
   ~ & Li Daobing & {\tt\tiny lidaobing at gmail dot com} & ~ \\
   ~ & Wei Liu & {\tt\tiny liuwei at asiainfo dot com} & ~ \\
   \hline
   Chinese Traditional & Daniel YC Lin & {\tt\tiny dlin dot tw at gmail dot com} & 1.6.0 \\
   ~ & Gary Lee & {\tt\tiny garywlee at gmail dot com} & ~ \\
   \hline
-  Croatian & Boris Bralo & {\tt\tiny boris dot bralo at gmail dot com} & up-to-date \\
+  Croatian & Boris Bralo & {\tt\tiny boris dot bralo at gmail dot com} & 1.7.5 \\
   \hline
-  Czech & Petr Přikryl & {\tt\tiny prikrylp at skil dot cz} & up-to-date \\
+  Czech & Petr Přikryl & {\tt\tiny prikrylp at skil dot cz} & 1.7.5 \\
   \hline
-  Danish & Poul-Erik Hansen & {\tt\tiny pouhan at gnotometrics dot dk} & up-to-date \\
+  Danish & Poul-Erik Hansen & {\tt\tiny pouhan at gnotometrics dot dk} & 1.7.5 \\
   ~ & Erik Søe Sørensen & {\tt\tiny eriksoe+doxygen at daimi dot au dot dk} & ~ \\
   \hline
-  Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
+  Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & 1.7.5 \\
   \hline
   English & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
   \hline
-  Esperanto & Ander Martinez & {\tt\tiny dwarfnauko at gmail dot com} & up-to-date \\
+  Esperanto & Ander Martinez & {\tt\tiny dwarfnauko at gmail dot com} & 1.7.5 \\
   \hline
   Finnish & Antti Laine & {\tt\tiny antti dot a dot laine at tut dot fi} & 1.6.0 \\
   \hline
   French & Xavier Outhier & {\tt\tiny xouthier at yahoo dot fr} & 1.6.3 \\
   \hline
-  German & Peter Grotrian & {\tt\tiny Peter dot Grotrian at pdv-FS dot de} & up-to-date \\
+  German & Peter Grotrian & {\tt\tiny Peter dot Grotrian at pdv-FS dot de} & 1.7.5 \\
   ~ & Jens Seidel & {\tt\tiny jensseidel at users dot sf dot net} & ~ \\
   \hline
-  Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & up-to-date \\
+  Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & 1.7.5 \\
   \hline
   Hungarian & Ákos Kiss & {\tt\tiny akiss at users dot sourceforge dot net} & 1.4.6 \\
   ~ & Földvári György & {\tt\tiny [unreachable] foldvari lost at cyberspace} & ~ \\
   \hline
   Indonesian & Hendy Irawan & {\tt\tiny ceefour at gauldong dot net} & 1.4.6 \\
   \hline
-  Italian & Alessandro Falappa & {\tt\tiny alessandro at falappa dot net} & up-to-date \\
+  Italian & Alessandro Falappa & {\tt\tiny alessandro at falappa dot net} & 1.7.5 \\
   ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23 at cam dot ac dot uk} & ~ \\
   \hline
   Japanese & Hiroki Iseri & {\tt\tiny goyoki at gmail dot com} & 1.6.0 \\
@@ -370,7 +370,7 @@ when the translator was updated.
   \hline
   JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
   \hline
-  Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & up-to-date \\
+  Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & 1.7.05 \\
   ~ & SooYoung Jung & {\tt\tiny jung5000 at gmail dot com} & ~ \\
   ~ & Richard Kim & {\tt\tiny [unreachable] ryk at dspwiz dot com} & ~ \\
   \hline
@@ -385,7 +385,7 @@ when the translator was updated.
   \hline
   Norwegian & Lars Erik Jordet & {\tt\tiny lejordet at gmail dot com} & 1.4.6 \\
   \hline
-  Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh at gmail dot com} & up-to-date \\
+  Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh at gmail dot com} & 1.7.5 \\
   \hline
   Polish & Piotr Kaminski & {\tt\tiny [unreachable] Piotr dot Kaminski at ctm dot gdynia dot pl} & 1.6.3 \\
   ~ & Grzegorz Kowal & {\tt\tiny [unreachable] g\_kowal at poczta dot onet dot pl} & ~ \\
@@ -397,24 +397,24 @@ when the translator was updated.
   Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & 1.6.0 \\
   ~ & Alexandru Iosup & {\tt\tiny aiosup at yahoo dot com} & ~ \\
   \hline
-  Russian & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & up-to-date \\
+  Russian & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & 1.7.5 \\
   \hline
   Serbian & Dejan Milosavljevic & {\tt\tiny [unreachable] dmilos at email dot com} & 1.6.0 \\
   \hline
   SerbianCyrilic & Nedeljko Stefanovic & {\tt\tiny stenedjo at yahoo dot com} & 1.6.0 \\
   \hline
-  Slovak & Kali+Laco Švec & {\tt\tiny the Slovak language advisors} & up-to-date \\
+  Slovak & Kali+Laco Švec & {\tt\tiny the Slovak language advisors} & 1.7.5 \\
   ~ & Petr Přikryl & {\tt\tiny prikrylp at skil dot cz} & ~ \\
   \hline
   Slovene & Matjaž Ostroveršnik & {\tt\tiny matjaz dot ostroversnik at ostri dot org} & 1.4.6 \\
   \hline
-  Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & up-to-date \\
+  Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & 1.7.5 \\
   ~ & Francisco Oltra Thennet & {\tt\tiny [unreachable] foltra at puc dot cl} & ~ \\
   ~ & David Vaquero & {\tt\tiny david at grupoikusnet dot com} & ~ \\
   \hline
   Swedish & Mikael Hallin & {\tt\tiny mikaelhallin at yahoo dot se} & 1.6.0 \\
   \hline
-  Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & up-to-date \\
+  Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & 1.7.5 \\
   \hline
   Ukrainian & Olexij Tkatchenko & {\tt\tiny [resigned] olexij at tkatchenko dot com} & 1.4.1 \\
   ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
index 77ede62..9cb017e 100644
--- a/doc/translator_report.txt
+++ b/doc/translator_report.txt
@@ -10,33 +10,16 @@ Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian,
 SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
 and Vietnamese.
 
-Of them, 18 translators are up-to-date, 21 translators are based on
+Of them, 1 translators are up-to-date, 38 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 225 of the required methods. Anyway, there
+and they implement all 228 of the required methods. Anyway, there
 still may be some details listed even for them:
 
-  TranslatorArmenian -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
-  TranslatorBrazilian
-  TranslatorChinese -- Reimplementation using UTF-8 suggested.
-  TranslatorCroatian
-  TranslatorCzech
-  TranslatorDanish -- Reimplementation using UTF-8 suggested.
-  TranslatorDutch
   TranslatorEnglish
-  TranslatorEsperanto
-  TranslatorGerman
-  TranslatorGreek
-  TranslatorItalian
-  TranslatorKorean -- Change the base class to Translator.
-  TranslatorPersian -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
-  TranslatorRussian -- Reimplementation using UTF-8 suggested.
-  TranslatorSlovak
-  TranslatorSpanish -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
-  TranslatorTurkish
 
 ----------------------------------------------------------------------
 The following translator classes need some maintenance (the most
@@ -44,55 +27,80 @@ obsolete at the end). The other info shows the estimation of Doxygen
 version when the class was last updated and number of methods that
 must be implemented to become up-to-date:
 
-  TranslatorPolish                1.6.3 	 4 methods to implement (1 %)
-  TranslatorFrench                1.6.3 	 4 methods to implement (1 %)
+  TranslatorTurkish               1.7.5 	 3 methods to implement (1 %)
+  TranslatorSpanish               1.7.5 	 3 methods to implement (1 %)
+  TranslatorSlovak                1.7.5 	 3 methods to implement (1 %)
+  TranslatorRussian               1.7.5 	 3 methods to implement (1 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorCatalan               1.6.3 	 4 methods to implement (1 %)
-  TranslatorVietnamese            1.6.0 	 9 methods to implement (4 %)
-  TranslatorSwedish               1.6.0 	 9 methods to implement (4 %)
+  TranslatorPersian               1.7.5 	 3 methods to implement (1 %)
+  TranslatorKorean                1.7.05	 3 methods to implement (1 %)
+	Note: Change the base class to TranslatorAdapter_1_7_5.
+
+  TranslatorItalian               1.7.5 	 3 methods to implement (1 %)
+  TranslatorGreek                 1.7.5 	 3 methods to implement (1 %)
+  TranslatorGerman                1.7.5 	 3 methods to implement (1 %)
+  TranslatorEsperanto             1.7.5 	 3 methods to implement (1 %)
+  TranslatorDutch                 1.7.5 	 3 methods to implement (1 %)
+  TranslatorDanish                1.7.5 	 3 methods to implement (1 %)
+	Note: Reimplementation using UTF-8 suggested.
+
+  TranslatorCzech                 1.7.5 	 3 methods to implement (1 %)
+  TranslatorCroatian              1.7.5 	 3 methods to implement (1 %)
+  TranslatorChinese               1.7.5 	 3 methods to implement (1 %)
+	Note: Reimplementation using UTF-8 suggested.
+
+  TranslatorBrazilian             1.7.5 	 3 methods to implement (1 %)
+  TranslatorArmenian              1.7.5 	 3 methods to implement (1 %)
+  TranslatorPolish                1.6.3 	 7 methods to implement (3 %)
+  TranslatorFrench                1.6.3 	 6 methods to implement (2 %)
+	Note: Reimplementation using UTF-8 suggested.
+
+  TranslatorCatalan               1.6.3 	 7 methods to implement (3 %)
+  TranslatorVietnamese            1.6.0 	12 methods to implement (5 %)
+  TranslatorSwedish               1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSerbian               1.6.0 	 9 methods to implement (4 %)
+  TranslatorSerbian               1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSerbianCyrilic        1.6.0 	 9 methods to implement (4 %)
-  TranslatorRomanian              1.6.0 	 9 methods to implement (4 %)
+  TranslatorSerbianCyrilic        1.6.0 	12 methods to implement (5 %)
+  TranslatorRomanian              1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorMacedonian            1.6.0 	 9 methods to implement (4 %)
-  TranslatorJapanese              1.6.0 	 9 methods to implement (4 %)
+  TranslatorMacedonian            1.6.0 	12 methods to implement (5 %)
+  TranslatorJapanese              1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorFinnish               1.6.0 	 9 methods to implement (4 %)
-  TranslatorChinesetraditional    1.6.0 	 9 methods to implement (4 %)
+  TranslatorFinnish               1.6.0 	12 methods to implement (5 %)
+  TranslatorChinesetraditional    1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorAfrikaans             1.6.0 	 9 methods to implement (4 %)
+  TranslatorAfrikaans             1.6.0 	12 methods to implement (5 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorSlovene               1.4.6 	33 methods to implement (14 %)
+  TranslatorSlovene               1.4.6 	36 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorNorwegian             1.4.6 	32 methods to implement (14 %)
+  TranslatorNorwegian             1.4.6 	35 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorLithuanian            1.4.6 	33 methods to implement (14 %)
+  TranslatorLithuanian            1.4.6 	36 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorIndonesian            1.4.6 	32 methods to implement (14 %)
+  TranslatorIndonesian            1.4.6 	35 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorHungarian             1.4.6 	33 methods to implement (14 %)
+  TranslatorHungarian             1.4.6 	36 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorArabic                1.4.6 	32 methods to implement (14 %)
+  TranslatorArabic                1.4.6 	35 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorUkrainian             1.4.1 	33 methods to implement (14 %)
+  TranslatorUkrainian             1.4.1 	36 methods to implement (15 %)
 	Note: Reimplementation using UTF-8 suggested.
 
-  TranslatorPortuguese            1.3.3 	44 methods to implement (19 %)
+  TranslatorPortuguese            1.3.3 	47 methods to implement (20 %)
 	Note: Reimplementation using UTF-8 suggested.
 
 
@@ -125,10 +133,10 @@ Details for translators (classes sorted alphabetically):
 
 
 
-TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 -------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -138,15 +146,18 @@ TranslatorAfrikaans   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorArabic   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
+TranslatorArabic   (TranslatorAdapter_1_4_6)  35 methods to implement (15 %)
 ----------------
 
-  Implements 193 of the required methods (85 %).
+  Implements 193 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -168,11 +179,14 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -196,35 +210,62 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorArmenian   (Translator)
+TranslatorArmenian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 ------------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorBrazilian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+-------------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorCatalan   (TranslatorAdapter_1_6_3)  4 methods to implement (1 %)
+TranslatorCatalan   (TranslatorAdapter_1_6_3)  7 methods to implement (3 %)
 -----------------
 
-  Implements 221 of the required methods (98 %).
+  Implements 221 of the required methods (96 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorChinese   (Translator)
+TranslatorChinese   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 -----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorChinesetraditional   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorChinesetraditional   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 ----------------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -234,21 +275,78 @@ TranslatorChinesetraditional   (TranslatorAdapter_1_6_0)  9 methods to implement
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorDanish   (Translator)
+TranslatorCroatian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+------------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorCzech   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+---------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorDanish   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 ----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorDutch   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+---------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorEsperanto   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+-------------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
 
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
-TranslatorFinnish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+
+TranslatorFinnish   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 -----------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -258,28 +356,57 @@ TranslatorFinnish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorFrench   (TranslatorAdapter_1_6_3)  4 methods to implement (1 %)
+TranslatorFrench   (TranslatorAdapter_1_6_3)  6 methods to implement (2 %)
 ----------------
 
-  Implements 221 of the required methods (98 %).
+  Implements 222 of the required methods (97 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorHungarian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
+TranslatorGerman   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+----------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorGreek   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+---------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorHungarian   (TranslatorAdapter_1_4_6)  36 methods to implement (15 %)
 -------------------
 
-  Implements 192 of the required methods (85 %).
+  Implements 192 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -301,11 +428,14 @@ TranslatorHungarian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -318,10 +448,10 @@ TranslatorHungarian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorIndonesian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
+TranslatorIndonesian   (TranslatorAdapter_1_4_6)  35 methods to implement (15 %)
 --------------------
 
-  Implements 193 of the required methods (85 %).
+  Implements 193 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -343,11 +473,14 @@ TranslatorIndonesian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -371,10 +504,22 @@ TranslatorIndonesian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorJapanese   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorItalian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+-----------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorJapanese   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 ------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -384,8 +529,11 @@ TranslatorJapanese   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
   Obsolete methods (should be removed, never used):
@@ -401,7 +549,7 @@ TranslatorJapanese   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorJapaneseEn   (TranslatorEnglish)  220 methods to implement (97 %)
+TranslatorJapaneseEn   (TranslatorEnglish)  223 methods to implement (97 %)
 --------------------
 
   Implements 5 of the required methods (2 %).
@@ -415,13 +563,19 @@ TranslatorJapaneseEn   (TranslatorEnglish)  220 methods to implement (97 %)
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorKorean   (TranslatorAdapter_1_6_3)
+TranslatorKorean   (TranslatorAdapter_1_6_3)  3 methods to implement (1 %)
 ----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorKoreanEn   (TranslatorEnglish)  220 methods to implement (97 %)
+TranslatorKoreanEn   (TranslatorEnglish)  223 methods to implement (97 %)
 ------------------
 
   Implements 5 of the required methods (2 %).
@@ -435,10 +589,10 @@ TranslatorKoreanEn   (TranslatorEnglish)  220 methods to implement (97 %)
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorLithuanian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
+TranslatorLithuanian   (TranslatorAdapter_1_4_6)  36 methods to implement (15 %)
 --------------------
 
-  Implements 192 of the required methods (85 %).
+  Implements 192 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -460,11 +614,14 @@ TranslatorLithuanian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -477,10 +634,10 @@ TranslatorLithuanian   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorMacedonian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorMacedonian   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 --------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -490,15 +647,18 @@ TranslatorMacedonian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorNorwegian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
+TranslatorNorwegian   (TranslatorAdapter_1_4_6)  35 methods to implement (15 %)
 -------------------
 
-  Implements 193 of the required methods (85 %).
+  Implements 193 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -520,11 +680,14 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -548,22 +711,31 @@ TranslatorNorwegian   (TranslatorAdapter_1_4_6)  32 methods to implement (14 %)
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorPersian   (Translator)
+TranslatorPersian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 -----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorPolish   (TranslatorAdapter_1_6_3)  4 methods to implement (1 %)
+TranslatorPolish   (TranslatorAdapter_1_6_3)  7 methods to implement (3 %)
 ----------------
 
-  Implements 221 of the required methods (98 %).
+  Implements 221 of the required methods (96 %).
 
   Missing methods (should be implemented):
 
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
   Obsolete methods (should be removed, never used):
@@ -579,10 +751,10 @@ TranslatorPolish   (TranslatorAdapter_1_6_3)  4 methods to implement (1 %)
     QCString trNoDescriptionAvailable()
 
 
-TranslatorPortuguese   (TranslatorAdapter_1_3_3)  44 methods to implement (19 %)
+TranslatorPortuguese   (TranslatorAdapter_1_3_3)  47 methods to implement (20 %)
 --------------------
 
-  Implements 181 of the required methods (80 %).
+  Implements 181 of the required methods (79 %).
 
   Missing methods (should be implemented):
 
@@ -610,12 +782,15 @@ TranslatorPortuguese   (TranslatorAdapter_1_3_3)  44 methods to implement (19 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trSearchResults(int numDocuments)
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trSearchMatches()
     virtual QCString trCompoundIndexFortran()
@@ -644,10 +819,10 @@ TranslatorPortuguese   (TranslatorAdapter_1_3_3)  44 methods to implement (19 %)
     QCString trNoDescriptionAvailable()
 
 
-TranslatorRomanian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorRomanian   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 ------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -657,21 +832,30 @@ TranslatorRomanian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorRussian   (Translator)
+TranslatorRussian   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 -----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorSerbian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorSerbian   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 -----------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -681,15 +865,18 @@ TranslatorSerbian   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 ------------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -699,15 +886,30 @@ TranslatorSerbianCyrilic   (TranslatorAdapter_1_6_0)  9 methods to implement (4
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorSlovene   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
+TranslatorSlovak   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+----------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorSlovene   (TranslatorAdapter_1_4_6)  36 methods to implement (15 %)
 -----------------
 
-  Implements 192 of the required methods (85 %).
+  Implements 192 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -729,11 +931,14 @@ TranslatorSlovene   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -746,16 +951,22 @@ TranslatorSlovene   (TranslatorAdapter_1_4_6)  33 methods to implement (14 %)
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorSpanish   (Translator)
+TranslatorSpanish   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
 -----------------
 
-  Implements 225 of the required methods (100 %).
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
 
 
-TranslatorSwedish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorSwedish   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 -----------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -765,15 +976,30 @@ TranslatorSwedish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorUkrainian   (TranslatorAdapter_1_4_1)  33 methods to implement (14 %)
+TranslatorTurkish   (TranslatorAdapter_1_7_5)  3 methods to implement (1 %)
+-----------------
+
+  Implements 225 of the required methods (98 %).
+
+  Missing methods (should be implemented):
+
+    virtual QCString trDirDepGraph(const char * name)
+    virtual QCString trCiteReferences()
+    virtual QCString trCopyright()
+
+
+TranslatorUkrainian   (TranslatorAdapter_1_4_1)  36 methods to implement (15 %)
 -------------------
 
-  Implements 192 of the required methods (85 %).
+  Implements 192 of the required methods (84 %).
 
   Missing methods (should be implemented):
 
@@ -796,11 +1022,14 @@ TranslatorUkrainian   (TranslatorAdapter_1_4_1)  33 methods to implement (14 %)
     virtual QCString trModuleReference(const char * namespaceName)
     virtual QCString trModulesMemberDescription(bool extractAll)
     virtual QCString trModulesMembers()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trModulesIndex()
     virtual QCString trDirRelation(const char * name)
     virtual QCString trCompoundListFortran()
     virtual QCString trDataTypes()
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
     virtual QCString trCompoundIndexFortran()
     virtual QCString trSubprogram(bool first_capital, bool singular)
@@ -824,10 +1053,10 @@ TranslatorUkrainian   (TranslatorAdapter_1_4_1)  33 methods to implement (14 %)
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorVietnamese   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
+TranslatorVietnamese   (TranslatorAdapter_1_6_0)  12 methods to implement (5 %)
 --------------------
 
-  Implements 216 of the required methods (96 %).
+  Implements 216 of the required methods (94 %).
 
   Missing methods (should be implemented):
 
@@ -837,6 +1066,9 @@ TranslatorVietnamese   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
     virtual QCString trFileIn(const char * name)
     virtual QCString trGlobalNamespace()
+    virtual QCString trDirDepGraph(const char * name)
     virtual QCString trDirRelation(const char * name)
+    virtual QCString trCiteReferences()
     virtual QCString trDirDependency(const char * name)
+    virtual QCString trCopyright()
     virtual QCString trIncludesFileIn(const char * name)
\ No newline at end of file
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
index 49929f5..f7b815e 100644
--- a/qtools/Doxyfile
+++ b/qtools/Doxyfile
@@ -131,9 +131,9 @@ IGNORE_PREFIX          = Q
 #---------------------------------------------------------------------------
 GENERATE_HTML          = YES
 HTML_OUTPUT            =
-HTML_FILE_EXTENSION    = .xhtml
-HTML_HEADER            =
-HTML_FOOTER            =
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
 HTML_STYLESHEET        =
 HTML_EXTRA_FILES       =
 HTML_COLORSTYLE_HUE    = 220
@@ -175,7 +175,7 @@ FORMULA_TRANSPARENT    = YES
 USE_MATHJAX            = NO
 MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
 SEARCHENGINE           = YES
-SERVER_BASED_SEARCH    = NO
+SERVER_BASED_SEARCH    = YES
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
diff --git a/qtools/qthread_unix.cpp b/qtools/qthread_unix.cpp
index 53242cc..5a7b788 100644
--- a/qtools/qthread_unix.cpp
+++ b/qtools/qthread_unix.cpp
@@ -53,6 +53,7 @@
 #include <sys/sysctl.h>
 #endif
 #include <unistd.h>
+#include <stdio.h>
 
 #include "qthread.h"
 #include "qthread_p.h"
diff --git a/src/cite.cpp b/src/cite.cpp
new file mode 100644
index 0000000..f460149
--- /dev/null
+++ b/src/cite.cpp
@@ -0,0 +1,356 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2011 by Dimitri van Heesch
+ * Based on a patch by David Munger
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "cite.h"
+#include "portable.h"
+#include "config.h"
+#include "message.h"
+#include "util.h"
+#include "language.h"
+#include "ftextstream.h"
+#include <qdir.h>
+
+//--------------------------------------------------------------------------
+
+static const char *doxygen_bst =
+#include "doxygen_bst.h"
+;
+
+//--------------------------------------------------------------------------
+
+const QCString CiteConsts::fileName("citelist");
+const QCString CiteConsts::anchorPrefix("CITEREF_");
+
+//--------------------------------------------------------------------------
+
+static bool writeBstFile(const QString &fileName)
+{
+  QCString bstData = doxygen_bst;
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly)) 
+  {
+    err("error: could not open file %s for writing\n",fileName.data());
+    return FALSE;
+  }
+  f.writeBlock(bstData, strlen(bstData));
+  return TRUE;
+}
+
+//--------------------------------------------------------------------------
+
+CiteDict::CiteDict(int size) : m_entries(size, FALSE)
+{ 
+  m_ordering.setAutoDelete(TRUE); 
+  m_entries.setAutoDelete(TRUE);
+}
+
+bool CiteDict::writeAux()
+{
+  //msg("..writing aux file\n");
+  QCString auxFileName(m_baseFileName + ".aux");
+  QFile auxFile(auxFileName);
+  if (!auxFile.open(IO_WriteOnly)) 
+    // point it to something valid, because warn() relies on it
+  {
+    err("Error opening file %s for output\n", auxFileName.data()); 
+    return FALSE;
+  }
+  FTextStream t(&auxFile);
+
+  QDictIterator<CiteInfo> cdi(m_entries);
+  for (CiteInfo *ci = 0; (ci=cdi.current()); ++cdi)
+  {
+    t << "\\citation{" << ci->label << "}\n";
+  }
+
+  t << "\\bibstyle{" << m_baseFileName << "}\n";
+
+  t << "\\bibdata{";
+  QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+  const char *bibdata = citeDataList.first();
+  while (bibdata)
+  {
+    QCString bibFile = bibdata;
+    if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+    if (!bibFile.isEmpty())
+    {
+      QFileInfo fi(bibFile);
+      if (fi.exists())
+      {
+        if (!copyFile(bibFile,m_baseFileName+"_"+bibFile))
+        {
+          return FALSE;
+        }
+        t << m_baseFileName+"_"+bibFile;
+        bibdata = citeDataList.next();
+        if (bibdata)
+        {
+          t << ",";
+        }
+      }
+      else
+      {
+        err("The file %s specified at CITE_BIB_FILES could not be read!\n",bibdata);
+        return FALSE;
+      }
+    }
+    else
+    {
+      bibdata = citeDataList.next();
+    }
+  }
+  t << "}\n";
+  return TRUE;
+}
+
+bool CiteDict::writeBst()
+{
+  //msg("..writing bst file\n");
+  QCString bstFileName = m_baseFileName + ".bst";
+  return writeBstFile(bstFileName);
+}
+
+void CiteDict::writeDefaultBibStyle()
+{
+  writeBstFile("doxygen.bst");
+  msg("wrote doxygen.bst\n");
+}
+
+void CiteDict::writeLatexBibliography(FTextStream &t)
+{
+  if (m_entries.count()==0) return;
+  QCString style = Config_getString("LATEX_BIB_STYLE");
+  if (style.isEmpty()) style="plain";
+  t << "\\newpage \\bibliographystyle{" << style << "}" << endl;
+  t << "\\bibliography{";
+  QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+  const char *bibdata = citeDataList.first();
+  while (bibdata)
+  {
+    QCString bibFile = bibdata;
+    if (!bibFile.isEmpty())
+    {
+      t << bibFile;
+      bibdata = citeDataList.next();
+      if (bibdata)
+      {
+        t << ",";
+      }
+    }
+    else
+    {
+      bibdata = citeDataList.next();
+    }
+  }
+  t << "}" << endl;
+}
+
+void CiteDict::insert(const char *label)
+{
+  m_entries.insert(label,new CiteInfo(label));
+}
+
+CiteInfo *CiteDict::find(const char *label) const
+{
+  return label ? m_entries.find(label) : 0;
+}
+
+void CiteDict::clear()
+{
+  m_entries.clear();
+  m_ordering.clear();
+}
+
+bool CiteDict::execute()
+{
+  //msg("..running bibtex\n");
+  bool result=TRUE;
+  QCString auxFileName(m_baseFileName + ".aux");
+  int splitPoint = auxFileName.findRev('/');
+  QCString dirname = auxFileName.left(splitPoint);
+  QCString basename = auxFileName.mid(splitPoint + 1);
+  QCString oldDir = convertToQCString(QDir::currentDirPath());
+  QDir::setCurrent(dirname);
+  QCString args;
+  args += "-terse ";
+  args += basename;
+  portable_system("bibtex", args);
+  int exitCode;
+  if ((exitCode=portable_system("bibtex",args))!=0)
+  {
+    err("Problems running bibtex: exit code=%d, command='bibtex', arguments='%s'\n",
+      exitCode,args.data());
+    result=FALSE;
+  }
+  QDir::setCurrent(oldDir);
+  return result;
+}
+
+void CiteDict::parse()
+{
+  //msg("..parsing bbl file\n");
+  QCString bblFileName(m_baseFileName + ".bbl");
+  QFile f(bblFileName);
+  if (!f.open(IO_ReadOnly))
+  {
+    err("error: could not open file %s\n",bblFileName.data());
+    return;
+  }
+
+  m_ordering.clear();
+
+  QTextStream t(&f);
+  QCString label;
+  QCString line;
+  while (!t.eof())
+  {
+    label=t.readLine();
+    if (label.isEmpty())
+    {
+      continue;
+    }
+
+    CiteInfo* ci = m_entries.find(label);
+    if (!ci) insert(label); 
+
+    // BibTeX has its own way of sorting references,
+    // depending on the .bst file
+    m_ordering.append(new QCString(label));
+
+    ci->text=t.readLine();
+
+    while (!(line=t.readLine()).isEmpty())
+    {
+      ci->fullText += line + '\n';
+    }
+
+    // FIXME: process LaTeX-style accents properly
+    ci->fullText = substitute(substitute(substitute(ci->fullText,
+            "{", ""),
+          "}", ""),
+        "~", " ");
+    
+    //printf("BIB ENTRY: %s -> %s: %s\n", ci->label.data(), ci->text.data(), ci->fullText.data());
+  }
+}
+
+void CiteDict::clean()
+{
+  // clean
+  QDir thisDir;
+  QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+  const char *bibdata = citeDataList.first();
+  while (bibdata)
+  {
+    QCString bibFile = bibdata;
+    if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+    if (!bibFile.isEmpty()) thisDir.remove(m_baseFileName+"_"+bibFile);
+    bibdata = citeDataList.next();
+  }
+
+  thisDir.remove(m_baseFileName + ".aux");
+  thisDir.remove(m_baseFileName + ".bbl");
+  thisDir.remove(m_baseFileName + ".blg");
+  thisDir.remove(m_baseFileName + ".tmp");
+  thisDir.remove(m_baseFileName + ".bst");
+
+  QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+  if (outputDirectory.isEmpty()) 
+  {
+    outputDirectory=QDir::currentDirPath();
+  }
+  QDir d(outputDirectory);
+  d.rmdir("bib");
+}
+
+void CiteDict::resolve()
+{
+  QStrList &citeBibFiles = Config_getList("CITE_BIB_FILES");
+  if (citeBibFiles.count()==0 || m_entries.count()==0) return; // nothing to cite
+
+  QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+  if (outputDirectory.isEmpty()) 
+  {
+    outputDirectory=QDir::currentDirPath();
+  }
+  QDir d(outputDirectory);
+  d.mkdir("bib");
+
+  uint pid = portable_pid();
+  m_baseFileName.sprintf("doxygen_bibtex_%d",pid);
+  m_baseFileName.prepend(outputDirectory+"/bib/");
+
+  if (writeAux() && writeBst() && execute()) 
+  {
+    parse();
+    clean();
+  }
+
+  if (Config_getBool("GENERATE_LATEX"))
+  {
+    // copy bib files to the latex output dir
+    QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
+    QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/";
+    const char *bibdata = citeDataList.first();
+    while (bibdata)
+    {
+      QCString bibFile = bibdata;
+      if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
+      if (!bibFile.isEmpty())
+      {
+        copyFile(bibFile,latexOutputDir+bibFile);
+      }
+      bibdata = citeDataList.next();
+    }
+  }
+}
+
+bool CiteDict::isEmpty() const
+{
+  QStrList &citeBibFiles = Config_getList("CITE_BIB_FILES");
+  return (citeBibFiles.count()==0 || m_ordering.isEmpty());
+}
+
+void CiteDict::generatePage() const
+{
+  //printf("** CiteDict::generatePage() count=%d\n",m_ordering.count());
+
+  // do not generate an empty citations page
+  if (isEmpty()) return; // nothing to cite
+
+  QCString doc;
+  doc += "<dl class=\"citelist\">";
+
+  QListIterator<QCString> it(m_ordering);
+  QCString *s;
+  for (it.toFirst();(s=it.current());++it)
+  {
+    CiteInfo* ci = m_entries.find(*s);
+    doc += " <dt>";
+    doc +=  "\\anchor ";
+    doc += CiteConsts::anchorPrefix + ci->label;
+    doc += "\n";
+    doc += ci->text;
+    doc += "</dt><dd> ";
+    doc += ci->fullText;
+    doc += "</dd>";
+  }
+  doc += "</dl>\n";
+  //printf("addRelatedPage with doc='%s'\n",doc.data());
+  addRelatedPage(CiteConsts::fileName,
+       theTranslator->trCiteReferences(),doc,0,CiteConsts::fileName,1,0,0,0);
+}
+
diff --git a/src/cite.h b/src/cite.h
new file mode 100644
index 0000000..62524a2
--- /dev/null
+++ b/src/cite.h
@@ -0,0 +1,104 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 2011 by Dimitri van Heesch
+ * Based on a patch by David Munger
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CITEDB_H
+#define CITEDB_H
+
+#include "qtbc.h"
+#include <qdict.h>
+#include <qlist.h>
+
+class FTextStream;
+
+/// String constants for citations
+struct CiteConsts
+{
+  static const QCString fileName;
+  static const QCString anchorPrefix;
+};
+
+/// Citation-related data.
+struct CiteInfo
+{
+  CiteInfo(const char *label_, const char *text_=0, const char *fullText_=0,
+      const char *ref_=0) :
+    label(label_), text(text_), fullText(fullText_), ref(ref_)
+  { }
+
+  CiteInfo(const CiteInfo &o)
+  { label=o.label.copy(); text=o.text.copy(); fullText=o.fullText.copy(); ref=o.ref.copy(); }
+
+  QCString label; 
+  QCString text;
+  QCString fullText;
+  QCString ref;
+
+};
+
+/**
+ * @brief Cite database access class.
+ * @details This class provides access do the database of bibliographic 
+ * references through the bibtex backend.
+ */
+class CiteDict 
+{
+  public:
+    /** Create the database, with an expected maximum of \a size entries */
+    CiteDict(int size);
+
+    /** Resolve references to citations */
+    void resolve();
+
+    /** Insert a citation identified by \a label into the database */
+    void insert(const char *label);
+
+    /** Return the citation info for a given \a label */
+    CiteInfo *find(const char *label) const;
+
+    /** Generate the citations page */
+    void generatePage() const;
+
+    /** clears the database */
+    void clear();
+
+    /** return TRUE if there are no citations. 
+     *  Only valid after calling resolve() 
+     */
+    bool isEmpty() const;
+
+    /** writes the latex code for the standard bibliography 
+     *  section to text stream \a t 
+     */
+    void writeLatexBibliography(FTextStream &t);
+
+    /** writes the default bibliography style to the output */
+    static void writeDefaultBibStyle();
+
+
+  private:
+    bool writeAux();
+    bool writeBst();
+    bool execute();
+    void parse();
+    void clean();
+    QDict<CiteInfo> m_entries;
+    QList<QCString> m_ordering;
+    QCString m_baseFileName;
+};
+
+#endif
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 34dcee3..c9cb837 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -174,6 +174,9 @@ class ClassDefImpl
 
     /** List of titles to use for the summary */
     SDict<QCString> vhdlSummaryTitles;
+
+    /** Is this a simple (non-nested) C structure? */
+    bool isSimple;
 };
 
 void ClassDefImpl::init(const char *defFileName, const char *name,
@@ -213,6 +216,7 @@ void ClassDefImpl::init(const char *defFileName, const char *name,
   membersMerged = FALSE;
   categoryOf = 0;
   usedOnly = FALSE;
+  isSimple = Config_getBool("INLINE_SIMPLE_STRUCTS");
   //QCString ns;
   //extractNamespaceName(name,className,ns);
   //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
@@ -266,7 +270,6 @@ ClassDef::ClassDef(
   m_impl->compType = ct;
   m_impl->lang     = SrcLangExt_Unknown;
   m_impl->init(defFileName,name(),compoundTypeString(),fName);
-
 }
 
 // destroy the class definition
@@ -321,6 +324,7 @@ void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p,
     m_impl->inherits->setAutoDelete(TRUE);
   }
   m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+  m_impl->isSimple = FALSE;
 }
 
 // inserts a sub class in the inherited list
@@ -334,6 +338,7 @@ void ClassDef::insertSubClass(ClassDef *cd,Protection p,
     m_impl->inheritedBy->setAutoDelete(TRUE);
   }
   m_impl->inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
+  m_impl->isSimple = FALSE;
 }
 
 void ClassDef::addMembersToMemberGroup()
@@ -388,6 +393,8 @@ void ClassDef::internalInsertMember(MemberDef *md,
   {
     static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
 
+    bool isSimple=FALSE;
+
     /********************************************/
     /* insert member in the declaration section */
     /********************************************/
@@ -484,6 +491,7 @@ void ClassDef::internalInsertMember(MemberDef *md,
                   break;
                 case Public:    
                   addMemberToList(MemberList::pubAttribs,md,TRUE);
+                  isSimple=TRUE;
                   break;
                 case Private:   
                   addMemberToList(MemberList::priAttribs,md,TRUE);
@@ -530,6 +538,10 @@ void ClassDef::internalInsertMember(MemberDef *md,
           break; 
       }
     }
+    if (!isSimple) // not a simple field -> not a simple struct
+    {
+      m_impl->isSimple = FALSE;
+    }
 
     /*******************************************************/
     /* insert member in the detailed documentation section */
@@ -1355,8 +1367,17 @@ void ClassDef::writeNestedClasses(OutputList &ol,const QCString &title)
   }
 }
 
+void ClassDef::writeInlineClasses(OutputList &ol)
+{
+  if (m_impl->innerClasses) 
+  {
+    m_impl->innerClasses->writeDocumentation(ol,this);
+  }
+}
+
 void ClassDef::startMemberDocumentation(OutputList &ol)
 {
+  //printf("%s: ClassDef::startMemberDocumentation()\n",name().data());
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
     ol.disable(OutputGenerator::Html);
@@ -1366,6 +1387,7 @@ void ClassDef::startMemberDocumentation(OutputList &ol)
 
 void ClassDef::endMemberDocumentation(OutputList &ol)
 {
+  //printf("%s: ClassDef::endMemberDocumentation()\n",name().data());
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
     ol.enable(OutputGenerator::Html);
@@ -1375,11 +1397,13 @@ void ClassDef::endMemberDocumentation(OutputList &ol)
 
 void ClassDef::startMemberDeclarations(OutputList &ol)
 {
+  //printf("%s: ClassDef::startMemberDeclarations()\n",name().data());
   ol.startMemberSections();
 }
 
 void ClassDef::endMemberDeclarations(OutputList &ol)
 {
+  //printf("%s: ClassDef::endMemberDeclarations()\n",name().data());
   ol.endMemberSections();
 }
 
@@ -1493,43 +1517,11 @@ void ClassDef::writeTagFileMarker(OutputList &ol)
   }
 }
 
-#if 0
-void ClassDef::writeInlineDeclaration(OutputList &ol,bool first)
-{
-  //printf("ClassDef::writeInlineDeclaration for %s\n",name().data());
-  bool exampleFlag=hasExamples();
-  QListIterator<LayoutDocEntry> eli(
-      LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
-  LayoutDocEntry *lde;
-  ol.startMemberHeader(first ? "nested-classes" : 0);
-  //ol.parseText(name()+" "+theTranslator->trClassDocumentation());
-  QCString s = compoundTypeString();
-  if (s.length()>0 && isId(s.at(0))) s[0]=toupper(s[0]);
-  s+=" "+name();
-  ol.parseText(s);
-  ol.endMemberHeader();
-  ol.writeAnchor(getOutputFileBase(),anchor());
-  ol.startInlineDescription();
-  writeBriefDescription(ol,exampleFlag);
-  ol.endInlineDescription();
-  for (eli.toFirst();(lde=eli.current());++eli)
-  {
-    if (lde->kind()==LayoutDocEntry::MemberDecl)
-    {
-      LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
-      writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript,TRUE);
-    }
-    else if (lde->kind()==LayoutDocEntry::MemberGroups)
-    {
-      writeMemberGroups(ol,TRUE);
-    }
-  }
-}
-#endif
-
 /** Write class documentation inside another container (i.e. a group) */
 void ClassDef::writeInlineDocumentation(OutputList &ol)
 {
+  bool isSimple = m_impl->isSimple;
+
   ol.addIndexItem(name(),0);
   //printf("ClassDef::writeInlineDocumentation(%s)\n",name().data());
   QListIterator<LayoutDocEntry> eli(
@@ -1593,33 +1585,38 @@ void ClassDef::writeInlineDocumentation(OutputList &ol)
         writeCollaborationGraph(ol); 
         break; 
       case LayoutDocEntry::MemberDeclStart: 
-        startMemberDeclarations(ol);
+        if (!isSimple) startMemberDeclarations(ol);
         break; 
       case LayoutDocEntry::MemberDecl:
         {
           LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
-          writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript,TRUE);
+          if (!isSimple) writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript,TRUE);
         }
         break;
       case LayoutDocEntry::MemberGroups:
-        {
-          writeMemberGroups(ol,TRUE);
-        }
+        if (!isSimple) writeMemberGroups(ol,TRUE);
         break;
       case LayoutDocEntry::MemberDeclEnd: 
-        endMemberDeclarations(ol);
+        if (!isSimple) endMemberDeclarations(ol);
         break;
       case LayoutDocEntry::MemberDefStart: 
-        startMemberDocumentation(ol);
+        if (!isSimple) startMemberDocumentation(ol);
         break; 
       case LayoutDocEntry::MemberDef: 
         {
           LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
-          writeMemberDocumentation(ol,lmd->type,lmd->title,TRUE);
+          if (isSimple)
+          {
+            writeSimpleMemberDocumentation(ol,lmd->type);
+          }
+          else
+          {
+            writeMemberDocumentation(ol,lmd->type,lmd->title,TRUE);
+          }
         }
         break; 
       case LayoutDocEntry::MemberDefEnd: 
-        endMemberDocumentation(ol);
+        if (!isSimple) endMemberDocumentation(ol);
         break;
       default:
         break;
@@ -1853,6 +1850,9 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString &pageTit
       case LayoutDocEntry::MemberDefStart: 
         startMemberDocumentation(ol);
         break; 
+      case LayoutDocEntry::ClassInlineClasses:
+        writeInlineClasses(ol);
+        break;
       case LayoutDocEntry::MemberDef: 
         {
           LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
@@ -1870,12 +1870,14 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString &pageTit
         break;
       case LayoutDocEntry::NamespaceNestedNamespaces:
       case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
       case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::FileInlineClasses:
       case LayoutDocEntry::GroupClasses: 
       case LayoutDocEntry::GroupInlineClasses: 
       case LayoutDocEntry::GroupNamespaces:
@@ -2039,7 +2041,8 @@ void ClassDef::writeDocumentationForInnerClasses(OutputList &ol)
     for (cli.toFirst();(innerCd=cli.current());++cli)
     {
       if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
-          (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE"))
+          (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE")) &&
+         !innerCd->isEmbeddedInOuterScope()
          )
       {
         msg("Generating docs for nested compound %s...\n",qPrint(innerCd->name()));
@@ -3163,11 +3166,34 @@ QCString ClassDef::getXmlOutputFileBase() const
 QCString ClassDef::getOutputFileBase() const 
 { 
   static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+  static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
+  Definition *scope=0;
   if (inlineGroupedClasses && partOfGroups()!=0)
   {
     // point to the group that embeds this class
     return partOfGroups()->at(0)->getOutputFileBase();
   }
+  else if (inlineSimpleClasses && m_impl->isSimple && partOfGroups()!=0)
+  {
+    // point to simple struct inside a group
+    return partOfGroups()->at(0)->getOutputFileBase();
+  }
+  else if (inlineSimpleClasses && m_impl->isSimple && (scope=getOuterScope()) && 
+            (
+              (scope==Doxygen::globalScope && getFileDef() && getFileDef()->isLinkable()) || 
+              scope->isLinkable()
+            )
+          )
+  {
+    if (scope==Doxygen::globalScope) // simple struct embedded in file
+    {
+      return getFileDef()->getOutputFileBase();
+    }
+    else // simple struct embedded in other container (namespace/group/class)
+    {
+      return getOuterScope()->getOutputFileBase();
+    }
+  }
   else
   {
     return getXmlOutputFileBase();
@@ -3243,6 +3269,7 @@ void ClassDef::addInnerCompound(Definition *d)
       m_impl->innerClasses = new ClassSDict(17);
     }
     m_impl->innerClasses->inSort(d->localName(),(ClassDef *)d);
+    m_impl->isSimple = FALSE;
   }
 }
 
@@ -3655,6 +3682,7 @@ void ClassDef::sortMemberLists()
 void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,
                const char *subTitle,bool showInline)
 {
+  //printf("%s: ClassDef::writeMemberDeclarations\n",name().data());
   static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
   MemberList * ml = getMemberList(lt);
   if (ml) 
@@ -3672,12 +3700,21 @@ void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,co
 
 void ClassDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title,bool showInline)
 {
+  //printf("%s: ClassDef::writeMemberDocumentation()\n",name().data());
   MemberList * ml = getMemberList(lt);
   if (ml) ml->writeDocumentation(ol,name(),this,title,FALSE,showInline);
 }
 
+void ClassDef::writeSimpleMemberDocumentation(OutputList &ol,MemberList::ListType lt)
+{
+  //printf("%s: ClassDef::writeSimpleMemberDocumentation()\n",name().data());
+  MemberList * ml = getMemberList(lt);
+  if (ml) ml->writeSimpleDocumentation(ol,this);
+}
+
 void ClassDef::writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup)
 {
+  //printf("%s: ClassDef::writePlainMemberDeclaration()\n",name().data());
   MemberList * ml = getMemberList(lt);
   if (ml) 
   {
@@ -3871,6 +3908,11 @@ bool ClassDef::isUsedOnly() const
   return m_impl->usedOnly;
 }
 
+bool ClassDef::isSimple() const
+{
+  return m_impl->isSimple;
+}
+
 void ClassDef::reclassifyMember(MemberDef *md,MemberDef::MemberType t)
 {
   md->setMemberType(t);
@@ -3886,7 +3928,7 @@ void ClassDef::reclassifyMember(MemberDef *md,MemberDef::MemberType t)
 QCString ClassDef::anchor() const
 {
   QCString anc;
-  if (isEmbeddedInGroupDocs())
+  if (isEmbeddedInOuterScope())
   {
     if (m_impl->templateMaster)
     {
@@ -3907,10 +3949,28 @@ QCString ClassDef::anchor() const
   return anc;
 }
 
-bool ClassDef::isEmbeddedInGroupDocs() const
+bool ClassDef::isEmbeddedInOuterScope() const
 {
   static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
-  return (inlineGroupedClasses && partOfGroups()!=0);
+  static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
+
+  Definition *container = getOuterScope();
+
+  // inline because of INLINE_GROUPED_CLASSES=YES ?
+  bool b1 = (inlineGroupedClasses && partOfGroups()!=0); // a grouped class
+  // inline because of INLINE_SIMPLE_STRUCTS=YES ?
+  bool b2 = (inlineSimpleClasses && m_impl->isSimple && // a simple class
+             ((container && 
+               (container==Doxygen::globalScope || container->isLinkableInProject())) || // with a documented scope
+               partOfGroups()!=0                                             // or part of a group
+             )
+           );
+  //printf("%s::isEmbeddedInOuterScope(): inlineGroupedClasses=%d "
+  //       "inlineSimpleClasses=%d partOfGroups()=%p m_impl->isSimple=%d "
+  //       "getOuterScope()=%p b1=%d b2=%d\n",
+  //    name().data(),inlineGroupedClasses,inlineSimpleClasses,
+  //    partOfGroups().pointer(),m_impl->isSimple,getOuterScope(),b1,b2);
+  return b1 || b2;  // either reason will do
 }
 
 
diff --git a/src/classdef.h b/src/classdef.h
index fcb8d4c..a3f4ad1 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -265,10 +265,12 @@ class ClassDef : public Definition
     bool isUsedOnly() const;
 
     QCString anchor() const;
-    bool isEmbeddedInGroupDocs() const;
+    bool isEmbeddedInOuterScope() const;
 
     SrcLangExt getLanguage() const;
 
+    bool isSimple() const;
+
     //-----------------------------------------------------------------------------------
     // --- setters ----
     //-----------------------------------------------------------------------------------
@@ -345,6 +347,7 @@ class ClassDef : public Definition
     void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,
                                  const char *subTitle=0,bool showInline=FALSE);
     void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title,bool showInline=FALSE);
+    void writeSimpleMemberDocumentation(OutputList &ol,MemberList::ListType lt);
     void writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup);
     void writeBriefDescription(OutputList &ol,bool exampleFlag);
     void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
@@ -355,6 +358,7 @@ class ClassDef : public Definition
     void writeCollaborationGraph(OutputList &ol);
     void writeMemberGroups(OutputList &ol,bool showInline=FALSE);
     void writeNestedClasses(OutputList &ol,const QCString &title);
+    void writeInlineClasses(OutputList &ol);
     void startMemberDeclarations(OutputList &ol);
     void endMemberDeclarations(OutputList &ol);
     void startMemberDocumentation(OutputList &ol);
diff --git a/src/classlist.cpp b/src/classlist.cpp
index 953cf61..bb6ab73 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -96,8 +96,6 @@ bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const
 void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
                                   const char *header,bool localNames)
 {
-//  static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
-//  bool first=TRUE;
   if (count()>0)
   {
     ClassSDict::Iterator sdi(*this);
@@ -110,45 +108,48 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f
           (filter==0 || *filter==cd->compoundType())
          )
       {
-//        //bool isLink = cd->isLinkable();
-//        if (inlineGroupedClasses && cd->partOfGroups()->count()>0)
-//        {
-//          cd->writeInlineDeclaration(ol,first);
-//          first=FALSE;
-//        }
-//        else // show link's only
-//        {
-          cd->writeDeclarationLink(ol,found,header,localNames);
-//        }
+        cd->writeDeclarationLink(ol,found,header,localNames);
       }
     }
     if (found) ol.endMemberList();
   }
 }
   
-void ClassSDict::writeDocumentation(OutputList &ol)
+void ClassSDict::writeDocumentation(OutputList &ol,Definition *container)
 {
   static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
 
   static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
-  if (!inlineGroupedClasses) return;
+  static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
+  if (!inlineGroupedClasses && !inlineSimpleClasses) return;
 
   if (count()>0)
   {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
-        theTranslator->trClassDocumentation());
-    ol.endGroupHeader();
+    bool found=FALSE;
 
     ClassSDict::Iterator sdi(*this);
     ClassDef *cd=0;
     for (sdi.toFirst();(cd=sdi.current());++sdi)
     {
-      if (cd->name().find('@')==-1 && 
-          cd->partOfGroups()->count()==1
+      //printf("%s:writeDocumentation() %p=%p embedded=%d\n",
+      //  cd->name().data(),container,cd->getOuterScope(),cd->isEmbeddedInOuterScope());
+
+      if (cd->name().find('@')==-1 && cd->isEmbeddedInOuterScope() &&
+          (container==0 || // no container -> used for groups
+           cd->getOuterScope()==container || // correct container -> used for namespaces and classes
+           (container->definitionType()==Definition::TypeFile && cd->getOuterScope()==Doxygen::globalScope && cd->partOfGroups()==0) // non grouped class with file scope -> used for files
+          )
          )
       {
+        if (!found)
+        {
+          ol.writeRuler();
+          ol.startGroupHeader();
+          ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
+              theTranslator->trClassDocumentation());
+          ol.endGroupHeader();
+          found=TRUE;
+        }
         cd->writeInlineDocumentation(ol);
       }
     }
diff --git a/src/classlist.h b/src/classlist.h
index efa2b7a..b54d510 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -24,6 +24,8 @@
 #include "classdef.h"
 #include "sortdict.h"
 
+class Definition;
+
 class ClassList : public QList<ClassDef>
 { 
   public:
@@ -54,7 +56,7 @@ class ClassSDict : public SDict<ClassDef>
    int compareItems(GCI item1,GCI item2);
    void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
                          const char *header=0,bool localNames=FALSE);
-   void writeDocumentation(OutputList &ol);
+   void writeDocumentation(OutputList &ol,Definition *container=0);
    bool declVisible(const ClassDef::CompoundType *filter=0) const;
 };
 
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index d45bccc..eac4657 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -29,6 +29,7 @@ CommandMap cmdMap[] =
   { "authors",       CMD_AUTHORS },
   { "b",             CMD_BOLD },
   { "c",             CMD_CODE },
+  { "cite",          CMD_CITE },
   { "code",          CMD_STARTCODE },
   { "copydoc",       CMD_COPYDOC },
   { "copybrief",     CMD_COPYBRIEF },
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 0a398f5..75227ab 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -117,6 +117,7 @@ enum CommandType
   CMD_MSCFILE      = 83,
   CMD_DCOLON       = 84,
   CMD_COPYRIGHT    = 85 | SIMPLESECT_BIT,
+  CMD_CITE         = 86,
 };
 
 enum HtmlTagType
diff --git a/src/commentscan.l b/src/commentscan.l
index 61cc9e2..00dd4e0 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -44,6 +44,7 @@
 #include "reflist.h"
 #include "debug.h"
 #include "parserintf.h"
+#include "cite.h"
 
 // forward declarations
 static bool handleBrief(const QCString &);
@@ -83,6 +84,7 @@ static bool handleMemberOf(const QCString &);
 static bool handleRefItem(const QCString &);
 static bool handleSection(const QCString &);
 static bool handleAnchor(const QCString &);
+static bool handleCite(const QCString &);
 static bool handleFormatBlock(const QCString &);
 static bool handleAddIndex(const QCString &);
 static bool handleIf(const QCString &);
@@ -161,6 +163,7 @@ static DocCmdMap docCmdMap[] =
   { "relatedalso",     &handleRelatedAlso,      TRUE  },
   { "relatesalso",     &handleRelatedAlso,      TRUE  },
   { "refitem",         &handleRefItem,          TRUE  },
+  { "cite",            &handleCite,             TRUE  },
   { "subpage",         &handleSubpage,          TRUE  },
   { "section",         &handleSection,          TRUE  },
   { "subsection",      &handleSection,          TRUE  },
@@ -602,6 +605,13 @@ static void addSection()
 
 //-----------------------------------------------------------------------------
 
+static void addCite()
+{
+  Doxygen::citeDict->insert(yytext);
+}
+
+//-----------------------------------------------------------------------------
+
 // strip trailing whitespace (excluding newlines) from string s
 static void stripTrailingWhiteSpace(QCString &s)
 {
@@ -780,7 +790,7 @@ static int yyread(char *buf,int max_size)
 
        /* start command character */
 CMD	  ("\\"|"@")
-DCMD1     ("arg"|"attention"|"author"|"code")
+DCMD1     ("arg"|"attention"|"author"|"cite"|"code")
 DCMD2     ("date"|"dot"|"msc"|"dotfile"|"example")
 DCMD3     ("htmlinclude"|"htmlonly"|"image"|"include")
 DCMD4     ("includelineno"|"internal"|"invariant")
@@ -861,6 +871,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 %x	AnchorLabel
 %x      HtmlComment
 %x      SkipLang
+%x	CiteLabel
 
 %%
 
@@ -1953,6 +1964,29 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <SkipLang>.			   { /* any other character */
                                    }
 
+  /* ----- handle arguments of the cite command ------- */
+
+<CiteLabel>{LABELID}			{ // found argyment
+  					  addCite();
+                                          addOutput(yytext);
+					  BEGIN(Comment);
+  					}
+<CiteLabel>{DOCNL}			{ // missing argument
+  					  warn(yyFileName,yyLineNr,
+					      "warning: \\cite command has no label"
+					      );
+  					  if (*yytext=='\n') yyLineNr++;
+					  addOutput('\n');
+					  BEGIN( Comment );
+  					}
+<CiteLabel>.				{ // invalid character for cite label
+  					  warn(yyFileName,yyLineNr,
+					      "warning: Invalid or missing cite label"
+					      );
+					  BEGIN(Comment);
+  					}
+
+
 
 %%
 
@@ -2259,6 +2293,13 @@ static bool handleAnchor(const QCString &s)
   return FALSE;
 }
 
+static bool handleCite(const QCString &s)
+{
+  addOutput(" @"+s+" ");
+  BEGIN(CiteLabel);
+  return FALSE;
+}
+
 static bool handleFormatBlock(const QCString &s)
 {
   addOutput(" @"+s+" ");
diff --git a/src/config.xml b/src/config.xml
index 9f081c4..f9bd11c 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -8,8 +8,9 @@ iconv built into libc) for the transcoding. See
 http://www.gnu.org/software/libiconv for the list of possible encodings. 
 ' defval='UTF-8'/>
     <option type='string' id='PROJECT_NAME' format='string' docs='
-The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-by quotes) that should identify the project. ' defval=''/>
+The PROJECT_NAME tag is a single word (or sequence of words) that should 
+identify the project. Note that if you do not use Doxywizard you need 
+to put quotes around the project name if it contains spaces.' defval=''/>
     <option type='string' id='PROJECT_NUMBER' format='string' docs='
 The PROJECT_NUMBER tag can be used to enter a project or revision number. 
 This could be handy for archiving the generated documentation or 
@@ -288,6 +289,13 @@ unions are shown inside the group in which they are included (e.g. using
 @ingroup) instead of on a separate page (for HTML and Man pages) or 
 section (for LaTeX and RTF).
 ' defval='0'/>
+    <option type='bool' id='INLINE_SIMPLE_STRUCTS' docs='
+When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and 
+unions with only public data fields will be shown inline in the documentation 
+of the scope in which they are defined (i.e. file, namespace, or group 
+documentation), provided this scope is documented. If set to NO (the default), 
+structs, classes, and unions are shown on a separate page (for HTML and Man 
+pages) or section (for LaTeX and RTF).' defval='0'/>
     <option type='bool' id='TYPEDEF_HIDES_STRUCT' docs='
 When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
 is documented as struct, union, or enum with the name of the typedef. So 
@@ -516,6 +524,14 @@ that represents doxygen&apos;s defaults, run doxygen with the -l option.
 You can optionally specify a file name after the option, if omitted 
 DoxygenLayout.xml will be used as the name of the layout file. 
 ' defval=''/>
+    <option type='list' id='CITE_BIB_FILES' format='file' docs='
+The CITE_BIB_FILES tag can be used to specify one or more bib files 
+containing the references data. This must be a list of .bib files. The 
+.bib extension is automatically appended if omitted. Using this command 
+requires the bibtex tool to be installed. See also 
+http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style 
+of the bibliography can be controlled using LATEX_BIB_STYLE. 
+' defval=''/>
   </group>
   <group name='Messages' docs='configuration options related to warning and progress messages'>
     <option type='bool' id='QUIET' docs='
@@ -789,13 +805,13 @@ doxygen will generate files with .html extension.
     <option type='string' id='HTML_HEADER' format='file' docs='
 The HTML_HEADER tag can be used to specify a personal HTML header for 
 each generated HTML page. If it is left blank doxygen will generate a 
-standard header. Note that when using a custom header you are responsible 
+standard header. Note that when using a custom header you are responsible  
 for the proper inclusion of any scripts and style sheets that doxygen 
 needs, which is dependent on the configuration options used. 
 It is adviced to generate a default header using "doxygen -w html 
 header.html footer.html stylesheet.css YourConfigFile" and then modify 
 that header. Note that the header is subject to change so you typically 
-have to redo this when upgrading to a newer version of doxygen or when
+have to redo this when upgrading to a newer version of doxygen or when 
 changing the value of configuration settings such as GENERATE_TREEVIEW!
 ' defval='' depends='GENERATE_HTML'/>
     <option type='string' id='HTML_FOOTER' format='file' docs='
@@ -1052,6 +1068,11 @@ mathjax.org site, so you can quickly see the result without installing
 MathJax, but it is strongly recommended to install a local copy of MathJax 
 before deployment.
 ' defval='http://www.mathjax.org/mathjax'/>
+    <option type='list' id='MATHJAX_EXTENSIONS' format='string' docs='
+The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
+names that should be enabled during MathJax rendering. 
+' depends='USE_MATHJAX'>
+    </option>
     <option type='bool' id='SEARCHENGINE' docs='
 When the SEARCHENGINE tag is enabled doxygen will generate a search box 
 for the HTML output. The underlying search engine uses javascript 
@@ -1154,6 +1175,11 @@ source code with syntax highlighting in the LaTeX output.
 Note that which sources are shown also depends on other settings 
 such as SOURCE_BROWSER.
 ' defval='0' depends='GENERATE_LATEX'/>
+    <option type='string' id='LATEX_BIB_STYLE' format='string' docs='
+The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
+bibliography, e.g. plainnat, or ieeetr. The default style is &quot;plain&quot;. See 
+http://en.wikipedia.org/wiki/BibTeX for more info.
+' defval='plain'/>
   </group>
   <group name='RTF' docs='configuration options related to the RTF output'>
     <option type='bool' id='GENERATE_RTF' docs='
@@ -1405,7 +1431,7 @@ explicitly to a value larger than 0 to get control over the balance
 between CPU load and processing speed.  
 ' defval='0' minval='0' maxval='32'/>
     <option type='string' id='DOT_FONTNAME' format='string' docs='
-By default doxygen will use the Helvetica font for all dot files that
+By default doxygen will use the Helvetica font for all dot files that 
 doxygen generates. When you want a differently looking font you can specify 
 the font name using DOT_FONTNAME. You need to make sure dot is able to find 
 the font, which can be done by putting it in a standard location or by setting 
@@ -1418,7 +1444,7 @@ The default size is 10pt.
 ' minval='4' maxval='24' defval='10' depends='HAVE_DOT'/>
     <option type='string' id='DOT_FONTPATH' format='string' docs='
 By default doxygen will tell dot to use the Helvetica font. 
-If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to 
 set the path where dot can find it.
 ' defval='' depends='HAVE_DOT'/>
     <option type='bool' id='CLASS_GRAPH' docs='
@@ -1486,7 +1512,7 @@ relations between the files in the directories.
 The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
 generated by dot. Possible values are svg, png, jpg, or gif. 
 If left blank png will be used. If you choose svg you need to set 
-HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
 visible in IE 9+ (other browsers do not have this requirement).
 ' depends='HAVE_DOT'>
       <value name='png'/>
@@ -1494,13 +1520,13 @@ visible in IE 9+ (other browsers do not have this requirement).
       <value name='gif'/>
       <value name='svg'/>
     </option>
-    <option type='bool' id='INTERACTIVE_SVG' doc='
-If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+    <option type='bool' id='INTERACTIVE_SVG' docs='
+If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to 
 enable generation of interactive SVG images that allow zooming and panning. 
 Note that this requires a modern browser other than Internet Explorer. 
-Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
-need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-visible. Older versions of IE do not have SVG support.
+Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you 
+need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
+visible. Older versions of IE do not have SVG support. 
 ' defval='0' depends='HAVE_DOT'/>
     <option type='string' id='DOT_PATH' format='dir' docs='
 The tag DOT_PATH can be used to specify the path where the dot tool can be 
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
index 2e45947..61fc635 100644
--- a/src/configoptions.cpp
+++ b/src/configoptions.cpp
@@ -32,8 +32,9 @@ void addConfigOptions(Config *cfg)
   //----
   cs = cfg->addString(
                  "PROJECT_NAME",
-                 "The PROJECT_NAME tag is a single word (or a sequence of words surrounded\n"
-                 "by quotes) that should identify the project."
+                 "The PROJECT_NAME tag is a single word (or sequence of words) that should\n"
+                 "identify the project. Note that if you do not use Doxywizard you need\n"
+                 "to put quotes around the project name if it contains spaces."
                 );
   //----
   cs = cfg->addString(
@@ -405,6 +406,17 @@ void addConfigOptions(Config *cfg)
                 );
   //----
   cb = cfg->addBool(
+                 "INLINE_SIMPLE_STRUCTS",
+                 "When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n"
+                 "unions with only public data fields will be shown inline in the documentation\n"
+                 "of the scope in which they are defined (i.e. file, namespace, or group\n"
+                 "documentation), provided this scope is documented. If set to NO (the default),\n"
+                 "structs, classes, and unions are shown on a separate page (for HTML and Man\n"
+                 "pages) or section (for LaTeX and RTF).",
+                 FALSE
+                );
+  //----
+  cb = cfg->addBool(
                  "TYPEDEF_HIDES_STRUCT",
                  "When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n"
                  "is documented as struct, union, or enum with the name of the typedef. So\n"
@@ -741,6 +753,17 @@ void addConfigOptions(Config *cfg)
                  "DoxygenLayout.xml will be used as the name of the layout file."
                 );
   cs->setWidgetType(ConfigString::File);
+  //----
+  cl = cfg->addList(
+                 "CITE_BIB_FILES",
+                 "The CITE_BIB_FILES tag can be used to specify one or more bib files\n"
+                 "containing the references data. This must be a list of .bib files. The\n"
+                 ".bib extension is automatically appended if omitted. Using this command\n"
+                 "requires the bibtex tool to be installed. See also\n"
+                 "http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n"
+                 "of the bibliography can be controlled using LATEX_BIB_STYLE."
+                );
+  cl->setWidgetType(ConfigList::File);
   //---------------------------------------------------------------------------
   cfg->addInfo("Messages","configuration options related to warning and progress messages");
   //---------------------------------------------------------------------------
@@ -1130,12 +1153,13 @@ void addConfigOptions(Config *cfg)
                  "The HTML_HEADER tag can be used to specify a personal HTML header for\n"
                  "each generated HTML page. If it is left blank doxygen will generate a\n"
                  "standard header. Note that when using a custom header you are responsible\n"
-                 "for the proper inclusion of any scripts and style sheets that doxygen\n"
+                 " for the proper inclusion of any scripts and style sheets that doxygen\n"
                  "needs, which is dependent on the configuration options used.\n"
                  "It is adviced to generate a default header using \"doxygen -w html\n"
                  "header.html footer.html stylesheet.css YourConfigFile\" and then modify\n"
                  "that header. Note that the header is subject to change so you typically\n"
-                 "have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!"
+                 "have to redo this when upgrading to a newer version of doxygen or when\n"
+                 "changing the value of configuration settings such as GENERATE_TREEVIEW!"
                 );
   cs->setWidgetType(ConfigString::File);
   cs->addDependency("GENERATE_HTML");
@@ -1551,6 +1575,13 @@ void addConfigOptions(Config *cfg)
                 );
   cs->setDefaultValue("http://www.mathjax.org/mathjax");
   //----
+  cl = cfg->addList(
+                 "MATHJAX_EXTENSIONS",
+                 "The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n"
+                 "names that should be enabled during MathJax rendering."
+                );
+  cl->addDependency("USE_MATHJAX");
+  //----
   cb = cfg->addBool(
                  "SEARCHENGINE",
                  "When the SEARCHENGINE tag is enabled doxygen will generate a search box\n"
@@ -1717,6 +1748,14 @@ void addConfigOptions(Config *cfg)
                  FALSE
                 );
   cb->addDependency("GENERATE_LATEX");
+  //----
+  cs = cfg->addString(
+                 "LATEX_BIB_STYLE",
+                 "The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n"
+                 "bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n"
+                 "http://en.wikipedia.org/wiki/BibTeX for more info."
+                );
+  cs->setDefaultValue("plain");
   //---------------------------------------------------------------------------
   cfg->addInfo("RTF","configuration options related to the RTF output");
   //---------------------------------------------------------------------------
@@ -2123,7 +2162,8 @@ void addConfigOptions(Config *cfg)
   //----
   cs = cfg->addString(
                  "DOT_FONTNAME",
-                 "By default doxygen will use the Helvetica font for all dot files that doxygen generates. When you want a differently looking font you can specify\n"
+                 "By default doxygen will use the Helvetica font for all dot files that\n"
+                 "doxygen generates. When you want a differently looking font you can specify\n"
                  "the font name using DOT_FONTNAME. You need to make sure dot is able to find\n"
                  "the font, which can be done by putting it in a standard location or by setting\n"
                  "the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n"
@@ -2143,7 +2183,8 @@ void addConfigOptions(Config *cfg)
   cs = cfg->addString(
                  "DOT_FONTPATH",
                  "By default doxygen will tell dot to use the Helvetica font.\n"
-                 "If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to set the path where dot can find it."
+                 "If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n"
+                 "set the path where dot can find it."
                 );
   cs->addDependency("HAVE_DOT");
   //----
@@ -2257,7 +2298,8 @@ void addConfigOptions(Config *cfg)
                  "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n"
                  "generated by dot. Possible values are svg, png, jpg, or gif.\n"
                  "If left blank png will be used. If you choose svg you need to set\n"
-                 "HTML_FILE_EXTENSION to xhtml in order to make the SVG files visible in IE 9+ (other browsers do not have this requirement).",
+                 "HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n"
+                 "visible in IE 9+ (other browsers do not have this requirement).",
                  "png"
                 );
   ce->addValue("png");
@@ -2268,7 +2310,12 @@ void addConfigOptions(Config *cfg)
   //----
   cb = cfg->addBool(
                  "INTERACTIVE_SVG",
-                 "",
+                 "If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n"
+                 "enable generation of interactive SVG images that allow zooming and panning.\n"
+                 "Note that this requires a modern browser other than Internet Explorer.\n"
+                 "Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n"
+                 "need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n"
+                 "visible. Older versions of IE do not have SVG support.",
                  FALSE
                 );
   cb->addDependency("HAVE_DOT");
diff --git a/src/definition.cpp b/src/definition.cpp
index 70a46d8..0851c9b 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -1343,7 +1343,6 @@ void Definition::writePathFragment(OutputList &ol) const
 void Definition::writeNavigationPath(OutputList &ol) const
 {
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
-  static bool hasCustomFooter = !Config_getString("HTML_FOOTER").isEmpty();
 
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
@@ -1356,13 +1355,7 @@ void Definition::writeNavigationPath(OutputList &ol) const
   ol.writeString("  <div id=\"nav-path\" class=\"navpath\">\n");
   ol.writeString("    <ul>\n");
   writePathFragment(ol);
-  if (!hasCustomFooter && generateTreeView) // write the doxygen logo as part of the navigation bar
-  {
-    ol.writeString("      <li class=\"footer\">");
-    ol.writeLogo();
-    ol.writeString("</li>\n");
-  }
-  if (!hasCustomFooter || !generateTreeView)
+  if (!generateTreeView)
   {
     ol.writeString("    </ul>\n");
     ol.writeString("  </div>\n");
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 9e9579b..bce7ce9 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -193,8 +193,7 @@ void DirDef::writeDirectoryGraph(OutputList &ol)
       ol.disable(OutputGenerator::Man);
       //ol.startParagraph();
       ol.startDirDepGraph();
-      //TODO: ol.parseText(theTranslator->trDirDepGraph());
-      ol.parseText((QCString)"Directory dependency graph for "+displayName()+":");
+      ol.parseText(theTranslator->trDirDepGraph(displayName()));
       ol.endDirDepGraph(dirDep);
       //ol.endParagraph();
       ol.enableAll();
@@ -381,6 +380,7 @@ void DirDef::writeDocumentation(OutputList &ol)
         }
         break;
       case LayoutDocEntry::ClassIncludes:
+      case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::ClassInheritanceGraph:
       case LayoutDocEntry::ClassNestedClasses:
       case LayoutDocEntry::ClassCollaborationGraph:
@@ -388,12 +388,14 @@ void DirDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassUsedFiles:
       case LayoutDocEntry::NamespaceNestedNamespaces:
       case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
       case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::FileInlineClasses:
       case LayoutDocEntry::GroupClasses: 
       case LayoutDocEntry::GroupInlineClasses: 
       case LayoutDocEntry::GroupNamespaces:
diff --git a/src/docparser.cpp b/src/docparser.cpp
index c50c34c..ee2a1c0 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -41,6 +41,7 @@
 #include "searchindex.h"
 #include "language.h"
 #include "portable.h"
+#include "cite.h"
 
 // debug off
 #define DBG(x) do {} while(0)
@@ -1163,11 +1164,10 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
 static DocAnchor *handleAnchor(DocNode *parent)
 {
   int tok=doctokenizerYYlex();
-  QCString tokenName = g_token->name;
   if (tok!=TK_WHITESPACE)
   {
     warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
-        qPrint(tokenName));
+        qPrint(g_token->name));
     return 0;
   }
   doctokenizerYYsetStateAnchor();
@@ -1175,13 +1175,13 @@ static DocAnchor *handleAnchor(DocNode *parent)
   if (tok==0)
   {
     warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
-        "argument of command %s",qPrint(tokenName));
+        "argument of command %s",qPrint(g_token->name));
     return 0;
   }
   else if (tok!=TK_WORD && tok!=TK_LNKWORD)
   {
     warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
-        tokToString(tok),qPrint(tokenName));
+        tokToString(tok),qPrint(g_token->name));
     return 0;
   }
   doctokenizerYYsetStatePara();
@@ -1689,6 +1689,21 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
   {
     m_anchor = id;
   }
+  else if (id.left(CiteConsts::anchorPrefix.length()) == CiteConsts::anchorPrefix) 
+  {
+    CiteInfo *cite = Doxygen::citeDict->find(id.mid(CiteConsts::anchorPrefix.length()));
+    if (cite) 
+    {
+      m_file = CiteConsts::fileName;
+      m_anchor = id;
+    }
+    else 
+    {
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid cite anchor id `%s'",qPrint(id));
+      m_anchor = "invalid";
+      m_file = "invalid";
+    }
+  }
   else // found \anchor label
   {
     SectionInfo *sec = Doxygen::sectionDict[id];
@@ -2385,6 +2400,33 @@ void DocRef::parse()
 
 //---------------------------------------------------------------------------
 
+DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //context)
+{
+  static uint numBibFiles = Config_getList("CITE_BIB_FILES").count();
+  m_parent = parent; 
+  QCString     anchor;
+  //printf("DocCite::DocCite(target=%s,context=%s\n",target.data(),context.data());
+  ASSERT(!target.isEmpty());
+  m_relPath = g_relPath;
+  CiteInfo *cite = Doxygen::citeDict->find(target);
+  if (numBibFiles>0 && cite) // ref to citation
+  {
+    m_text         = cite->text;
+    if (m_text.isEmpty()) m_text = cite->label;
+    m_ref          = cite->ref;
+    m_anchor       = CiteConsts::anchorPrefix+cite->label;
+    m_file         = CiteConsts::fileName;
+    //printf("CITE ==> m_text=%s,m_ref=%s,m_file=%s,m_anchor=%s\n",
+    //    m_text.data(),m_ref.data(),m_file.data(),m_anchor.data());
+    return;
+  }
+  m_text = linkToText(target,FALSE);
+  warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\cite command",
+           qPrint(target)); 
+}
+
+//---------------------------------------------------------------------------
+
 DocLink::DocLink(DocNode *parent,const QCString &target) 
 {
   m_parent = parent; 
@@ -4420,6 +4462,38 @@ int DocPara::handleParamSection(const QCString &cmdName,
   return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
 }
 
+void DocPara::handleCite()
+{
+  // get the argument of the cite command.
+  int tok=doctokenizerYYlex();
+  if (tok!=TK_WHITESPACE)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+        qPrint("cite"));
+    return;
+  }
+  tok=doctokenizerYYlex();
+  if (tok==0)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+        "argument of command %s\n", qPrint("cite"));
+    return;
+  }
+  else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+  {
+    warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+        tokToString(tok),qPrint("cite"));
+    return;
+  }
+  g_token->sectionId = g_token->name;
+  doctokenizerYYsetStateCite();
+  DocCite *cite = new DocCite(this,g_token->name,g_context);
+  m_children.append(cite);
+  //cite->parse();
+
+  doctokenizerYYsetStatePara();
+}
+
 int DocPara::handleXRefItem()
 {
   int retval=doctokenizerYYlex();
@@ -5103,6 +5177,9 @@ int DocPara::handleCommand(const QCString &cmdName)
     case CMD_JAVALINK:
       handleLink(cmdName,TRUE);
       break;
+    case CMD_CITE:
+      handleCite();
+      break;
     case CMD_REF: // fall through
     case CMD_SUBPAGE:
       handleRef(cmdName);
diff --git a/src/docparser.h b/src/docparser.h
index 9adb540..bdd40b0 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -272,8 +272,8 @@ class DocAnchor : public DocNode
   public:
     DocAnchor(DocNode *parent,const QCString &id,bool newAnchor);
     Kind kind() const          { return Kind_Anchor; }
-    QCString anchor() const     { return m_anchor; }
-    QCString file() const       { return m_file; }
+    QCString anchor() const    { return m_anchor; }
+    QCString file() const      { return m_file; }
     void accept(DocVisitor *v) { v->visit(this); }
 
   private:
@@ -281,6 +281,28 @@ class DocAnchor : public DocNode
     QCString  m_file;
 };
 
+/*! @brief Node representing a citation of some bibliographic reference */
+class DocCite : public DocNode
+{
+  public:
+    DocCite(DocNode *parent,const QCString &target,const QCString &context);
+    Kind kind() const            { return Kind_Ref; }
+    QCString file() const        { return m_file; }
+    QCString relPath() const     { return m_relPath; }
+    QCString ref() const         { return m_ref; }
+    QCString anchor() const      { return m_anchor; }
+    QCString text() const        { return m_text; }
+    void accept(DocVisitor *v) { v->visit(this); }
+
+  private:
+    QCString   m_file;
+    QCString   m_relPath;
+    QCString   m_ref;
+    QCString   m_anchor;
+    QCString   m_text;
+};
+
+
 /*! @brief Node representing a style change */
 class DocStyleChange : public DocNode
 {
@@ -980,6 +1002,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode
     void handleMscFile(const QCString &cmdName);
     void handleInclude(const QCString &cmdName,DocInclude::Type t);
     void handleLink(const QCString &cmdName,bool isJavaLink);
+    void handleCite();
     void handleRef(const QCString &cmdName);
     void handleSection(const QCString &cmdName);
     void handleInheritDoc();
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index 496e209..1ea6570 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -141,6 +141,7 @@ void doctokenizerYYsetStateXRefItem();
 void doctokenizerYYsetStateFile();
 void doctokenizerYYsetStatePattern();
 void doctokenizerYYsetStateLink();
+void doctokenizerYYsetStateCite();
 void doctokenizerYYsetStateRef();
 void doctokenizerYYsetStateInternalRef();
 void doctokenizerYYsetStateText();
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 6de1627..104b75b 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -337,7 +337,7 @@ CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."=]
 ESCWORD   "%"{ID}(("::"|"."){ID})*
 WORD1     {ESCWORD}|{CHARWORDQ}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"")
 WORD2     "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="
-WORD1NQ   {ESCWORD}|{CHARWORDQ}+
+WORD1NQ   {ESCWORD}|{CHARWORDQ}+|"{"|"}"
 WORD2NQ   "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="
 HTMLTAG   "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">" 
 HTMLKEYL  "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
@@ -372,6 +372,7 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
 %x St_File
 %x St_Pattern
 %x St_Link
+%x St_Cite
 %x St_Ref
 %x St_Ref2
 %x St_IntRef
@@ -733,6 +734,22 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}
   			 unput(*yytext);
 			 return 0;
   		       }
+<St_Cite>{LABELID}     { // label to cite
+  			 g_token->name=yytext;
+			 return TK_WORD;
+  		       }
+<St_Cite>{BLANK}       { // white space
+  			 unput(' ');
+  			 return 0;
+                       }
+<St_Cite>\n	       { // new line
+                         unput(*yytext);
+  			 return 0;
+  		       }
+<St_Cite>.	       { // any other character
+                         unput(*yytext);
+  			 return 0;
+  		       }
 <St_Ref>{REFWORD}      { // label to refer to
   			 g_token->name=yytext;
 			 return TK_WORD;
@@ -1079,6 +1096,11 @@ void doctokenizerYYsetStateLink()
   BEGIN(St_Link);
 }
 
+void doctokenizerYYsetStateCite()
+{
+  BEGIN(St_Cite);
+}
+
 void doctokenizerYYsetStateRef()
 {
   BEGIN(St_Ref);
diff --git a/src/docvisitor.h b/src/docvisitor.h
index f65fd20..8978831 100644
--- a/src/docvisitor.h
+++ b/src/docvisitor.h
@@ -67,6 +67,7 @@ class DocImage;
 class DocDotFile;
 class DocMscFile;
 class DocLink;
+class DocCite;
 class DocRef;
 class DocFormula;
 class DocSecRefItem;
@@ -108,6 +109,7 @@ class DocVisitor
     virtual void visit(DocLinkedWord *) = 0;
     virtual void visit(DocIndexEntry *) = 0;
     virtual void visit(DocSimpleSectSep *) = 0;
+    virtual void visit(DocCite *) = 0;
     /*! @} */
 
     /*! @name Visitor functions for internal nodes 
diff --git a/src/dot.cpp b/src/dot.cpp
index 2cd6c83..8609efa 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -3808,6 +3808,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
  *  \param relPath relative path the to root of the output dir
  *  \param baseName the base name of the output files
  *  \param context the scope in which this graph is found (for resolving links)
+ *  \param graphId a unique id for this graph, use for dynamic sections
  */
 void writeDotImageMapFromFile(FTextStream &t,
                             const QCString &inFile, const QCString &outDir,
diff --git a/src/doxygen.bst b/src/doxygen.bst
new file mode 100644
index 0000000..23479fa
--- /dev/null
+++ b/src/doxygen.bst
@@ -0,0 +1,1414 @@
+%% doxygen.bst
+%% This is a modification of plainhtml.bst; the original copyright notice
+%% follows.
+
+%% ORIGINAL COPYRIGHT NOTICE OF plainhtml.bst
+%%
+%% plainhtml.bst
+%%
+%% Part of bibhtml, version 2.0.1, released 2009 November 2
+%% Hg node 6ca3807543d6.
+%% See <http://purl.org/nxg/dist/bibhtml>
+%%
+%% Copyright 1999, 2005, 2006, 2009, Norman Gray <norman@astro.gla.ac.uk>
+%%
+%% This is a modification of a modification!
+%%
+%%% Modification of BibTeX style file /usr/local/texlive/2008/texmf-dist/bibtex/bst/base/plain.bst
+%%% ... by urlbst, version 0.6-4 (marked with "% urlbst")
+%%% See <http://purl.org/nxg/dist/urlbst>
+%%% Added webpage entry type, and url and lastchecked fields.
+%%% Added eprint support.
+%%% Added DOI support.
+%%% Added PUBMED support.
+%%% Added hyperref support.
+%%% Original headers follow...
+
+% BibTeX standard bibliography style `plain'
+	% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
+	% Copyright (C) 1985, all rights reserved.
+	% Copying of this file is authorized only if either
+	% (1) you make absolutely no changes to your copy, including name, or
+	% (2) if you do make changes, you name it something other than
+	% btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
+	% This restriction helps ensure that all standard styles are identical.
+	% The file btxbst.doc has the documentation for this style.
+
+ENTRY
+  { address
+    author
+    booktitle
+    chapter
+    edition
+    editor
+    howpublished
+    institution
+    journal
+    key
+    month
+    note
+    number
+    organization
+    pages
+    publisher
+    school
+    series
+    title
+    type
+    volume
+    year
+    eprint % urlbst
+    doi % urlbst
+    pubmed % urlbst
+    url % urlbst
+    lastchecked % urlbst
+  }
+  {}
+  { label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block doiform }
+
+STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl pubmedprefix pubmedurl openinlinelink closeinlinelink } % urlbst...
+INTEGERS { inlinelinks makeinlinelink addeprints adddoiresolver addpubmedresolver }
+% Following constants may be adjusted by hand, if desired
+FUNCTION {init.urlbst.variables}
+{
+  "Available from: " 'urlintro := % prefix before URL
+  "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref
+  "arXiv:" 'eprintprefix := % text prefix printed before eprint ref
+  "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI
+  "doi:" 'doiprefix :=      % text prefix printed before DOI ref
+  "http://www.ncbi.nlm.nih.gov/pubmed/" 'pubmedurl := % prefix to make URL from PUBMED
+  "PMID:" 'pubmedprefix :=      % text prefix printed before PUBMED ref
+  #1 'addeprints :=         % 0=no eprints; 1=include eprints
+  #1 'adddoiresolver :=     % 0=no DOI resolver; 1=include it
+  #1 'addpubmedresolver :=     % 0=no PUBMED resolver; 1=include it
+  #1 'inlinelinks :=        % 0=URLs explicit; 1=URLs attached to titles
+  #1 'doiform :=            % 0=simple, but can produce invalid HTML; 1=needs post-processing
+  % the following are internal state variables, not config constants
+  #0 'makeinlinelink :=     % state variable managed by possibly.setup.inlinelink
+  "" 'openinlinelink :=     % ditto
+  "" 'closeinlinelink :=    % ditto
+}
+INTEGERS { 
+  bracket.state
+  outside.brackets
+  open.brackets
+  within.brackets
+  close.brackets
+  close.first.block
+}
+% ...urlbst to here
+FUNCTION {init.state.consts}
+{ #0 'outside.brackets := % urlbst
+  #1 'open.brackets :=
+  #2 'within.brackets :=
+  #3 'close.brackets :=
+
+  #0 'before.all :=
+  #1 'mid.sentence :=
+  #2 'after.sentence :=
+  #3 'after.block :=
+  #0 'close.first.block :=
+}
+
+STRINGS { s t }
+
+% urlbst
+FUNCTION {output.nonnull.original}
+{ 's :=
+  output.state mid.sentence =
+    { ", " * write$ }
+    { output.state after.block =
+	{ add.period$ write$
+          % close the <dt> after the end of the first block
+          close.first.block
+            { newline$
+              #0 'close.first.block := }
+	    { newline$ }
+          if$
+	}
+	{ output.state before.all =
+	    'write$
+	    { add.period$ " " * write$ }
+	  if$
+	}
+      if$
+      mid.sentence 'output.state :=
+    }
+  if$
+  s
+}
+
+% urlbst...
+% The following three functions are for handling inlinelink.  They wrap
+% a block of text which is potentially output with write$ by multiple
+% other functions, so we don't know the content a priori.
+% They communicate between each other using the variables makeinlinelink
+% (which is true if a link should be made), and closeinlinelink (which holds
+% the string which should close any current link.  They can be called
+% at any time, but start.inlinelink will be a no-op unless something has
+% previously set makeinlinelink true, and the two ...end.inlinelink functions
+% will only do their stuff if start.inlinelink has previously set
+% closeinlinelink to be non-empty.
+FUNCTION {possibly.setup.inlinelink}
+{ makeinlinelink
+   { "\rev CITEREF_" quote$ * url * quote$ * " [" * 'openinlinelink :=
+     "]" 'closeinlinelink :=
+     #0 'makeinlinelink := }
+   'skip$
+ if$ % makeinlinelink
+}
+FUNCTION {add.inlinelink}
+{ openinlinelink empty$
+    'skip$
+    { openinlinelink swap$ * closeinlinelink *
+      "" 'openinlinelink :=
+      }
+  if$
+}
+FUNCTION {output.nonnull}
+{ % Save the thing we've been asked to output
+  's :=
+  % If the bracket-state is close.brackets, then add a close-bracket to
+  % what is currently at the top of the stack, and set bracket.state
+  % to outside.brackets
+  bracket.state close.brackets =
+    { "]" *
+      outside.brackets 'bracket.state :=
+    }
+    'skip$
+  if$
+  bracket.state outside.brackets =
+    { % We're outside all brackets -- this is the normal situation.
+      % Write out what's currently at the top of the stack, using the
+      % original output.nonnull function.
+      s
+      add.inlinelink
+      output.nonnull.original % invoke the original output.nonnull
+    }
+    { % Still in brackets.  Add open-bracket or (continuation) comma, add the
+      % new text (in s) to the top of the stack, and move to the close-brackets
+      % state, ready for next time (unless inbrackets resets it).  If we come
+      % into this branch, then output.state is carefully undisturbed.
+      bracket.state open.brackets =
+        { " [" * }
+        { ", " * } % bracket.state will be within.brackets
+      if$ 
+      s * 
+      close.brackets 'bracket.state :=
+    }
+  if$
+}
+
+% Call this function just before adding something which should be presented in 
+% brackets.  bracket.state is handled specially within output.nonnull.
+FUNCTION {inbrackets}
+{ bracket.state close.brackets =
+    { within.brackets 'bracket.state := } % reset the state: not open nor closed
+    { open.brackets 'bracket.state := }
+  if$
+}
+
+FUNCTION {format.lastchecked}
+{ lastchecked empty$
+    { "" }
+    { inbrackets "cited " lastchecked * }
+  if$
+}
+% ...urlbst to here
+
+FUNCTION {output}
+{ duplicate$ empty$
+    'pop$
+    'output.nonnull
+  if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+  duplicate$ empty$
+    { pop$ "empty " t * " in " * cite$ * warning$ }
+    'output.nonnull
+  if$
+}
+
+FUNCTION {output.bibitem.original}
+{ newline$
+  cite$ write$
+  newline$
+  "[" label * "] " * write$
+  % the <dt> is closed within output.nonnull, as long as close.first.block is true
+  #1 'close.first.block :=
+  newline$
+  ""
+  before.all 'output.state :=
+}
+
+FUNCTION {fin.entry.original}
+{ add.period$
+  write$
+  newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+    'skip$
+    { after.block 'output.state := }
+  if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+    'skip$
+    { output.state before.all =
+	'skip$
+	{ after.sentence 'output.state := }
+      if$
+    }
+  if$
+}
+
+FUNCTION {not}
+{   { #0 }
+    { #1 }
+  if$
+}
+
+FUNCTION {and}
+{   'skip$
+    { pop$ #0 }
+  if$
+}
+
+FUNCTION {or}
+{   { pop$ #1 }
+    'skip$
+  if$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+    'skip$
+    'new.block
+  if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+  swap$ empty$
+  and
+    'skip$
+    'new.block
+  if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+    'skip$
+    'new.sentence
+  if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+  swap$ empty$
+  and
+    'skip$
+    'new.sentence
+  if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+    { pop$ "" }
+    'skip$
+  if$
+}
+
+FUNCTION {bold}
+{ duplicate$ empty$
+    { pop$ "" }
+    { "<b>" swap$ * "</b>" * }
+  if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+    { pop$ "" }
+    { "<em>" swap$ * "</em>" * }
+  if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+  #1 'nameptr :=
+  s num.names$ 'numnames :=
+  numnames 'namesleft :=
+    { namesleft #0 > }
+    { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+      nameptr #1 >
+	{ namesleft #1 >
+	    { ", " * t * }
+	    { numnames #2 >
+		{ "," * }
+		'skip$
+	      if$
+	      t "others" =
+		{ " et~al." * }
+		{ " and " * t * }
+	      if$
+	    }
+	  if$
+	}
+	't
+      if$
+      nameptr #1 + 'nameptr :=
+      namesleft #1 - 'namesleft :=
+    }
+  while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+    { "" }
+    { author format.names }
+  if$
+  bold
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+    { "" }
+    { editor format.names
+      editor num.names$ #1 >
+	{ ", editors" * }
+	{ ", editor" * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+    { "" }
+    { title "t" change.case$ }
+  if$
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+  ""
+    { t empty$ not }
+    { t #1 #1 substring$ "-" =
+	{ t #1 #2 substring$ "--" = not
+	    { "--" *
+	      t #2 global.max$ substring$ 't :=
+	    }
+	    {   { t #1 #1 substring$ "-" = }
+		{ "-" *
+		  t #2 global.max$ substring$ 't :=
+		}
+	      while$
+	    }
+	  if$
+	}
+	{ t #1 #1 substring$ *
+	  t #2 global.max$ substring$ 't :=
+	}
+      if$
+    }
+  while$
+}
+
+FUNCTION {format.date}
+{ year empty$
+    { month empty$
+	{ "" }
+	{ "there's a month but no year in " cite$ * warning$
+	  month
+	}
+      if$
+    }
+    { month empty$
+	'year
+	{ month " " * year * }
+      if$
+    }
+  if$
+  bold
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+    { "~" }
+    { " " }
+  if$
+  swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+    'pop$
+    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+  if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+    { "" }
+    { "volume" volume tie.or.space.connect
+      series empty$
+	'skip$
+	{ " of " * series emphasize * }
+      if$
+      "volume and number" number either.or.check
+    }
+  if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+    { number empty$
+	{ series field.or.null }
+	{ output.state mid.sentence =
+	    { "number" }
+	    { "Number" }
+	  if$
+	  number tie.or.space.connect
+	  series empty$
+	    { "there's a number but no series in " cite$ * warning$ }
+	    { " in " * series * }
+	  if$
+	}
+      if$
+    }
+    { "" }
+  if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+    { "" }
+    { output.state mid.sentence =
+	{ edition "l" change.case$ " edition" * }
+	{ edition "t" change.case$ " edition" * }
+      if$
+    }
+  if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+  #0 'multiresult :=
+    { multiresult not
+      t empty$ not
+      and
+    }
+    { t #1 #1 substring$
+      duplicate$ "-" =
+      swap$ duplicate$ "," =
+      swap$ "+" =
+      or or
+	{ #1 'multiresult := }
+	{ t #2 global.max$ substring$ 't := }
+      if$
+    }
+  while$
+  multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+    { "" }
+    { pages multi.page.check
+	{ "pages" pages n.dashify tie.or.space.connect }
+	{ "page" pages tie.or.space.connect }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+  number empty$
+    'skip$
+    { "(" number * ")" * *
+      volume empty$
+	{ "there's a number but no volume in " cite$ * warning$ }
+	'skip$
+      if$
+    }
+  if$
+  pages empty$
+    'skip$
+    { duplicate$ empty$
+	{ pop$ format.pages }
+	{ ":" * pages n.dashify * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+    'format.pages
+    { type empty$
+	{ "chapter" }
+	{ type "l" change.case$ }
+      if$
+      chapter tie.or.space.connect
+      pages empty$
+	'skip$
+	{ ", " * format.pages * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+    { "" }
+    { editor empty$
+	{ "In " booktitle emphasize * }
+	{ "In " format.editors * ", " * booktitle emphasize * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+  month empty$ year empty$ note empty$
+  and and and and and
+  key empty$ not and
+    { "all relevant fields are empty in " cite$ * warning$ }
+    'skip$
+  if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+    'skip$
+    { pop$
+      type "t" change.case$
+    }
+  if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+    { "Technical Report" }
+    'type
+  if$
+  number empty$
+    { "t" change.case$ }
+    { number tie.or.space.connect }
+  if$
+}
+
+FUNCTION {format.article.crossref}
+{ key empty$
+    { journal empty$
+	{ "need key or journal for " cite$ * " to crossref " * crossref *
+	  warning$
+	  ""
+	}
+	{ "In <em>" journal * "</em>" * }
+      if$
+    }
+    { "In " key * }
+  if$
+  " <span class='cite'>" * crossref * "</span>" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+  editor num.names$ duplicate$
+  #2 >
+    { pop$ " et~al." * }
+    { #2 <
+	'skip$
+	{ editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+	    { " et~al." * }
+	    { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+	  if$
+	}
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+      "In "
+    }
+    { "Volume" volume tie.or.space.connect
+      " of " *
+    }
+  if$
+  editor empty$
+  editor field.or.null author field.or.null =
+  or
+    { key empty$
+	{ series empty$
+	    { "need editor, key, or series for " cite$ * " to crossref " *
+	      crossref * warning$
+	      "" *
+	    }
+	    { "<em>" * series * "</em>" * }
+	  if$
+	}
+	{ key * }
+      if$
+    }
+    { format.crossref.editor * }
+  if$
+  " <span class='cite'>" * crossref * "</span>" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{ editor empty$
+  editor field.or.null author field.or.null =
+  or
+    { key empty$
+	{ booktitle empty$
+	    { "need editor, key, or booktitle for " cite$ * " to crossref " *
+	      crossref * warning$
+	      ""
+	    }
+	    { "In <em>" booktitle * "</em>" * }
+	  if$
+	}
+	{ "In " key * }
+      if$
+    }
+    { "In " format.crossref.editor * }
+  if$
+  " <span class='cite'>" * crossref * "</span>" *
+}
+
+% urlbst...
+% Functions for making hypertext links.
+FUNCTION {make.href}
+{ 
+  "<a href='" swap$ * "'><code>" * swap$ * "</code></a>" *
+}
+
+% If inlinelinks is true, then format.url should be a no-op, since it's
+% (a) redundant, and (b) could end up as a link-within-a-link.
+FUNCTION {format.url}
+{ inlinelinks #1 = url empty$ or
+    { "" }
+    { urlintro "<code>" * url * "</code>" * }
+  if$
+}
+
+FUNCTION {format.eprint}
+{ eprint empty$
+    { "" }
+    { eprintprefix eprint * eprinturl eprint * make.href }
+  if$
+}
+
+FUNCTION {format.doi}
+{ doi empty$
+    { "" }
+    { doiform #0 =
+        { doiprefix doi * doiurl doi * make.href }
+        { "DOI:{" doi * "}" * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.pubmed}
+{ pubmed empty$
+    { "" }
+    { pubmedprefix pubmed * pubmedurl pubmed * make.href }
+  if$
+}
+
+% Output a URL.  We can't use the more normal idiom (something like
+% `format.url output'), because the `inbrackets' within
+% format.lastchecked applies to everything between calls to `output',
+% so that `format.url format.lastchecked * output' ends up with both
+% the URL and the lastchecked in brackets.
+FUNCTION {output.url}
+{ url empty$
+    'skip$ 
+    { new.block 
+      format.url output
+      format.lastchecked output 
+    }
+  if$
+}
+
+FUNCTION {output.web.refs}
+{
+  new.block
+  output.url
+  addeprints eprint empty$ not and
+    { format.eprint output.nonnull }
+    'skip$
+  if$
+  adddoiresolver doi empty$ not and
+    { format.doi output.nonnull }
+    'skip$
+  if$
+  addpubmedresolver pubmed empty$ not and
+    { format.pubmed output.nonnull }
+    'skip$
+  if$
+}
+
+% Wrapper for output.bibitem.original.
+% If the URL field is not empty, set makeinlinelink to be true,
+% so that an inline link will be started at the next opportunity
+FUNCTION {output.bibitem}
+{ outside.brackets 'bracket.state :=
+  output.bibitem.original
+  inlinelinks url empty$ not and
+    { #1 'makeinlinelink := }
+    { #0 'makeinlinelink := }
+  if$
+}
+
+% Wrapper for fin.entry.original
+FUNCTION {fin.entry}
+{ output.web.refs  % urlbst
+  makeinlinelink       % ooops, it appears we didn't have a title for inlinelink
+    { possibly.setup.inlinelink % add some artificial link text here, as a fallback
+      "[link]" output.nonnull }
+    'skip$
+  if$
+  bracket.state close.brackets = % urlbst
+    { "]" * }
+    'skip$
+  if$
+  fin.entry.original
+}
+
+% Webpage entry type.
+% Title and url fields required;
+% author, note, year, month, and lastchecked fields optional
+% See references 
+%   ISO 690-2 http://www.nlc-bnc.ca/iso/tc46sc9/standard/690-2e.htm
+%   http://www.classroom.net/classroom/CitingNetResources.html
+%   http://neal.ctstateu.edu/history/cite.html
+%   http://www.cas.usf.edu/english/walker/mla.html
+% for citation formats for web pages.
+FUNCTION {webpage}
+{ output.bibitem
+  author empty$
+    { editor empty$
+        'skip$  % author and editor both optional
+        { format.editors output.nonnull }
+      if$
+    }
+    { editor empty$
+        { format.authors output.nonnull }
+        { "can't use both author and editor fields in " cite$ * warning$ }
+      if$
+    }
+  if$
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$
+  format.title "title" output.check
+  inbrackets "online" output
+  new.block
+  year empty$
+    'skip$
+    { format.date "year" output.check }
+  if$
+  % We don't need to output the URL details ('lastchecked' and 'url'),
+  % because fin.entry does that for us, using output.web.refs.  The only
+  % reason we would want to put them here is if we were to decide that
+  % they should go in front of the rather miscellaneous information in 'note'.
+  new.block
+  note output
+  fin.entry
+}
+% ...urlbst to here
+
+
+FUNCTION {article}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  crossref missing$
+    { journal emphasize "journal" output.check
+      possibly.setup.inlinelink format.vol.num.pages output% urlbst
+      format.date "year" output.check
+    }
+    { format.article.crossref output.nonnull
+      format.pages output
+    }
+  if$
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+  author empty$
+    { format.editors "author and editor" output.check }
+    { format.authors output.nonnull
+      crossref missing$
+	{ "author and editor" editor either.or.check }
+	'skip$
+      if$
+    }
+  if$
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.btitle "title" output.check
+  crossref missing$
+    { format.bvolume output
+      new.block
+      format.number.series output
+      new.sentence
+      publisher "publisher" output.check
+      address output
+    }
+    { new.block
+      format.book.crossref output.nonnull
+    }
+  if$
+  format.edition output
+  format.date "year" output.check
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+  format.authors output
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  howpublished address new.block.checkb
+  howpublished output
+  address output
+  format.date output
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+  author empty$
+    { format.editors "author and editor" output.check }
+    { format.authors output.nonnull
+      crossref missing$
+	{ "author and editor" editor either.or.check }
+	'skip$
+      if$
+    }
+  if$
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.btitle "title" output.check
+  crossref missing$
+    { format.bvolume output
+      format.chapter.pages "chapter and pages" output.check
+      new.block
+      format.number.series output
+      new.sentence
+      publisher "publisher" output.check
+      address output
+    }
+    { format.chapter.pages "chapter and pages" output.check
+      new.block
+      format.book.crossref output.nonnull
+    }
+  if$
+  format.edition output
+  format.date "year" output.check
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  crossref missing$
+    { format.in.ed.booktitle "booktitle" output.check
+      format.bvolume output
+      format.number.series output
+      format.chapter.pages output
+      new.sentence
+      publisher "publisher" output.check
+      address output
+      format.edition output
+      format.date "year" output.check
+    }
+    { format.incoll.inproc.crossref output.nonnull
+      format.chapter.pages output
+    }
+  if$
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  crossref missing$
+    { format.in.ed.booktitle "booktitle" output.check
+      format.bvolume output
+      format.number.series output
+      format.pages output
+      address empty$
+	{ organization publisher new.sentence.checkb
+	  organization output
+	  publisher output
+	  format.date "year" output.check
+	}
+	{ address output.nonnull
+	  format.date "year" output.check
+	  new.sentence
+	  organization output
+	  publisher output
+	}
+      if$
+    }
+    { format.incoll.inproc.crossref output.nonnull
+      format.pages output
+    }
+  if$
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+  author empty$
+    { organization empty$
+	'skip$
+	{ organization output.nonnull
+	  address output
+	}
+      if$
+    }
+    { format.authors output.nonnull }
+  if$
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.btitle "title" output.check
+  author empty$
+    { organization empty$
+	{ address new.block.checka
+	  address output
+	}
+	'skip$
+      if$
+    }
+    { organization address new.block.checkb
+      organization output
+      address output
+    }
+  if$
+  format.edition output
+  format.date output
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  "Master's thesis" format.thesis.type output.nonnull
+  school "school" output.check
+  address output
+  format.date "year" output.check
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+  format.authors output
+  title howpublished new.block.checkb
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title output
+  howpublished new.block.checka
+  howpublished output
+  format.date output
+  new.block
+  note output
+  fin.entry
+  empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.btitle "title" output.check
+  new.block
+  "PhD thesis" format.thesis.type output.nonnull
+  school "school" output.check
+  address output
+  format.date "year" output.check
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+  editor empty$
+    { organization output }
+    { format.editors output.nonnull }
+  if$
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.btitle "title" output.check
+  format.bvolume output
+  format.number.series output
+  address empty$
+    { editor empty$
+	{ publisher new.sentence.checka }
+	{ organization publisher new.sentence.checkb
+	  organization output
+	}
+      if$
+      publisher output
+      format.date "year" output.check
+    }
+    { address output.nonnull
+      format.date "year" output.check
+      new.sentence
+      editor empty$
+	'skip$
+	{ organization output }
+      if$
+      publisher output
+    }
+  if$
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  format.tr.number output.nonnull
+  institution "institution" output.check
+  address output
+  format.date "year" output.check
+  new.block
+  note output
+  fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+  format.authors "author" output.check
+  new.block
+  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst
+  format.title "title" output.check
+  new.block
+  note "note" output.check
+  format.date output
+  fin.entry
+}
+
+FUNCTION {default.type} { misc }
+MACRO {jan} {"January"}
+MACRO {feb} {"February"}
+MACRO {mar} {"March"}
+MACRO {apr} {"April"}
+MACRO {may} {"May"}
+MACRO {jun} {"June"}
+MACRO {jul} {"July"}
+MACRO {aug} {"August"}
+MACRO {sep} {"September"}
+MACRO {oct} {"October"}
+MACRO {nov} {"November"}
+MACRO {dec} {"December"}
+MACRO {acmcs} {"ACM Computing Surveys"}
+MACRO {acta} {"Acta Informatica"}
+MACRO {cacm} {"Communications of the ACM"}
+MACRO {ibmjrd} {"IBM Journal of Research and Development"}
+MACRO {ibmsj} {"IBM Systems Journal"}
+MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
+MACRO {ieeetc} {"IEEE Transactions on Computers"}
+MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+MACRO {ipl} {"Information Processing Letters"}
+MACRO {jacm} {"Journal of the ACM"}
+MACRO {jcss} {"Journal of Computer and System Sciences"}
+MACRO {scp} {"Science of Computer Programming"}
+MACRO {sicomp} {"SIAM Journal on Computing"}
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+MACRO {tods} {"ACM Transactions on Database Systems"}
+MACRO {tog} {"ACM Transactions on Graphics"}
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+MACRO {tcs} {"Theoretical Computer Science"}
+
+READ
+
+FUNCTION {sortify}
+{ purify$
+  "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+  'len :=
+  s #1 len substring$ =
+    { s len #1 + global.max$ substring$ }
+    's
+  if$
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+  #1 'nameptr :=
+  ""
+  s num.names$ 'numnames :=
+  numnames 'namesleft :=
+    { namesleft #0 > }
+    { nameptr #1 >
+	{ "   " * }
+	'skip$
+      if$
+      s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
+      nameptr numnames = t "others" = and
+	{ "et al" * }
+	{ t sortify * }
+      if$
+      nameptr #1 + 'nameptr :=
+      namesleft #1 - 'namesleft :=
+    }
+  while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+  "A " #2
+    "An " #3
+      "The " #4 t chop.word
+    chop.word
+  chop.word
+  sortify
+  #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+    { key empty$
+	{ "to sort, need author or key in " cite$ * warning$
+	  ""
+	}
+	{ key sortify }
+      if$
+    }
+    { author sort.format.names }
+  if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+    { editor empty$
+	{ key empty$
+	    { "to sort, need author, editor, or key in " cite$ * warning$
+	      ""
+	    }
+	    { key sortify }
+	  if$
+	}
+	{ editor sort.format.names }
+      if$
+    }
+    { author sort.format.names }
+  if$
+}
+
+FUNCTION {author.organization.sort}
+{ author empty$
+    { organization empty$
+	{ key empty$
+	    { "to sort, need author, organization, or key in " cite$ * warning$
+	      ""
+	    }
+	    { key sortify }
+	  if$
+	}
+	{ "The " #4 organization chop.word sortify }
+      if$
+    }
+    { author sort.format.names }
+  if$
+}
+
+FUNCTION {editor.organization.sort}
+{ editor empty$
+    { organization empty$
+	{ key empty$
+	    { "to sort, need editor, organization, or key in " cite$ * warning$
+	      ""
+	    }
+	    { key sortify }
+	  if$
+	}
+	{ "The " #4 organization chop.word sortify }
+      if$
+    }
+    { editor sort.format.names }
+  if$
+}
+
+FUNCTION {presort.by.author}
+{ type$ "book" =
+  type$ "inbook" =
+  or
+    'author.editor.sort
+    { type$ "proceedings" =
+	'editor.organization.sort
+	{ type$ "manual" =
+	    'author.organization.sort
+	    'author.sort
+	  if$
+	}
+      if$
+    }
+  if$
+  "    "
+  *
+  year field.or.null sortify
+  *
+  "    "
+  *
+  title field.or.null
+  sort.format.title
+  *
+  #1 entry.max$ substring$
+  'sort.key$ :=
+}
+
+FUNCTION {presort.by.year}
+{ year field.or.null sortify
+  "    "
+  *
+  type$ "book" =
+  type$ "inbook" =
+  or
+    'author.editor.sort
+    { type$ "proceedings" =
+	'editor.organization.sort
+	{ type$ "manual" =
+	    'author.organization.sort
+	    'author.sort
+	  if$
+	}
+      if$
+    }
+  if$
+  *
+  "    "
+  *
+  title field.or.null
+  sort.format.title
+  *
+  #1 entry.max$ substring$
+  'sort.key$ :=
+}
+
+ITERATE {presort.by.author}
+
+SORT
+
+STRINGS { longest.label }
+
+INTEGERS { number.label longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+  #1 'number.label :=
+  #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ number.label int.to.str$ 'label :=
+  number.label #1 + 'number.label :=
+  label width$ longest.label.width >
+    { label 'longest.label :=
+      label width$ 'longest.label.width :=
+    }
+    'skip$
+  if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+    'skip$
+    { preamble$ write$ newline$ }
+  if$
+  %"/** \page bibref References" write$ newline$
+  newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.urlbst.variables}
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+  %"*/" write$ newline$
+}
+
+EXECUTE {end.bib}
+
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 0924dd7..9d4b870 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -78,6 +78,7 @@
 #include "vhdlscanner.h"
 #include "vhdldocgen.h"
 #include "eclipsehelp.h"
+#include "cite.h"
 
 #include "layout.h"
 
@@ -108,6 +109,7 @@ FormulaDict      Doxygen::formulaNameDict(1009);   // the label name of all form
 PageSDict       *Doxygen::pageSDict = 0;
 PageSDict       *Doxygen::exampleSDict = 0;
 SectionDict      Doxygen::sectionDict(257);        // all page sections
+CiteDict        *Doxygen::citeDict=0;              // database of bibliographic references
 StringDict       Doxygen::aliasDict(257);          // aliases
 FileNameDict    *Doxygen::includeNameDict = 0;     // include names
 FileNameDict    *Doxygen::exampleNameDict = 0;     // examples
@@ -180,6 +182,7 @@ void clearAll()
   Doxygen::formulaDict.clear();      
   Doxygen::formulaNameDict.clear();  
   Doxygen::tagDestinationDict.clear();
+  delete Doxygen::citeDict;
   delete Doxygen::mainPage; Doxygen::mainPage=0;
 }
 
@@ -7408,7 +7411,7 @@ static void generateClassList(ClassSDict &classSDict)
     //printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
     if ((cd->getOuterScope()==0 || // <-- should not happen, but can if we read an old tag file
          cd->getOuterScope()==Doxygen::globalScope // only look at global classes
-        ) && !cd->isHidden() && !cd->isEmbeddedInGroupDocs()
+        ) && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
        ) 
     {
       // skip external references, anonymous compounds and 
@@ -8177,6 +8180,7 @@ static void resolveUserReferences()
 }
 
 
+
 //----------------------------------------------------------------------------
 // generate all separate documentation pages
 
@@ -8348,7 +8352,7 @@ static void generateNamespaceDocs()
              cd->templateMaster()==0
            ) // skip external references, anonymous compounds and 
              // template instances and nested classes
-           && !cd->isHidden()
+           && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
          )
       {
         msg("Generating docs for compound %s...\n",cd->name().data());
@@ -8609,36 +8613,9 @@ static void readTagFile(Entry *root,const char *tl)
     msg("Reading tag file `%s'...\n",fileName.data());
 
   parseTagFile(root,fi.absFilePath(),fi.fileName());
-
 }
 
 //----------------------------------------------------------------------------
-static void copyFile(const QCString &src,const QCString &dest)
-{
-  QFile sf(src);
-  if (sf.open(IO_ReadOnly))
-  {
-    QFileInfo fi(src);
-    QFile df(dest);
-    if (df.open(IO_WriteOnly))
-    {
-      char *buffer = new char[fi.size()];
-      sf.readBlock(buffer,fi.size());
-      df.writeBlock(buffer,fi.size());
-      df.flush();
-      delete[] buffer;
-    }
-    else
-    {
-      err("error: could not write to file %s\n",dest.data());
-    }
-  }
-  else
-  {
-    err("error: could not open user specified file %s\n",src.data());
-  }
-}
-
 static void copyStyleSheet()
 {
   QCString &htmlStyleSheet = Config_getString("HTML_STYLESHEET");
@@ -9231,9 +9208,9 @@ static void usage(const char *name)
   msg("   generated documentation:\n");
   msg("    %s -l layoutFileName.xml\n\n",name);
   msg("5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
-  msg("    RTF:   %s -w rtf styleSheetFile\n",name);
-  msg("    HTML:  %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
-  msg("    LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name);
+  msg("    RTF:        %s -w rtf styleSheetFile\n",name);
+  msg("    HTML:       %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
+  msg("    LaTeX:      %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name);
   msg("6) Use doxygen to generate an rtf extensions file\n");
   msg("    RTF:   %s -e rtf extensionsFile\n\n",name);
   msg("If -s is specified the comments in the config file will be omitted.\n");
@@ -9320,6 +9297,7 @@ void initDoxygen()
   Doxygen::tagDestinationDict.setAutoDelete(TRUE);
   Doxygen::lookupCache.setAutoDelete(TRUE);
   Doxygen::dirRelations.setAutoDelete(TRUE);
+  Doxygen::citeDict = new CiteDict(256);
 }
 
 void cleanUpDoxygen()
@@ -9578,9 +9556,9 @@ void readConfiguration(int argc, char **argv)
           cleanUpDoxygen();
           exit(0);
         }
-        else 
+        else
         {
-          err("error: Illegal format specifier %s: should be one of rtf, html, or latex\n",formatName);
+          err("error: Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName);
           cleanUpDoxygen();
           exit(1);
         }
@@ -10399,6 +10377,12 @@ void parseInput()
     computeDirDependencies();
   }
 
+  msg("Resolving citations...\n");
+  Doxygen::citeDict->resolve();
+
+  msg("Generating citations page...\n");
+  Doxygen::citeDict->generatePage();
+
   msg("Counting data structures...\n");
   countDataStructures();
  
@@ -10569,7 +10553,7 @@ void generateOutput()
   }
 
   //statistics();
-  
+
   // count the number of documented elements in the lists we have built. 
   // If the result is 0 we do not generate the lists and omit the 
   // corresponding links in the index.
diff --git a/src/doxygen.css b/src/doxygen.css
index 778b60c..8a2ebf4 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -629,6 +629,58 @@ table.doxtable th {
 	text-align:left;
 }
 
+table.fieldtable {
+        width: 100%;
+        margin-bottom: 10px;
+        border: 1px solid ##B4;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid ##B4;
+        border-bottom: 1px solid ##B4;
+        vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid ##B4;
+        width: 100%;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: ##E6;
+        font-size: 90%;
+        color: ##2B;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid ##B4;
+}
+
+
 .tabsearch {
 	top: 0px;
 	left: 10px;
@@ -846,6 +898,23 @@ div.zoom
 	border: 1px solid ##A0;
 }
 
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:##40;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
 @media print
 {
   #top { display: none; }
diff --git a/src/doxygen.h b/src/doxygen.h
index 9ed47e0..401c37f 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -48,6 +48,7 @@ class ObjCache;
 class Store;
 class QFileInfo;
 class BufStr;
+class CiteDict;
 
 typedef QList<QCString>    StringList;
 typedef QDict<FileDef>     FileDict;
@@ -126,6 +127,7 @@ class Doxygen
     static Store                    *symbolStorage;
     static QCString                  objDBFileName;
     static QCString                  entryDBFileName;
+    static CiteDict                 *citeDict;
     static bool                      gatherDefines;
     static bool                      userComments;
     static IndexList                 indexList;
diff --git a/src/doxygen_bst.h b/src/doxygen_bst.h
new file mode 100644
index 0000000..7acf63e
--- /dev/null
+++ b/src/doxygen_bst.h
@@ -0,0 +1,1414 @@
+"%% doxygen.bst\n"
+"%% This is a modification of plainhtml.bst; the original copyright notice\n"
+"%% follows.\n"
+"\n"
+"%% ORIGINAL COPYRIGHT NOTICE OF plainhtml.bst\n"
+"%%\n"
+"%% plainhtml.bst\n"
+"%%\n"
+"%% Part of bibhtml, version 2.0.1, released 2009 November 2\n"
+"%% Hg node 6ca3807543d6.\n"
+"%% See <http://purl.org/nxg/dist/bibhtml>\n"
+"%%\n"
+"%% Copyright 1999, 2005, 2006, 2009, Norman Gray <norman@astro.gla.ac.uk>\n"
+"%%\n"
+"%% This is a modification of a modification!\n"
+"%%\n"
+"%%% Modification of BibTeX style file /usr/local/texlive/2008/texmf-dist/bibtex/bst/base/plain.bst\n"
+"%%% ... by urlbst, version 0.6-4 (marked with \"% urlbst\")\n"
+"%%% See <http://purl.org/nxg/dist/urlbst>\n"
+"%%% Added webpage entry type, and url and lastchecked fields.\n"
+"%%% Added eprint support.\n"
+"%%% Added DOI support.\n"
+"%%% Added PUBMED support.\n"
+"%%% Added hyperref support.\n"
+"%%% Original headers follow...\n"
+"\n"
+"% BibTeX standard bibliography style `plain'\n"
+"	% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.\n"
+"	% Copyright (C) 1985, all rights reserved.\n"
+"	% Copying of this file is authorized only if either\n"
+"	% (1) you make absolutely no changes to your copy, including name, or\n"
+"	% (2) if you do make changes, you name it something other than\n"
+"	% btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.\n"
+"	% This restriction helps ensure that all standard styles are identical.\n"
+"	% The file btxbst.doc has the documentation for this style.\n"
+"\n"
+"ENTRY\n"
+"  { address\n"
+"    author\n"
+"    booktitle\n"
+"    chapter\n"
+"    edition\n"
+"    editor\n"
+"    howpublished\n"
+"    institution\n"
+"    journal\n"
+"    key\n"
+"    month\n"
+"    note\n"
+"    number\n"
+"    organization\n"
+"    pages\n"
+"    publisher\n"
+"    school\n"
+"    series\n"
+"    title\n"
+"    type\n"
+"    volume\n"
+"    year\n"
+"    eprint % urlbst\n"
+"    doi % urlbst\n"
+"    pubmed % urlbst\n"
+"    url % urlbst\n"
+"    lastchecked % urlbst\n"
+"  }\n"
+"  {}\n"
+"  { label }\n"
+"\n"
+"INTEGERS { output.state before.all mid.sentence after.sentence after.block doiform }\n"
+"\n"
+"STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl pubmedprefix pubmedurl openinlinelink closeinlinelink } % urlbst...\n"
+"INTEGERS { inlinelinks makeinlinelink addeprints adddoiresolver addpubmedresolver }\n"
+"% Following constants may be adjusted by hand, if desired\n"
+"FUNCTION {init.urlbst.variables}\n"
+"{\n"
+"  \"Available from: \" 'urlintro := % prefix before URL\n"
+"  \"http://arxiv.org/abs/\" 'eprinturl := % prefix to make URL from eprint ref\n"
+"  \"arXiv:\" 'eprintprefix := % text prefix printed before eprint ref\n"
+"  \"http://dx.doi.org/\" 'doiurl := % prefix to make URL from DOI\n"
+"  \"doi:\" 'doiprefix :=      % text prefix printed before DOI ref\n"
+"  \"http://www.ncbi.nlm.nih.gov/pubmed/\" 'pubmedurl := % prefix to make URL from PUBMED\n"
+"  \"PMID:\" 'pubmedprefix :=      % text prefix printed before PUBMED ref\n"
+"  #1 'addeprints :=         % 0=no eprints; 1=include eprints\n"
+"  #1 'adddoiresolver :=     % 0=no DOI resolver; 1=include it\n"
+"  #1 'addpubmedresolver :=     % 0=no PUBMED resolver; 1=include it\n"
+"  #1 'inlinelinks :=        % 0=URLs explicit; 1=URLs attached to titles\n"
+"  #1 'doiform :=            % 0=simple, but can produce invalid HTML; 1=needs post-processing\n"
+"  % the following are internal state variables, not config constants\n"
+"  #0 'makeinlinelink :=     % state variable managed by possibly.setup.inlinelink\n"
+"  \"\" 'openinlinelink :=     % ditto\n"
+"  \"\" 'closeinlinelink :=    % ditto\n"
+"}\n"
+"INTEGERS { \n"
+"  bracket.state\n"
+"  outside.brackets\n"
+"  open.brackets\n"
+"  within.brackets\n"
+"  close.brackets\n"
+"  close.first.block\n"
+"}\n"
+"% ...urlbst to here\n"
+"FUNCTION {init.state.consts}\n"
+"{ #0 'outside.brackets := % urlbst\n"
+"  #1 'open.brackets :=\n"
+"  #2 'within.brackets :=\n"
+"  #3 'close.brackets :=\n"
+"\n"
+"  #0 'before.all :=\n"
+"  #1 'mid.sentence :=\n"
+"  #2 'after.sentence :=\n"
+"  #3 'after.block :=\n"
+"  #0 'close.first.block :=\n"
+"}\n"
+"\n"
+"STRINGS { s t }\n"
+"\n"
+"% urlbst\n"
+"FUNCTION {output.nonnull.original}\n"
+"{ 's :=\n"
+"  output.state mid.sentence =\n"
+"    { \", \" * write$ }\n"
+"    { output.state after.block =\n"
+"	{ add.period$ write$\n"
+"          % close the <dt> after the end of the first block\n"
+"          close.first.block\n"
+"            { newline$\n"
+"              #0 'close.first.block := }\n"
+"	    { newline$ }\n"
+"          if$\n"
+"	}\n"
+"	{ output.state before.all =\n"
+"	    'write$\n"
+"	    { add.period$ \" \" * write$ }\n"
+"	  if$\n"
+"	}\n"
+"      if$\n"
+"      mid.sentence 'output.state :=\n"
+"    }\n"
+"  if$\n"
+"  s\n"
+"}\n"
+"\n"
+"% urlbst...\n"
+"% The following three functions are for handling inlinelink.  They wrap\n"
+"% a block of text which is potentially output with write$ by multiple\n"
+"% other functions, so we don't know the content a priori.\n"
+"% They communicate between each other using the variables makeinlinelink\n"
+"% (which is true if a link should be made), and closeinlinelink (which holds\n"
+"% the string which should close any current link.  They can be called\n"
+"% at any time, but start.inlinelink will be a no-op unless something has\n"
+"% previously set makeinlinelink true, and the two ...end.inlinelink functions\n"
+"% will only do their stuff if start.inlinelink has previously set\n"
+"% closeinlinelink to be non-empty.\n"
+"FUNCTION {possibly.setup.inlinelink}\n"
+"{ makeinlinelink\n"
+"   { \"\\rev CITEREF_\" quote$ * url * quote$ * \" [\" * 'openinlinelink :=\n"
+"     \"]\" 'closeinlinelink :=\n"
+"     #0 'makeinlinelink := }\n"
+"   'skip$\n"
+" if$ % makeinlinelink\n"
+"}\n"
+"FUNCTION {add.inlinelink}\n"
+"{ openinlinelink empty$\n"
+"    'skip$\n"
+"    { openinlinelink swap$ * closeinlinelink *\n"
+"      \"\" 'openinlinelink :=\n"
+"      }\n"
+"  if$\n"
+"}\n"
+"FUNCTION {output.nonnull}\n"
+"{ % Save the thing we've been asked to output\n"
+"  's :=\n"
+"  % If the bracket-state is close.brackets, then add a close-bracket to\n"
+"  % what is currently at the top of the stack, and set bracket.state\n"
+"  % to outside.brackets\n"
+"  bracket.state close.brackets =\n"
+"    { \"]\" *\n"
+"      outside.brackets 'bracket.state :=\n"
+"    }\n"
+"    'skip$\n"
+"  if$\n"
+"  bracket.state outside.brackets =\n"
+"    { % We're outside all brackets -- this is the normal situation.\n"
+"      % Write out what's currently at the top of the stack, using the\n"
+"      % original output.nonnull function.\n"
+"      s\n"
+"      add.inlinelink\n"
+"      output.nonnull.original % invoke the original output.nonnull\n"
+"    }\n"
+"    { % Still in brackets.  Add open-bracket or (continuation) comma, add the\n"
+"      % new text (in s) to the top of the stack, and move to the close-brackets\n"
+"      % state, ready for next time (unless inbrackets resets it).  If we come\n"
+"      % into this branch, then output.state is carefully undisturbed.\n"
+"      bracket.state open.brackets =\n"
+"        { \" [\" * }\n"
+"        { \", \" * } % bracket.state will be within.brackets\n"
+"      if$ \n"
+"      s * \n"
+"      close.brackets 'bracket.state :=\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"% Call this function just before adding something which should be presented in \n"
+"% brackets.  bracket.state is handled specially within output.nonnull.\n"
+"FUNCTION {inbrackets}\n"
+"{ bracket.state close.brackets =\n"
+"    { within.brackets 'bracket.state := } % reset the state: not open nor closed\n"
+"    { open.brackets 'bracket.state := }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.lastchecked}\n"
+"{ lastchecked empty$\n"
+"    { \"\" }\n"
+"    { inbrackets \"cited \" lastchecked * }\n"
+"  if$\n"
+"}\n"
+"% ...urlbst to here\n"
+"\n"
+"FUNCTION {output}\n"
+"{ duplicate$ empty$\n"
+"    'pop$\n"
+"    'output.nonnull\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {output.check}\n"
+"{ 't :=\n"
+"  duplicate$ empty$\n"
+"    { pop$ \"empty \" t * \" in \" * cite$ * warning$ }\n"
+"    'output.nonnull\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {output.bibitem.original}\n"
+"{ newline$\n"
+"  cite$ write$\n"
+"  newline$\n"
+"  \"[\" label * \"] \" * write$\n"
+"  % the <dt> is closed within output.nonnull, as long as close.first.block is true\n"
+"  #1 'close.first.block :=\n"
+"  newline$\n"
+"  \"\"\n"
+"  before.all 'output.state :=\n"
+"}\n"
+"\n"
+"FUNCTION {fin.entry.original}\n"
+"{ add.period$\n"
+"  write$\n"
+"  newline$\n"
+"}\n"
+"\n"
+"FUNCTION {new.block}\n"
+"{ output.state before.all =\n"
+"    'skip$\n"
+"    { after.block 'output.state := }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {new.sentence}\n"
+"{ output.state after.block =\n"
+"    'skip$\n"
+"    { output.state before.all =\n"
+"	'skip$\n"
+"	{ after.sentence 'output.state := }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {not}\n"
+"{   { #0 }\n"
+"    { #1 }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {and}\n"
+"{   'skip$\n"
+"    { pop$ #0 }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {or}\n"
+"{   { pop$ #1 }\n"
+"    'skip$\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {new.block.checka}\n"
+"{ empty$\n"
+"    'skip$\n"
+"    'new.block\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {new.block.checkb}\n"
+"{ empty$\n"
+"  swap$ empty$\n"
+"  and\n"
+"    'skip$\n"
+"    'new.block\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {new.sentence.checka}\n"
+"{ empty$\n"
+"    'skip$\n"
+"    'new.sentence\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {new.sentence.checkb}\n"
+"{ empty$\n"
+"  swap$ empty$\n"
+"  and\n"
+"    'skip$\n"
+"    'new.sentence\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {field.or.null}\n"
+"{ duplicate$ empty$\n"
+"    { pop$ \"\" }\n"
+"    'skip$\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {bold}\n"
+"{ duplicate$ empty$\n"
+"    { pop$ \"\" }\n"
+"    { \"<b>\" swap$ * \"</b>\" * }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {emphasize}\n"
+"{ duplicate$ empty$\n"
+"    { pop$ \"\" }\n"
+"    { \"<em>\" swap$ * \"</em>\" * }\n"
+"  if$\n"
+"}\n"
+"\n"
+"INTEGERS { nameptr namesleft numnames }\n"
+"\n"
+"FUNCTION {format.names}\n"
+"{ 's :=\n"
+"  #1 'nameptr :=\n"
+"  s num.names$ 'numnames :=\n"
+"  numnames 'namesleft :=\n"
+"    { namesleft #0 > }\n"
+"    { s nameptr \"{ff~}{vv~}{ll}{, jj}\" format.name$ 't :=\n"
+"      nameptr #1 >\n"
+"	{ namesleft #1 >\n"
+"	    { \", \" * t * }\n"
+"	    { numnames #2 >\n"
+"		{ \",\" * }\n"
+"		'skip$\n"
+"	      if$\n"
+"	      t \"others\" =\n"
+"		{ \" et~al.\" * }\n"
+"		{ \" and \" * t * }\n"
+"	      if$\n"
+"	    }\n"
+"	  if$\n"
+"	}\n"
+"	't\n"
+"      if$\n"
+"      nameptr #1 + 'nameptr :=\n"
+"      namesleft #1 - 'namesleft :=\n"
+"    }\n"
+"  while$\n"
+"}\n"
+"\n"
+"FUNCTION {format.authors}\n"
+"{ author empty$\n"
+"    { \"\" }\n"
+"    { author format.names }\n"
+"  if$\n"
+"  bold\n"
+"}\n"
+"\n"
+"FUNCTION {format.editors}\n"
+"{ editor empty$\n"
+"    { \"\" }\n"
+"    { editor format.names\n"
+"      editor num.names$ #1 >\n"
+"	{ \", editors\" * }\n"
+"	{ \", editor\" * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.title}\n"
+"{ title empty$\n"
+"    { \"\" }\n"
+"    { title \"t\" change.case$ }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {n.dashify}\n"
+"{ 't :=\n"
+"  \"\"\n"
+"    { t empty$ not }\n"
+"    { t #1 #1 substring$ \"-\" =\n"
+"	{ t #1 #2 substring$ \"--\" = not\n"
+"	    { \"--\" *\n"
+"	      t #2 global.max$ substring$ 't :=\n"
+"	    }\n"
+"	    {   { t #1 #1 substring$ \"-\" = }\n"
+"		{ \"-\" *\n"
+"		  t #2 global.max$ substring$ 't :=\n"
+"		}\n"
+"	      while$\n"
+"	    }\n"
+"	  if$\n"
+"	}\n"
+"	{ t #1 #1 substring$ *\n"
+"	  t #2 global.max$ substring$ 't :=\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"  while$\n"
+"}\n"
+"\n"
+"FUNCTION {format.date}\n"
+"{ year empty$\n"
+"    { month empty$\n"
+"	{ \"\" }\n"
+"	{ \"there's a month but no year in \" cite$ * warning$\n"
+"	  month\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"    { month empty$\n"
+"	'year\n"
+"	{ month \" \" * year * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  bold\n"
+"}\n"
+"\n"
+"FUNCTION {format.btitle}\n"
+"{ title emphasize\n"
+"}\n"
+"\n"
+"FUNCTION {tie.or.space.connect}\n"
+"{ duplicate$ text.length$ #3 <\n"
+"    { \"~\" }\n"
+"    { \" \" }\n"
+"  if$\n"
+"  swap$ * *\n"
+"}\n"
+"\n"
+"FUNCTION {either.or.check}\n"
+"{ empty$\n"
+"    'pop$\n"
+"    { \"can't use both \" swap$ * \" fields in \" * cite$ * warning$ }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.bvolume}\n"
+"{ volume empty$\n"
+"    { \"\" }\n"
+"    { \"volume\" volume tie.or.space.connect\n"
+"      series empty$\n"
+"	'skip$\n"
+"	{ \" of \" * series emphasize * }\n"
+"      if$\n"
+"      \"volume and number\" number either.or.check\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.number.series}\n"
+"{ volume empty$\n"
+"    { number empty$\n"
+"	{ series field.or.null }\n"
+"	{ output.state mid.sentence =\n"
+"	    { \"number\" }\n"
+"	    { \"Number\" }\n"
+"	  if$\n"
+"	  number tie.or.space.connect\n"
+"	  series empty$\n"
+"	    { \"there's a number but no series in \" cite$ * warning$ }\n"
+"	    { \" in \" * series * }\n"
+"	  if$\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"    { \"\" }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.edition}\n"
+"{ edition empty$\n"
+"    { \"\" }\n"
+"    { output.state mid.sentence =\n"
+"	{ edition \"l\" change.case$ \" edition\" * }\n"
+"	{ edition \"t\" change.case$ \" edition\" * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"INTEGERS { multiresult }\n"
+"\n"
+"FUNCTION {multi.page.check}\n"
+"{ 't :=\n"
+"  #0 'multiresult :=\n"
+"    { multiresult not\n"
+"      t empty$ not\n"
+"      and\n"
+"    }\n"
+"    { t #1 #1 substring$\n"
+"      duplicate$ \"-\" =\n"
+"      swap$ duplicate$ \",\" =\n"
+"      swap$ \"+\" =\n"
+"      or or\n"
+"	{ #1 'multiresult := }\n"
+"	{ t #2 global.max$ substring$ 't := }\n"
+"      if$\n"
+"    }\n"
+"  while$\n"
+"  multiresult\n"
+"}\n"
+"\n"
+"FUNCTION {format.pages}\n"
+"{ pages empty$\n"
+"    { \"\" }\n"
+"    { pages multi.page.check\n"
+"	{ \"pages\" pages n.dashify tie.or.space.connect }\n"
+"	{ \"page\" pages tie.or.space.connect }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.vol.num.pages}\n"
+"{ volume field.or.null\n"
+"  number empty$\n"
+"    'skip$\n"
+"    { \"(\" number * \")\" * *\n"
+"      volume empty$\n"
+"	{ \"there's a number but no volume in \" cite$ * warning$ }\n"
+"	'skip$\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  pages empty$\n"
+"    'skip$\n"
+"    { duplicate$ empty$\n"
+"	{ pop$ format.pages }\n"
+"	{ \":\" * pages n.dashify * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.chapter.pages}\n"
+"{ chapter empty$\n"
+"    'format.pages\n"
+"    { type empty$\n"
+"	{ \"chapter\" }\n"
+"	{ type \"l\" change.case$ }\n"
+"      if$\n"
+"      chapter tie.or.space.connect\n"
+"      pages empty$\n"
+"	'skip$\n"
+"	{ \", \" * format.pages * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.in.ed.booktitle}\n"
+"{ booktitle empty$\n"
+"    { \"\" }\n"
+"    { editor empty$\n"
+"	{ \"In \" booktitle emphasize * }\n"
+"	{ \"In \" format.editors * \", \" * booktitle emphasize * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {empty.misc.check}\n"
+"{ author empty$ title empty$ howpublished empty$\n"
+"  month empty$ year empty$ note empty$\n"
+"  and and and and and\n"
+"  key empty$ not and\n"
+"    { \"all relevant fields are empty in \" cite$ * warning$ }\n"
+"    'skip$\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.thesis.type}\n"
+"{ type empty$\n"
+"    'skip$\n"
+"    { pop$\n"
+"      type \"t\" change.case$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.tr.number}\n"
+"{ type empty$\n"
+"    { \"Technical Report\" }\n"
+"    'type\n"
+"  if$\n"
+"  number empty$\n"
+"    { \"t\" change.case$ }\n"
+"    { number tie.or.space.connect }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.article.crossref}\n"
+"{ key empty$\n"
+"    { journal empty$\n"
+"	{ \"need key or journal for \" cite$ * \" to crossref \" * crossref *\n"
+"	  warning$\n"
+"	  \"\"\n"
+"	}\n"
+"	{ \"In <em>\" journal * \"</em>\" * }\n"
+"      if$\n"
+"    }\n"
+"    { \"In \" key * }\n"
+"  if$\n"
+"  \" <span class='cite'>\" * crossref * \"</span>\" *\n"
+"}\n"
+"\n"
+"FUNCTION {format.crossref.editor}\n"
+"{ editor #1 \"{vv~}{ll}\" format.name$\n"
+"  editor num.names$ duplicate$\n"
+"  #2 >\n"
+"    { pop$ \" et~al.\" * }\n"
+"    { #2 <\n"
+"	'skip$\n"
+"	{ editor #2 \"{ff }{vv }{ll}{ jj}\" format.name$ \"others\" =\n"
+"	    { \" et~al.\" * }\n"
+"	    { \" and \" * editor #2 \"{vv~}{ll}\" format.name$ * }\n"
+"	  if$\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.book.crossref}\n"
+"{ volume empty$\n"
+"    { \"empty volume in \" cite$ * \"'s crossref of \" * crossref * warning$\n"
+"      \"In \"\n"
+"    }\n"
+"    { \"Volume\" volume tie.or.space.connect\n"
+"      \" of \" *\n"
+"    }\n"
+"  if$\n"
+"  editor empty$\n"
+"  editor field.or.null author field.or.null =\n"
+"  or\n"
+"    { key empty$\n"
+"	{ series empty$\n"
+"	    { \"need editor, key, or series for \" cite$ * \" to crossref \" *\n"
+"	      crossref * warning$\n"
+"	      \"\" *\n"
+"	    }\n"
+"	    { \"<em>\" * series * \"</em>\" * }\n"
+"	  if$\n"
+"	}\n"
+"	{ key * }\n"
+"      if$\n"
+"    }\n"
+"    { format.crossref.editor * }\n"
+"  if$\n"
+"  \" <span class='cite'>\" * crossref * \"</span>\" *\n"
+"}\n"
+"\n"
+"FUNCTION {format.incoll.inproc.crossref}\n"
+"{ editor empty$\n"
+"  editor field.or.null author field.or.null =\n"
+"  or\n"
+"    { key empty$\n"
+"	{ booktitle empty$\n"
+"	    { \"need editor, key, or booktitle for \" cite$ * \" to crossref \" *\n"
+"	      crossref * warning$\n"
+"	      \"\"\n"
+"	    }\n"
+"	    { \"In <em>\" booktitle * \"</em>\" * }\n"
+"	  if$\n"
+"	}\n"
+"	{ \"In \" key * }\n"
+"      if$\n"
+"    }\n"
+"    { \"In \" format.crossref.editor * }\n"
+"  if$\n"
+"  \" <span class='cite'>\" * crossref * \"</span>\" *\n"
+"}\n"
+"\n"
+"% urlbst...\n"
+"% Functions for making hypertext links.\n"
+"FUNCTION {make.href}\n"
+"{ \n"
+"  \"<a href='\" swap$ * \"'><code>\" * swap$ * \"</code></a>\" *\n"
+"}\n"
+"\n"
+"% If inlinelinks is true, then format.url should be a no-op, since it's\n"
+"% (a) redundant, and (b) could end up as a link-within-a-link.\n"
+"FUNCTION {format.url}\n"
+"{ inlinelinks #1 = url empty$ or\n"
+"    { \"\" }\n"
+"    { urlintro \"<code>\" * url * \"</code>\" * }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.eprint}\n"
+"{ eprint empty$\n"
+"    { \"\" }\n"
+"    { eprintprefix eprint * eprinturl eprint * make.href }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.doi}\n"
+"{ doi empty$\n"
+"    { \"\" }\n"
+"    { doiform #0 =\n"
+"        { doiprefix doi * doiurl doi * make.href }\n"
+"        { \"DOI:{\" doi * \"}\" * }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {format.pubmed}\n"
+"{ pubmed empty$\n"
+"    { \"\" }\n"
+"    { pubmedprefix pubmed * pubmedurl pubmed * make.href }\n"
+"  if$\n"
+"}\n"
+"\n"
+"% Output a URL.  We can't use the more normal idiom (something like\n"
+"% `format.url output'), because the `inbrackets' within\n"
+"% format.lastchecked applies to everything between calls to `output',\n"
+"% so that `format.url format.lastchecked * output' ends up with both\n"
+"% the URL and the lastchecked in brackets.\n"
+"FUNCTION {output.url}\n"
+"{ url empty$\n"
+"    'skip$ \n"
+"    { new.block \n"
+"      format.url output\n"
+"      format.lastchecked output \n"
+"    }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {output.web.refs}\n"
+"{\n"
+"  new.block\n"
+"  output.url\n"
+"  addeprints eprint empty$ not and\n"
+"    { format.eprint output.nonnull }\n"
+"    'skip$\n"
+"  if$\n"
+"  adddoiresolver doi empty$ not and\n"
+"    { format.doi output.nonnull }\n"
+"    'skip$\n"
+"  if$\n"
+"  addpubmedresolver pubmed empty$ not and\n"
+"    { format.pubmed output.nonnull }\n"
+"    'skip$\n"
+"  if$\n"
+"}\n"
+"\n"
+"% Wrapper for output.bibitem.original.\n"
+"% If the URL field is not empty, set makeinlinelink to be true,\n"
+"% so that an inline link will be started at the next opportunity\n"
+"FUNCTION {output.bibitem}\n"
+"{ outside.brackets 'bracket.state :=\n"
+"  output.bibitem.original\n"
+"  inlinelinks url empty$ not and\n"
+"    { #1 'makeinlinelink := }\n"
+"    { #0 'makeinlinelink := }\n"
+"  if$\n"
+"}\n"
+"\n"
+"% Wrapper for fin.entry.original\n"
+"FUNCTION {fin.entry}\n"
+"{ output.web.refs  % urlbst\n"
+"  makeinlinelink       % ooops, it appears we didn't have a title for inlinelink\n"
+"    { possibly.setup.inlinelink % add some artificial link text here, as a fallback\n"
+"      \"[link]\" output.nonnull }\n"
+"    'skip$\n"
+"  if$\n"
+"  bracket.state close.brackets = % urlbst\n"
+"    { \"]\" * }\n"
+"    'skip$\n"
+"  if$\n"
+"  fin.entry.original\n"
+"}\n"
+"\n"
+"% Webpage entry type.\n"
+"% Title and url fields required;\n"
+"% author, note, year, month, and lastchecked fields optional\n"
+"% See references \n"
+"%   ISO 690-2 http://www.nlc-bnc.ca/iso/tc46sc9/standard/690-2e.htm\n"
+"%   http://www.classroom.net/classroom/CitingNetResources.html\n"
+"%   http://neal.ctstateu.edu/history/cite.html\n"
+"%   http://www.cas.usf.edu/english/walker/mla.html\n"
+"% for citation formats for web pages.\n"
+"FUNCTION {webpage}\n"
+"{ output.bibitem\n"
+"  author empty$\n"
+"    { editor empty$\n"
+"        'skip$  % author and editor both optional\n"
+"        { format.editors output.nonnull }\n"
+"      if$\n"
+"    }\n"
+"    { editor empty$\n"
+"        { format.authors output.nonnull }\n"
+"        { \"can't use both author and editor fields in \" cite$ * warning$ }\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$\n"
+"  format.title \"title\" output.check\n"
+"  inbrackets \"online\" output\n"
+"  new.block\n"
+"  year empty$\n"
+"    'skip$\n"
+"    { format.date \"year\" output.check }\n"
+"  if$\n"
+"  % We don't need to output the URL details ('lastchecked' and 'url'),\n"
+"  % because fin.entry does that for us, using output.web.refs.  The only\n"
+"  % reason we would want to put them here is if we were to decide that\n"
+"  % they should go in front of the rather miscellaneous information in 'note'.\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"% ...urlbst to here\n"
+"\n"
+"\n"
+"FUNCTION {article}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  crossref missing$\n"
+"    { journal emphasize \"journal\" output.check\n"
+"      possibly.setup.inlinelink format.vol.num.pages output% urlbst\n"
+"      format.date \"year\" output.check\n"
+"    }\n"
+"    { format.article.crossref output.nonnull\n"
+"      format.pages output\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {book}\n"
+"{ output.bibitem\n"
+"  author empty$\n"
+"    { format.editors \"author and editor\" output.check }\n"
+"    { format.authors output.nonnull\n"
+"      crossref missing$\n"
+"	{ \"author and editor\" editor either.or.check }\n"
+"	'skip$\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.btitle \"title\" output.check\n"
+"  crossref missing$\n"
+"    { format.bvolume output\n"
+"      new.block\n"
+"      format.number.series output\n"
+"      new.sentence\n"
+"      publisher \"publisher\" output.check\n"
+"      address output\n"
+"    }\n"
+"    { new.block\n"
+"      format.book.crossref output.nonnull\n"
+"    }\n"
+"  if$\n"
+"  format.edition output\n"
+"  format.date \"year\" output.check\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {booklet}\n"
+"{ output.bibitem\n"
+"  format.authors output\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  howpublished address new.block.checkb\n"
+"  howpublished output\n"
+"  address output\n"
+"  format.date output\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {inbook}\n"
+"{ output.bibitem\n"
+"  author empty$\n"
+"    { format.editors \"author and editor\" output.check }\n"
+"    { format.authors output.nonnull\n"
+"      crossref missing$\n"
+"	{ \"author and editor\" editor either.or.check }\n"
+"	'skip$\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.btitle \"title\" output.check\n"
+"  crossref missing$\n"
+"    { format.bvolume output\n"
+"      format.chapter.pages \"chapter and pages\" output.check\n"
+"      new.block\n"
+"      format.number.series output\n"
+"      new.sentence\n"
+"      publisher \"publisher\" output.check\n"
+"      address output\n"
+"    }\n"
+"    { format.chapter.pages \"chapter and pages\" output.check\n"
+"      new.block\n"
+"      format.book.crossref output.nonnull\n"
+"    }\n"
+"  if$\n"
+"  format.edition output\n"
+"  format.date \"year\" output.check\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {incollection}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  crossref missing$\n"
+"    { format.in.ed.booktitle \"booktitle\" output.check\n"
+"      format.bvolume output\n"
+"      format.number.series output\n"
+"      format.chapter.pages output\n"
+"      new.sentence\n"
+"      publisher \"publisher\" output.check\n"
+"      address output\n"
+"      format.edition output\n"
+"      format.date \"year\" output.check\n"
+"    }\n"
+"    { format.incoll.inproc.crossref output.nonnull\n"
+"      format.chapter.pages output\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {inproceedings}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  crossref missing$\n"
+"    { format.in.ed.booktitle \"booktitle\" output.check\n"
+"      format.bvolume output\n"
+"      format.number.series output\n"
+"      format.pages output\n"
+"      address empty$\n"
+"	{ organization publisher new.sentence.checkb\n"
+"	  organization output\n"
+"	  publisher output\n"
+"	  format.date \"year\" output.check\n"
+"	}\n"
+"	{ address output.nonnull\n"
+"	  format.date \"year\" output.check\n"
+"	  new.sentence\n"
+"	  organization output\n"
+"	  publisher output\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"    { format.incoll.inproc.crossref output.nonnull\n"
+"      format.pages output\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {conference} { inproceedings }\n"
+"\n"
+"FUNCTION {manual}\n"
+"{ output.bibitem\n"
+"  author empty$\n"
+"    { organization empty$\n"
+"	'skip$\n"
+"	{ organization output.nonnull\n"
+"	  address output\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"    { format.authors output.nonnull }\n"
+"  if$\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.btitle \"title\" output.check\n"
+"  author empty$\n"
+"    { organization empty$\n"
+"	{ address new.block.checka\n"
+"	  address output\n"
+"	}\n"
+"	'skip$\n"
+"      if$\n"
+"    }\n"
+"    { organization address new.block.checkb\n"
+"      organization output\n"
+"      address output\n"
+"    }\n"
+"  if$\n"
+"  format.edition output\n"
+"  format.date output\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {mastersthesis}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  \"Master's thesis\" format.thesis.type output.nonnull\n"
+"  school \"school\" output.check\n"
+"  address output\n"
+"  format.date \"year\" output.check\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {misc}\n"
+"{ output.bibitem\n"
+"  format.authors output\n"
+"  title howpublished new.block.checkb\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title output\n"
+"  howpublished new.block.checka\n"
+"  howpublished output\n"
+"  format.date output\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"  empty.misc.check\n"
+"}\n"
+"\n"
+"FUNCTION {phdthesis}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.btitle \"title\" output.check\n"
+"  new.block\n"
+"  \"PhD thesis\" format.thesis.type output.nonnull\n"
+"  school \"school\" output.check\n"
+"  address output\n"
+"  format.date \"year\" output.check\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {proceedings}\n"
+"{ output.bibitem\n"
+"  editor empty$\n"
+"    { organization output }\n"
+"    { format.editors output.nonnull }\n"
+"  if$\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.btitle \"title\" output.check\n"
+"  format.bvolume output\n"
+"  format.number.series output\n"
+"  address empty$\n"
+"    { editor empty$\n"
+"	{ publisher new.sentence.checka }\n"
+"	{ organization publisher new.sentence.checkb\n"
+"	  organization output\n"
+"	}\n"
+"      if$\n"
+"      publisher output\n"
+"      format.date \"year\" output.check\n"
+"    }\n"
+"    { address output.nonnull\n"
+"      format.date \"year\" output.check\n"
+"      new.sentence\n"
+"      editor empty$\n"
+"	'skip$\n"
+"	{ organization output }\n"
+"      if$\n"
+"      publisher output\n"
+"    }\n"
+"  if$\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {techreport}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  format.tr.number output.nonnull\n"
+"  institution \"institution\" output.check\n"
+"  address output\n"
+"  format.date \"year\" output.check\n"
+"  new.block\n"
+"  note output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {unpublished}\n"
+"{ output.bibitem\n"
+"  format.authors \"author\" output.check\n"
+"  new.block\n"
+"  title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst\n"
+"  format.title \"title\" output.check\n"
+"  new.block\n"
+"  note \"note\" output.check\n"
+"  format.date output\n"
+"  fin.entry\n"
+"}\n"
+"\n"
+"FUNCTION {default.type} { misc }\n"
+"MACRO {jan} {\"January\"}\n"
+"MACRO {feb} {\"February\"}\n"
+"MACRO {mar} {\"March\"}\n"
+"MACRO {apr} {\"April\"}\n"
+"MACRO {may} {\"May\"}\n"
+"MACRO {jun} {\"June\"}\n"
+"MACRO {jul} {\"July\"}\n"
+"MACRO {aug} {\"August\"}\n"
+"MACRO {sep} {\"September\"}\n"
+"MACRO {oct} {\"October\"}\n"
+"MACRO {nov} {\"November\"}\n"
+"MACRO {dec} {\"December\"}\n"
+"MACRO {acmcs} {\"ACM Computing Surveys\"}\n"
+"MACRO {acta} {\"Acta Informatica\"}\n"
+"MACRO {cacm} {\"Communications of the ACM\"}\n"
+"MACRO {ibmjrd} {\"IBM Journal of Research and Development\"}\n"
+"MACRO {ibmsj} {\"IBM Systems Journal\"}\n"
+"MACRO {ieeese} {\"IEEE Transactions on Software Engineering\"}\n"
+"MACRO {ieeetc} {\"IEEE Transactions on Computers\"}\n"
+"MACRO {ieeetcad} {\"IEEE Transactions on Computer-Aided Design of Integrated Circuits\"}\n"
+"MACRO {ipl} {\"Information Processing Letters\"}\n"
+"MACRO {jacm} {\"Journal of the ACM\"}\n"
+"MACRO {jcss} {\"Journal of Computer and System Sciences\"}\n"
+"MACRO {scp} {\"Science of Computer Programming\"}\n"
+"MACRO {sicomp} {\"SIAM Journal on Computing\"}\n"
+"MACRO {tocs} {\"ACM Transactions on Computer Systems\"}\n"
+"MACRO {tods} {\"ACM Transactions on Database Systems\"}\n"
+"MACRO {tog} {\"ACM Transactions on Graphics\"}\n"
+"MACRO {toms} {\"ACM Transactions on Mathematical Software\"}\n"
+"MACRO {toois} {\"ACM Transactions on Office Information Systems\"}\n"
+"MACRO {toplas} {\"ACM Transactions on Programming Languages and Systems\"}\n"
+"MACRO {tcs} {\"Theoretical Computer Science\"}\n"
+"\n"
+"READ\n"
+"\n"
+"FUNCTION {sortify}\n"
+"{ purify$\n"
+"  \"l\" change.case$\n"
+"}\n"
+"\n"
+"INTEGERS { len }\n"
+"\n"
+"FUNCTION {chop.word}\n"
+"{ 's :=\n"
+"  'len :=\n"
+"  s #1 len substring$ =\n"
+"    { s len #1 + global.max$ substring$ }\n"
+"    's\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {sort.format.names}\n"
+"{ 's :=\n"
+"  #1 'nameptr :=\n"
+"  \"\"\n"
+"  s num.names$ 'numnames :=\n"
+"  numnames 'namesleft :=\n"
+"    { namesleft #0 > }\n"
+"    { nameptr #1 >\n"
+"	{ \"   \" * }\n"
+"	'skip$\n"
+"      if$\n"
+"      s nameptr \"{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}\" format.name$ 't :=\n"
+"      nameptr numnames = t \"others\" = and\n"
+"	{ \"et al\" * }\n"
+"	{ t sortify * }\n"
+"      if$\n"
+"      nameptr #1 + 'nameptr :=\n"
+"      namesleft #1 - 'namesleft :=\n"
+"    }\n"
+"  while$\n"
+"}\n"
+"\n"
+"FUNCTION {sort.format.title}\n"
+"{ 't :=\n"
+"  \"A \" #2\n"
+"    \"An \" #3\n"
+"      \"The \" #4 t chop.word\n"
+"    chop.word\n"
+"  chop.word\n"
+"  sortify\n"
+"  #1 global.max$ substring$\n"
+"}\n"
+"\n"
+"FUNCTION {author.sort}\n"
+"{ author empty$\n"
+"    { key empty$\n"
+"	{ \"to sort, need author or key in \" cite$ * warning$\n"
+"	  \"\"\n"
+"	}\n"
+"	{ key sortify }\n"
+"      if$\n"
+"    }\n"
+"    { author sort.format.names }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {author.editor.sort}\n"
+"{ author empty$\n"
+"    { editor empty$\n"
+"	{ key empty$\n"
+"	    { \"to sort, need author, editor, or key in \" cite$ * warning$\n"
+"	      \"\"\n"
+"	    }\n"
+"	    { key sortify }\n"
+"	  if$\n"
+"	}\n"
+"	{ editor sort.format.names }\n"
+"      if$\n"
+"    }\n"
+"    { author sort.format.names }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {author.organization.sort}\n"
+"{ author empty$\n"
+"    { organization empty$\n"
+"	{ key empty$\n"
+"	    { \"to sort, need author, organization, or key in \" cite$ * warning$\n"
+"	      \"\"\n"
+"	    }\n"
+"	    { key sortify }\n"
+"	  if$\n"
+"	}\n"
+"	{ \"The \" #4 organization chop.word sortify }\n"
+"      if$\n"
+"    }\n"
+"    { author sort.format.names }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {editor.organization.sort}\n"
+"{ editor empty$\n"
+"    { organization empty$\n"
+"	{ key empty$\n"
+"	    { \"to sort, need editor, organization, or key in \" cite$ * warning$\n"
+"	      \"\"\n"
+"	    }\n"
+"	    { key sortify }\n"
+"	  if$\n"
+"	}\n"
+"	{ \"The \" #4 organization chop.word sortify }\n"
+"      if$\n"
+"    }\n"
+"    { editor sort.format.names }\n"
+"  if$\n"
+"}\n"
+"\n"
+"FUNCTION {presort.by.author}\n"
+"{ type$ \"book\" =\n"
+"  type$ \"inbook\" =\n"
+"  or\n"
+"    'author.editor.sort\n"
+"    { type$ \"proceedings\" =\n"
+"	'editor.organization.sort\n"
+"	{ type$ \"manual\" =\n"
+"	    'author.organization.sort\n"
+"	    'author.sort\n"
+"	  if$\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  \"    \"\n"
+"  *\n"
+"  year field.or.null sortify\n"
+"  *\n"
+"  \"    \"\n"
+"  *\n"
+"  title field.or.null\n"
+"  sort.format.title\n"
+"  *\n"
+"  #1 entry.max$ substring$\n"
+"  'sort.key$ :=\n"
+"}\n"
+"\n"
+"FUNCTION {presort.by.year}\n"
+"{ year field.or.null sortify\n"
+"  \"    \"\n"
+"  *\n"
+"  type$ \"book\" =\n"
+"  type$ \"inbook\" =\n"
+"  or\n"
+"    'author.editor.sort\n"
+"    { type$ \"proceedings\" =\n"
+"	'editor.organization.sort\n"
+"	{ type$ \"manual\" =\n"
+"	    'author.organization.sort\n"
+"	    'author.sort\n"
+"	  if$\n"
+"	}\n"
+"      if$\n"
+"    }\n"
+"  if$\n"
+"  *\n"
+"  \"    \"\n"
+"  *\n"
+"  title field.or.null\n"
+"  sort.format.title\n"
+"  *\n"
+"  #1 entry.max$ substring$\n"
+"  'sort.key$ :=\n"
+"}\n"
+"\n"
+"ITERATE {presort.by.author}\n"
+"\n"
+"SORT\n"
+"\n"
+"STRINGS { longest.label }\n"
+"\n"
+"INTEGERS { number.label longest.label.width }\n"
+"\n"
+"FUNCTION {initialize.longest.label}\n"
+"{ \"\" 'longest.label :=\n"
+"  #1 'number.label :=\n"
+"  #0 'longest.label.width :=\n"
+"}\n"
+"\n"
+"FUNCTION {longest.label.pass}\n"
+"{ number.label int.to.str$ 'label :=\n"
+"  number.label #1 + 'number.label :=\n"
+"  label width$ longest.label.width >\n"
+"    { label 'longest.label :=\n"
+"      label width$ 'longest.label.width :=\n"
+"    }\n"
+"    'skip$\n"
+"  if$\n"
+"}\n"
+"\n"
+"EXECUTE {initialize.longest.label}\n"
+"\n"
+"ITERATE {longest.label.pass}\n"
+"\n"
+"FUNCTION {begin.bib}\n"
+"{ preamble$ empty$\n"
+"    'skip$\n"
+"    { preamble$ write$ newline$ }\n"
+"  if$\n"
+"  %\"/** \\page bibref References\" write$ newline$\n"
+"  newline$\n"
+"}\n"
+"\n"
+"EXECUTE {begin.bib}\n"
+"\n"
+"EXECUTE {init.urlbst.variables}\n"
+"EXECUTE {init.state.consts}\n"
+"\n"
+"ITERATE {call.type$}\n"
+"\n"
+"FUNCTION {end.bib}\n"
+"{ newline$\n"
+"  %\"*/\" write$ newline$\n"
+"}\n"
+"\n"
+"EXECUTE {end.bib}\n"
+"\n"
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index f4069f6..a7b659e 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -629,6 +629,58 @@
 "	text-align:left;\n"
 "}\n"
 "\n"
+"table.fieldtable {\n"
+"        width: 100%;\n"
+"        margin-bottom: 10px;\n"
+"        border: 1px solid ##B4;\n"
+"        border-spacing: 0px;\n"
+"        -moz-border-radius: 4px;\n"
+"        -webkit-border-radius: 4px;\n"
+"        border-radius: 4px;\n"
+"        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n"
+"        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n"
+"        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n"
+"}\n"
+"\n"
+".fieldtable td, .fieldtable th {\n"
+"        padding: 3px 7px 2px;\n"
+"}\n"
+"\n"
+".fieldtable td.fieldtype, .fieldtable td.fieldname {\n"
+"        white-space: nowrap;\n"
+"        border-right: 1px solid ##B4;\n"
+"        border-bottom: 1px solid ##B4;\n"
+"        vertical-align: top;\n"
+"}\n"
+"\n"
+".fieldtable td.fielddoc {\n"
+"        border-bottom: 1px solid ##B4;\n"
+"        width: 100%;\n"
+"}\n"
+"\n"
+".fieldtable tr:last-child td {\n"
+"        border-bottom: none;\n"
+"}\n"
+"\n"
+".fieldtable th {\n"
+"        background-image:url('nav_f.png');\n"
+"        background-repeat:repeat-x;\n"
+"        background-color: ##E6;\n"
+"        font-size: 90%;\n"
+"        color: ##2B;\n"
+"        padding-bottom: 4px;\n"
+"        padding-top: 5px;\n"
+"        text-align:left;\n"
+"        -moz-border-radius-topleft: 4px;\n"
+"        -moz-border-radius-topright: 4px;\n"
+"        -webkit-border-top-left-radius: 4px;\n"
+"        -webkit-border-top-right-radius: 4px;\n"
+"        border-top-left-radius: 4px;\n"
+"        border-top-right-radius: 4px;\n"
+"        border-bottom: 1px solid ##B4;\n"
+"}\n"
+"\n"
+"\n"
 ".tabsearch {\n"
 "	top: 0px;\n"
 "	left: 10px;\n"
@@ -846,6 +898,23 @@
 "	border: 1px solid ##A0;\n"
 "}\n"
 "\n"
+"dl.citelist {\n"
+"        margin-bottom:50px;\n"
+"}\n"
+"\n"
+"dl.citelist dt {\n"
+"        color:##40;\n"
+"        float:left;\n"
+"        font-weight:bold;\n"
+"        margin-right:10px;\n"
+"        padding:5px;\n"
+"}\n"
+"\n"
+"dl.citelist dd {\n"
+"        margin:2px 0;\n"
+"        padding:5px 0;\n"
+"}\n"
+"\n"
 "@media print\n"
 "{\n"
 "  #top { display: none; }\n"
diff --git a/src/entry.cpp b/src/entry.cpp
index cbd519e..be5f9e4 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -360,6 +360,12 @@ void Entry::addSpecialListItem(const char *listName,int itemId)
   sli->append(ili);
 }
 
+Entry *Entry::removeSubEntry(Entry *e)
+{
+ int i = m_sublist->find(e);
+ return i!=-1 ? m_sublist->take(i) : 0;
+}
+
 //------------------------------------------------------------------
 
 
diff --git a/src/entry.h b/src/entry.h
index ddb2017..36d23c6 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -289,23 +289,43 @@ class Entry
 
     Entry();
     Entry(const Entry &);
-    ~Entry();
+   ~Entry();
+
+    /*! Returns the static size of the Entry (so excluding any dynamic memory) */
     int getSize();
+
     void addSpecialListItem(const char *listName,int index);
     void createNavigationIndex(EntryNav *rootNav,FileStorage *storage,FileDef *fd);
 
     // while parsing a file these function can be used to navigate/build the tree
     void setParent(Entry *parent) { m_parent = parent; }
+
+    /*! Returns the parent for this Entry or 0 if this entry has no parent. */
     Entry *parent() const { return m_parent; }
+
+    /*! Returns the list of children for this Entry 
+     *  @see addSubEntry() and removeSubEntry()
+     */
     const QList<Entry> *children() const { return m_sublist; }
 
-    /*! Adds entry \e as a child to this entry */
-    void	addSubEntry (Entry* e) ;
+    /*! Adds entry \a e as a child to this entry */
+    void addSubEntry (Entry* e) ;
+
+    /*! Removes entry \a e from the list of children. 
+     *  Returns a pointer to the entry or 0 if the entry was not a child. 
+     *  Note the entry will not be deleted.
+     */ 
+    Entry *removeSubEntry(Entry *e);
+
     /*! Restore the state of this Entry to the default value it has
      *  at construction time. 
      */
     void reset();
+
+    /*! Serialize this entry to a persistent storage stream. */
     void marshall(StorageIntf *);
+
+    /*! Reinitialize this entry from a persistent storage stream. */
     void unmarshall(StorageIntf *);
 
   public:
@@ -366,6 +386,7 @@ class Entry
     bool        artificial;   //!< Artificially introduced item
     GroupDocType groupDocType;
 
+
     static int  num;          //!< counts the total number of entries
 
     /// return the command name used to define GROUPDOC_SEC
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 5c68187..d33de00 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -398,6 +398,11 @@ void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
   if (classSDict) classSDict->writeDeclaration(ol,0,title,FALSE);
 }
 
+void FileDef::writeInlineClasses(OutputList &ol)
+{
+  if (classSDict) classSDict->writeDocumentation(ol,this);
+}
+
 void FileDef::startMemberDeclarations(OutputList &ol)
 {
   ol.startMemberSections();
@@ -636,6 +641,9 @@ void FileDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::MemberDefStart: 
         startMemberDocumentation(ol);
         break; 
+      case LayoutDocEntry::FileInlineClasses:
+        writeInlineClasses(ol);
+        break;
       case LayoutDocEntry::MemberDef: 
         {
           LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
@@ -654,8 +662,10 @@ void FileDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassCollaborationGraph:
       case LayoutDocEntry::ClassAllMembersLink:
       case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::NamespaceNestedNamespaces:
       case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::GroupClasses: 
       case LayoutDocEntry::GroupInlineClasses: 
       case LayoutDocEntry::GroupNamespaces:
diff --git a/src/filedef.h b/src/filedef.h
index e9a7844..8708794 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -198,6 +198,7 @@ class FileDef : public Definition
     void writeSourceLink(OutputList &ol);
     void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
     void writeClassDeclarations(OutputList &ol,const QCString &title);
+    void writeInlineClasses(OutputList &ol);
     void startMemberDeclarations(OutputList &ol);
     void endMemberDeclarations(OutputList &ol);
     void startMemberDocumentation(OutputList &ol);
diff --git a/src/footer.html b/src/footer.html
new file mode 100644
index 0000000..d476078
--- /dev/null
+++ b/src/footer.html
@@ -0,0 +1,16 @@
+<!--BEGIN GENERATE_TREEVIEW-->
+    <li class="footer">$generatedby
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+   </ul>
+ </div>
+<!--END GENERATE_TREEVIEW-->
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
\ No newline at end of file
diff --git a/src/footer_html.h b/src/footer_html.h
new file mode 100644
index 0000000..adcf367
--- /dev/null
+++ b/src/footer_html.h
@@ -0,0 +1,16 @@
+"<!--BEGIN GENERATE_TREEVIEW-->\n"
+"    <li class=\"footer\">$generatedby\n"
+"    <a href=\"http://www.doxygen.org/index.html\">\n"
+"    <img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n"
+"   </ul>\n"
+" </div>\n"
+"<!--END GENERATE_TREEVIEW-->\n"
+"<!--BEGIN !GENERATE_TREEVIEW-->\n"
+"<hr class=\"footer\"/><address class=\"footer\"><small>\n"
+"$generatedby &#160;<a href=\"http://www.doxygen.org/index.html\">\n"
+"<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>\n"
+"</a> $doxygenversion\n"
+"</small></address>\n"
+"<!--END !GENERATE_TREEVIEW-->\n"
+"</body>\n"
+"</html>\n"
\ No newline at end of file
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index bc0ffc4..0ea16dc 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -496,6 +496,7 @@ PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
 
  /*------ module handling ------------------------------------------------------------*/ 
 <Start>module|program{BS_}             {  //
+                                         v_type = V_IGNORE;
 					    if(yytext[0]=='m' || yytext[0]=='M')
 					      yy_push_state(Module);
 					    else
@@ -903,6 +904,7 @@ private                                 {
 
 <SubprogPrefix>{BS}{SUBPROG}{BS_}     {
                                          // Fortran subroutine or function found
+                                         v_type = V_IGNORE;
                                          result=yytext;
                                          result=result.stripWhiteSpace();
                                          addSubprogram(result);
@@ -1572,84 +1574,84 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
 {
   if (!mdfs.dimension.isNull()) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += mdfs.dimension;
   }
   if (mdfs.direction!=SymbolModifiers::NONE_D) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += directionStrs[mdfs.direction];
   }
   if (mdfs.optional) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "optional";
   }
   if (mdfs.allocatable) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "allocatable";
   }
   if (mdfs.external) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "external";
   }
   if (mdfs.intrinsic) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "intrinsic";
   }
   if (mdfs.parameter) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "parameter";
   }
   if (mdfs.pointer) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "pointer";
   }
   if (mdfs.target) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "target";
   }
   if (mdfs.save) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "save";
   }
   if (mdfs.deferred) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "deferred";
   }
   if (mdfs.nonoverridable) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "non_overridable";
   }
   if (mdfs.nopass) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "nopass";
   }
   if (mdfs.pass) 
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "pass";
     if (!mdfs.passVar.isEmpty())
       typeName += "(" + mdfs.passVar + ")";
   }
   if (mdfs.protection == SymbolModifiers::PUBLIC)
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "public";
   }
   else if (mdfs.protection == SymbolModifiers::PRIVATE)
   {
-    typeName += ",";
+    typeName += ", ";
     typeName += "private";
   }
 
@@ -1739,8 +1741,11 @@ static bool endScope(Entry *scope, bool isGlobalRoot)
       //cout<<"Search in "<<scope->name<<endl;
       EntryListIterator eli(*scope->children());
       Entry *ce;
+      int count = 0;
+      int found = FALSE;
       for (;(ce=eli.current());++eli) 
       {
+        count++;
         if (ce->section != Entry::FUNCTION_SEC)
           continue;
 
@@ -1751,6 +1756,15 @@ static bool endScope(Entry *scope, bool isGlobalRoot)
 	  arg->name = arg->type;
           arg->type = scope->name;
         }
+        if (ce->name.lower() == scope->name.lower()) found = TRUE;
+      }
+      if ((count == 1) && found)
+      {
+        // clear all modifiers of the scope
+        modifiers.remove(scope);
+        delete scope->parent()->removeSubEntry(scope);
+        scope = 0;
+        return TRUE;
       }
     }
   } 
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 0ac582b..8ecc784 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -241,7 +241,7 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
       LockingPtr<ArgumentList> tMdAl    = md->templateArguments();
       
       if (srcMd->isFunction() && md->isFunction() && // both are a function
-          (tSrcMdAl.pointer()==0 && tMdAl.pointer()==0 || 
+          ((tSrcMdAl.pointer()==0 && tMdAl.pointer()==0) || 
            (tSrcMdAl.pointer()!=0 && tMdAl.pointer()!=0 && tSrcMdAl->count()==tMdAl->count())
           ) &&       // same number of template arguments
           matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl.pointer(),
@@ -988,14 +988,17 @@ void GroupDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassCollaborationGraph:
       case LayoutDocEntry::ClassAllMembersLink:
       case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::NamespaceNestedNamespaces:
       case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::NamespaceInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
       case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::FileInlineClasses:
       case LayoutDocEntry::DirSubDirs:
       case LayoutDocEntry::DirFiles:
       case LayoutDocEntry::DirGraph:
@@ -1165,125 +1168,103 @@ void addGroupToGroups(Entry *root,GroupDef *subGroup)
 /*! Add a member to the group with the highest priority */
 void addMemberToGroups(Entry *root,MemberDef *md)
 {
-//  static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
-//  //printf("addMembersToGroups: %s: %s\n",md->name().data(),md->getClassDef()?md->getClassDef()->name().data():"<none>");
-//  if (inlineGroupedClasses && // member part of a grouped class?
-//     !md->getGroupDef() &&
-//      md->getClassDef() &&
-//      md->getClassDef()->partOfGroups()!=0 &&
-//      md->getClassDef()->partOfGroups()->count()>0)
-//  {
-//    GroupDef *gd = md->getClassDef()->partOfGroups()->at(0);
-//    //printf("-> add to group '%s'\n",gd->name().data());
-//    bool success = gd->insertMember(md);
-//    if (success)
-//    {
-//      md->setGroupDef(gd,
-//                      Grouping::GROUPING_LOWEST,root->fileName,root->startLine,
-//                      !root->doc.isEmpty());
-//    }
-//  }
-//  else // add if the member was explicitly added to a group
-  {
-
-    //printf("addMemberToGroups:  Root %p = %s, md %p=%s groups=%d\n", 
-    //    root, root->name.data(), md, md->name().data(), root->groups->count() );
-    QListIterator<Grouping> gli(*root->groups);
-    Grouping *g;
+  //printf("addMemberToGroups:  Root %p = %s, md %p=%s groups=%d\n", 
+  //    root, root->name.data(), md, md->name().data(), root->groups->count() );
+  QListIterator<Grouping> gli(*root->groups);
+  Grouping *g;
 
-    // Search entry's group list for group with highest pri.
-    Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST;
-    GroupDef *fgd=0;
-    for (;(g=gli.current());++gli)
+  // Search entry's group list for group with highest pri.
+  Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST;
+  GroupDef *fgd=0;
+  for (;(g=gli.current());++gli)
+  {
+    GroupDef *gd=0;
+    if (!g->groupname.isEmpty() &&
+        (gd=Doxygen::groupSDict->find(g->groupname)) &&
+        g->pri >= pri)
     {
-      GroupDef *gd=0;
-      if (!g->groupname.isEmpty() &&
-          (gd=Doxygen::groupSDict->find(g->groupname)) &&
-          g->pri >= pri)
+      if (fgd && gd!=fgd && g->pri==pri) 
       {
-        if (fgd && gd!=fgd && g->pri==pri) 
-        {
-          warn(root->fileName.data(), root->startLine,
-              "warning: Member %s found in multiple %s groups! "
-              "The member will be put in group %s, and not in group %s",
-              md->name().data(), Grouping::getGroupPriName( pri ),
-              gd->name().data(), fgd->name().data()
-              );
-        }
-
-        fgd = gd;
-        pri = g->pri;
+        warn(root->fileName.data(), root->startLine,
+            "warning: Member %s found in multiple %s groups! "
+            "The member will be put in group %s, and not in group %s",
+            md->name().data(), Grouping::getGroupPriName( pri ),
+            gd->name().data(), fgd->name().data()
+            );
       }
+
+      fgd = gd;
+      pri = g->pri;
     }
-    //printf("fgd=%p\n",fgd);
+  }
+  //printf("fgd=%p\n",fgd);
 
-    // put member into group defined by this entry?
-    if (fgd)
+  // put member into group defined by this entry?
+  if (fgd)
+  {
+    GroupDef *mgd = md->getGroupDef();
+    //printf("mgd=%p\n",mgd);
+    bool insertit = FALSE;
+    if (mgd==0)
+    {
+      insertit = TRUE;
+    }
+    else if (mgd!=fgd)
     {
-      GroupDef *mgd = md->getGroupDef();
-      //printf("mgd=%p\n",mgd);
-      bool insertit = FALSE;
-      if (mgd==0)
+      bool moveit = FALSE;
+
+      // move member from one group to another if 
+      // - the new one has a higher priority
+      // - the new entry has the same priority, but with docs where the old one had no docs
+      if (md->getGroupPri()<pri)
       {
-        insertit = TRUE;
+        moveit = TRUE;
       }
-      else if (mgd!=fgd)
+      else
       {
-        bool moveit = FALSE;
-
-        // move member from one group to another if 
-        // - the new one has a higher priority
-        // - the new entry has the same priority, but with docs where the old one had no docs
-        if (md->getGroupPri()<pri)
+        if (md->getGroupPri()==pri)
         {
-          moveit = TRUE;
-        }
-        else
-        {
-          if (md->getGroupPri()==pri)
+          if (!root->doc.isEmpty() && !md->getGroupHasDocs())
+          {
+            moveit = TRUE;
+          }
+          else if (!root->doc.isEmpty() && md->getGroupHasDocs())
           {
-            if (!root->doc.isEmpty() && !md->getGroupHasDocs())
-            {
-              moveit = TRUE;
-            }
-            else if (!root->doc.isEmpty() && md->getGroupHasDocs())
-            {
-              warn(md->getGroupFileName(),md->getGroupStartLine(),
-                  "warning: Member documentation for %s found several times in %s groups!\n"
-                  "%s:%d: The member will remain in group %s, and won't be put into group %s",
-                  md->name().data(), Grouping::getGroupPriName( pri ),
-                  root->fileName.data(), root->startLine,
-                  mgd->name().data(),
-                  fgd->name().data()
-                  );
-            }
+            warn(md->getGroupFileName(),md->getGroupStartLine(),
+                "warning: Member documentation for %s found several times in %s groups!\n"
+                "%s:%d: The member will remain in group %s, and won't be put into group %s",
+                md->name().data(), Grouping::getGroupPriName( pri ),
+                root->fileName.data(), root->startLine,
+                mgd->name().data(),
+                fgd->name().data()
+                );
           }
         }
+      }
 
-        if (moveit)
-        {
-          //printf("removeMember\n");
-          mgd->removeMember(md);
-          insertit = TRUE;
-        }
+      if (moveit)
+      {
+        //printf("removeMember\n");
+        mgd->removeMember(md);
+        insertit = TRUE;
       }
+    }
 
-      if (insertit)
+    if (insertit)
+    {
+      //printf("insertMember found at %s line %d: %s: related %s\n",
+      //    md->getDefFileName().data(),md->getDefLine(),
+      //    md->name().data(),root->relates.data());
+      bool success = fgd->insertMember(md);
+      if (success)
       {
-        //printf("insertMember found at %s line %d: %s: related %s\n",
-        //    md->getDefFileName().data(),md->getDefLine(),
-        //    md->name().data(),root->relates.data());
-        bool success = fgd->insertMember(md);
-        if (success)
+        //printf("insertMember successful\n");
+        md->setGroupDef(fgd,pri,root->fileName,root->startLine,
+            !root->doc.isEmpty());
+        ClassDef *cd = md->getClassDefOfAnonymousType();
+        if (cd) 
         {
-          //printf("insertMember successful\n");
-          md->setGroupDef(fgd,pri,root->fileName,root->startLine,
-                          !root->doc.isEmpty());
-          ClassDef *cd = md->getClassDefOfAnonymousType();
-          if (cd) 
-          {
-            cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
-          }
+          cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
         }
       }
     }
diff --git a/src/header.html b/src/header.html
new file mode 100644
index 0000000..40574bd
--- /dev/null
+++ b/src/header.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
+<link href="$relpath$$stylesheet" rel="stylesheet" type="text/css" />
+$treeview
+$search
+$mathjax
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <!--BEGIN PROJECT_LOGO-->
+  <td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td>
+  <!--END PROJECT_LOGO-->
+  <!--BEGIN PROJECT_NAME-->
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">$projectname
+   <!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
+   </div>
+   <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
+  </td>
+  <!--END PROJECT_NAME-->
+  <!--BEGIN !PROJECT_NAME-->
+   <!--BEGIN PROJECT_BRIEF-->
+    <td style="padding-left: 0.5em;">
+    <div id="projectbrief">$projectbrief</div>
+    </td>
+   <!--END PROJECT_BRIEF-->
+  <!--END !PROJECT_NAME-->
+  <!--BEGIN DISABLE_INDEX-->
+   <!--BEGIN SEARCHENGINE-->
+   <td>$searchbox</td>
+   <!--END SEARCHENGINE-->
+  <!--END DISABLE_INDEX-->
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
diff --git a/src/header_html.h b/src/header_html.h
new file mode 100644
index 0000000..424d1fb
--- /dev/null
+++ b/src/header_html.h
@@ -0,0 +1,48 @@
+"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
+"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+"<head>\n"
+"<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
+"<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n"
+"<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n"
+"<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+"<link href=\"$relpath$$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n"
+"$treeview\n"
+"$search\n"
+"$mathjax\n"
+"</head>\n"
+"<body>\n"
+"<div id=\"top\"><!-- do not remove this div! -->\n"
+"\n"
+"<!--BEGIN TITLEAREA-->\n"
+"<div id=\"titlearea\">\n"
+"<table cellspacing=\"0\" cellpadding=\"0\">\n"
+" <tbody>\n"
+" <tr style=\"height: 56px;\">\n"
+"  <!--BEGIN PROJECT_LOGO-->\n"
+"  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n"
+"  <!--END PROJECT_LOGO-->\n"
+"  <!--BEGIN PROJECT_NAME-->\n"
+"  <td style=\"padding-left: 0.5em;\">\n"
+"   <div id=\"projectname\">$projectname\n"
+"   <!--BEGIN PROJECT_NUMBER-->&#160;<span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n"
+"   </div>\n"
+"   <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n"
+"  </td>\n"
+"  <!--END PROJECT_NAME-->\n"
+"  <!--BEGIN !PROJECT_NAME-->\n"
+"   <!--BEGIN PROJECT_BRIEF-->\n"
+"    <td style=\"padding-left: 0.5em;\">\n"
+"    <div id=\"projectbrief\">$projectbrief</div>\n"
+"    </td>\n"
+"   <!--END PROJECT_BRIEF-->\n"
+"  <!--END !PROJECT_NAME-->\n"
+"  <!--BEGIN DISABLE_INDEX-->\n"
+"   <!--BEGIN SEARCHENGINE-->\n"
+"   <td>$searchbox</td>\n"
+"   <!--END SEARCHENGINE-->\n"
+"  <!--END DISABLE_INDEX-->\n"
+" </tr>\n"
+" </tbody>\n"
+"</table>\n"
+"</div>\n"
+"<!--END TITLEAREA-->\n"
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index d9cd52f..410542b 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -551,6 +551,29 @@ void HtmlDocVisitor::visit(DocSimpleSectSep *)
   m_t << "<dd>" << endl;
 }
 
+void HtmlDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  if (!cite->file().isEmpty()) 
+  {
+    startLink(cite->ref(),cite->file(),cite->relPath(),cite->anchor());
+  }
+  else
+  {
+    m_t << "<b>[";
+  }
+  filter(cite->text());
+  if (!cite->file().isEmpty()) 
+  {
+    endLink();
+  }
+  else
+  {
+    m_t << "]</b>";
+  }
+}
+
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
@@ -913,7 +936,7 @@ void HtmlDocVisitor::visitPre(DocSimpleSect *s)
     case DocSimpleSect::Post:
       m_t << theTranslator->trPostcondition(); break;
     case DocSimpleSect::Copyright:
-      m_t << "Copyright" /* TODO: theTranslator->trCopyright() */; break;
+      m_t << theTranslator->trCopyright(); break;
     case DocSimpleSect::Invar:
       m_t << theTranslator->trInvariant(); break;
     case DocSimpleSect::Remark:
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index e267a0f..b4a50ae 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -52,6 +52,7 @@ class HtmlDocVisitor : public DocVisitor
     void visit(DocFormula *);
     void visit(DocIndexEntry *);
     void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index c976825..7865fd6 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -45,12 +45,24 @@
 //#define DBG_HTML(x) x;
 #define DBG_HTML(x) 
 
+static const char defaultHtmlHeader[] =
+#include "header_html.h"
+;
+
+static const char defaultHtmlFooter[] =
+#include "footer_html.h"
+;
+
 static const char defaultStyleSheet[] = 
 #include "doxygen_css.h"
 ;
 
-static const char search_script[]=
-#include "search_php.h"
+static const char search_functions_script[]=
+#include "search_functions_php.h"
+;
+
+static const char search_opensearch_script[]=
+#include "search_opensearch_php.h"
 ;
 
 static const char search_styleSheet[] =
@@ -753,7 +765,7 @@ static void writeClientSearchBox(FTextStream &t,const char *relPath)
 static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlightSearch)
 {
   t << "        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
-  t << "          <span class=\"left\">\n";
+  t << "          <div class=\"left\">\n";
   t << "            <form id=\"FSearchBox\" action=\"" << relPath << "search.php\" method=\"get\">\n";
   t << "              <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.png\" alt=\"\"/>\n";
   if (!highlightSearch)
@@ -763,84 +775,11 @@ static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlig
     t << "                     onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
     t << "                     onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
     t << "            </form>\n";
-    t << "          </span><span class=\"right\"></span>\n";
+    t << "          </div><div class=\"right\"></div>\n";
     t << "        </div>\n";
   }
 }
 
-static QCString getLogoName(const char *projectLogo)
-{
-  if (projectLogo==0) return "";
-  if (projectLogo[0]=='$') 
-  {
-    return projectLogo; // marker is used
-  }
-  QFileInfo fi(projectLogo);
-  if (fi.exists())
-  {
-    return fi.fileName().data();
-  }
-  return "";
-}
-
-static void writeTitleArea(FTextStream &t,const char *relPath,
-            const char *projectName,const char *projectBrief,
-            const char *projectNumber,const char *projectLogo)
-{
-  QCString logoName = getLogoName(projectLogo);
-  static bool disableIndex = Config_getBool("DISABLE_INDEX"); 
-  static bool searchEngine      = Config_getBool("SEARCHENGINE");
-  static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
-  if (!(logoName.isEmpty() && QCString(projectName).isEmpty() && 
-        QCString(projectBrief).isEmpty()) ||
-      (disableIndex && searchEngine))
-  {
-    t << "<div id=\"titlearea\">" << endl;
-    t << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;
-    t << " <tbody>" << endl;
-    t << " <tr style=\"height: 56px;\">" << endl;
-    if (!logoName.isEmpty())
-    {
-      t << "  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"" << relPath << logoName << "\"/></td>" << endl;
-    }
-    if (!(QCString(projectName).isEmpty() && QCString(projectBrief).isEmpty()))
-    {
-      t << "  <td style=\"padding-left: 0.5em;\">" << endl;
-      if (!QCString(projectName).isEmpty())
-      {
-        t << "   <div id=\"projectname\">" << projectName;
-        if (!QCString(projectNumber).isEmpty())
-        {
-          t << "&#160;<span id=\"projectnumber\">" << projectNumber << "</span>";
-        }
-        t << "</div>" << endl;
-      }
-      if (!QCString(projectBrief).isEmpty())
-      {
-        t << "   <div id=\"projectbrief\">" << projectBrief << "</div>" << endl;
-      }
-      t << "  </td>" << endl;
-    }
-    if (disableIndex && searchEngine)
-    {
-      t << "  <td>" << endl;
-      if (serverBasedSearch)
-      {
-        writeServerSearchBox(t,relPath,FALSE);
-      }
-      else
-      {
-        writeClientSearchBox(t,relPath);
-      }
-      t << "  </td>" << endl;
-    }
-    t << " </tr>" << endl;
-    t << " </tbody>" << endl;
-    t << "</table>" << endl;
-    t << "</div>" << endl;
-  }
-}
-
 //------------------------------------------------------------------------
 
 /// substitute all occurrences of \a src in \a s by \a dst
@@ -877,7 +816,7 @@ QCString substitute(const char *s,const char *src,const char *dst)
 }
 //----------------------------------------------------------------------
 
-/// Clear a text block \a s from \a begin to end \a markers
+/// Clear a text block \a s from \a begin to \a end markers
 QCString clearBlock(const char *s,const char *begin,const char *end)
 {
   if (s==0 || begin==0 || end==0) return s;
@@ -885,17 +824,18 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
   int beginLen = strlen(begin);
   int endLen = strlen(end);
   int resLen = 0;
-  for(p=s; (q=strstr(p,begin))!=0; p=q+endLen)
+  for (p=s; (q=strstr(p,begin))!=0; p=q+endLen)
   {
     resLen+=q-p;
     p=q+beginLen;
-    if((q=strstr(p,end))==0)
+    if ((q=strstr(p,end))==0)
     {
       resLen+=beginLen;
       break;
     }
   }
   resLen+=strlen(p);
+  // resLen is the length of the string without the marked block
 
   QCString result(resLen+1);
   char *r;
@@ -905,7 +845,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
     memcpy(r,p,l);
     r+=l;
     p=q+beginLen;
-    if((q=strstr(p,end))==0)
+    if ((q=strstr(p,end))==0)
     {
       memcpy(r,begin,beginLen);
       r+=beginLen;
@@ -917,7 +857,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
 }
 //----------------------------------------------------------------------
 
-QCString selectBlock(const QCString& s,const QCString &name,bool which)
+QCString selectBlock(const QCString& s,const QCString &name,bool enable)
 {
   const QCString begin = "<!--BEGIN " + name + "-->";
   const QCString end = "<!--END " + name + "-->";
@@ -925,7 +865,7 @@ QCString selectBlock(const QCString& s,const QCString &name,bool which)
   const QCString noend = "<!--END !" + name + "-->";
 
   QCString result = s;
-  if (which)
+  if (enable)
   {
     result = substitute(result, begin, "");
     result = substitute(result, end, "");
@@ -959,21 +899,39 @@ static QCString substituteHtmlKeywords(const QCString &s,const char *title,
                                        const QCString &relPath)
 {
   // Build CSS/Javascript tags depending on treeview, search engine settings
+  QCString cssFile;
+  QCString generatedBy;
   QCString treeViewCssJs;
   QCString searchCssJs;
   QCString searchBox;
   QCString mathJaxJs;
+
+  static QCString projectName = Config_getString("PROJECT_NAME");
+  static bool timeStamp = Config_getBool("HTML_TIMESTAMP");
   static bool treeView = Config_getBool("GENERATE_TREEVIEW");
   static bool searchEngine = Config_getBool("SEARCHENGINE");
   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
   static bool mathJax = Config_getBool("USE_MATHJAX");
   static bool disableIndex = Config_getBool("DISABLE_INDEX");
-  static bool hasProjectName = !Config_getString("PROJECT_NAME").isEmpty();
+  static bool hasProjectName = !projectName.isEmpty();
   static bool hasProjectNumber = !Config_getString("PROJECT_NUMBER").isEmpty();
   static bool hasProjectBrief = !Config_getString("PROJECT_BRIEF").isEmpty();
   static bool hasProjectLogo = !Config_getString("PROJECT_LOGO").isEmpty();
   static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
 
+  cssFile = Config_getString("HTML_STYLESHEET");
+  if (cssFile.isEmpty())
+  {
+    cssFile = "doxygen.css";
+  }
+
+  if (timeStamp) {
+    generatedBy = theTranslator->trGeneratedAt(dateToString(TRUE), Config_getString("PROJECT_NAME"));
+  }
+  else {
+    generatedBy = theTranslator->trGeneratedBy();
+  }
+
   if (treeView)
   {
     treeViewCssJs = "<link href=\"$relpath$navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
@@ -1006,7 +964,15 @@ static QCString substituteHtmlKeywords(const QCString &s,const char *title,
                      "  $(document).ready(function() {\n"
                      "    if ($('.searchresults').length > 0) { searchBox.DOMSearchField().focus(); }\n"
                      "  });\n"
-                     "</script>";
+                     "</script>\n";
+
+      // OPENSEARCH_PROVIDER {
+      searchCssJs += "<link rel=\"search\" href=\"" + relPath +
+                     "search-opensearch.php?v=opensearch.xml\" "
+                     "type=\"application/opensearchdescription+xml\" title=\"" +
+                     (hasProjectName ? projectName : QCString("Doxygen")) + 
+                     "\"/>";
+      // OPENSEARCH_PROVIDER }
     }
     searchBox = getSearchBox(serverBasedSearch, relPath, FALSE);
   }
@@ -1015,20 +981,30 @@ static QCString substituteHtmlKeywords(const QCString &s,const char *title,
   {
     mathJaxJs = "<script src=\"$relpath$MathJax.js\">\n"
                 "  MathJax.Hub.Config({\n"
-                "    extensions: [\"tex2jax.js\"],\n"
-                "    jax: [\"input/TeX\",\"output/HTML-CSS\"],\n"
-                "});\n"
-                "</script>\n";
+                "    extensions: [\"tex2jax.js\"";
+    QStrList &mathJaxExtensions = Config_getList("MATHJAX_EXTENSIONS");
+    const char *s = mathJaxExtensions.first();
+    while (s)
+    {
+      mathJaxJs+= ", \""+QCString(s)+".js\"";
+      s = mathJaxExtensions.next();
+    }
+    mathJaxJs += "],\n"
+                 "    jax: [\"input/TeX\",\"output/HTML-CSS\"],\n"
+                 "});\n"
+                 "</script>";
   }
 
   // first substitute generic keywords
   QCString result = substituteKeywords(s,title);
 
   // additional HTML only keywords
+  result = substitute(result,"$stylesheet",cssFile);
   result = substitute(result,"$treeview",treeViewCssJs);
   result = substitute(result,"$searchbox",searchBox);
   result = substitute(result,"$search",searchCssJs);
   result = substitute(result,"$mathjax",mathJaxJs);
+  result = substitute(result,"$generatedby",generatedBy);
   result = substitute(result,"$relpath$",relPath); //<-- must be last
   
   // additional HTML only conditional blocks
@@ -1050,6 +1026,7 @@ HtmlGenerator::HtmlGenerator() : OutputGenerator()
 {
   dir=Config_getString("HTML_OUTPUT");
   col=0;  
+  m_emptySection=FALSE;
 }
 
 HtmlGenerator::~HtmlGenerator()
@@ -1072,11 +1049,20 @@ void HtmlGenerator::init()
     g_header=fileToString(Config_getString("HTML_HEADER"));
     //printf("g_header='%s'\n",g_header.data());
   }
+  else 
+  {
+    g_header = defaultHtmlHeader;
+  }
+
   if (!Config_getString("HTML_FOOTER").isEmpty()) 
   {
     g_footer=fileToString(Config_getString("HTML_FOOTER"));
     //printf("g_footer='%s'\n",g_footer.data());
   }
+  else 
+  {
+    g_footer = defaultHtmlFooter;
+  }
   createSubDirs(d);
 
   QCString fileName=dname+"/tabs.css";
@@ -1193,132 +1179,10 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
   t << replaceColorMarkers(defaultStyleSheet);
 }
 
-static void writeDefaultNavTree(FTextStream &t,const char *relPathStr)
-{
-  static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
-  if (generateTreeView)
-  {
-    t << "<link href=\"" << relPathStr << "navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-    t << "<script type=\"text/javascript\" src=\"" << relPathStr << "jquery.js\"></script>\n";
-    t << "<script type=\"text/javascript\" src=\"" << relPathStr << "navtree.js\"></script>\n";
-    t << "<script type=\"text/javascript\" src=\"" << relPathStr << "resize.js\"></script>\n";
-    t << "<script type=\"text/javascript\">" << endl;
-    t << "$(document).ready(initResizable);" << endl;
-    t << "</script>" << endl;
-  }
-}
-
-static void writeDefaultHeaderFile(FTextStream &t, const char *name,
-                                   const char *title,
-                                   const char *relPath,bool usePathCmd,
-                                   bool searchPage=FALSE)
-{
-  QString relPathStr;
-  if (usePathCmd) 
-    relPathStr="$relpath$";
-  else
-    relPathStr=relPath;
-
-  QCString id = name;
-  if (id.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension) 
-  {
-    id=id.left(id.length()-Doxygen::htmlFileExtension.length());
-  }
-
-  static bool searchEngine = Config_getBool("SEARCHENGINE");
-  static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
-  //if (searchEngine && !generateTreeView)
-  //{
-  //  t << "<!-- This comment will put IE 6, 7 and 8 in quirks mode -->" << endl;
-  //}
-  //  t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
-  //  t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
-  t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
-  t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
-       "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
-       "<title>"; 
-  t << convertToHtml(title);
-  t << "</title>\n";
-  
-  t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-  if (searchEngine /* && !generateTreeView*/ )
-  {
-    t << "<link href=\"" << relPathStr << "search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-    t << "<script type=\"text/javascript\" src=\"" << relPathStr << "search/search.js\"></script>\n";
-  }
-
-  writeDefaultNavTree(t,relPathStr);
-
-  if (Config_getBool("USE_MATHJAX"))
-  {
-    QCString path = Config_getString("MATHJAX_RELPATH");
-    if (!path.isEmpty() && path.at(path.length()-1)!='/')
-    {
-      path+="/";
-    }
-    if (path.isEmpty() || path.left(2)=="..") // relative path
-    {
-      path.prepend(relPathStr);
-    }
-    t << "<script src=\"" << path << "MathJax.js\">\n";
-    t << "  MathJax.Hub.Config({\n";
-    t << "    extensions: [\"tex2jax.js\"],\n";
-    t << "    jax: [\"input/TeX\",\"output/HTML-CSS\"],\n";
-    t << "});\n";
-    t << "</script>\n";
-  }
-  t << "<link ";
-  t << "href=\"";
-  QCString cssname=Config_getString("HTML_STYLESHEET");
-  if (cssname.isEmpty())
-  {
-    t << relPathStr << "doxygen.css";
-  }
-  else
-  {
-    if (usePathCmd)
-    {
-      t << relPathStr << cssname;
-    }
-    else
-    {
-      QFileInfo cssfi(cssname);
-      if (!cssfi.exists())
-      {
-        err("error: user specified HTML style sheet file does not exist!\n");
-      }
-      t << relPathStr << cssfi.fileName();
-    }
-  }
-  
-  t << "\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-  t << "</head>\n";
-  if (searchEngine && /*!generateTreeView &&*/ !serverBasedSearch)
-  {
-    // for the javascript based search select the default filter
-    t << "<body onload='searchBox.OnSelectItem(0);'>\n";
-  }
-  else
-  {
-    if (searchPage) // keep focus on search result's box when loading 
-                    // search results page
-    {
-      t << "<body onload='searchBox.DOMSearchField().focus()'>\n";
-    }
-    else
-    {
-      t << "<body>\n";
-    }
-  }
-}
-
-
 void HtmlGenerator::writeHeaderFile(QFile &file, const char *cssname)
 {
   FTextStream t(&file);
   
-  // writeDefaultHeaderFile(t,file.name(),"$title",relativePathToRoot(0),TRUE);
-  
   QString relPathStr = "$relpath$";
 
   QCString id(file.name());
@@ -1327,77 +1191,14 @@ void HtmlGenerator::writeHeaderFile(QFile &file, const char *cssname)
     id=id.left(id.length()-Doxygen::htmlFileExtension.length());
   }
 
-  t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
-  t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
-       "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
-       "<title>$title</title>\n";
-  t << "<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
-  t << "<link href=\"$relpath$" << cssname << "\" rel=\"stylesheet\" type=\"text/css\" />\n";
-  t << "$treeview\n";
-  t << "$search\n";
-  t << "$mathjax\n";
-  t << "</head>\n";
-  t << "<body>\n";
-  t << "<div id=\"top\"><!-- do not remove this div! -->\n";
-  
-  t << "<!--BEGIN TITLEAREA-->\n";
-  t << "<div id=\"titlearea\">\n";
-  t << "<table cellspacing=\"0\" cellpadding=\"0\">\n";
-  t << " <tbody>\n";
-  t << " <tr style=\"height: 56px;\">\n";
-  t << "  <!--BEGIN PROJECT_LOGO-->\n";
-  t << "  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n";
-  t << "  <!--END PROJECT_LOGO-->\n";
-  t << "  <!--BEGIN PROJECT_NAME-->\n";
-  t << "  <td style=\"padding-left: 0.5em;\">\n";
-  t << "   <div id=\"projectname\">$projectname\n";
-  t << "   <!--BEGIN PROJECT_NUMBER-->&#160;<span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n";
-  t << "   </div>\n";
-  t << "   <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n";
-  t << "  </td>\n";
-  t << "  <!--END PROJECT_NAME-->\n";
-  t << "  <!--BEGIN !PROJECT_NAME-->\n";
-  t << "   <!--BEGIN PROJECT_BRIEF-->\n";
-  t << "    <td style=\"padding-left: 0.5em;\">\n";
-  t << "    <div id=\"projectbrief\">$projectbrief</div>\n";
-  t << "    </td>\n";
-  t << "   <!--END PROJECT_BRIEF-->\n";
-  t << "  <!--END !PROJECT_NAME-->\n";    
-  t << "  <!--BEGIN DISABLE_INDEX-->\n";
-  t << "   <!--BEGIN SEARCHENGINE-->\n";
-  t << "   <td>$searchbox</td>\n";
-  t << "   <!--END SEARCHENGINE-->\n";
-  t << "  <!--END DISABLE_INDEX-->\n";
-  t << " </tr>\n";
-  t << " </tbody>\n";
-  t << "</table>\n";
-  t << "</div>\n";
-  t << "<!--END TITLEAREA-->\n";
+  t << substitute(defaultHtmlHeader, "$stylesheet", cssname);
 }
 
 void HtmlGenerator::writeFooterFile(QFile &file)
 {
   FTextStream t(&file);
-  
-  t << "<!--BEGIN GENERATE_TREEVIEW-->\n";
-  t << "    <li class=\"footer\">";
-  t << theTranslator->trGeneratedAt( "$datetime", "$projectname" ) << endl;
-  t << "    <a href=\"http://www.doxygen.org/index.html\">\n";
-  t << "    <img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n";
-  t << "   </ul>\n";
-  t << " </div>\n";
-  t << "<!--END GENERATE_TREEVIEW-->\n";
-  t << "<!--BEGIN !GENERATE_TREEVIEW-->\n";
-  t << "<hr class=\"footer\"/><address class=\"footer\"><small>\n";
-  t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
-  t << "&#160;<a href=\"http://www.doxygen.org/index.html\">"
-    << "<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>"
-    << "</a> $doxygenversion";
-  t << "</small></address>\n";
-  t << "<!--END !GENERATE_TREEVIEW-->\n";
-
-  t << "</body>\n"
-    << "</html>\n";
+  QCString contents(defaultHtmlFooter);
+  t << contents;
 }
 
 static void generateDynamicSections(FTextStream &t,const QCString &relPath)
@@ -1429,22 +1230,9 @@ void HtmlGenerator::startFile(const char *name,const char *,
   //  HtmlHelp::getInstance()->addIndexFile(fileName);
   //}
   
-  QCString dispTitle = title;
-  QCString projName = Config_getString("PROJECT_NAME");
-  if (!projName.isEmpty())
-  {
-    dispTitle.prepend(projName+": ");
-  }
- 
   lastFile = fileName;
-  if (g_header.isEmpty()) 
-  {
-    writeDefaultHeaderFile(t,name,dispTitle,relPath,FALSE);
-  }
-  else
-  {
-    t << substituteHtmlKeywords(g_header,convertToHtml(dispTitle),relPath);
-  }
+  t << substituteHtmlKeywords(g_header,convertToHtml(title),relPath);
+
   t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen " 
     << versionString << " -->" << endl;
   //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
@@ -1512,37 +1300,14 @@ void HtmlGenerator::writeLogo()
 
 void HtmlGenerator::writePageFooter(FTextStream &t,const QCString &lastTitle,const QCString &relPath)
 {
-  static bool generateTreeView  = Config_getBool("GENERATE_TREEVIEW");
   static bool searchEngine      = Config_getBool("SEARCHENGINE");
   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
   if (searchEngine /*&& !generateTreeView*/ && !serverBasedSearch)
   {
     HtmlGenerator::writeSearchFooter(t,relPath);
   }
-  if (g_footer.isEmpty())
-  {
-    if (!generateTreeView)
-    {
-      t << "<hr class=\"footer\"/><address class=\"footer\"><small>";
-      t << writeLogoAsString(relPath);
-      t << "</small></address>";
-      if (Debug::isFlagSet(Debug::Validate))
-      {
-        t << "<p><a href=\"http://validator.w3.org/check/referer\">"
-          "<img class=\"footer\" src=\"http://www.w3.org/Icons/valid-html401\""
-          " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 "
-          "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">"
-          "<img class=\"footer\" style=\"border:0;width:88px;height:31px\" "
-          "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" "
-          "alt=\"This page uses valid CSS!\"/></a></p>";
-      }
-    }
-    t << "\n</body>\n</html>\n";
-  }
-  else
-  {
-    t << substituteHtmlKeywords(g_footer,convertToHtml(lastTitle),relPath);
-  }
+
+  t << substituteHtmlKeywords(g_footer,convertToHtml(lastTitle),relPath);
 }
 
 void HtmlGenerator::writeFooter()
@@ -1944,7 +1709,7 @@ static void startSectionHeader(FTextStream &t,
          "class=\"dynheader closed\" "
          "style=\"cursor:pointer;\">" << endl;
     t << "  <img id=\"dynsection-" << sectionCount << "-trigger\" src=\"" 
-      << relPath << "closed.png\"/> ";
+      << relPath << "closed.png\" alt=\"+\"/> ";
   }
   else
   {
@@ -2067,6 +1832,11 @@ void HtmlGenerator::startMemberItem(int annoType)
   DBG_HTML(t << "<!-- startMemberItem() -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
+    if (m_emptySection)
+    {
+      t << "<table class=\"memberdecls\">" << endl;
+      m_emptySection=FALSE;
+    }
     t << "<tr>";
     switch(annoType)
     {
@@ -2121,6 +1891,11 @@ void HtmlGenerator::startMemberDescription()
   DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
+    if (m_emptySection)
+    {
+      t << "<table class=\"memberdecls\">" << endl;
+      m_emptySection=FALSE;
+    }
     t << "<tr><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">"; 
   }
   else
@@ -2147,9 +1922,9 @@ void HtmlGenerator::startMemberSections()
   DBG_HTML(t << "<!-- startMemberSections -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "<table class=\"memberdecls\">" << endl;
-    // HTML is not recursively decomposable, sorry
-    //t << "<tr><td></td></tr>" << endl;
+    m_emptySection=TRUE; // we postpone writing <table> until we actually
+                         // write a row to prevent empty tables, which 
+                         // are not valid XHTML!
   }
 }
 
@@ -2158,7 +1933,10 @@ void HtmlGenerator::endMemberSections()
   DBG_HTML(t << "<!-- endMemberSections -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "</table>" << endl;
+    if (!m_emptySection)
+    {
+      t << "</table>" << endl;
+    }
   }
 }
 
@@ -2167,6 +1945,11 @@ void HtmlGenerator::startMemberHeader(const char *anchor)
   DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
+    if (m_emptySection)
+    {
+      t << "<table class=\"memberdecls\">" << endl;
+      m_emptySection=FALSE;
+    }
     t << "<tr><td colspan=\"2\"><h2>";
   }
   else
@@ -2843,26 +2626,6 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact,
   }
 }
 
-void HtmlGenerator::startQuickIndices()
-{
-  static bool customHeader = !Config_getString("HTML_HEADER").isEmpty();
-  static QCString projectName = Config_getString("PROJECT_NAME");
-  static QCString projectBrief = Config_getString("PROJECT_BRIEF"); 
-  static QCString projectNumber = Config_getString("PROJECT_NUMBER"); 
-  static QCString projectLogo = Config_getString("PROJECT_LOGO");
-
-  if (!customHeader)
-  {
-    t << "<div id=\"top\"";
-    //if (generateTreeView)
-    //{
-    //  t << " onmouseout=\"return navLeave()\" onmouseover=\"navEnter()\"";
-    //}
-    t << ">" << endl;
-    writeTitleArea(t,relPath,projectName,projectBrief,projectNumber,projectLogo);
-  }
-}
-
 void HtmlGenerator::endQuickIndices()
 {
   t << "</div>" << endl;
@@ -2920,23 +2683,64 @@ void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli)
 void HtmlGenerator::writeSearchPage()
 {
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+  static bool disableIndex = Config_getBool("DISABLE_INDEX");
   static QCString projectName = Config_getString("PROJECT_NAME");
   static QCString projectBrief = Config_getString("PROJECT_BRIEF"); 
   static QCString projectNumber = Config_getString("PROJECT_NUMBER"); 
   static QCString projectLogo = Config_getString("PROJECT_LOGO");
+
+  // OPENSEARCH_PROVIDER {
+  QCString configFileName = Config_getString("HTML_OUTPUT")+"/search-config.php";
+  QFile cf(configFileName);
+  if (cf.open(IO_WriteOnly))
+  {
+    FTextStream t(&cf);
+    t << "<script language=\"php\">\n\n";
+    t << "$config = array(\n";
+    t << "  'PROJECT_NAME' => \"" << projectName << "\",\n";
+    t << "  'GENERATE_TREEVIEW' => " << (generateTreeView?"true":"false") << ",\n";
+    t << "  'DISABLE_INDEX' => " << (disableIndex?"true":"false") << ",\n";
+    t << ");\n\n";
+    t << "$translator = array(\n";
+    t << "  'search_results_title' => \"" << theTranslator->trSearchResultsTitle() << "\",\n";
+    t << "  'search_results' => array(\n";  
+    t << "    0 => \"" << theTranslator->trSearchResults(0) << "\",\n";     
+    t << "    1 => \"" << theTranslator->trSearchResults(1) << "\",\n";     
+    t << "    2 => \"" << substitute(theTranslator->trSearchResults(2), "$", "\\$") << "\",\n";     
+    t << "  ),\n";
+    t << "  'search_matches' => \"" << theTranslator->trSearchMatches() << "\",\n";
+    t << "  'search' => \"" << theTranslator->trSearch() << "\",\n";
+    t << "  'split_bar' => \"" << substitute(substitute(writeSplitBarAsString("",""), "\"","\\\""), "\n","\\n") << "\",\n";
+    t << "  'logo' => \"" << substitute(substitute(writeLogoAsString(""), "\"","\\\""), "\n","\\n") << "\",\n";
+    t << ");\n\n";
+    t << "</script>\n";
+  }
+
+  QCString functionsFileName = Config_getString("HTML_OUTPUT")+"/search-functions.php";
+  QFile ff(functionsFileName);
+  if (ff.open(IO_WriteOnly))
+  {
+    FTextStream t(&ff);
+    // Write stuff from search_functions.php source file...
+    t << search_functions_script;
+  }
+
+  QCString opensearchFileName = Config_getString("HTML_OUTPUT")+"/search-opensearch.php";
+  QFile of(opensearchFileName);
+  if (of.open(IO_WriteOnly))
+  {
+    FTextStream t(&of);
+    // Write stuff from search_opensearch.php source file...
+    t << search_opensearch_script;
+  }
+  // OPENSEARCH_PROVIDER }
+
   QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php";
   QFile f(fileName);
   if (f.open(IO_WriteOnly))
   {
     FTextStream t(&f);
-    if (g_header.isEmpty()) 
-    {
-      writeDefaultHeaderFile(t,"search",theTranslator->trSearch().data(),0,FALSE,TRUE);
-    }
-    else
-    {
-      t << substituteHtmlKeywords(g_header,"Search","");
-    }
+    t << substituteHtmlKeywords(g_header,"Search","");
 
     t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen " 
       << versionString << " -->" << endl;
@@ -2949,10 +2753,8 @@ void HtmlGenerator::writeSearchPage()
         << "search\",false,'" << theTranslator->trSearch() << "');\n";
       t << "</script>\n";
     }
-    t << "<div id=\"top\">" << endl;
-    writeTitleArea(t,"",projectName,projectBrief,projectNumber,projectLogo);
-    if (!Config_getBool("DISABLE_INDEX")) 
-    { 
+    if (!Config_getBool("DISABLE_INDEX"))
+    {
       writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
     }
     else
@@ -2963,6 +2765,8 @@ void HtmlGenerator::writeSearchPage()
       t << "</div>" << endl;
     }
 
+    // OPENSEARCH_PROVIDER {
+#if 0
     t << "\n<script language=\"php\">\n\n";
     t << "function search_results()\n";
     t << "{\n";
@@ -2998,7 +2802,7 @@ void HtmlGenerator::writeSearchPage()
         << "onfocus=\\\"searchBox.OnSearchFieldFocus(true)\\\" "
         << "onblur=\\\"searchBox.OnSearchFieldFocus(false)\\\"/>\\n"
         << "            </form>\\n"
-        << "          </span><span class=\\\"right\\\"></span>\\n"
+        << "          </div><div class=\\\"right\\\"></div>\\n"
         << "        </div>\\n"
         << "      </li>\\n"
         << "    </ul>\\n"
@@ -3013,28 +2817,25 @@ void HtmlGenerator::writeSearchPage()
     }
     t << "\";\n";
     t << "}\n";
-    t << "function end_page()\n";
-    t << "{\n";
-    t << "  echo \"";
-    if (generateTreeView)
-    {
-      t << "</div>\\n";
-      t << "<div id=\\\"nav-path\\\" class=\\\"navpath\\\">\\n";
-      t << "  <ul>\\n";
-      t << "    <li class=\\\"footer\\\">";
-      t << substitute(substitute(writeLogoAsString(""),
-                                 "\"","\\\""),
-                      "\n","\\n");
-      t << "</li>\\n";
-      t << "  </ul>\\n";
-      t << "</div>\\n";
-    }
-    t << "</body></html>\";\n";
-    t << "}\n";
     t << "\n";
     t << search_script;
     t << "\n";
     t << "</script>\n";
+#endif
+    // OPENSEARCH_PROVIDER }
+
+    t << "<script language=\"php\">\n";
+    t << "require_once \"search-functions.php\";\n";
+    t << "main();\n";
+    t << "</script>\n";
+
+    // Write empty navigation path, to make footer connect properly
+    if (generateTreeView)
+    {
+      t << "</div><div id=\"nav-path\" class=\"navpath\">\n";
+      t << "    <ul>\n";
+    }
+
     writePageFooter(t,"Search","");
   }
   QCString scriptName = Config_getString("HTML_OUTPUT")+"/search/search.js";
@@ -3177,24 +2978,67 @@ void HtmlGenerator::endHeaderSection()
   t << "</div>" << endl;
 }
 
-void HtmlGenerator::startInlineDescription()
+void HtmlGenerator::startInlineHeader()
 {
-  t << "<tr><td colspan=\"2\">";
+  if (m_emptySection)
+  {
+    t << "<table class=\"memberdecls\">" << endl;
+    m_emptySection=FALSE;
+  }
+  t << "<tr><td colspan=\"2\"><h3>";
 }
 
-void HtmlGenerator::endInlineDescription()
+void HtmlGenerator::endInlineHeader()
 {
-  t << "</td></tr>" << endl;
+  t << "</h3></td></tr>" << endl;
 }
 
-void HtmlGenerator::startInlineHeader()
+void HtmlGenerator::startMemberDocSimple()
 {
-  t << "<tr><td colspan=\"2\"><h3>";
+  DBG_HTML(t << "<!-- startMemberDocSimple -->" << endl;)
+  t << "<table class=\"fieldtable\">" << endl;
+  t << "<tr><th colspan=\"3\">" << theTranslator->trCompoundMembers() << "</th></tr>" << endl;
 }
 
-void HtmlGenerator::endInlineHeader()
+void HtmlGenerator::endMemberDocSimple()
 {
-  t << "</h3></td></tr>" << endl;
+  DBG_HTML(t << "<!-- endMemberDocSimple -->" << endl;)
+  t << "</table>" << endl;
+}
+
+void HtmlGenerator::startInlineMemberType()
+{
+  DBG_HTML(t << "<!-- startInlineMemberType -->" << endl;)
+  t << "<tr><td class=\"fieldtype\">" << endl;
+}
+
+void HtmlGenerator::endInlineMemberType()
+{
+  DBG_HTML(t << "<!-- endInlineMemberType -->" << endl;)
+  t << "</td>" << endl;
+}
+
+void HtmlGenerator::startInlineMemberName()
+{
+  DBG_HTML(t << "<!-- startInlineMemberName -->" << endl;)
+  t << "<td class=\"fieldname\">" << endl;
+}
+
+void HtmlGenerator::endInlineMemberName()
+{
+  DBG_HTML(t << "<!-- endInlineMemberName -->" << endl;)
+  t << "</td>" << endl;
+}
+
+void HtmlGenerator::startInlineMemberDoc()
+{
+  DBG_HTML(t << "<!-- startInlineMemberDoc -->" << endl;)
+  t << "<td class=\"fielddoc\">" << endl;
 }
 
+void HtmlGenerator::endInlineMemberDoc()
+{
+  DBG_HTML(t << "<!-- endInlineMemberDoc -->" << endl;)
+  t << "</td></tr>" << endl;
+}
 
diff --git a/src/htmlgen.h b/src/htmlgen.h
index df63555..aa4c0b1 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -115,8 +115,6 @@ class HtmlGenerator : public OutputGenerator
     void endMemberDocList();
     void startMemberList();
     void endMemberList();
-    void startInlineDescription();
-    void endInlineDescription();
     void startInlineHeader();
     void endInlineHeader();
     void startAnonTypeScope(int) {}
@@ -194,7 +192,7 @@ class HtmlGenerator : public OutputGenerator
     void endClassDiagram(const ClassDiagram &,const char *,const char *);
     void startPageRef() {}
     void endPageRef(const char *,const char *) {}
-    void startQuickIndices();
+    void startQuickIndices() {}
     void endQuickIndices();
     void writeSplitBar(const char *name);
     void writeLogo();
@@ -254,6 +252,15 @@ class HtmlGenerator : public OutputGenerator
     void endConstraintDocs();
     void endConstraintList();
 
+    void startMemberDocSimple();
+    void endMemberDocSimple();
+    void startInlineMemberType();
+    void endInlineMemberType();
+    void startInlineMemberName();
+    void endInlineMemberName();
+    void startInlineMemberDoc();
+    void endInlineMemberDoc();
+
     void startFontClass(const char *s) { t << "<span class=\"" << s << "\">"; }
     void endFontClass() { t << "</span>"; }
 
@@ -276,6 +283,7 @@ class HtmlGenerator : public OutputGenerator
 
     int col;
     int m_sectionCount;
+    bool m_emptySection;
 };
 
 #endif
diff --git a/src/index.cpp b/src/index.cpp
index 8d1e4c5..49cdd8e 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -317,7 +317,6 @@ void startFile(OutputList &ol,const char *name,const char *manName,
 void endFile(OutputList &ol,bool skipNavIndex)
 {
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
-  static bool hasCustomFooter = !Config_getString("HTML_FOOTER").isEmpty();
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
   if (!skipNavIndex)
@@ -328,14 +327,6 @@ void endFile(OutputList &ol,bool skipNavIndex)
       ol.writeString("</div>\n");
       ol.writeString("  <div id=\"nav-path\" class=\"navpath\">\n");
       ol.writeString("    <ul>\n");
-      if (!hasCustomFooter)
-      {
-        ol.writeString("      <li class=\"footer\">");
-        ol.writeLogo();
-        ol.writeString("</li>\n");
-        ol.writeString("    </ul>\n");
-        ol.writeString("  </div>\n");
-      }
     }
   }
   ol.writeFooter(); // write the footer
@@ -1073,7 +1064,7 @@ int countAnnotatedClasses(int *cp)
   {
     if (cd->isLinkableInProject() && cd->templateMaster()==0) 
     { 
-      if (!cd->isEmbeddedInGroupDocs())
+      if (!cd->isEmbeddedInOuterScope())
       {
         countPrinted++;
       }
@@ -1142,7 +1133,7 @@ void writeAnnotatedClassList(OutputList &ol)
   for (cli.toFirst();(cd=cli.current());++cli)
   {
     ol.pushGeneratorState();
-    if (cd->isEmbeddedInGroupDocs())
+    if (cd->isEmbeddedInOuterScope())
     {
       ol.disable(OutputGenerator::Latex);
       ol.disable(OutputGenerator::RTF);
@@ -1215,14 +1206,51 @@ public:
     ClassDef *c2=(ClassDef *)item2;
 
     QCString n1 = c1->className();
-    n1.remove (0, getPrefixIndex(n1));
     QCString n2 = c2->className();
-    n2.remove (0, getPrefixIndex(n2));
-    
-    return stricmp (n1, n2);
+    return stricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
   }
 };
 
+class AlphaIndexTableCell
+{
+  public:
+    AlphaIndexTableCell(int row,int col,uchar letter,ClassDef *cd) : 
+      m_letter(letter), m_class(cd), m_row(row), m_col(col) 
+    { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-',
+      //       cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>"); 
+    }
+
+    ClassDef *classDef() const { return m_class; }
+    uchar letter()       const { return m_letter; }
+    int row()            const { return m_row; }
+    int column()         const { return m_col; }
+
+  private:
+    uchar m_letter;
+    ClassDef *m_class;
+    int m_row;
+    int m_col;
+};
+
+class AlphaIndexTableRows : public QList<AlphaIndexTableCell>
+{
+  public:
+    AlphaIndexTableRows() { setAutoDelete(TRUE); }
+};
+
+class AlphaIndexTableRowsIterator : public QListIterator<AlphaIndexTableCell>
+{
+  public:
+    AlphaIndexTableRowsIterator(const AlphaIndexTableRows &list) : 
+      QListIterator<AlphaIndexTableCell>(list) {}
+};
+
+class AlphaIndexTableColumns : public QList<AlphaIndexTableRows>
+{
+  public:
+    AlphaIndexTableColumns() { setAutoDelete(TRUE); }
+};
+
 // write an alphabetical index of all class with a header for each letter
 void writeAlphabeticalClassList(OutputList &ol)
 {
@@ -1249,7 +1277,7 @@ void writeAlphabeticalClassList(OutputList &ol)
 
   QCString alphaLinks = "<div class=\"qindex\">";
   int l;
-  for (l = 0; l < 256; l++)
+  for (l=0; l<256; l++)
   {
     if (indexLetterUsed[l])
     {
@@ -1264,24 +1292,24 @@ void writeAlphabeticalClassList(OutputList &ol)
   alphaLinks += "</div>\n";
   ol.writeString(alphaLinks);
 
-  ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
 
   // the number of columns in the table
   const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
 
   int i,j;
-  int totalItems = headerItems + annotatedClasses;            // number of items in the table
-  int rows = (totalItems + columns - 1)/columns;              // number of rows in the table
-  int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
+  int totalItems = headerItems*2 + annotatedClasses;          // number of items in the table (headers span 2 items)
+  int rows = (totalItems + columns - 1)/columns;          // number of rows in the table
+  //int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
 
   //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
   //    headerItems,totalItems,columns,rows,itemsInLastRow);
 
   // Keep a list of classes for each starting letter
   PrefixIgnoreClassList classesByLetter[256];
+  AlphaIndexTableColumns tableColumns;
 
   // fill the columns with the class list (row elements in each column,
-  // expect for the columns with number >= itemsInLastRow, which get on
+  // expect for the columns with number >= itemsInLastRow, which get one
   // item less.
   //int icount=0;
   startLetter=0;
@@ -1293,139 +1321,155 @@ void writeAlphabeticalClassList(OutputList &ol)
       startLetter=toupper(cd->className().at(index))&0xFF;
       // Do some sorting again, since the classes are sorted by name with 
       // prefix, which should be ignored really.
-      classesByLetter[startLetter].inSort (cd);
+      classesByLetter[startLetter].inSort(cd);
     }
   }
 
-  // create one class list for each column 
-  ClassList *colList = new ClassList[columns];
-
-  // fill the columns with the class list (row elements in each column,
-  // expect for the columns with number >= itemsInLastRow, which get on
-  // item less.
-  int col=0,row=0;
-  //int icount=0;
-  startLetter=0;
-  for (l = 0; l < 256; l++)
-  {
-    if (!indexLetterUsed[l]) continue;
-
-    // insert a new header using a dummy class pointer.
-    colList[col].append((ClassDef *)8); // insert dummy for the header
-    row++;
-    if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) 
-    { 
-      // if the header is the last item in the row, we add an extra
-      // row to make it easier to find the text of the header (this
-      // is then contained in the next cell)
-      colList[col].append(classesByLetter[l].at (0)); 
-      col++; 
-      row=0; 
-    }
-    uint i;
-    for (i = 0; i < classesByLetter[l].count(); i++)
+  #define NEXT_ROW()                           \
+    do                                         \
+    {                                          \
+      if (row>maxRows) maxRows=row;            \
+      if (row>=rows && col<columns)            \
+      {                                        \
+        col++;                                 \
+        row=0;                                 \
+        tableRows = new AlphaIndexTableRows;   \
+        tableColumns.append(tableRows);        \
+      }                                        \
+    }                                          \
+    while(0)                                   \
+
+  AlphaIndexTableRows *tableRows = new AlphaIndexTableRows;
+  tableColumns.append(tableRows);
+  int col=0,row=0,maxRows=0;
+  for (l=0; l<256; l++)
+  {
+    if (classesByLetter[l].count()>0)
     {
-      // add the class definition to the correct column list
-      colList[col].append (classesByLetter[l].at (i));
+      // add special header cell
+      tableRows->append(new AlphaIndexTableCell(row,col,(uchar)l,(ClassDef*)0x8));
+      row++;
+      tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8));
       row++;
-      if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) { col++; row=0; }
+      tableRows->append(new AlphaIndexTableCell(row,col,0,classesByLetter[l].at(0)));
+      row++; 
+      NEXT_ROW();
+      for (i=1; i<(int)classesByLetter[l].count(); i++)
+      {
+        // add normal cell
+        tableRows->append(new AlphaIndexTableCell(row,col,0,classesByLetter[l].at(i)));
+        row++;
+        NEXT_ROW();
+      }
     }
   }
 
-  // create iterators for each column
-  ClassListIterator **colIterators = new ClassListIterator*[columns];
+  // create row iterators for each column
+  AlphaIndexTableRowsIterator **colIterators = new AlphaIndexTableRowsIterator*[columns];
   for (i=0;i<columns;i++)
   {
-    colIterators[i] = new ClassListIterator(colList[i]);
+    if (i<(int)tableColumns.count())
+    {
+      colIterators[i] = new AlphaIndexTableRowsIterator(*tableColumns.at(i));
+    }
+    else // empty column
+    {
+      colIterators[i] = 0;
+    }
   }
 
+  ol.writeString("<table style=\"margin: 10px;\" align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
   // generate table
-  for (i=0;i<rows;i++) // foreach table row
+  for (i=0;i<=maxRows;i++) // foreach table row
   {
+    //printf("writing row %d\n",i);
     //ol.nextTableRow();
     ol.writeString("<tr>");
     // the last column may contain less items then the others
-    int colsInRow = (i<rows-1) ? columns : itemsInLastRow; 
+    //int colsInRow = (i<rows-1) ? columns : itemsInLastRow; 
     //printf("row [%d]\n",i);
-    for (j=0;j<colsInRow;j++) // foreach table column
+    for (j=0;j<columns;j++) // foreach table column
     {
-      ol.writeString("<td>");
-      ClassDef *cd = colIterators[j]->current();
-      //printf("columns [%d] cd=%p\n",j,cd);
-      if (cd==(ClassDef *)8) // the class pointer is really a header
+      if (colIterators[j])
       {
-        cd=++(*colIterators[j]); // get the next item
-        if (cd)
+        AlphaIndexTableCell *cell = colIterators[j]->current();
+        if (cell)
         {
-          //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
-          int index = getPrefixIndex(cd->className());
-          startLetter=toupper(cd->className().at(index));
-          QCString s = letterToLabel(startLetter);
-          //ol.writeIndexHeading(s);
-          ol.writeString("<a name=\"letter_");
-          ol.writeString(s);
-          ol.writeString("\"></a>");
-          ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
-                           "<tr>"
-                             "<td><div class=\"ah\">&#160;&#160;"); 
-          ol.writeString(s);
-          ol.writeString(         "&#160;&#160;</div>"
-                             "</td>"
-                           "</tr>"
-                         "</table>\n");
+          if (cell->row()==i)
+          {
+            if (cell->letter()!=0)
+            {
+              QCString s = letterToLabel(cell->letter());
+              ol.writeString("<td rowspan=\"2\" valign=\"bottom\">");
+              ol.writeString("<a name=\"letter_");
+              ol.writeString(s);
+              ol.writeString("\"></a>");
+              ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
+                  "<tr>"
+                  "<td><div class=\"ah\">&#160;&#160;"); 
+              ol.writeString(s);
+              ol.writeString(         "&#160;&#160;</div>"
+                  "</td>"
+                  "</tr>"
+                  "</table>\n");
+            }
+            else if (cell->classDef()!=(ClassDef*)0x8)
+            {
+              cd = cell->classDef();
+              ol.writeString("<td valign=\"top\">");
+              QCString namesp,cname;
+              //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
+              //QCString cname=cd->className();
+              extractNamespaceName(cd->name(),cname,namesp);
+              QCString nsDispName;
+              if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+              {
+                nsDispName=substitute(namesp,"::",".");
+              }
+              else
+              {
+                nsDispName=namesp.copy();
+              }
+              if (cname.right(2)=="-g" || cname.right(2)=="-p")
+              {
+                cname = cname.left(cname.length()-2);
+              }
 
-        }
-      }
-      else if (cd) // a real class, insert a link
-      {
-        QCString namesp,cname;
-        //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
-        //QCString cname=cd->className();
-        extractNamespaceName(cd->name(),cname,namesp);
-        QCString nsDispName;
-        if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
-        {
-          nsDispName=substitute(namesp,"::",".");
+              ol.writeObjectLink(cd->getReference(),
+                  cd->getOutputFileBase(),cd->anchor(),cname);
+              if (!namesp.isEmpty())
+              {
+                ol.docify(" (");
+                NamespaceDef *nd = getResolvedNamespace(namesp);
+                if (nd && nd->isLinkable())
+                {
+                  ol.writeObjectLink(nd->getReference(),
+                      nd->getOutputFileBase(),0,nsDispName);
+                }
+                else
+                {
+                  ol.docify(nsDispName);
+                }
+                ol.docify(")");
+              }
+              ol.writeNonBreakableSpace(3);
+            }
+            ++(*colIterators[j]);
+            if (cell->letter()!=0 || cell->classDef()!=(ClassDef*)0x8)
+            {
+              ol.writeString("</td>");
+            }
+          }
         }
         else
         {
-          nsDispName=namesp.copy();
-        }
-        if (cname.right(2)=="-g" || cname.right(2)=="-p")
-        {
-          cname = cname.left(cname.length()-2);
+          ol.writeString("<td></td>");
         }
-
-        ol.writeObjectLink(cd->getReference(),
-                           cd->getOutputFileBase(),cd->anchor(),cname);
-        if (!namesp.isEmpty())
-        {
-          ol.docify(" (");
-          NamespaceDef *nd = getResolvedNamespace(namesp);
-          if (nd && nd->isLinkable())
-          {
-            ol.writeObjectLink(nd->getReference(),
-                           nd->getOutputFileBase(),0,nsDispName);
-          }
-          else
-          {
-            ol.docify(nsDispName);
-          }
-          ol.docify(")");
-        }
-        ol.writeNonBreakableSpace(3);
-        //printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
-        ++(*colIterators[j]);
       }
-      //ol.endTableColumn();
-      ol.writeString("</td>");
-      //if (j<colsInRow-1) ol.nextTableColumn();
     }
-    //ol.endTableRow();
-    ol.writeString("</tr>");
+    ol.writeString("</tr>\n");
   }
-  //ol.endAlphabeticalIndexList();
-  ol.writeString("</table>");
+  ol.writeString("</table>\n");
   
   ol.writeString(alphaLinks);
 
@@ -1435,7 +1479,7 @@ void writeAlphabeticalClassList(OutputList &ol)
     delete colIterators[i];
   }
   delete[] colIterators;
-  delete[] colList;
+  //delete[] colList;
 }
 
 //----------------------------------------------------------------------------
@@ -2717,9 +2761,9 @@ void writeJavascriptSearchIndex()
                 << "class=\"SRSymbol\" ";
               t << externalLinkTarget() << "href=\"" << externalRef("../",d->getReference(),TRUE);
               t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
-              if (isMemberDef)
+              if (md)
               {
-                t << "#" << ((MemberDef *)d)->anchor();
+                t << "#" << md->anchor();
               }
               t << "\"";
               static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
@@ -2738,10 +2782,10 @@ void writeJavascriptSearchIndex()
                   << convertToXML(d->getOuterScope()->name()) 
                   << "</span>" << endl;
               }
-              else if (isMemberDef)
+              else if (md)
               {
-                FileDef *fd = ((MemberDef *)d)->getBodyDef();
-                if (fd==0) fd = ((MemberDef *)d)->getFileDef();
+                FileDef *fd = md->getBodyDef();
+                if (fd==0) fd = md->getFileDef();
                 if (fd)
                 {
                   t << "  <span class=\"SRScope\">" 
@@ -4045,6 +4089,13 @@ void writeIndex(OutputList &ol)
            (Doxygen::mainPage==pd->getOuterScope()))  // or inside main page
          )
       {
+        bool isCitationPage = pd->name()=="citelist";
+        if (isCitationPage)
+        {
+          // For LaTeX the bibliograph is already written by \bibliography
+          ol.pushGeneratorState();
+          ol.disable(OutputGenerator::Latex);
+        }
         QCString title = pd->title();
         if (title.isEmpty()) title=pd->name();
         ol.startIndexSection(isPageDocumentation);
@@ -4060,6 +4111,11 @@ void writeIndex(OutputList &ol)
 
         ol.writePageLink(pd->getOutputFileBase(),first);
         first=FALSE;
+
+        if (isCitationPage)
+        {
+          ol.popGeneratorState();
+        }
       }
     }
   }
diff --git a/src/language.cpp b/src/language.cpp
index a07c5e4..582e1f0 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -176,7 +176,7 @@ bool setTranslator(const char *langName)
   }
 #endif
 #ifdef LANG_AM
-  else if (L_EQUAL("amerenian"))
+  else if (L_EQUAL("armenian"))
   {
     theTranslator=new TranslatorArmenian;
   }
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 28455d9..bc4caed 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -27,6 +27,7 @@
 #include "parserintf.h"
 #include "msc.h"
 #include "htmlattrib.h"
+#include "cite.h"
 
 static QCString escapeLabelName(const char *s)
 {
@@ -490,6 +491,24 @@ void LatexDocVisitor::visit(DocSimpleSectSep *)
 {
 }
 
+void LatexDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  if (!cite->file().isEmpty()) 
+  {
+    //startLink(cite->ref(),cite->file(),cite->anchor());
+    QCString anchor = cite->anchor();
+    anchor = anchor.mid(CiteConsts::anchorPrefix.length()); // strip prefix
+    m_t << "\\cite{" << anchor << "}";
+  }
+  else
+  {
+    m_t << "{\\bfseries [";
+    filter(cite->text());
+    m_t << "]}";
+  }
+}
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
@@ -603,7 +622,7 @@ void LatexDocVisitor::visitPre(DocSimpleSect *s)
       break;
     case DocSimpleSect::Copyright:
       m_t << "\\begin{DoxyCopyright}{";
-      filter("Copyright" /*TODO: theTranslator->trCopyright()*/);
+      filter(theTranslator->trCopyright());
       break;
     case DocSimpleSect::Invar:
       m_t << "\\begin{DoxyInvariant}{";
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index b4c7f3b..33d832a 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -53,6 +53,7 @@ class LatexDocVisitor : public DocVisitor
     void visit(DocFormula *);
     void visit(DocIndexEntry *);
     void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 9491983..c9da3fa 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -32,6 +32,7 @@
 #include "docparser.h"
 #include "latexdocvisitor.h"
 #include "dirdef.h"
+#include "cite.h"
 
 //static QCString filterTitle(const char *s)
 //{
@@ -73,6 +74,8 @@ LatexGenerator::~LatexGenerator()
 
 void LatexGenerator::init()
 {
+  bool generateBib = !Doxygen::citeDict->isEmpty();
+
   QCString dir=Config_getString("LATEX_OUTPUT");
   QDir d(dir);
   if (!d.exists() && !d.mkdir(dir))
@@ -120,8 +123,15 @@ void LatexGenerator::init()
       << "\techo \"Running latex...\"" << endl
       << "\t" << latex_command << " refman.tex" << endl
       << "\techo \"Running makeindex...\"" << endl
-      << "\t" << mkidx_command << " refman.idx" << endl
-      << "\techo \"Rerunning latex....\"" << endl
+      << "\t" << mkidx_command << " refman.idx" << endl;
+    if (generateBib)
+    {
+      t << "\techo \"Running bibtex...\"" << endl;
+      t << "\tbibtex refman" << endl;
+      t << "\techo \"Rerunning latex....\"" << endl;
+      t << "\tpdflatex refman" << endl;
+    }
+    t << "\techo \"Rerunning latex....\"" << endl
       << "\t" << latex_command << " refman.tex" << endl
       << "\tlatex_count=5 ; \\" << endl
       << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
@@ -147,14 +157,19 @@ void LatexGenerator::init()
     t << "all: refman.pdf" << endl << endl
       << "pdf: refman.pdf" << endl << endl;
     t << "refman.pdf: clean refman.tex" << endl;
-    t << "\tpdflatex refman.tex" << endl;
-    t << "\tmakeindex refman.idx" << endl;
-    t << "\tpdflatex refman.tex" << endl
+    t << "\tpdflatex refman" << endl;
+    t << "\tmakeindex refman" << endl;
+    if (generateBib)
+    {
+      t << "\tbibtex refman" << endl;
+      t << "\tpdflatex refman" << endl;
+    }
+    t << "\tpdflatex refman" << endl
       << "\tlatex_count=5 ; \\" << endl
       << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
       << "\t    do \\" << endl
       << "\t      echo \"Rerunning latex....\" ;\\" << endl
-      << "\t      pdflatex refman.tex ;\\" << endl
+      << "\t      pdflatex refman ;\\" << endl
       << "\t      latex_count=`expr $$latex_count - 1` ;\\" << endl
       << "\t    done" << endl << endl;
   }
@@ -166,7 +181,7 @@ void LatexGenerator::init()
 #else
     << "\trm -f " 
 #endif
-    << "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl;
+    << "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf" << endl;
 
   createSubDirs(d);
 }
@@ -189,7 +204,9 @@ static void writeDefaultHeaderPart1(FTextStream &t)
   t << "}\n";
   // the next package is obsolete (see bug 563698)
   //if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";
-  t << "\\usepackage{makeidx}\n"
+  t << 
+    "\\usepackage{makeidx}\n"
+    "\\usepackage{natbib}\n"
     "\\usepackage{graphicx}\n"
     "\\usepackage{multicol}\n"
     "\\usepackage{float}\n"
@@ -272,7 +289,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
   {
     // to avoid duplicate page anchors due to reuse of same numbers for
     // the index (be it as roman numbers)
-    t << "\\hypersetup{pageanchor=false}" << endl;
+    t << "\\hypersetup{pageanchor=false,citecolor=blue}" << endl;
   }
   if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
   t << "\\begin{titlepage}\n"
@@ -307,7 +324,7 @@ static void writeDefaultHeaderPart3(FTextStream &t)
   static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
   if (pdfHyperlinks && usePDFLatex)
   {
-    t << "\\hypersetup{pageanchor=true}" << endl;
+    t << "\\hypersetup{pageanchor=true,citecolor=blue}" << endl;
   }
 }
 
@@ -645,29 +662,46 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
   t << "% Used by parameter lists\n"
        "\\newenvironment{DoxyParams}[2][]{%\n"
        "  \\begin{DoxyDesc}{#2}%\n"
-       "    \\begin{description}%\n"
-       "      \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
+       //"    \\begin{description}%\n"
+       "    \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
        //"      \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
        //"      \\rowcolors{1}{white}{tableShade}%\n"
        //"      \\arrayrulecolor{gray}%\n"
-       "      \\settowidth{\\labelwidth}{40pt}%\n"
-       "      \\setlength{\\LTleft}{\\labelwidth}%\n"
-       "      \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
-       "      \\ifthenelse{\\equal{#1}{}}\n" // default: name, docs columns
-       "      {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                          p{0.76\\textwidth}|}}%\n"
-       "      {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns
-       "       {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n"
-       "                          >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                          p{0.64\\textwidth}|}}%\n"
-       "       {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns
-       "                          >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                          >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
-       "                          p{0.47\\textwidth}|}}%\n"
-       "       }\\hline%\n"
+       "    \\settowidth{\\labelwidth}{40pt}%\n"
+       //"    \\setlength{\\LTleft}{\\labelwidth}%\n"
+       "    \\setlength{\\LTleft}{0pt}%\n"
+       "    \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+       "    \\ifthenelse{\\equal{#1}{}}%\n" // default: name, docs columns
+       "    {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+       "                        p{0.815\\textwidth}|}}%\n"
+       "    {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns
+       "      {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n"
+       "                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+       "                         p{0.685\\textwidth}|}}%\n"
+       "      {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns
+       "                         >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+       "                         >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+       "                         p{0.515\\textwidth}|}}%\n"
+       "    }\\hline%\n"
        "}{%\n"
-       "      \\end{longtable}%\n"
-       "    \\end{description}%\n"
+       "    \\end{longtable}%\n"
+       //"    \\end{description}%\n"
+       "  \\end{DoxyDesc}%\n"
+       "}\n\n";
+  t << "% Used for fields of simple structs\n"
+       "\\newenvironment{DoxyFields}[1]{%\n"
+       "  \\begin{DoxyDesc}{#1}%\n"
+       "    \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
+       "    \\settowidth{\\labelwidth}{40pt}%\n"
+       "    \\setlength{\\LTleft}{0pt}%\n"
+       "    \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+       "    \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+       "                         p{0.15\\textwidth}|%\n"
+       "                         p{0.635\\textwidth}|}%\n"
+       "    \\hline%\n"
+       "}{%\n"
+       "    \\end{longtable}%\n"
+       //"    \\end{description}%\n"
        "  \\end{DoxyDesc}%\n"
        "}\n\n";
   t << "% is used for parameters within a detailed function description\n"
@@ -755,7 +789,8 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
   t << "}\n";
   t << "{\\end{tabular*}\\par}\n";
   t << "\\newcommand{\\entrylabel}[1]{\n";
-  t << "   {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\vspace{1.5\\baselineskip}}}}\n";
+  t << "   {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{%\n";
+  t << "   \\usefont{OT1}{phv}{bc}{n}\\color{darkgray}#1}\\vspace{1.5\\baselineskip}}}}\n";
   t << "\\newenvironment{Desc}\n";
   t << "{\\begin{list}{}\n";
   t << "  {\n";
@@ -835,6 +870,7 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
 
 static void writeDefaultFooter(FTextStream &t)
 {
+  Doxygen::citeDict->writeLatexBibliography(t);
   t << "\\printindex\n";
   t << "\\end{document}\n";
 }
@@ -1020,7 +1056,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-              !cd->isEmbeddedInGroupDocs()
+              !cd->isEmbeddedInOuterScope()
              )
           {
             if (compactLatex) t << "\\section"; else t << "\\chapter";
@@ -1202,7 +1238,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-             !cd->isEmbeddedInGroupDocs()
+             !cd->isEmbeddedInOuterScope()
              )
           {
             t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
@@ -1213,7 +1249,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-             !cd->isEmbeddedInGroupDocs()
+             !cd->isEmbeddedInOuterScope()
              )
           {
             //if (compactLatex) t << "\\input"; else t << "\\include";
@@ -2440,3 +2476,42 @@ void LatexGenerator::lineBreak(const char *)
   }
 }
 
+void LatexGenerator::startMemberDocSimple()
+{
+  t << "\\begin{DoxyFields}{" << endl;
+  docify(theTranslator->trCompoundMembers());
+  t << "}" << endl;
+}
+
+void LatexGenerator::endMemberDocSimple()
+{
+  t << "\\end{DoxyFields}" << endl;
+}
+
+void LatexGenerator::startInlineMemberType()
+{
+}
+
+void LatexGenerator::endInlineMemberType()
+{
+  t << "&" << endl;
+}
+
+void LatexGenerator::startInlineMemberName()
+{
+}
+
+void LatexGenerator::endInlineMemberName()
+{
+  t << "&" << endl;
+}
+
+void LatexGenerator::startInlineMemberDoc()
+{
+}
+
+void LatexGenerator::endInlineMemberDoc()
+{
+  t << "\\\\\n\\hline\n" << endl;
+}
+
diff --git a/src/latexgen.h b/src/latexgen.h
index 6b4dec6..cfa7375 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -108,8 +108,6 @@ class LatexGenerator : public OutputGenerator
     void endMemberDocList() {}
     void startMemberList();
     void endMemberList();
-    void startInlineDescription() {}
-    void endInlineDescription() {}
     void startInlineHeader();
     void endInlineHeader();
     void startAnonTypeScope(int);
@@ -239,6 +237,15 @@ class LatexGenerator : public OutputGenerator
     void endConstraintDocs();
     void endConstraintList();
 
+    void startMemberDocSimple();
+    void endMemberDocSimple();
+    void startInlineMemberType();
+    void endInlineMemberType();
+    void startInlineMemberName();
+    void endInlineMemberName();
+    void startInlineMemberDoc();
+    void endInlineMemberDoc();
+
     void startFontClass(const char *); // {}
     void endFontClass(); // {}
 
diff --git a/src/layout.cpp b/src/layout.cpp
index 6adff4a..c212907 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -348,6 +348,11 @@ class LayoutParser : public QXmlDefaultHandler
           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       m_sHandler.insert("class/memberdef", 
           new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("class/memberdef/inlineclasses", 
+          new StartElementHandlerSection(this,LayoutDocEntry::ClassInlineClasses,&LayoutParser::startSectionEntry,
+                                         fortranOpt ? theTranslator->trTypeDocumentation() :
+                                         theTranslator->trClassDocumentation() 
+                                         ));
       m_sHandler.insert("class/memberdef/typedefs", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
                                         MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation()));
@@ -426,6 +431,11 @@ class LayoutParser : public QXmlDefaultHandler
           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       m_sHandler.insert("namespace/memberdef", 
           new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("namespace/memberdef/inlineclasses", 
+          new StartElementHandlerSection(this,LayoutDocEntry::NamespaceInlineClasses,&LayoutParser::startSectionEntry,
+                                         fortranOpt ? theTranslator->trTypeDocumentation() :
+                                         theTranslator->trClassDocumentation() 
+                                         ));
       m_sHandler.insert("namespace/memberdef/typedefs", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
                                         MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
@@ -503,6 +513,11 @@ class LayoutParser : public QXmlDefaultHandler
           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       m_sHandler.insert("file/memberdef", 
           new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("file/memberdef/inlineclasses", 
+          new StartElementHandlerSection(this,LayoutDocEntry::FileInlineClasses,&LayoutParser::startSectionEntry,
+                                         fortranOpt ? theTranslator->trTypeDocumentation() :
+                                         theTranslator->trClassDocumentation() 
+                                         ));
       m_sHandler.insert("file/memberdef/defines", 
           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
                                         MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
diff --git a/src/layout.h b/src/layout.h
index febcd87..d371e6d 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -38,18 +38,20 @@ struct LayoutDocEntry
               AuthorSection,
               
               // Class specific items
-              ClassIncludes,
+              ClassIncludes, ClassInlineClasses,
               ClassInheritanceGraph, ClassNestedClasses,
               ClassCollaborationGraph, ClassAllMembersLink,
               ClassUsedFiles,
 
               // Namespace specific items
               NamespaceNestedNamespaces, NamespaceClasses,
+              NamespaceInlineClasses,
 
               // File specific items
               FileClasses, FileNamespaces, 
               FileIncludes, FileIncludeGraph, 
               FileIncludedByGraph, FileSourceLink,
+              FileInlineClasses,
 
               // Group specific items
               GroupClasses, GroupInlineClasses, GroupNamespaces,
diff --git a/src/layout_default.h b/src/layout_default.h
index 377ac52..06af510 100644
--- a/src/layout_default.h
+++ b/src/layout_default.h
@@ -63,6 +63,7 @@
 "    </memberdecl>\n"
 "    <detaileddescription title=\"\"/>\n"
 "    <memberdef>\n"
+"      <inlineclasses title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
 "      <constructors title=\"\"/>\n"
@@ -90,6 +91,7 @@
 "    </memberdecl>\n"
 "    <detaileddescription title=\"\"/>\n"
 "    <memberdef>\n"
+"      <inlineclasses title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
 "      <functions title=\"\"/>\n"
@@ -117,6 +119,7 @@
 "    </memberdecl>\n"
 "    <detaileddescription title=\"\"/>\n"
 "    <memberdef>\n"
+"      <inlineclasses title=\"\"/>\n"
 "      <defines title=\"\"/>\n"
 "      <typedefs title=\"\"/>\n"
 "      <enums title=\"\"/>\n"
diff --git a/src/layout_default.xml b/src/layout_default.xml
index e8faa6d..8ef0c12 100644
--- a/src/layout_default.xml
+++ b/src/layout_default.xml
@@ -63,6 +63,7 @@
     </memberdecl>
     <detaileddescription title=""/>
     <memberdef>
+      <inlineclasses title=""/>
       <typedefs title=""/>
       <enums title=""/>
       <constructors title=""/>
@@ -90,6 +91,7 @@
     </memberdecl>
     <detaileddescription title=""/>
     <memberdef>
+      <inlineclasses title=""/>
       <typedefs title=""/>
       <enums title=""/>
       <functions title=""/>
@@ -117,6 +119,7 @@
     </memberdecl>
     <detaileddescription title=""/>
     <memberdef>
+      <inlineclasses title=""/>
       <defines title=""/>
       <typedefs title=""/>
       <enums title=""/>
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index f04ba7c..aff7e9a 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -17,6 +17,7 @@
 TEMPLATE     =	libdoxygen.t
 CONFIG       =	console warn_on staticlib $extraopts
 HEADERS      =	bufstr.h \
+		cite.h \
                 classdef.h \
                 classlist.h \
                 cmdmapper.h \
@@ -41,16 +42,19 @@ HEADERS      =	bufstr.h \
                 docvisitor.h \
 		dot.h \
 		doxygen.h \
+		doxygen_bst.h \
 		doxygen_css.h \
 		eclipsehelp.h \
 		entry.h \
 		example.h \
 		filedef.h \
 		filename.h \
+		footer_html.h \
 		formula.h \
 		ftextstream.h \
 		ftvhelp.h \
 		groupdef.h \
+		header_html.h \
 		htags.h \
 		htmlattrib.h \
                 htmldocvisitor.h \
@@ -109,7 +113,8 @@ HEADERS      =	bufstr.h \
 		searchindex.h \
 		search_css.h \
 		search_js.h \
-		search_php.h \
+		search_functions_php.h \
+		search_opensearch_php.h \
 		section.h \
 		sortdict.h \
                 store.h \
@@ -163,6 +168,7 @@ HEADERS      =	bufstr.h \
 
 SOURCES      =	ce_lex.cpp \
                 ce_parse.cpp \
+		cite.cpp \
 		classdef.cpp \
 		classlist.cpp \
                 cmdmapper.cpp \
diff --git a/src/libdoxygen.t b/src/libdoxygen.t
index ca34a08..0a6f4e3 100644
--- a/src/libdoxygen.t
+++ b/src/libdoxygen.t
@@ -110,8 +110,17 @@ compound_xsd.h: compound.xsd
 layout_default.h: layout_default.xml
 	cat layout_default.xml | $(TO_C_CMD) >layout_default.h 
 
-search_php.h: search.php
-	cat search.php | $(TO_C_CMD) >search_php.h 
+header_html.h: header.html
+	cat header.html | $(TO_C_CMD) >header_html.h
+
+footer_html.h: footer.html
+	cat footer.html | $(TO_C_CMD) >footer_html.h
+
+search_functions_php.h: search_functions.php
+	cat search_functions.php | $(TO_C_CMD) >search_functions_php.h 
+
+search_opensearch_php.h: search_opensearch.php
+	cat search_opensearch.php | $(TO_C_CMD) >search_opensearch_php.h 
 
 search_js.h: search.js
 	cat search.js | $(TO_C_CMD) >search_js.h 
@@ -146,3 +155,6 @@ navtree_css.h: navtree.css
 svgpan_js.h: svgpan.js
 	cat svgpan.js | $(TO_C_CMD) >svgpan_js.h
 
+doxygen_bst.h: doxygen.bst
+	cat doxygen.bst | $(TO_C_CMD) >doxygen_bst.h
+
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index 48109af..e9ebe66 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -342,6 +342,17 @@ void ManDocVisitor::visit(DocSimpleSectSep *)
 {
 }
 
+void ManDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  m_t << "\\fB";
+  if (cite->file().isEmpty()) m_t << "[";
+  filter(cite->text());
+  if (cite->file().isEmpty()) m_t << "]";
+  m_t << "\\fP";
+}
+
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
@@ -446,7 +457,7 @@ void ManDocVisitor::visitPre(DocSimpleSect *s)
     case DocSimpleSect::Post:
       m_t << theTranslator->trPostcondition(); break;
     case DocSimpleSect::Copyright:
-      m_t << "Copyright" /*theTranslator->trCopyright()*/; break;
+      m_t << theTranslator->trCopyright(); break;
     case DocSimpleSect::Invar:
       m_t << theTranslator->trInvariant(); break;
     case DocSimpleSect::Remark:
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
index 71eb667..929780e 100644
--- a/src/mandocvisitor.h
+++ b/src/mandocvisitor.h
@@ -51,6 +51,7 @@ class ManDocVisitor : public DocVisitor
     void visit(DocFormula *);
     void visit(DocIndexEntry *);
     void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 585754f..87ddde6 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -30,6 +30,7 @@
 #include <string.h>
 #include "docparser.h"
 #include "mandocvisitor.h"
+#include "language.h"
 
 static QCString getExtension()
 {
@@ -715,13 +716,6 @@ void ManGenerator::endConstraintList()
 {
 }
 
-void ManGenerator::startInlineDescription() 
-{
-}
-
-void ManGenerator::endInlineDescription() 
-{
-}
 
 void ManGenerator::startInlineHeader() 
 {
@@ -738,5 +732,54 @@ void ManGenerator::endInlineHeader()
   firstCol = FALSE;
 }
 
+void ManGenerator::startMemberDocSimple()
+{
+  if (!firstCol) 
+  {
+    t << endl << ".PP" << endl;
+  }
+  t << "\\fB";
+  docify(theTranslator->trCompoundMembers());
+  t << ":\\fP" << endl;
+  t << ".RS 4" << endl;
+}
+
+void ManGenerator::endMemberDocSimple()
+{
+  if (!firstCol) t << endl;
+  t << ".RE" << endl;
+  t << ".PP" << endl;
+  firstCol=TRUE;
+}
+
+void ManGenerator::startInlineMemberType()
+{
+}
+
+void ManGenerator::endInlineMemberType()
+{
+  t << " ";
+}
 
+void ManGenerator::startInlineMemberName()
+{
+  t << "\\fI";
+}
+
+void ManGenerator::endInlineMemberName()
+{
+  t << "\\fP ";
+}
+
+void ManGenerator::startInlineMemberDoc()
+{
+}
+
+void ManGenerator::endInlineMemberDoc()
+{
+  if (!firstCol) t << endl;
+  t << ".br" << endl;
+  t << ".PP" << endl;
+  firstCol=TRUE;
+}
 
diff --git a/src/mangen.h b/src/mangen.h
index c80d849..d312ecc 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -106,8 +106,6 @@ class ManGenerator : public OutputGenerator
     void endMemberDocList() {}
     void startMemberList();
     void endMemberList();
-    void startInlineDescription();
-    void endInlineDescription();
     void startInlineHeader();
     void endInlineHeader();
     void startAnonTypeScope(int);
@@ -235,6 +233,16 @@ class ManGenerator : public OutputGenerator
     void endConstraintDocs();
     void endConstraintList();
 
+    void startMemberDocSimple();
+    void endMemberDocSimple();
+    void startInlineMemberType();
+    void endInlineMemberType();
+    void startInlineMemberName();
+    void endInlineMemberName();
+    void startInlineMemberDoc();
+    void endInlineMemberDoc();
+
+
     void writeCodeAnchor(const char *) {}
     void linkableSymbol(int,const char *,Definition *,Definition *) {}
 
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index bd23b23..7330b00 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -2132,9 +2132,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
    
     if (!inbodyDocumentation().isEmpty())
     {
-      ol.startParagraph();
-      ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
-      ol.endParagraph();
+      ol.parseDoc(inbodyFile(),inbodyLine(),
+                  getOuterScope()?getOuterScope():container,this,
+                  inbodyDocumentation()+"\n",TRUE,FALSE);
     }
   }
   else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
@@ -2476,7 +2476,61 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
           qPrint(qualifiedName()));
     }
   }
+}
+
+void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
+{
+  Definition *scope  = getOuterScope();
+  QCString doxyName  = name();
+  QCString doxyArgs  = argsString();
+  QCString memAnchor = anchor();
+  QCString cfname    = getOutputFileBase();
+  QCString cname;
+  if (scope) cname   = scope->name();
+
+  ol.startInlineMemberType();
+  ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
+  linkifyText(TextGeneratorOLImpl(ol), // out
+              scope,                   // scope
+              getBodyDef(),            // fileScope
+              doxyName,                // 
+              m_impl->type,            // text
+              TRUE                     // autoBreak
+             ); 
+  ol.endDoxyAnchor(cfname,memAnchor);
+  ol.endInlineMemberType();
+
+  ol.startInlineMemberName();
+  ol.docify(doxyName);
+  ol.endInlineMemberName();
+
+  ol.startInlineMemberDoc();
+
+  QCString brief           = briefDescription();
+  QCString detailed        = documentation();
+
+  /* write brief description */
+  if (!brief.isEmpty() && 
+      (Config_getBool("REPEAT_BRIEF") || 
+       !Config_getBool("BRIEF_MEMBER_DESC")
+      ) 
+     )  
+  { 
+    ol.parseDoc(briefFile(),briefLine(),
+                getOuterScope()?getOuterScope():container,this,
+                brief,FALSE,FALSE,0,TRUE,FALSE);
+  }
+
+  /* write detailed description */
+  if (!detailed.isEmpty())
+  { 
+    ol.parseDoc(docFile(),docLine(),
+                getOuterScope()?getOuterScope():container,this,
+                detailed+"\n",FALSE,FALSE,0,TRUE,FALSE);
+   
+  }
 
+  ol.endInlineMemberDoc();
 }
 
 QCString MemberDef::memberTypeName() const
diff --git a/src/memberdef.h b/src/memberdef.h
index 4079f08..9311f2c 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -349,6 +349,7 @@ class MemberDef : public Definition
                             const char *scopeName,Definition *container,
                             bool inGroup,bool showEnumValues=FALSE,bool
                             showInline=FALSE);
+    void writeMemberDocSimple(OutputList &ol,Definition *container);
     void warnIfUndocumented();
     
     MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs,
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index aad386c..dc26691 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -542,6 +542,22 @@ void MemberList::writeDocumentation(OutputList &ol,
   ol.endMemberDocList();
 }
 
+void MemberList::writeSimpleDocumentation(OutputList &ol,
+                     Definition *container)
+{
+  countDocMembers(FALSE);
+  if (numDocMembers()==0) return;
+
+  ol.startMemberDocSimple();
+  MemberListIterator mli(*this);
+  MemberDef *md;
+  for ( ; (md=mli.current()) ; ++mli)
+  {
+    md->writeMemberDocSimple(ol,container);
+  }
+  ol.endMemberDocSimple();
+}
+
 void MemberList::writeDocumentationPage(OutputList &ol,
                      const char *scopeName, Definition *container)
 {
diff --git a/src/memberlist.h b/src/memberlist.h
index 2e40176..09ac656 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -143,6 +143,7 @@ class MemberList : public QList<MemberDef>
                const char *title,const char *subtitle,bool showEnumValues=FALSE,bool showInline=FALSE);
     void writeDocumentation(OutputList &ol,const char *scopeName,
                Definition *container,const char *title,bool showEnumValues=FALSE,bool showInline=FALSE);
+    void writeSimpleDocumentation(OutputList &ol,Definition *container);
     void writeDocumentationPage(OutputList &ol,
                const char *scopeName, Definition *container);
     bool declVisible() const;
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 0ea3edb..cc2d57b 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -338,6 +338,11 @@ void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)
   if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);
 }
 
+void NamespaceDef::writeInlineClasses(OutputList &ol)
+{
+  if (classSDict) classSDict->writeDocumentation(ol,this);
+}
+
 void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
 {
   if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
@@ -509,6 +514,9 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::MemberDefStart: 
         startMemberDocumentation(ol);
         break; 
+      case LayoutDocEntry::NamespaceInlineClasses:
+        writeInlineClasses(ol);
+        break;
       case LayoutDocEntry::MemberDef: 
         {
           LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
@@ -527,12 +535,14 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
       case LayoutDocEntry::ClassCollaborationGraph:
       case LayoutDocEntry::ClassAllMembersLink:
       case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::ClassInlineClasses:
       case LayoutDocEntry::FileClasses:
       case LayoutDocEntry::FileNamespaces:
       case LayoutDocEntry::FileIncludes:
       case LayoutDocEntry::FileIncludeGraph:
       case LayoutDocEntry::FileIncludedByGraph: 
       case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::FileInlineClasses:
       case LayoutDocEntry::GroupClasses: 
       case LayoutDocEntry::GroupInlineClasses: 
       case LayoutDocEntry::GroupNamespaces:
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 0f1594e..06029e4 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -98,6 +98,7 @@ class NamespaceDef : public Definition
     void startMemberDeclarations(OutputList &ol);
     void endMemberDeclarations(OutputList &ol);
     void writeClassDeclarations(OutputList &ol,const QCString &title);
+    void writeInlineClasses(OutputList &ol);
     void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
     void writeMemberGroups(OutputList &ol);
     void writeAuthorSection(OutputList &ol);
diff --git a/src/outputgen.h b/src/outputgen.h
index 0465eeb..acbaef9 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -335,8 +335,6 @@ class OutputGenerator : public BaseOutputDocInterface
     virtual void endMemberDocList() = 0;
     virtual void startMemberList() = 0;
     virtual void endMemberList() = 0;
-    virtual void startInlineDescription() = 0;
-    virtual void endInlineDescription() = 0;
     virtual void startInlineHeader() = 0;
     virtual void endInlineHeader() = 0;
     virtual void startAnonTypeScope(int) = 0;
@@ -411,6 +409,15 @@ class OutputGenerator : public BaseOutputDocInterface
     virtual void endConstraintDocs() = 0;
     virtual void endConstraintList() = 0;
 
+    virtual void startMemberDocSimple() = 0;
+    virtual void endMemberDocSimple() = 0;
+    virtual void startInlineMemberType() = 0;
+    virtual void endInlineMemberType() = 0;
+    virtual void startInlineMemberName() = 0;
+    virtual void endInlineMemberName() = 0;
+    virtual void startInlineMemberDoc() = 0;
+    virtual void endInlineMemberDoc() = 0;
+
   protected:
     FTextStream t;
     QFile *file;
diff --git a/src/outputlist.h b/src/outputlist.h
index 403adbc..298f57e 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -191,10 +191,6 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::startMemberList); }
     void endMemberList() 
     { forall(&OutputGenerator::endMemberList); }
-    void startInlineDescription()
-    { forall(&OutputGenerator::startInlineDescription); }
-    void endInlineDescription()
-    { forall(&OutputGenerator::endInlineDescription); }
     void startInlineHeader()
     { forall(&OutputGenerator::startInlineHeader); }
     void endInlineHeader()
@@ -425,6 +421,24 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::endConstraintDocs); }
     void endConstraintList()
     { forall(&OutputGenerator::endConstraintList); }
+
+    void startMemberDocSimple()
+    { forall(&OutputGenerator::startMemberDocSimple); }
+    void endMemberDocSimple()
+    { forall(&OutputGenerator::endMemberDocSimple); }
+    void startInlineMemberType()
+    { forall(&OutputGenerator::startInlineMemberType); }
+    void endInlineMemberType()
+    { forall(&OutputGenerator::endInlineMemberType); }
+    void startInlineMemberName()
+    { forall(&OutputGenerator::startInlineMemberName); }
+    void endInlineMemberName()
+    { forall(&OutputGenerator::endInlineMemberName); }
+    void startInlineMemberDoc()
+    { forall(&OutputGenerator::startInlineMemberDoc); }
+    void endInlineMemberDoc()
+    { forall(&OutputGenerator::endInlineMemberDoc); }
+
     void startFontClass(const char *c)
     { forall(&OutputGenerator::startFontClass,c); }
     void endFontClass()
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 69ff314..78451cd 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -297,6 +297,7 @@ public:
   void visit(DocFormula *);
   void visit(DocIndexEntry *);
   void visit(DocSimpleSectSep *);
+  void visit(DocCite *);
 
   //--------------------------------------
   // visitor functions for compound nodes
@@ -737,6 +738,14 @@ void PerlModDocVisitor::visit(DocSimpleSectSep *)
 {
 }
 
+void PerlModDocVisitor::visit(DocCite *cite)
+{
+  openItem("cite");
+  m_output.addFieldQuotedString("text", cite->text());
+  closeItem();
+}
+
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
diff --git a/src/pre.l b/src/pre.l
index 677877d..d4b5002 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -97,6 +97,7 @@ static DefineDict        *g_fileDefineDict = new DefineDict(1009);
 static DefineDict        *g_expandedDict;
 static int                g_findDefArgContext;
 static bool               g_expectGuard;
+static QCString           g_guardName;
 static QCString           g_lastGuardName;
 static QCString           g_incName;
 static QCString           g_guardExpr;
@@ -1238,7 +1239,7 @@ static void readIncludeFile(const QCString &inc)
     QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
 
     QCString dosExt = incFileName.right(4);
-    if (dosExt==".exe" || dosExt==".dll" || dosExt==".tbl")
+    if (dosExt==".exe" || dosExt==".dll" || dosExt==".tlb")
     {
       // skip imported binary files (e.g. M$ type libraries)
       return;
@@ -1811,7 +1812,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
   					}
 <DefinedExpr1,DefinedExpr2>\\\n		{ g_yyLineNr++; outputChar('\n'); }
 <DefinedExpr1>{ID}			{
-  					  if (isDefined(yytext))
+  					  if (isDefined(yytext) || g_guardName==yytext)
 					    g_guardExpr+=" 1L ";
 					  else
 					    g_guardExpr+=" 0L ";
@@ -1819,7 +1820,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 					  BEGIN(Guard);
   					}
 <DefinedExpr2>{ID}			{
-  					  if (isDefined(yytext))
+  					  if (isDefined(yytext) || g_guardName==yytext)
 					    g_guardExpr+=" 1L ";
 					  else
 					    g_guardExpr+=" 0L ";
@@ -2019,6 +2020,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 					  else // define is a guard => hide
 					  {
 					    //printf("Found a guard %s\n",yytext);
+					    g_guardName = yytext;
 					    g_lastGuardName.resize(0);
 					    BEGIN(Start);
 					  }
@@ -2645,6 +2647,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
   BEGIN( Start );
   
   g_expectGuard = guessSection(fileName)==Entry::HEADER_SEC;
+  g_guardName.resize(0);
   g_lastGuardName.resize(0);
   g_guardExpr.resize(0);
   
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index 33b2e60..7fdc159 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -215,6 +215,15 @@ class PrintDocVisitor : public DocVisitor
       indent_leaf();
       printf("<simplesectsep/>");
     }
+    void visit(DocCite *cite)
+    {
+      indent_leaf();
+      printf("<cite ref=\"%s\" file=\"%s\" "
+             "anchor=\"%s\" text=\"%s\""
+             "/>\n",
+             cite->ref().data(),cite->file().data(),cite->anchor().data(),
+             cite->text().data());
+    }
 
     //--------------------------------------
     
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index 6a70532..1eca048 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -543,6 +543,30 @@ void RTFDocVisitor::visit(DocSimpleSectSep *)
 {
 }
 
+void RTFDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCite)}\n");
+  if (!cite->file().isEmpty()) 
+  {
+    startLink(cite->ref(),cite->file(),cite->anchor());
+  }
+  else
+  {
+    m_t << "{\\b ";
+  }
+  filter(cite->text());
+  if (!cite->file().isEmpty()) 
+  {
+    endLink(cite->ref());
+  }
+  else
+  {
+    m_t << "}";
+  }
+}
+
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
@@ -664,7 +688,7 @@ void RTFDocVisitor::visitPre(DocSimpleSect *s)
     case DocSimpleSect::Post:
       m_t << theTranslator->trPostcondition(); break;
     case DocSimpleSect::Copyright:
-      m_t << "Copyright"; /* TODO: theTranslator->trCopyright();*/ break;
+      m_t << theTranslator->trCopyright(); break;
     case DocSimpleSect::Invar:
       m_t << theTranslator->trInvariant(); break;
     case DocSimpleSect::Remark:
@@ -1246,7 +1270,7 @@ void RTFDocVisitor::visitPre(DocParamList *pl)
   { { 2, 25, 100, 100, 100 }, // no inout, no type
     { 3, 14,  35, 100, 100 }, // inout, no type
     { 3, 25,  50, 100, 100 }, // no inout, type
-    { 4, 14,  35, 55,  100 }, // no inout, type
+    { 4, 14,  35, 55,  100 }, // inout, type
   };
   int config=0;
   if (m_hide) return;
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
index d739df6..fd76af2 100644
--- a/src/rtfdocvisitor.h
+++ b/src/rtfdocvisitor.h
@@ -51,6 +51,7 @@ class RTFDocVisitor : public DocVisitor
     void visit(DocFormula *);
     void visit(DocIndexEntry *);
     void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index da60111..1b4a18c 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -475,7 +475,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-             !cd->isEmbeddedInGroupDocs()
+             !cd->isEmbeddedInOuterScope()
              )
           {
             beginRTFChapter();
@@ -759,7 +759,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-             !cd->isEmbeddedInGroupDocs()
+             !cd->isEmbeddedInOuterScope()
              )
           {
             t << "\\par " << rtf_Style_Reset << endl;
@@ -773,7 +773,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         {
           if (cd->isLinkableInProject() && 
               cd->templateMaster()==0 &&
-             !cd->isEmbeddedInGroupDocs()
+             !cd->isEmbeddedInOuterScope()
              )
           {
             t << "\\par " << rtf_Style_Reset << endl;
@@ -2800,16 +2800,6 @@ void RTFGenerator::endIndexListItem()
   t << "\\par" << endl;
 }
 
-void RTFGenerator::startInlineDescription() 
-{
-  DBG_RTF(t << "{\\comment (startInlineDescription)}" << endl)
-}
-
-void RTFGenerator::endInlineDescription() 
-{
-  DBG_RTF(t << "{\\comment (endInlineDescription)}" << endl)
-}
-
 void RTFGenerator::startInlineHeader() 
 {
   DBG_RTF(t << "{\\comment (startInlineHeader)}" << endl)
@@ -2826,4 +2816,73 @@ void RTFGenerator::endInlineHeader()
   t << "}" << endl;
 }
 
+void RTFGenerator::startMemberDocSimple()
+{
+  DBG_RTF(t << "{\\comment (startMemberDocSimple)}" << endl)
+  t << "{\\par" << endl;
+  t << "{" << rtf_Style["Heading5"]->reference << endl;
+  t << theTranslator->trCompoundMembers() << ":\\par}" << endl;
+  t << rtf_Style_Reset << rtf_DList_DepthStyle();
+  t << "\\trowd \\trgaph108\\trleft426\\tblind426"
+       "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
+       "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
+       "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
+       "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
+       "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
+       "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl;
+  int i,columnPos[3] = { 25, 50, 100 };
+  for (i=0;i<3;i++)
+  {
+    t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
+         "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
+         "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
+         "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
+         "\\cltxlrtb "
+         "\\cellx" << (rtf_pageWidth*columnPos[i]/100) << endl;
+  }
+  t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
+}
+
+void RTFGenerator::endMemberDocSimple()
+{
+  DBG_RTF(t << "{\\comment (endMemberDocSimple)}" << endl)
+  t << "}" << endl;
+}
+
+void RTFGenerator::startInlineMemberType()
+{
+  DBG_RTF(t << "{\\comment (startInlineMemberType)}" << endl)
+  t << "{\\qr ";
+}
+
+void RTFGenerator::endInlineMemberType()
+{
+  DBG_RTF(t << "{\\comment (endInlineMemberType)}" << endl)
+  t << "\\cell }";
+}
+
+void RTFGenerator::startInlineMemberName()
+{
+  DBG_RTF(t << "{\\comment (startInlineMemberName)}" << endl)
+  t << "{";
+}
+
+void RTFGenerator::endInlineMemberName()
+{
+  DBG_RTF(t << "{\\comment (endInlineMemberName)}" << endl)
+  t << "\\cell }";
+}
+
+void RTFGenerator::startInlineMemberDoc()
+{
+  DBG_RTF(t << "{\\comment (startInlineMemberDoc)}" << endl)
+  t << "{";
+}
+
+void RTFGenerator::endInlineMemberDoc()
+{
+  DBG_RTF(t << "{\\comment (endInlineMemberDoc)}" << endl)
+  t << "\\cell }{\\row }" << endl;
+}
+
 
diff --git a/src/rtfgen.h b/src/rtfgen.h
index d85f921..406519c 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -106,8 +106,6 @@ class RTFGenerator : public OutputGenerator
     void endMemberDocList() {}
     void startMemberList();
     void endMemberList();
-    void startInlineDescription();
-    void endInlineDescription();
     void startInlineHeader();
     void endInlineHeader();
     void startAnonTypeScope(int) {}
@@ -234,6 +232,14 @@ class RTFGenerator : public OutputGenerator
     void endConstraintDocs();
     void endConstraintList();
 
+    void startMemberDocSimple();
+    void endMemberDocSimple();
+    void startInlineMemberType();
+    void endInlineMemberType();
+    void startInlineMemberName();
+    void endInlineMemberName();
+    void startInlineMemberDoc();
+    void endInlineMemberDoc();
 
     void startFontClass(const char *) {}
     void endFontClass() {}
diff --git a/src/search.php b/src/search.php
deleted file mode 100644
index 906f09c..0000000
--- a/src/search.php
+++ /dev/null
@@ -1,317 +0,0 @@
-function readInt($file)
-{
-  $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));
-  $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));
-  return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;
-}
-
-function readString($file)
-{
-  $result="";
-  while (ord($c=fgetc($file))) $result.=$c;
-  return $result;
-}
-
-function readHeader($file)
-{
-  $header =fgetc($file); $header.=fgetc($file);
-  $header.=fgetc($file); $header.=fgetc($file);
-  return $header;
-}
-
-function computeIndex($word)
-{
-  // Simple hashing that allows for substring search
-  if (strlen($word)<2) return -1;
-  // high char of the index
-  $hi = ord($word{0});
-  if ($hi==0) return -1;
-  // low char of the index
-  $lo = ord($word{1});
-  if ($lo==0) return -1;
-  // return index
-  return $hi*256+$lo;
-}
-
-function search($file,$word,&$statsList)
-{
-  $index = computeIndex($word);
-  if ($index!=-1) // found a valid index
-  {
-    fseek($file,$index*4+4); // 4 bytes per entry, skip header
-    $index = readInt($file);
-    if ($index) // found words matching the hash key
-    {
-      $start=sizeof($statsList);
-      $count=$start;
-      fseek($file,$index);
-      $w = readString($file);
-      while ($w)
-      {
-        $statIdx = readInt($file);
-        if ($word==substr($w,0,strlen($word)))
-        { // found word that matches (as substring)
-          $statsList[$count++]=array(
-              "word"=>$word,
-              "match"=>$w,
-              "index"=>$statIdx,
-              "full"=>strlen($w)==strlen($word),
-              "docs"=>array()
-              );
-        }
-        $w = readString($file);
-      }
-      $totalHi=0;
-      $totalFreqHi=0;
-      $totalFreqLo=0;
-      for ($count=$start;$count<sizeof($statsList);$count++)
-      {
-        $statInfo = &$statsList[$count];
-        $multiplier = 1;
-        // whole word matches have a double weight
-        if ($statInfo["full"]) $multiplier=2;
-        fseek($file,$statInfo["index"]); 
-        $numDocs = readInt($file);
-        $docInfo = array();
-        // read docs info + occurrence frequency of the word
-        for ($i=0;$i<$numDocs;$i++)
-        {
-          $idx=readInt($file); 
-          $freq=readInt($file); 
-          $docInfo[$i]=array("idx"  => $idx,
-                             "freq" => $freq>>1,
-                             "rank" => 0.0,
-                             "hi"   => $freq&1
-                            );
-          if ($freq&1) // word occurs in high priority doc
-          {
-            $totalHi++;
-            $totalFreqHi+=$freq*$multiplier;
-          }
-          else // word occurs in low priority doc
-          {
-            $totalFreqLo+=$freq*$multiplier;
-          }
-        }
-        // read name and url info for the doc
-        for ($i=0;$i<$numDocs;$i++)
-        {
-          fseek($file,$docInfo[$i]["idx"]);
-          $docInfo[$i]["name"]=readString($file);
-          $docInfo[$i]["url"]=readString($file);
-        }
-        $statInfo["docs"]=$docInfo;
-      }
-      $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;
-      for ($count=$start;$count<sizeof($statsList);$count++)
-      {
-        $statInfo = &$statsList[$count];
-        $multiplier = 1;
-        // whole word matches have a double weight
-        if ($statInfo["full"]) $multiplier=2;
-        for ($i=0;$i<sizeof($statInfo["docs"]);$i++)
-        {
-          $docInfo = &$statInfo["docs"];
-          // compute frequency rank of the word in each doc
-          $freq=$docInfo[$i]["freq"];
-          if ($docInfo[$i]["hi"])
-          {
-            $statInfo["docs"][$i]["rank"]=
-              (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;
-          }
-          else
-          {
-            $statInfo["docs"][$i]["rank"]=
-              (float)($freq*$multiplier)/$totalFreq;
-          }
-        }
-      }
-    }
-  }
-  return $statsList;
-}
-
-function combine_results($results,&$docs)
-{
-  foreach ($results as $wordInfo)
-  {
-    $docsList = &$wordInfo["docs"];
-    foreach ($docsList as $di)
-    {
-      $key=$di["url"];
-      $rank=$di["rank"];
-      if (isset($docs[$key]))
-      {
-        $docs[$key]["rank"]+=$rank;
-      }
-      else
-      {
-        $docs[$key] = array("url"=>$key,
-            "name"=>$di["name"],
-            "rank"=>$rank
-            );
-      }
-      $docs[$key]["words"][] = array(
-               "word"=>$wordInfo["word"],
-               "match"=>$wordInfo["match"],
-               "freq"=>$di["freq"]
-               );
-    }
-  }
-  return $docs;
-}
-
-function filter_results($docs,&$requiredWords,&$forbiddenWords)
-{
-  $filteredDocs=array();
-  while (list ($key, $val) = each ($docs)) 
-  {
-    $words = &$docs[$key]["words"];
-    $copy=1; // copy entry by default
-    if (sizeof($requiredWords)>0)
-    {
-      foreach ($requiredWords as $reqWord)
-      {
-        $found=0;
-        foreach ($words as $wordInfo)
-        { 
-          $found = $wordInfo["word"]==$reqWord;
-          if ($found) break;
-        }
-        if (!$found) 
-        {
-          $copy=0; // document contains none of the required words
-          break;
-        }
-      }
-    }
-    if (sizeof($forbiddenWords)>0)
-    {
-      foreach ($words as $wordInfo)
-      {
-        if (in_array($wordInfo["word"],$forbiddenWords))
-        {
-          $copy=0; // document contains a forbidden word
-          break;
-        }
-      }
-    }
-    if ($copy) $filteredDocs[$key]=$docs[$key];
-  }
-  return $filteredDocs;
-}
-
-function compare_rank($a,$b)
-{
-  if ($a["rank"] == $b["rank"]) 
-  {
-    return 0;
-  }
-  return ($a["rank"]>$b["rank"]) ? -1 : 1; 
-}
-
-function sort_results($docs,&$sorted)
-{
-  $sorted = $docs;
-  usort($sorted,"compare_rank");
-  return $sorted;
-}
-
-function report_results(&$docs)
-{
-  echo "<div class=\"header\">";
-  echo "  <div class=\"headertitle\">\n";
-  echo "    <h1>".search_results()."</h1>\n";
-  echo "  </div>\n";
-  echo "</div>\n";
-  echo "<div class=\"searchresults\">\n";
-  echo "<table cellspacing=\"2\">\n";
-  $numDocs = sizeof($docs);
-  if ($numDocs==0)
-  {
-    echo "  <tr>\n";
-    echo "    <td colspan=\"2\">".matches_text(0)."</td>\n";
-    echo "  </tr>\n";
-  }
-  else
-  {
-    echo "  <tr>\n";
-    echo "    <td colspan=\"2\">".matches_text($numDocs);
-    echo "\n";
-    echo "    </td>\n";
-    echo "  </tr>\n";
-    $num=1;
-    foreach ($docs as $doc)
-    {
-      echo "  <tr>\n";
-      echo "    <td align=\"right\">$num.</td>";
-      echo     "<td><a class=\"el\" href=\"".$doc["url"]."\">".$doc["name"]."</a></td>\n";
-      echo "  <tr>\n";
-      echo "    <td></td><td class=\"tiny\">".report_matches()." ";
-      foreach ($doc["words"] as $wordInfo)
-      {
-        $word = $wordInfo["word"];
-        $matchRight = substr($wordInfo["match"],strlen($word));
-        echo "<b>$word</b>$matchRight(".$wordInfo["freq"].") ";
-      }
-      echo "    </td>\n";
-      echo "  </tr>\n";
-      $num++;
-    }
-  }
-  echo "</table>\n";
-}
-
-function main()
-{
-  if(strcmp('4.1.0', phpversion()) > 0) 
-  {
-    die("Error: PHP version 4.1.0 or above required!");
-  }
-  if (!($file=fopen("search/search.idx","rb"))) 
-  {
-    die("Error: Search index file could NOT be opened!");
-  }
-  if (readHeader($file)!="DOXS")
-  {
-    die("Error: Header of index file is invalid!");
-  }
-  $query="";
-  if (array_key_exists("query", $_GET))
-  {
-    $query=$_GET["query"];
-  }
-  end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query ));
-  $results = array();
-  $requiredWords = array();
-  $forbiddenWords = array();
-  $foundWords = array();
-  $word=strtok($query," ");
-  while ($word) // for each word in the search query
-  {
-    if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }
-    if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }
-    if (!in_array($word,$foundWords))
-    {
-      $foundWords[]=$word;
-      search($file,strtolower($word),$results);
-    }
-    $word=strtok(" ");
-  }
-  $docs = array();
-  combine_results($results,$docs);
-  // filter out documents with forbidden word or that do not contain
-  // required words
-  $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);
-  // sort the results based on rank
-  $sorted = array();
-  sort_results($filteredDocs,$sorted);
-  // report results to the user
-  report_results($sorted);
-  echo "</div>\n";
-  end_page();
-  fclose($file);
-}
-
-main();
-
diff --git a/src/search_functions.php b/src/search_functions.php
new file mode 100644
index 0000000..10dabf2
--- /dev/null
+++ b/src/search_functions.php
@@ -0,0 +1,374 @@
+<script language="PHP">
+require_once "search-config.php";
+
+function end_form($value)
+{
+  global $config;
+  global $translator;
+  if ($config['DISABLE_INDEX'] == false)
+  {
+  echo "            <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\"$value\" size=\"20\" accesskey=\"S\" onfocus=\"searchBox.OnSearchFieldFocus(true)\" onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n            </form>\n          </div><div class=\"right\"></div>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div>\n";
+  }
+  if ($config['GENERATE_TREEVIEW'])
+  {
+    echo $translator['split_bar'];
+  }
+}
+
+function end_page()
+{
+  global $config;
+  global $translator;
+  if ($config['GENERATE_TREEVIEW'])
+  {
+    echo "</div>\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n    <li class=\"footer\">";
+    echo $translator['logo'];
+    echo "</li>\n  </ul>\n</div>";
+  }
+  echo "</body></html>";
+}
+
+function search_results()
+{
+  global $translator;
+  return $translator['search_results_title'];
+}
+
+function matches_text($num)
+{
+  global $translator;
+  $string = $translator['search_results'][($num>2)?2:$num];
+  // The eval is used so that translator strings can contain $num.
+  eval("\$result = \"$string\";");
+  return $result;
+}
+
+function report_matches()
+{
+  global $translator;
+  return $translator['search_matches'];
+}
+
+function readInt($file)
+{
+  $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));
+  $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));
+  return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;
+}
+
+function readString($file)
+{
+  $result="";
+  while (ord($c=fgetc($file))) $result.=$c;
+  return $result;
+}
+
+function readHeader($file)
+{
+  $header =fgetc($file); $header.=fgetc($file);
+  $header.=fgetc($file); $header.=fgetc($file);
+  return $header;
+}
+
+function computeIndex($word)
+{
+  // Simple hashing that allows for substring search
+  if (strlen($word)<2) return -1;
+  // high char of the index
+  $hi = ord($word{0});
+  if ($hi==0) return -1;
+  // low char of the index
+  $lo = ord($word{1});
+  if ($lo==0) return -1;
+  // return index
+  return $hi*256+$lo;
+}
+
+function search($file,$word,&$statsList)
+{
+  $index = computeIndex($word);
+  if ($index!=-1) // found a valid index
+  {
+    fseek($file,$index*4+4); // 4 bytes per entry, skip header
+    $index = readInt($file);
+    if ($index) // found words matching the hash key
+    {
+      $start=sizeof($statsList);
+      $count=$start;
+      fseek($file,$index);
+      $w = readString($file);
+      while ($w)
+      {
+        $statIdx = readInt($file);
+        if ($word==substr($w,0,strlen($word)))
+        { // found word that matches (as substring)
+          $statsList[$count++]=array(
+              "word"=>$word,
+              "match"=>$w,
+              "index"=>$statIdx,
+              "full"=>strlen($w)==strlen($word),
+              "docs"=>array()
+              );
+        }
+        $w = readString($file);
+      }
+      $totalHi=0;
+      $totalFreqHi=0;
+      $totalFreqLo=0;
+      for ($count=$start;$count<sizeof($statsList);$count++)
+      {
+        $statInfo = &$statsList[$count];
+        $multiplier = 1;
+        // whole word matches have a double weight
+        if ($statInfo["full"]) $multiplier=2;
+        fseek($file,$statInfo["index"]); 
+        $numDocs = readInt($file);
+        $docInfo = array();
+        // read docs info + occurrence frequency of the word
+        for ($i=0;$i<$numDocs;$i++)
+        {
+          $idx=readInt($file); 
+          $freq=readInt($file); 
+          $docInfo[$i]=array("idx"  => $idx,
+                             "freq" => $freq>>1,
+                             "rank" => 0.0,
+                             "hi"   => $freq&1
+                            );
+          if ($freq&1) // word occurs in high priority doc
+          {
+            $totalHi++;
+            $totalFreqHi+=$freq*$multiplier;
+          }
+          else // word occurs in low priority doc
+          {
+            $totalFreqLo+=$freq*$multiplier;
+          }
+        }
+        // read name and url info for the doc
+        for ($i=0;$i<$numDocs;$i++)
+        {
+          fseek($file,$docInfo[$i]["idx"]);
+          $docInfo[$i]["name"]=readString($file);
+          $docInfo[$i]["url"]=readString($file);
+        }
+        $statInfo["docs"]=$docInfo;
+      }
+      $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;
+      for ($count=$start;$count<sizeof($statsList);$count++)
+      {
+        $statInfo = &$statsList[$count];
+        $multiplier = 1;
+        // whole word matches have a double weight
+        if ($statInfo["full"]) $multiplier=2;
+        for ($i=0;$i<sizeof($statInfo["docs"]);$i++)
+        {
+          $docInfo = &$statInfo["docs"];
+          // compute frequency rank of the word in each doc
+          $freq=$docInfo[$i]["freq"];
+          if ($docInfo[$i]["hi"])
+          {
+            $statInfo["docs"][$i]["rank"]=
+              (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;
+          }
+          else
+          {
+            $statInfo["docs"][$i]["rank"]=
+              (float)($freq*$multiplier)/$totalFreq;
+          }
+        }
+      }
+    }
+  }
+  return $statsList;
+}
+
+function combine_results($results,&$docs)
+{
+  foreach ($results as $wordInfo)
+  {
+    $docsList = &$wordInfo["docs"];
+    foreach ($docsList as $di)
+    {
+      $key=$di["url"];
+      $rank=$di["rank"];
+      if (isset($docs[$key]))
+      {
+        $docs[$key]["rank"]+=$rank;
+      }
+      else
+      {
+        $docs[$key] = array("url"=>$key,
+            "name"=>$di["name"],
+            "rank"=>$rank
+            );
+      }
+      $docs[$key]["words"][] = array(
+               "word"=>$wordInfo["word"],
+               "match"=>$wordInfo["match"],
+               "freq"=>$di["freq"]
+               );
+    }
+  }
+  return $docs;
+}
+
+function filter_results($docs,&$requiredWords,&$forbiddenWords)
+{
+  $filteredDocs=array();
+  while (list ($key, $val) = each ($docs)) 
+  {
+    $words = &$docs[$key]["words"];
+    $copy=1; // copy entry by default
+    if (sizeof($requiredWords)>0)
+    {
+      foreach ($requiredWords as $reqWord)
+      {
+        $found=0;
+        foreach ($words as $wordInfo)
+        { 
+          $found = $wordInfo["word"]==$reqWord;
+          if ($found) break;
+        }
+        if (!$found) 
+        {
+          $copy=0; // document contains none of the required words
+          break;
+        }
+      }
+    }
+    if (sizeof($forbiddenWords)>0)
+    {
+      foreach ($words as $wordInfo)
+      {
+        if (in_array($wordInfo["word"],$forbiddenWords))
+        {
+          $copy=0; // document contains a forbidden word
+          break;
+        }
+      }
+    }
+    if ($copy) $filteredDocs[$key]=$docs[$key];
+  }
+  return $filteredDocs;
+}
+
+function compare_rank($a,$b)
+{
+  if ($a["rank"] == $b["rank"]) 
+  {
+    return 0;
+  }
+  return ($a["rank"]>$b["rank"]) ? -1 : 1; 
+}
+
+function sort_results($docs,&$sorted)
+{
+  $sorted = $docs;
+  usort($sorted,"compare_rank");
+  return $sorted;
+}
+
+function report_results(&$docs)
+{
+  echo "<div class=\"header\">";
+  echo "  <div class=\"headertitle\">\n";
+  echo "    <h1>".search_results()."</h1>\n";
+  echo "  </div>\n";
+  echo "</div>\n";
+  echo "<div class=\"searchresults\">\n";
+  echo "<table cellspacing=\"2\">\n";
+  $numDocs = sizeof($docs);
+  if ($numDocs==0)
+  {
+    echo "  <tr>\n";
+    echo "    <td colspan=\"2\">".matches_text(0)."</td>\n";
+    echo "  </tr>\n";
+  }
+  else
+  {
+    echo "  <tr>\n";
+    echo "    <td colspan=\"2\">".matches_text($numDocs);
+    echo "\n";
+    echo "    </td>\n";
+    echo "  </tr>\n";
+    $num=1;
+    foreach ($docs as $doc)
+    {
+      echo "  <tr>\n";
+      echo "    <td align=\"right\">$num.</td>";
+      echo     "<td><a class=\"el\" href=\"".$doc["url"]."\">".$doc["name"]."</a></td>\n";
+      echo "  <tr>\n";
+      echo "    <td></td><td class=\"tiny\">".report_matches()." ";
+      foreach ($doc["words"] as $wordInfo)
+      {
+        $word = $wordInfo["word"];
+        $matchRight = substr($wordInfo["match"],strlen($word));
+        echo "<b>$word</b>$matchRight(".$wordInfo["freq"].") ";
+      }
+      echo "    </td>\n";
+      echo "  </tr>\n";
+      $num++;
+    }
+  }
+  echo "</table>\n";
+  echo "</div>\n";
+}
+
+function run_query($query)
+{
+  if(strcmp('4.1.0', phpversion()) > 0) 
+  {
+    die("Error: PHP version 4.1.0 or above required!");
+  }
+  if (!($file=fopen("search/search.idx","rb"))) 
+  {
+    die("Error: Search index file could NOT be opened!");
+  }
+  if (readHeader($file)!="DOXS")
+  {
+    die("Error: Header of index file is invalid!");
+  }
+  $results = array();
+  $requiredWords = array();
+  $forbiddenWords = array();
+  $foundWords = array();
+  $word=strtok($query," ");
+  while ($word) // for each word in the search query
+  {
+    if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }
+    if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }
+    if (!in_array($word,$foundWords))
+    {
+      $foundWords[]=$word;
+      search($file,strtolower($word),$results);
+    }
+    $word=strtok(" ");
+  }
+  fclose($file);
+  $docs = array();
+  combine_results($results,$docs);
+  // filter out documents with forbidden word or that do not contain
+  // required words
+  $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);
+  // sort the results based on rank
+  $sorted = array();
+  sort_results($filteredDocs,$sorted);
+  return $sorted;
+}
+
+function main()
+{
+  $query = "";
+  if (array_key_exists("query", $_GET))
+  {
+    $query=$_GET["query"];
+  }
+  $sorted = run_query($query);
+  // Now output the HTML stuff...
+  // End the HTML form
+  end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query ));
+  // report results to the user
+  report_results($sorted);
+  end_page();
+}
+</script>
diff --git a/src/search_functions_php.h b/src/search_functions_php.h
new file mode 100644
index 0000000..27c722c
--- /dev/null
+++ b/src/search_functions_php.h
@@ -0,0 +1,374 @@
+"<script language=\"PHP\">\n"
+"require_once \"search-config.php\";\n"
+"\n"
+"function end_form($value)\n"
+"{\n"
+"  global $config;\n"
+"  global $translator;\n"
+"  if ($config['DISABLE_INDEX'] == false)\n"
+"  {\n"
+"  echo \"            <input type=\\\"text\\\" id=\\\"MSearchField\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"S\\\" onfocus=\\\"searchBox.OnSearchFieldFocus(true)\\\" onblur=\\\"searchBox.OnSearchFieldFocus(false)\\\"/>\\n            </form>\\n          </div><div class=\\\"right\\\"></div>\\n        </div>\\n      </li>\\n    </ul>\\n  </div>\\n</div>\\n\";\n"
+"  }\n"
+"  if ($config['GENERATE_TREEVIEW'])\n"
+"  {\n"
+"    echo $translator['split_bar'];\n"
+"  }\n"
+"}\n"
+"\n"
+"function end_page()\n"
+"{\n"
+"  global $config;\n"
+"  global $translator;\n"
+"  if ($config['GENERATE_TREEVIEW'])\n"
+"  {\n"
+"    echo \"</div>\\n<div id=\\\"nav-path\\\" class=\\\"navpath\\\">\\n  <ul>\\n    <li class=\\\"footer\\\">\";\n"
+"    echo $translator['logo'];\n"
+"    echo \"</li>\\n  </ul>\\n</div>\";\n"
+"  }\n"
+"  echo \"</body></html>\";\n"
+"}\n"
+"\n"
+"function search_results()\n"
+"{\n"
+"  global $translator;\n"
+"  return $translator['search_results_title'];\n"
+"}\n"
+"\n"
+"function matches_text($num)\n"
+"{\n"
+"  global $translator;\n"
+"  $string = $translator['search_results'][($num>2)?2:$num];\n"
+"  // The eval is used so that translator strings can contain $num.\n"
+"  eval(\"\\$result = \\\"$string\\\";\");\n"
+"  return $result;\n"
+"}\n"
+"\n"
+"function report_matches()\n"
+"{\n"
+"  global $translator;\n"
+"  return $translator['search_matches'];\n"
+"}\n"
+"\n"
+"function readInt($file)\n"
+"{\n"
+"  $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n"
+"  $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));\n"
+"  return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;\n"
+"}\n"
+"\n"
+"function readString($file)\n"
+"{\n"
+"  $result=\"\";\n"
+"  while (ord($c=fgetc($file))) $result.=$c;\n"
+"  return $result;\n"
+"}\n"
+"\n"
+"function readHeader($file)\n"
+"{\n"
+"  $header =fgetc($file); $header.=fgetc($file);\n"
+"  $header.=fgetc($file); $header.=fgetc($file);\n"
+"  return $header;\n"
+"}\n"
+"\n"
+"function computeIndex($word)\n"
+"{\n"
+"  // Simple hashing that allows for substring search\n"
+"  if (strlen($word)<2) return -1;\n"
+"  // high char of the index\n"
+"  $hi = ord($word{0});\n"
+"  if ($hi==0) return -1;\n"
+"  // low char of the index\n"
+"  $lo = ord($word{1});\n"
+"  if ($lo==0) return -1;\n"
+"  // return index\n"
+"  return $hi*256+$lo;\n"
+"}\n"
+"\n"
+"function search($file,$word,&$statsList)\n"
+"{\n"
+"  $index = computeIndex($word);\n"
+"  if ($index!=-1) // found a valid index\n"
+"  {\n"
+"    fseek($file,$index*4+4); // 4 bytes per entry, skip header\n"
+"    $index = readInt($file);\n"
+"    if ($index) // found words matching the hash key\n"
+"    {\n"
+"      $start=sizeof($statsList);\n"
+"      $count=$start;\n"
+"      fseek($file,$index);\n"
+"      $w = readString($file);\n"
+"      while ($w)\n"
+"      {\n"
+"        $statIdx = readInt($file);\n"
+"        if ($word==substr($w,0,strlen($word)))\n"
+"        { // found word that matches (as substring)\n"
+"          $statsList[$count++]=array(\n"
+"              \"word\"=>$word,\n"
+"              \"match\"=>$w,\n"
+"              \"index\"=>$statIdx,\n"
+"              \"full\"=>strlen($w)==strlen($word),\n"
+"              \"docs\"=>array()\n"
+"              );\n"
+"        }\n"
+"        $w = readString($file);\n"
+"      }\n"
+"      $totalHi=0;\n"
+"      $totalFreqHi=0;\n"
+"      $totalFreqLo=0;\n"
+"      for ($count=$start;$count<sizeof($statsList);$count++)\n"
+"      {\n"
+"        $statInfo = &$statsList[$count];\n"
+"        $multiplier = 1;\n"
+"        // whole word matches have a double weight\n"
+"        if ($statInfo[\"full\"]) $multiplier=2;\n"
+"        fseek($file,$statInfo[\"index\"]); \n"
+"        $numDocs = readInt($file);\n"
+"        $docInfo = array();\n"
+"        // read docs info + occurrence frequency of the word\n"
+"        for ($i=0;$i<$numDocs;$i++)\n"
+"        {\n"
+"          $idx=readInt($file); \n"
+"          $freq=readInt($file); \n"
+"          $docInfo[$i]=array(\"idx\"  => $idx,\n"
+"                             \"freq\" => $freq>>1,\n"
+"                             \"rank\" => 0.0,\n"
+"                             \"hi\"   => $freq&1\n"
+"                            );\n"
+"          if ($freq&1) // word occurs in high priority doc\n"
+"          {\n"
+"            $totalHi++;\n"
+"            $totalFreqHi+=$freq*$multiplier;\n"
+"          }\n"
+"          else // word occurs in low priority doc\n"
+"          {\n"
+"            $totalFreqLo+=$freq*$multiplier;\n"
+"          }\n"
+"        }\n"
+"        // read name and url info for the doc\n"
+"        for ($i=0;$i<$numDocs;$i++)\n"
+"        {\n"
+"          fseek($file,$docInfo[$i][\"idx\"]);\n"
+"          $docInfo[$i][\"name\"]=readString($file);\n"
+"          $docInfo[$i][\"url\"]=readString($file);\n"
+"        }\n"
+"        $statInfo[\"docs\"]=$docInfo;\n"
+"      }\n"
+"      $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;\n"
+"      for ($count=$start;$count<sizeof($statsList);$count++)\n"
+"      {\n"
+"        $statInfo = &$statsList[$count];\n"
+"        $multiplier = 1;\n"
+"        // whole word matches have a double weight\n"
+"        if ($statInfo[\"full\"]) $multiplier=2;\n"
+"        for ($i=0;$i<sizeof($statInfo[\"docs\"]);$i++)\n"
+"        {\n"
+"          $docInfo = &$statInfo[\"docs\"];\n"
+"          // compute frequency rank of the word in each doc\n"
+"          $freq=$docInfo[$i][\"freq\"];\n"
+"          if ($docInfo[$i][\"hi\"])\n"
+"          {\n"
+"            $statInfo[\"docs\"][$i][\"rank\"]=\n"
+"              (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;\n"
+"          }\n"
+"          else\n"
+"          {\n"
+"            $statInfo[\"docs\"][$i][\"rank\"]=\n"
+"              (float)($freq*$multiplier)/$totalFreq;\n"
+"          }\n"
+"        }\n"
+"      }\n"
+"    }\n"
+"  }\n"
+"  return $statsList;\n"
+"}\n"
+"\n"
+"function combine_results($results,&$docs)\n"
+"{\n"
+"  foreach ($results as $wordInfo)\n"
+"  {\n"
+"    $docsList = &$wordInfo[\"docs\"];\n"
+"    foreach ($docsList as $di)\n"
+"    {\n"
+"      $key=$di[\"url\"];\n"
+"      $rank=$di[\"rank\"];\n"
+"      if (isset($docs[$key]))\n"
+"      {\n"
+"        $docs[$key][\"rank\"]+=$rank;\n"
+"      }\n"
+"      else\n"
+"      {\n"
+"        $docs[$key] = array(\"url\"=>$key,\n"
+"            \"name\"=>$di[\"name\"],\n"
+"            \"rank\"=>$rank\n"
+"            );\n"
+"      }\n"
+"      $docs[$key][\"words\"][] = array(\n"
+"               \"word\"=>$wordInfo[\"word\"],\n"
+"               \"match\"=>$wordInfo[\"match\"],\n"
+"               \"freq\"=>$di[\"freq\"]\n"
+"               );\n"
+"    }\n"
+"  }\n"
+"  return $docs;\n"
+"}\n"
+"\n"
+"function filter_results($docs,&$requiredWords,&$forbiddenWords)\n"
+"{\n"
+"  $filteredDocs=array();\n"
+"  while (list ($key, $val) = each ($docs)) \n"
+"  {\n"
+"    $words = &$docs[$key][\"words\"];\n"
+"    $copy=1; // copy entry by default\n"
+"    if (sizeof($requiredWords)>0)\n"
+"    {\n"
+"      foreach ($requiredWords as $reqWord)\n"
+"      {\n"
+"        $found=0;\n"
+"        foreach ($words as $wordInfo)\n"
+"        { \n"
+"          $found = $wordInfo[\"word\"]==$reqWord;\n"
+"          if ($found) break;\n"
+"        }\n"
+"        if (!$found) \n"
+"        {\n"
+"          $copy=0; // document contains none of the required words\n"
+"          break;\n"
+"        }\n"
+"      }\n"
+"    }\n"
+"    if (sizeof($forbiddenWords)>0)\n"
+"    {\n"
+"      foreach ($words as $wordInfo)\n"
+"      {\n"
+"        if (in_array($wordInfo[\"word\"],$forbiddenWords))\n"
+"        {\n"
+"          $copy=0; // document contains a forbidden word\n"
+"          break;\n"
+"        }\n"
+"      }\n"
+"    }\n"
+"    if ($copy) $filteredDocs[$key]=$docs[$key];\n"
+"  }\n"
+"  return $filteredDocs;\n"
+"}\n"
+"\n"
+"function compare_rank($a,$b)\n"
+"{\n"
+"  if ($a[\"rank\"] == $b[\"rank\"]) \n"
+"  {\n"
+"    return 0;\n"
+"  }\n"
+"  return ($a[\"rank\"]>$b[\"rank\"]) ? -1 : 1; \n"
+"}\n"
+"\n"
+"function sort_results($docs,&$sorted)\n"
+"{\n"
+"  $sorted = $docs;\n"
+"  usort($sorted,\"compare_rank\");\n"
+"  return $sorted;\n"
+"}\n"
+"\n"
+"function report_results(&$docs)\n"
+"{\n"
+"  echo \"<div class=\\\"header\\\">\";\n"
+"  echo \"  <div class=\\\"headertitle\\\">\\n\";\n"
+"  echo \"    <h1>\".search_results().\"</h1>\\n\";\n"
+"  echo \"  </div>\\n\";\n"
+"  echo \"</div>\\n\";\n"
+"  echo \"<div class=\\\"searchresults\\\">\\n\";\n"
+"  echo \"<table cellspacing=\\\"2\\\">\\n\";\n"
+"  $numDocs = sizeof($docs);\n"
+"  if ($numDocs==0)\n"
+"  {\n"
+"    echo \"  <tr>\\n\";\n"
+"    echo \"    <td colspan=\\\"2\\\">\".matches_text(0).\"</td>\\n\";\n"
+"    echo \"  </tr>\\n\";\n"
+"  }\n"
+"  else\n"
+"  {\n"
+"    echo \"  <tr>\\n\";\n"
+"    echo \"    <td colspan=\\\"2\\\">\".matches_text($numDocs);\n"
+"    echo \"\\n\";\n"
+"    echo \"    </td>\\n\";\n"
+"    echo \"  </tr>\\n\";\n"
+"    $num=1;\n"
+"    foreach ($docs as $doc)\n"
+"    {\n"
+"      echo \"  <tr>\\n\";\n"
+"      echo \"    <td align=\\\"right\\\">$num.</td>\";\n"
+"      echo     \"<td><a class=\\\"el\\\" href=\\\"\".$doc[\"url\"].\"\\\">\".$doc[\"name\"].\"</a></td>\\n\";\n"
+"      echo \"  <tr>\\n\";\n"
+"      echo \"    <td></td><td class=\\\"tiny\\\">\".report_matches().\" \";\n"
+"      foreach ($doc[\"words\"] as $wordInfo)\n"
+"      {\n"
+"        $word = $wordInfo[\"word\"];\n"
+"        $matchRight = substr($wordInfo[\"match\"],strlen($word));\n"
+"        echo \"<b>$word</b>$matchRight(\".$wordInfo[\"freq\"].\") \";\n"
+"      }\n"
+"      echo \"    </td>\\n\";\n"
+"      echo \"  </tr>\\n\";\n"
+"      $num++;\n"
+"    }\n"
+"  }\n"
+"  echo \"</table>\\n\";\n"
+"  echo \"</div>\\n\";\n"
+"}\n"
+"\n"
+"function run_query($query)\n"
+"{\n"
+"  if(strcmp('4.1.0', phpversion()) > 0) \n"
+"  {\n"
+"    die(\"Error: PHP version 4.1.0 or above required!\");\n"
+"  }\n"
+"  if (!($file=fopen(\"search/search.idx\",\"rb\"))) \n"
+"  {\n"
+"    die(\"Error: Search index file could NOT be opened!\");\n"
+"  }\n"
+"  if (readHeader($file)!=\"DOXS\")\n"
+"  {\n"
+"    die(\"Error: Header of index file is invalid!\");\n"
+"  }\n"
+"  $results = array();\n"
+"  $requiredWords = array();\n"
+"  $forbiddenWords = array();\n"
+"  $foundWords = array();\n"
+"  $word=strtok($query,\" \");\n"
+"  while ($word) // for each word in the search query\n"
+"  {\n"
+"    if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }\n"
+"    if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }\n"
+"    if (!in_array($word,$foundWords))\n"
+"    {\n"
+"      $foundWords[]=$word;\n"
+"      search($file,strtolower($word),$results);\n"
+"    }\n"
+"    $word=strtok(\" \");\n"
+"  }\n"
+"  fclose($file);\n"
+"  $docs = array();\n"
+"  combine_results($results,$docs);\n"
+"  // filter out documents with forbidden word or that do not contain\n"
+"  // required words\n"
+"  $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);\n"
+"  // sort the results based on rank\n"
+"  $sorted = array();\n"
+"  sort_results($filteredDocs,$sorted);\n"
+"  return $sorted;\n"
+"}\n"
+"\n"
+"function main()\n"
+"{\n"
+"  $query = \"\";\n"
+"  if (array_key_exists(\"query\", $_GET))\n"
+"  {\n"
+"    $query=$_GET[\"query\"];\n"
+"  }\n"
+"  $sorted = run_query($query);\n"
+"  // Now output the HTML stuff...\n"
+"  // End the HTML form\n"
+"  end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n"
+"  // report results to the user\n"
+"  report_results($sorted);\n"
+"  end_page();\n"
+"}\n"
+"</script>\n"
diff --git a/src/search_opensearch.php b/src/search_opensearch.php
new file mode 100644
index 0000000..3b59516
--- /dev/null
+++ b/src/search_opensearch.php
@@ -0,0 +1,127 @@
+<script language="PHP">
+require "search-functions.php";
+
+$mode = array_key_exists('v', $_GET)?$_GET['v']:"";
+$query = array_key_exists('query', $_GET)?$_GET['query']:"";
+
+$query_results = run_query($query);
+
+switch ($mode)
+{
+  case "opensearch.xml":
+    opensearch_description();
+    break;
+  case "json":
+    opensearch_json_results($query, $query_results);
+    break;
+  case "xml":
+    opensearch_xml_results($query, $query_results);
+    break;
+  default:
+    invalid_format($query, $query_results);
+    break;
+}
+
+function opensearch_description()
+{
+  global $config;
+  global $translator;
+
+  $shortname = $translator['search']." ".$config['PROJECT_NAME'];
+  $link = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']);
+  header("Content-Type: application/xml");
+  echo <<<END_OPENSEARCH
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+<ShortName>$shortname</ShortName>
+<Description>Doxygen Search</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<!--
+<Image height="16" width="16" type="image/x-icon">
+http://dev.squello.com/doc/html/favicon.ico</Image>
+-->
+<Url type="text/html" method="GET"
+template="$link/search.php?query={searchTerms}" />
+<Url type="application/x-suggestions+json" method="GET"
+template="$link/search-opensearch.php?v=json&amp;query={searchTerms}" />
+<Url type="application/x-suggestions+xml" method="GET"
+template="$link/search-opensearch.php?v=xml&amp;query={searchTerms}" />
+</OpenSearchDescription>
+END_OPENSEARCH;
+}
+
+function opensearch_xml_results($query, array $results)
+{
+  // Much as I hate copy'n'paste code re-use, this is for testing;
+  // I expect a richer version to come soon.
+  // Although I hate that IE does this richer than FF more...
+  $qs_results = array();
+  foreach ($results as $i => $val)
+  {
+    foreach ($val['words'] as $j => $word)
+    {
+      if (array_key_exists($word, $qs_results))
+        $qs_results[$word['match']]++;
+      else
+        $qs_results[$word['match']] = 1;
+    }
+  }
+  $result = <<<END_FRAG
+<?xml version="1.0"?>
+<SearchSuggestion xmlns="http://schemas.microsoft.com/Search/2008/suggestions">
+<Query>$query</Query>
+<Section>
+END_FRAG;
+  foreach ($qs_results as $word => $count)
+  {
+    $result .= <<<END_FRAG
+<Item>
+<Text>$word</Text>
+<Description>$count results</Description>
+</Item>
+END_FRAG;
+  }
+  $result .= <<<END_FRAG
+</Section>
+</SearchSuggestion>
+END_FRAG;
+  echo $result;
+}
+
+function opensearch_json_results($query, array $results)
+{
+  $qs_results = array();
+  foreach ($results as $i => $val)
+  {
+    foreach ($val['words'] as $j => $word)
+    {
+      if (array_key_exists($word, $qs_results))
+        $qs_results[$word['match']]++;
+      else
+        $qs_results[$word['match']] = 1;
+    }
+  }
+  $result = '["'.$query.'", [';
+  $json_words = "";
+  $json_descriptions = "";
+  $i = 0;
+  foreach ($qs_results as $word => $count)
+  {
+    if ($i != 0)
+    {
+      $json_words .= ", ";
+      $json_descriptions .= ", ";
+    }
+    $json_words .= '"'.$word.'"';
+    $json_descriptions .= '"'.$count.' result'.($count==1?'':'s').'"';
+    $i++;
+  }
+  print "[\"$query\", [$json_words],[$json_descriptions]]";
+}
+
+function invalid_format($query, array $results)
+{
+  print "Search results for '$query':\n\n";
+  print_r($results);
+}
+</script>
diff --git a/src/search_opensearch_php.h b/src/search_opensearch_php.h
new file mode 100644
index 0000000..b1e9529
--- /dev/null
+++ b/src/search_opensearch_php.h
@@ -0,0 +1,127 @@
+"<script language=\"PHP\">\n"
+"require \"search-functions.php\";\n"
+"\n"
+"$mode = array_key_exists('v', $_GET)?$_GET['v']:\"\";\n"
+"$query = array_key_exists('query', $_GET)?$_GET['query']:\"\";\n"
+"\n"
+"$query_results = run_query($query);\n"
+"\n"
+"switch ($mode)\n"
+"{\n"
+"  case \"opensearch.xml\":\n"
+"    opensearch_description();\n"
+"    break;\n"
+"  case \"json\":\n"
+"    opensearch_json_results($query, $query_results);\n"
+"    break;\n"
+"  case \"xml\":\n"
+"    opensearch_xml_results($query, $query_results);\n"
+"    break;\n"
+"  default:\n"
+"    invalid_format($query, $query_results);\n"
+"    break;\n"
+"}\n"
+"\n"
+"function opensearch_description()\n"
+"{\n"
+"  global $config;\n"
+"  global $translator;\n"
+"\n"
+"  $shortname = $translator['search'].\" \".$config['PROJECT_NAME'];\n"
+"  $link = \"http://\".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']);\n"
+"  header(\"Content-Type: application/xml\");\n"
+"  echo <<<END_OPENSEARCH\n"
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<OpenSearchDescription xmlns=\"http://a9.com/-/spec/opensearch/1.1/\">\n"
+"<ShortName>$shortname</ShortName>\n"
+"<Description>Doxygen Search</Description>\n"
+"<InputEncoding>UTF-8</InputEncoding>\n"
+"<!--\n"
+"<Image height=\"16\" width=\"16\" type=\"image/x-icon\">\n"
+"http://dev.squello.com/doc/html/favicon.ico</Image>\n"
+"-->\n"
+"<Url type=\"text/html\" method=\"GET\"\n"
+"template=\"$link/search.php?query={searchTerms}\" />\n"
+"<Url type=\"application/x-suggestions+json\" method=\"GET\"\n"
+"template=\"$link/search-opensearch.php?v=json&amp;query={searchTerms}\" />\n"
+"<Url type=\"application/x-suggestions+xml\" method=\"GET\"\n"
+"template=\"$link/search-opensearch.php?v=xml&amp;query={searchTerms}\" />\n"
+"</OpenSearchDescription>\n"
+"END_OPENSEARCH;\n"
+"}\n"
+"\n"
+"function opensearch_xml_results($query, array $results)\n"
+"{\n"
+"  // Much as I hate copy'n'paste code re-use, this is for testing;\n"
+"  // I expect a richer version to come soon.\n"
+"  // Although I hate that IE does this richer than FF more...\n"
+"  $qs_results = array();\n"
+"  foreach ($results as $i => $val)\n"
+"  {\n"
+"    foreach ($val['words'] as $j => $word)\n"
+"    {\n"
+"      if (array_key_exists($word, $qs_results))\n"
+"        $qs_results[$word['match']]++;\n"
+"      else\n"
+"        $qs_results[$word['match']] = 1;\n"
+"    }\n"
+"  }\n"
+"  $result = <<<END_FRAG\n"
+"<?xml version=\"1.0\"?>\n"
+"<SearchSuggestion xmlns=\"http://schemas.microsoft.com/Search/2008/suggestions\">\n"
+"<Query>$query</Query>\n"
+"<Section>\n"
+"END_FRAG;\n"
+"  foreach ($qs_results as $word => $count)\n"
+"  {\n"
+"    $result .= <<<END_FRAG\n"
+"<Item>\n"
+"<Text>$word</Text>\n"
+"<Description>$count results</Description>\n"
+"</Item>\n"
+"END_FRAG;\n"
+"  }\n"
+"  $result .= <<<END_FRAG\n"
+"</Section>\n"
+"</SearchSuggestion>\n"
+"END_FRAG;\n"
+"  echo $result;\n"
+"}\n"
+"\n"
+"function opensearch_json_results($query, array $results)\n"
+"{\n"
+"  $qs_results = array();\n"
+"  foreach ($results as $i => $val)\n"
+"  {\n"
+"    foreach ($val['words'] as $j => $word)\n"
+"    {\n"
+"      if (array_key_exists($word, $qs_results))\n"
+"        $qs_results[$word['match']]++;\n"
+"      else\n"
+"        $qs_results[$word['match']] = 1;\n"
+"    }\n"
+"  }\n"
+"  $result = '[\"'.$query.'\", [';\n"
+"  $json_words = \"\";\n"
+"  $json_descriptions = \"\";\n"
+"  $i = 0;\n"
+"  foreach ($qs_results as $word => $count)\n"
+"  {\n"
+"    if ($i != 0)\n"
+"    {\n"
+"      $json_words .= \", \";\n"
+"      $json_descriptions .= \", \";\n"
+"    }\n"
+"    $json_words .= '\"'.$word.'\"';\n"
+"    $json_descriptions .= '\"'.$count.' result'.($count==1?'':'s').'\"';\n"
+"    $i++;\n"
+"  }\n"
+"  print \"[\\\"$query\\\", [$json_words],[$json_descriptions]]\";\n"
+"}\n"
+"\n"
+"function invalid_format($query, array $results)\n"
+"{\n"
+"  print \"Search results for '$query':\\n\\n\";\n"
+"  print_r($results);\n"
+"}\n"
+"</script>\n"
diff --git a/src/search_php.h b/src/search_php.h
deleted file mode 100644
index 1ebedf1..0000000
--- a/src/search_php.h
+++ /dev/null
@@ -1,317 +0,0 @@
-"function readInt($file)\n"
-"{\n"
-"  $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n"
-"  $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));\n"
-"  return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;\n"
-"}\n"
-"\n"
-"function readString($file)\n"
-"{\n"
-"  $result=\"\";\n"
-"  while (ord($c=fgetc($file))) $result.=$c;\n"
-"  return $result;\n"
-"}\n"
-"\n"
-"function readHeader($file)\n"
-"{\n"
-"  $header =fgetc($file); $header.=fgetc($file);\n"
-"  $header.=fgetc($file); $header.=fgetc($file);\n"
-"  return $header;\n"
-"}\n"
-"\n"
-"function computeIndex($word)\n"
-"{\n"
-"  // Simple hashing that allows for substring search\n"
-"  if (strlen($word)<2) return -1;\n"
-"  // high char of the index\n"
-"  $hi = ord($word{0});\n"
-"  if ($hi==0) return -1;\n"
-"  // low char of the index\n"
-"  $lo = ord($word{1});\n"
-"  if ($lo==0) return -1;\n"
-"  // return index\n"
-"  return $hi*256+$lo;\n"
-"}\n"
-"\n"
-"function search($file,$word,&$statsList)\n"
-"{\n"
-"  $index = computeIndex($word);\n"
-"  if ($index!=-1) // found a valid index\n"
-"  {\n"
-"    fseek($file,$index*4+4); // 4 bytes per entry, skip header\n"
-"    $index = readInt($file);\n"
-"    if ($index) // found words matching the hash key\n"
-"    {\n"
-"      $start=sizeof($statsList);\n"
-"      $count=$start;\n"
-"      fseek($file,$index);\n"
-"      $w = readString($file);\n"
-"      while ($w)\n"
-"      {\n"
-"        $statIdx = readInt($file);\n"
-"        if ($word==substr($w,0,strlen($word)))\n"
-"        { // found word that matches (as substring)\n"
-"          $statsList[$count++]=array(\n"
-"              \"word\"=>$word,\n"
-"              \"match\"=>$w,\n"
-"              \"index\"=>$statIdx,\n"
-"              \"full\"=>strlen($w)==strlen($word),\n"
-"              \"docs\"=>array()\n"
-"              );\n"
-"        }\n"
-"        $w = readString($file);\n"
-"      }\n"
-"      $totalHi=0;\n"
-"      $totalFreqHi=0;\n"
-"      $totalFreqLo=0;\n"
-"      for ($count=$start;$count<sizeof($statsList);$count++)\n"
-"      {\n"
-"        $statInfo = &$statsList[$count];\n"
-"        $multiplier = 1;\n"
-"        // whole word matches have a double weight\n"
-"        if ($statInfo[\"full\"]) $multiplier=2;\n"
-"        fseek($file,$statInfo[\"index\"]); \n"
-"        $numDocs = readInt($file);\n"
-"        $docInfo = array();\n"
-"        // read docs info + occurrence frequency of the word\n"
-"        for ($i=0;$i<$numDocs;$i++)\n"
-"        {\n"
-"          $idx=readInt($file); \n"
-"          $freq=readInt($file); \n"
-"          $docInfo[$i]=array(\"idx\"  => $idx,\n"
-"                             \"freq\" => $freq>>1,\n"
-"                             \"rank\" => 0.0,\n"
-"                             \"hi\"   => $freq&1\n"
-"                            );\n"
-"          if ($freq&1) // word occurs in high priority doc\n"
-"          {\n"
-"            $totalHi++;\n"
-"            $totalFreqHi+=$freq*$multiplier;\n"
-"          }\n"
-"          else // word occurs in low priority doc\n"
-"          {\n"
-"            $totalFreqLo+=$freq*$multiplier;\n"
-"          }\n"
-"        }\n"
-"        // read name and url info for the doc\n"
-"        for ($i=0;$i<$numDocs;$i++)\n"
-"        {\n"
-"          fseek($file,$docInfo[$i][\"idx\"]);\n"
-"          $docInfo[$i][\"name\"]=readString($file);\n"
-"          $docInfo[$i][\"url\"]=readString($file);\n"
-"        }\n"
-"        $statInfo[\"docs\"]=$docInfo;\n"
-"      }\n"
-"      $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;\n"
-"      for ($count=$start;$count<sizeof($statsList);$count++)\n"
-"      {\n"
-"        $statInfo = &$statsList[$count];\n"
-"        $multiplier = 1;\n"
-"        // whole word matches have a double weight\n"
-"        if ($statInfo[\"full\"]) $multiplier=2;\n"
-"        for ($i=0;$i<sizeof($statInfo[\"docs\"]);$i++)\n"
-"        {\n"
-"          $docInfo = &$statInfo[\"docs\"];\n"
-"          // compute frequency rank of the word in each doc\n"
-"          $freq=$docInfo[$i][\"freq\"];\n"
-"          if ($docInfo[$i][\"hi\"])\n"
-"          {\n"
-"            $statInfo[\"docs\"][$i][\"rank\"]=\n"
-"              (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;\n"
-"          }\n"
-"          else\n"
-"          {\n"
-"            $statInfo[\"docs\"][$i][\"rank\"]=\n"
-"              (float)($freq*$multiplier)/$totalFreq;\n"
-"          }\n"
-"        }\n"
-"      }\n"
-"    }\n"
-"  }\n"
-"  return $statsList;\n"
-"}\n"
-"\n"
-"function combine_results($results,&$docs)\n"
-"{\n"
-"  foreach ($results as $wordInfo)\n"
-"  {\n"
-"    $docsList = &$wordInfo[\"docs\"];\n"
-"    foreach ($docsList as $di)\n"
-"    {\n"
-"      $key=$di[\"url\"];\n"
-"      $rank=$di[\"rank\"];\n"
-"      if (isset($docs[$key]))\n"
-"      {\n"
-"        $docs[$key][\"rank\"]+=$rank;\n"
-"      }\n"
-"      else\n"
-"      {\n"
-"        $docs[$key] = array(\"url\"=>$key,\n"
-"            \"name\"=>$di[\"name\"],\n"
-"            \"rank\"=>$rank\n"
-"            );\n"
-"      }\n"
-"      $docs[$key][\"words\"][] = array(\n"
-"               \"word\"=>$wordInfo[\"word\"],\n"
-"               \"match\"=>$wordInfo[\"match\"],\n"
-"               \"freq\"=>$di[\"freq\"]\n"
-"               );\n"
-"    }\n"
-"  }\n"
-"  return $docs;\n"
-"}\n"
-"\n"
-"function filter_results($docs,&$requiredWords,&$forbiddenWords)\n"
-"{\n"
-"  $filteredDocs=array();\n"
-"  while (list ($key, $val) = each ($docs)) \n"
-"  {\n"
-"    $words = &$docs[$key][\"words\"];\n"
-"    $copy=1; // copy entry by default\n"
-"    if (sizeof($requiredWords)>0)\n"
-"    {\n"
-"      foreach ($requiredWords as $reqWord)\n"
-"      {\n"
-"        $found=0;\n"
-"        foreach ($words as $wordInfo)\n"
-"        { \n"
-"          $found = $wordInfo[\"word\"]==$reqWord;\n"
-"          if ($found) break;\n"
-"        }\n"
-"        if (!$found) \n"
-"        {\n"
-"          $copy=0; // document contains none of the required words\n"
-"          break;\n"
-"        }\n"
-"      }\n"
-"    }\n"
-"    if (sizeof($forbiddenWords)>0)\n"
-"    {\n"
-"      foreach ($words as $wordInfo)\n"
-"      {\n"
-"        if (in_array($wordInfo[\"word\"],$forbiddenWords))\n"
-"        {\n"
-"          $copy=0; // document contains a forbidden word\n"
-"          break;\n"
-"        }\n"
-"      }\n"
-"    }\n"
-"    if ($copy) $filteredDocs[$key]=$docs[$key];\n"
-"  }\n"
-"  return $filteredDocs;\n"
-"}\n"
-"\n"
-"function compare_rank($a,$b)\n"
-"{\n"
-"  if ($a[\"rank\"] == $b[\"rank\"]) \n"
-"  {\n"
-"    return 0;\n"
-"  }\n"
-"  return ($a[\"rank\"]>$b[\"rank\"]) ? -1 : 1; \n"
-"}\n"
-"\n"
-"function sort_results($docs,&$sorted)\n"
-"{\n"
-"  $sorted = $docs;\n"
-"  usort($sorted,\"compare_rank\");\n"
-"  return $sorted;\n"
-"}\n"
-"\n"
-"function report_results(&$docs)\n"
-"{\n"
-"  echo \"<div class=\\\"header\\\">\";\n"
-"  echo \"  <div class=\\\"headertitle\\\">\\n\";\n"
-"  echo \"    <h1>\".search_results().\"</h1>\\n\";\n"
-"  echo \"  </div>\\n\";\n"
-"  echo \"</div>\\n\";\n"
-"  echo \"<div class=\\\"searchresults\\\">\\n\";\n"
-"  echo \"<table cellspacing=\\\"2\\\">\\n\";\n"
-"  $numDocs = sizeof($docs);\n"
-"  if ($numDocs==0)\n"
-"  {\n"
-"    echo \"  <tr>\\n\";\n"
-"    echo \"    <td colspan=\\\"2\\\">\".matches_text(0).\"</td>\\n\";\n"
-"    echo \"  </tr>\\n\";\n"
-"  }\n"
-"  else\n"
-"  {\n"
-"    echo \"  <tr>\\n\";\n"
-"    echo \"    <td colspan=\\\"2\\\">\".matches_text($numDocs);\n"
-"    echo \"\\n\";\n"
-"    echo \"    </td>\\n\";\n"
-"    echo \"  </tr>\\n\";\n"
-"    $num=1;\n"
-"    foreach ($docs as $doc)\n"
-"    {\n"
-"      echo \"  <tr>\\n\";\n"
-"      echo \"    <td align=\\\"right\\\">$num.</td>\";\n"
-"      echo     \"<td><a class=\\\"el\\\" href=\\\"\".$doc[\"url\"].\"\\\">\".$doc[\"name\"].\"</a></td>\\n\";\n"
-"      echo \"  <tr>\\n\";\n"
-"      echo \"    <td></td><td class=\\\"tiny\\\">\".report_matches().\" \";\n"
-"      foreach ($doc[\"words\"] as $wordInfo)\n"
-"      {\n"
-"        $word = $wordInfo[\"word\"];\n"
-"        $matchRight = substr($wordInfo[\"match\"],strlen($word));\n"
-"        echo \"<b>$word</b>$matchRight(\".$wordInfo[\"freq\"].\") \";\n"
-"      }\n"
-"      echo \"    </td>\\n\";\n"
-"      echo \"  </tr>\\n\";\n"
-"      $num++;\n"
-"    }\n"
-"  }\n"
-"  echo \"</table>\\n\";\n"
-"}\n"
-"\n"
-"function main()\n"
-"{\n"
-"  if(strcmp('4.1.0', phpversion()) > 0) \n"
-"  {\n"
-"    die(\"Error: PHP version 4.1.0 or above required!\");\n"
-"  }\n"
-"  if (!($file=fopen(\"search/search.idx\",\"rb\"))) \n"
-"  {\n"
-"    die(\"Error: Search index file could NOT be opened!\");\n"
-"  }\n"
-"  if (readHeader($file)!=\"DOXS\")\n"
-"  {\n"
-"    die(\"Error: Header of index file is invalid!\");\n"
-"  }\n"
-"  $query=\"\";\n"
-"  if (array_key_exists(\"query\", $_GET))\n"
-"  {\n"
-"    $query=$_GET[\"query\"];\n"
-"  }\n"
-"  end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n"
-"  $results = array();\n"
-"  $requiredWords = array();\n"
-"  $forbiddenWords = array();\n"
-"  $foundWords = array();\n"
-"  $word=strtok($query,\" \");\n"
-"  while ($word) // for each word in the search query\n"
-"  {\n"
-"    if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }\n"
-"    if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }\n"
-"    if (!in_array($word,$foundWords))\n"
-"    {\n"
-"      $foundWords[]=$word;\n"
-"      search($file,strtolower($word),$results);\n"
-"    }\n"
-"    $word=strtok(\" \");\n"
-"  }\n"
-"  $docs = array();\n"
-"  combine_results($results,$docs);\n"
-"  // filter out documents with forbidden word or that do not contain\n"
-"  // required words\n"
-"  $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);\n"
-"  // sort the results based on rank\n"
-"  $sorted = array();\n"
-"  sort_results($filteredDocs,$sorted);\n"
-"  // report results to the user\n"
-"  report_results($sorted);\n"
-"  echo \"</div>\\n\";\n"
-"  end_page();\n"
-"  fclose($file);\n"
-"}\n"
-"\n"
-"main();\n"
-"\n"
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
index 2703693..40fa612 100644
--- a/src/textdocvisitor.h
+++ b/src/textdocvisitor.h
@@ -51,6 +51,7 @@ class TextDocVisitor : public DocVisitor
     void visit(DocFormula *)      {}
     void visit(DocIndexEntry *)   {}
     void visit(DocSimpleSectSep *){}
+    void visit(DocCite *)         {}
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/src/translator.h b/src/translator.h
index e69b08c..07c83ea 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -497,7 +497,13 @@ class Translator
                                 int hour,int minutes,int seconds,
                                 bool includeTime) = 0;
                        
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
 
+    virtual QCString trCiteReferences() = 0;
+    virtual QCString trCopyright() = 0;
+    virtual QCString trDirDepGraph(const char *name) = 0;
 };
 
 #endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
index 3c99783..82e795f 100644
--- a/src/translator_adapter.h
+++ b/src/translator_adapter.h
@@ -5,7 +5,6 @@
 
 /*! \brief Base of the translator adapter tree
  *
- 
  *  This abstract class provides access to the english
  *  translations, to be used as a substitute for not implemented
  *  local translations. 
@@ -41,7 +40,23 @@ class TranslatorAdapterBase : public Translator
 
 };
 
-class TranslatorAdapter_1_6_3 : public TranslatorAdapterBase
+class TranslatorAdapter_1_7_5 : public TranslatorAdapterBase
+{
+  public:
+    virtual QCString updateNeededMessage()
+    { return createUpdateNeededMessage(idLanguage(),"release 1.7.5"); }
+
+    virtual QCString trCiteReferences()
+    { return english.trCiteReferences(); }
+
+    virtual QCString trCopyright()
+    { return english.trCopyright(); }
+
+    virtual QCString trDirDepGraph(const char *name)
+    { return english.trDirDepGraph(name); }
+};
+
+class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
 {
   public:
     virtual QCString updateNeededMessage()
diff --git a/src/translator_am.h b/src/translator_am.h
index bb286d5..15b1502 100644
--- a/src/translator_am.h
+++ b/src/translator_am.h
@@ -1,1835 +1,1835 @@
-/******************************************************************************
- *
- * 
- *
- * Copyright (C) 1997-2011 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- */
-
-/*
- * Translation by
- * Armen Tangamyan <armen.tangamyan@anu.edu.au>
- */
-
-#ifndef TRANSLATOR_AM_H
-#define TRANSLATOR_AM_H
-
-class TranslatorArmenian : public Translator
-{
-  public:
-    /*! Used for identification of the language. */
-    virtual QCString idLanguage()
-    { return "armenian"; }
-
-    /* Used to get the command(s) for the language support. */
-    virtual QCString latexLanguageSupportCommand()
-    {
-        return "<pre>\\usepackage[latin]{armtex}\n"
-			   "\\usepackage[armscii8]{inputenc}\n</pre>"; 
-    }
-
-    /*! return the language charset. This will be used for the HTML output */
-    virtual QCString idLanguageCharset()
-    {
-        return "utf-8"; 
-    }
-
-    // --- Language translation methods -------------------
-
-    /*! used in the compound documentation before a list of related functions. */
-    virtual QCString trRelatedFunctions()
-    { return "Դասին վերաբերվող ֆունկցիաներ"; }
-
-    /*! subscript for the related functions. */
-    virtual QCString trRelatedSubscript()
-    { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
-
-    /*! header that is put before the detailed description of files, classes and namespaces. */
-    virtual QCString trDetailedDescription()
-    { return "Մանրամասն նկարագրություն"; }
-
-    /*! header that is put before the list of typedefs. */
-    virtual QCString trMemberTypedefDocumentation()
-    { return "Անդամ տիպի սահմանումներ (typedef)"; }
-
-    /*! header that is put before the list of enumerations. */
-    virtual QCString trMemberEnumerationDocumentation()
-    { return "Անդամ hամարակալումներ"; }
-
-    /*! header that is put before the list of member functions. */
-    virtual QCString trMemberFunctionDocumentation()
-    { return "Անդամ ֆունկցիաներ"; }
-
-    /*! header that is put before the list of member attributes. */
-    virtual QCString trMemberDataDocumentation()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Դաշտեր";
-      }
-      else
-      {
-        return "Անդամ տվյալներ";
-      }
-    }
-
-    /*! this is the text of a link put after brief descriptions. */
-    virtual QCString trMore()
-    { return "Մանրամասն..."; }
-
-    /*! put in the class documentation */
-    /* Dosn't use when optimization for C is on. */
-    virtual QCString trListOfAllMembers()
-    {
-      return "Բոլոր անդամների ցուցակը";
-    }
-
-    /*! used as the title of the "list of all members" page of a class */
-    /* Dosn't use when optimization for C is on. */
-    virtual QCString trMemberList()
-    {
-      return "Անդամների ցուցակ";
-    }
-
-    /*! this is the first part of a sentence that is followed by a class name */
-    /* Dosn't use when optimization for C is on. */
-    virtual QCString trThisIsTheListOfAllMembers()
-    { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
-
-    /*! this is the remainder of the sentence after the class name */
-    /* Dosn't use when optimization for C is on. */
-    virtual QCString trIncludingInheritedMembers()
-    { return ", ներառյալ բոլոր ժառանգված անդամները"; }
-
-    /*! this is put at the author sections at the bottom of man pages.
-     *  parameter s is name of the project name.
-     */
-    virtual QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";
-      if (s) result+=s+(QCString)" համար:";
-      return result;
-    }
-
-    /*! put after an enum name in the list of all members */
-    virtual QCString trEnumName()
-    { return "համարակալման անուն"; }
-
-    /*! put after an enum value in the list of all members */
-    virtual QCString trEnumValue()
-    { return "համարակալման արժեք"; }
-
-    /*! put after an undocumented member in the list of all members */
-    virtual QCString trDefinedIn()
-    { return "սահմանված"; }
-
-    // quick reference sections
-
-    /*! This is put above each page as a link to the list of all groups of 
-     *  compounds or files (see the \\group command).
-     */
-    virtual QCString trModules()
-    { return "Մոդուլներ"; }
-
-    /*! This is put above each page as a link to the class hierarchy */
-    virtual QCString trClassHierarchy()
-    { return "Դասերի հիերարխա"; }
-
-    /*! This is put above each page as a link to the list of annotated classes */
-    virtual QCString trCompoundList()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածք";
-      }
-      else
-      {
-        return "Դասերի ցուցակ";
-      }
-    }
-
-    /*! This is put above each page as a link to the list of documented files */
-    virtual QCString trFileList()
-    { return "Ֆայլերի ցուցակ"; }
-
-    /*! This is put above each page as a link to all members of compounds. */
-    virtual QCString trCompoundMembers()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների դաշտեր";
-      }
-      else
-      {
-        return "Դասի անդամներ";
-      }
-    }
-
-    /*! This is put above each page as a link to all members of files. */
-    /*??*/
-    virtual QCString trFileMembers()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Գլոբալներ"; 
-      }
-      else
-      {
-        return "Ֆայլի անդամներ"; 
-      }
-    }
-
-    /*! This is put above each page as a link to all related pages. */
-    virtual QCString trRelatedPages()
-    { return "Նմանատիպ էջեր"; }
-
-    /*! This is put above each page as a link to all examples. */
-    virtual QCString trExamples()
-    { return "Օրինակներ"; }
-
-    /*! This is put above each page as a link to the search engine. */
-    virtual QCString trSearch()
-    { return "Որոնում"; }
-
-    /*! This is an introduction to the class hierarchy. */
-    virtual QCString trClassHierarchyDescription()
-    { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
-             "բայց ոչ ամբողջապես, այբբենական կարգով.";
-	}
-
-    /*! This is an introduction to the list with all files. */
-    virtual QCString trFileListDescription(bool extractAll)
-    {
-      QCString result="Բոլոր ";
-      if (!extractAll) result+="փաստագրված ";
-      result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
-      return result;
-    }
-
-    /*! This is an introduction to the annotated compound list. */
-    virtual QCString trCompoundListDescription()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
-      }
-      else
-      {
-        return "Դասերը, կառուցվածքները, միավորումները "
-				"և ինտերֆեյսները` կարճ բացատրություններով.";
-      }
-    }
-
-    /*! This is an introduction to the page with all class members. */
-    virtual QCString trCompoundMembersDescription(bool extractAll)
-    {
-        QCString result="Բոլոր ";
-        if(!extractAll) result+="փաստագրված ";
-        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-          result+="կառուցվածքների և միավորումների դաշտերի ";
-        else
-          result+="դասի անդամների ";
-		result+="ցուցակը`";
-		result+=" հղումներով դեպի ";
-        if(!extractAll)
-        {
-          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-            result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
-          else
-            result+="դասի փաստագրությունը բոլոր անդամների համար.";
-        }
-        else
-        {
-          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-            result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
-          else
-            result += "դասերը, որոնց նրանք պատկանում են.";
-        }
-        return result;
-    }
-
-    /*! This is an introduction to the page with all file members. */
-    virtual QCString trFileMembersDescription(bool extractAll)
-    {
-      QCString result="Բոլոր ";
-      if (!extractAll) result+="փաստագրված ";
-
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
-                "համարակալումների և տիպի սահմանումների (typedef)";
-      }
-      else
-      {
-        result+="ֆայլի անդամների ";
-      }
-	  result+="ցուցակը`";
-      result+=" հղումներով դեպի ";
-      if (extractAll)
-        result+="ֆայլերը, որոնց նրանք պատկանում են.";
-      else
-        result+="փաստագրությունը.";
-      return result;
-    }
-
-    /*! This is an introduction to the page with the list of all examples */
-    virtual QCString trExamplesDescription()
-    { return "Բոլոր օրինակների ցուցակը."; }
-
-    /*! This is an introduction to the page with the list of related pages */
-    virtual QCString trRelatedPagesDescription()
-    { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
-
-    /*! This is an introduction to the page with the list of class/file groups */
-    virtual QCString trModulesDescription()
-    { return "Բոլոր մոդուլների ցուցակը."; }
-
-    // index titles (the project name is prepended for these) 
-
-
-    /*! This is used in HTML as the title of index.html. */
-    virtual QCString trDocumentation()
-    { return " - Փաստագրություն"; }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     * index of all groups.
-     */
-    virtual QCString trModuleIndex()
-    { return "Մոդուլներ"; }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     * class hierarchy.
-     */
-    virtual QCString trHierarchicalIndex()
-    { return "Դասակարգումներ"; }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     * annotated compound index.
-     */
-    virtual QCString trCompoundIndex()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածք";
-      }
-      else
-      {
-        return "Դասեր";
-      }
-    }
-
-    /*! This is used in LaTeX as the title of the chapter with the
-     * list of all files.
-     */
-    virtual QCString trFileIndex()
-    { return "Ֆայլեր"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all groups.
-     */
-    virtual QCString trModuleDocumentation()
-    { return "Մոդուլներ"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all classes, structs and unions.
-     */
-    virtual QCString trClassDocumentation()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածքներ";
-      }
-      else
-      {
-        return "Դասեր";
-      }
-    }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all files.
-     */
-    virtual QCString trFileDocumentation()
-    { return "Ֆայլեր"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all examples.
-     */
-    virtual QCString trExampleDocumentation()
-    { return "Օրինակներ"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all related pages.
-     */
-    virtual QCString trPageDocumentation()
-    { return "Էջեր"; }
-
-    /*! This is used in LaTeX as the title of the document */
-    virtual QCString trReferenceManual()
-    { return "Հղումների ձեռնարկ"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of defines
-     */
-    virtual QCString trDefines()
-    { return "Մակրոսներ"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of function prototypes
-     */
-    virtual QCString trFuncProtos()
-    { return "Ֆունկցիաների նախատիպեր"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of typedefs
-     */
-    virtual QCString trTypedefs()
-    { return "Տիպի սահմանումներ (typedef)"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of enumerations
-     */
-    virtual QCString trEnumerations()
-    { return "Համարակալումներ"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of (global) functions
-     */
-    virtual QCString trFunctions()
-    { return "Ֆունկցիաներ"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of (global) variables
-     */
-    virtual QCString trVariables()
-    { return "Փոփոխականներ"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of (global) variables
-     */
-    virtual QCString trEnumerationValues()
-    { return "Հաշվիչ"; }
-
-    /*! This is used in the documentation of a file before the list of
-     *  documentation blocks for defines
-     */
-    virtual QCString trDefineDocumentation()
-    { return "Մակրոսներ"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for function prototypes
-     */
-    virtual QCString trFunctionPrototypeDocumentation()
-    { return "Ֆունկցիաների նախատիպեր"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for typedefs
-     */
-    virtual QCString trTypedefDocumentation()
-    { return "Տիպի սահմանումներ (typedef)"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for enumeration types
-     */
-    virtual QCString trEnumerationTypeDocumentation()
-    { return "Համարակալման տիպեր"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for functions
-     */
-    virtual QCString trFunctionDocumentation()
-    { return "Ֆունկցիաներ"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for variables
-     */
-    virtual QCString trVariableDocumentation()
-    { return "Փոփոխականներ"; }
-
-    /*! This is used in the documentation of a file/namespace/group before 
-     *  the list of links to documented compounds
-     */
-    virtual QCString trCompounds()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածք";
-      }
-      else
-      { 
-        return "Դասեր";
-      }
-
-    }
-
-    /*! This is used in the documentation of a group before the list of 
-     *  links to documented files
-     */
-    /*! This is used in the standard footer of each page and indicates when 
-     *  the page was generated 
-     */
-    virtual QCString trGeneratedAt(const char *date,const char *projName)
-    { 
-      QCString result=(QCString)"Ստեղծվել է "+date;
-      if (projName) result+=projName+QCString(" -ի համար,");
-      result+=(QCString)" հետևյալ համակարգով.";
-      return result;
-    }
-    /*! This is part of the sentence used in the standard footer of each page.
-     */
-    virtual QCString trWrittenBy()
-    {
-      return "Հեղինակ - ";
-    }
-
-    /*! this text is put before a class diagram */
-    virtual QCString trClassDiagram(const char *clName)
-    {
-      return clName+QCString(" -ի ժառանգման գծագիրը.");
-    }
-
-    /*! this text is generated when the \\internal command is used. */
-    virtual QCString trForInternalUseOnly()
-    { return "Միայն ներքին օգտագործման համար"; }
-
-    /*! this text is generated when the \\warning command is used. */
-    virtual QCString trWarning()
-    { return "Զգուշացում"; }
-
-    /*! this text is generated when the \\version command is used. */
-    virtual QCString trVersion()
-    { return "Տարբերակ"; }
-
-    /*! this text is generated when the \\date command is used. */
-    virtual QCString trDate()
-    { return "Տարեթիվ"; }
-
-    /*! this text is generated when the \\return command is used. */
-    virtual QCString trReturns()
-    { return "Վերադարձնում է"; }
-
-    /*! this text is generated when the \\sa command is used. */
-    virtual QCString trSeeAlso()
-    { return "Տեսեք նաև"; }
-
-    /*! this text is generated when the \\param command is used. */
-    virtual QCString trParameters()
-    { return "Պարամետրեր"; }
-
-    /*! this text is generated when the \\exception command is used. */
-    virtual QCString trExceptions()
-    { return "Բացառություններ"; }
-
-    /*! this text is used in the title page of a LaTeX document. */
-    virtual QCString trGeneratedBy()
-    { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
-    
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307 
-//////////////////////////////////////////////////////////////////////////
-    
-    /*! used as the title of page containing all the index of all namespaces. */
-    virtual QCString trNamespaceList()
-    { return "Անունների տարածությունների ցուցակ"; }
-
-    /*! used as an introduction to the namespace list */
-    virtual QCString trNamespaceListDescription(bool extractAll)
-    {
-      QCString result="Բոլոր ";
-      if (!extractAll) result+="փաստագրված ";
-      result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
-      return result;
-    }
-
-    /*! used in the class documentation as a header before the list of all
-     *  friends of a class
-     */
-    virtual QCString trFriends()
-    { return "Ընկերներ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-    
-    /*! used in the class documentation as a header before the list of all
-     * related classes 
-     */
-    virtual QCString trRelatedFunctionDocumentation()
-    { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
-    
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
-    /*! used as the title of the HTML page of a class/struct/union */
-    virtual QCString trCompoundReference(const char *clName,
-                                 ClassDef::CompoundType compType,
-                                 bool isTemplate)
-    {
-		QCString result=(QCString)clName;
-		if (isTemplate)
-		{		  
-		  switch(compType)
-		  {
-			case ClassDef::Class:      result+=" Դասի"; break;
-			case ClassDef::Struct:     result+=" Կառուցվածքի"; break;
-			case ClassDef::Union:      result+=" Միավորման"; break;
-			case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;
-			case ClassDef::Protocol:   result+=" Արձանագրության"; break;
-			case ClassDef::Category:   result+=" Դասակարգման"; break;
-			case ClassDef::Exception:  result+=" Բացառության"; break;
-		  }
-		  result+=" Ձևանմուշներ";
-		}
-		else
-		{
-		  switch(compType)
-		  {
-			case ClassDef::Class:      result+=" Դաս"; break;
-			case ClassDef::Struct:     result+=" Կառուցվածք"; break;
-			case ClassDef::Union:      result+=" Միավորում"; break;
-			case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;
-			case ClassDef::Protocol:   result+=" Արձանագրություն"; break;
-			case ClassDef::Category:   result+=" Դասակարգում"; break;
-			case ClassDef::Exception:  result+=" Բացառություն"; break;
-		  }
-		}
-		return result;
-	}
-
-    /*! used as the title of the HTML page of a file */
-    virtual QCString trFileReference(const char *fileName)
-    {
-      return fileName+QCString(" ֆայլեր");
-    }
-
-    /*! used as the title of the HTML page of a namespace */
-    virtual QCString trNamespaceReference(const char *namespaceName)
-    {
-      QCString result=namespaceName;
-      result+=" անունների տարածություններ";
-      return result;
-    }
-    
-    virtual QCString trPublicMembers()
-    { return "Բաց անդամ ֆունկցիաներ"; }
-    virtual QCString trPublicSlots()
-    { return "Բաց սլոթեր"; }
-    virtual QCString trSignals()
-    { return "Ազդանշաններ"; }
-    virtual QCString trStaticPublicMembers()
-    { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
-    virtual QCString trProtectedMembers()
-    { return "Պաշտպանված անդամ ֆունկցիաներ"; }
-    virtual QCString trProtectedSlots()
-    { return "Պաշտպանված սլոթեր"; }
-    virtual QCString trStaticProtectedMembers()
-    { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
-    virtual QCString trPrivateMembers()
-    { return "Փակ ֆունկցիաներ"; }
-    virtual QCString trPrivateSlots()
-    { return "Փակ սլոթեր"; }
-    virtual QCString trStaticPrivateMembers()
-    { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
-    
-    /*! this function is used to produce a comma-separated list of items.
-     *  use generateMarker(i) to indicate where item i should be put.
-     */
-    virtual QCString trWriteList(int numEntries)
-    {
-      QCString result;
-      int i;
-      // the inherits list contain `numEntries' classes
-      for (i=0;i<numEntries;i++) 
-      {
-        // use generateMarker to generate placeholders for the class links!
-        result+=generateMarker(i); // generate marker for entry i in the list 
-                                   // (order is left to right)
-        
-        if (i!=numEntries-1)  // not the last entry, so we need a separator
-        {
-          if (i<numEntries-2) // not the fore last entry 
-            result+=", ";
-          else                // the fore last entry
-            result+=" և ";
-        }
-      }
-      return result; 
-    }
-    
-    /*! used in class documentation to produce a list of base classes,
-     *  if class diagrams are disabled.
-     */
-    virtual QCString trInheritsList(int numEntries)
-    {
-      return "Հենքային դասեր - "+trWriteList(numEntries)+":";
-    }
-
-    /*! used in class documentation to produce a list of super classes,
-     *  if class diagrams are disabled.
-     */
-    virtual QCString trInheritedByList(int numEntries)
-    {
-      return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
-    }
-
-    /*! used in member documentation blocks to produce a list of 
-     *  members that are hidden by this one.
-     */
-    virtual QCString trReimplementedFromList(int numEntries)
-    {
-      return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
-    }
-
-    /*! used in member documentation blocks to produce a list of
-     *  all member that overwrite the implementation of this member.
-     */
-    virtual QCString trReimplementedInList(int numEntries)
-    {
-      return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
-    }
-
-    /*! This is put above each page as a link to all members of namespaces. */
-    virtual QCString trNamespaceMembers()
-    { return "Անունների տարածության անդամներ"; }
-
-    /*! This is an introduction to the page with all namespace members */
-    virtual QCString trNamespaceMemberDescription(bool extractAll)
-    {
-      QCString result="Բոլոր ";
-      if (!extractAll) result+="փաստագրված ";
-      result+="անունների տարածության անդամների ցուցակը` "
-			"հղումներով դեպի ";
-      if (extractAll) 
-        result+="բոլոր անդամների անունների տարածության փաստագրությունը.";
-      else 
-        result+="անունների տարածությունը, որին նրանք պատկանում են.";
-      return result;
-    }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     *  index of all namespaces.
-     */
-    virtual QCString trNamespaceIndex()
-    { return "Անունների տարածություններ"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all namespaces.
-     */
-    virtual QCString trNamespaceDocumentation()
-    { return "Անունների տարածություն"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is used in the documentation before the list of all
-     *  namespaces in a file.
-     */
-    virtual QCString trNamespaces()
-    { return "Անունների տարածություններ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is put at the bottom of a class documentation page and is
-     *  followed by a list of files that were used to generate the page.
-     */
-    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
-        bool single)
-    { 
-      QCString result = (QCString)"Այս ";
-      switch(compType)
-      {
-        case ClassDef::Class:      result+="դասի"; break;
-        case ClassDef::Struct:     result+="կառուցվածքի"; break;
-        case ClassDef::Union:      result+="միավորման"; break;
-        case ClassDef::Interface:  result+="ինտերֆեյսի"; break;
-        case ClassDef::Protocol:   result+="արձանագրության"; break;
-        case ClassDef::Category:   result+="դասակարգման"; break;
-        case ClassDef::Exception:  result+="բացառության"; break;
-      }
-      result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
-      if (single) result+="ից."; else result+="երից.";
-      return result;
-    }
-
-    /*! This is in the (quick) index as a link to the alphabetical compound
-     * list.
-     */
-    virtual QCString trAlphabeticalList()
-    { return "Այբբենական ցուցակ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is used as the heading text for the retval command. */
-    virtual QCString trReturnValues()
-    { return "Վերադարձվող արժեքներ"; }
-
-    /*! This is in the (quick) index as a link to the main page (index.html)
-     */
-    virtual QCString trMainPage()
-    { return "Գլխավոր էջ"; }
-
-    /*! This is used in references to page that are put in the LaTeX 
-     *  documentation. It should be an abbreviation of the word page.
-     */
-    virtual QCString trPageAbbreviation()
-    { return "էջ:"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
-    virtual QCString trDefinedAtLineInSourceFile()
-    {
-      return "Սահմանումը @1 ֆայլի @0 տողում է:";
-    }
-    virtual QCString trDefinedInSourceFile()
-    {
-      return "Սահմանումը @0 ֆայլում է:";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
-    virtual QCString trDeprecated()
-    {
-      return "Հնացած է";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
-    /*! this text is put before a collaboration diagram */
-    virtual QCString trCollaborationDiagram(const char *clName)
-    {
-      return (QCString)clName+"-ի համագործակցությունների գծագիր.";
-    }
-    /*! this text is put before an include dependency graph */
-    virtual QCString trInclDepGraph(const char *fName)
-    {
-      return (QCString)fName+"-ի ներառումների կախվածությունների գծագիր.";
-    }
-    /*! header that is put before the list of constructor/destructors. */
-    virtual QCString trConstructorDocumentation()
-    {
-      return "Կառուցիչներ"; 
-    }
-    /*! Used in the file documentation to point to the corresponding sources. */
-    virtual QCString trGotoSourceCode()
-    {
-      return "Տե'ս այս ֆայլի ելքային կոդը";
-    }
-    /*! Used in the file sources to point to the corresponding documentation. */
-    virtual QCString trGotoDocumentation()
-    {
-      return "Տե'ս այս ֆայլի փաստագրությունը:";
-    }
-    /*! Text for the \\pre command */
-    virtual QCString trPrecondition()
-    {
-      return "Նախապայման";
-    }
-    /*! Text for the \\post command */
-    virtual QCString trPostcondition()
-    {
-      return "Հետպայման";
-    }
-    /*! Text for the \\invariant command */
-    virtual QCString trInvariant()
-    {
-      return "Անփոփոխ";
-    }
-    /*! Text shown before a multi-line variable/enum initialization */
-    virtual QCString trInitialValue()
-    {
-      return "Նախնական արժեք";
-    }
-    /*! Text used the source code in the file index */
-    virtual QCString trCode()
-    {
-      return "Ելքային կոդ";
-    }
-    virtual QCString trGraphicalHierarchy()
-    {
-      return "Գրաֆիկական դասերի հիերարխիա:";
-    }
-    virtual QCString trGotoGraphicalHierarchy()
-    {
-      return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
-    }
-    virtual QCString trGotoTextualHierarchy()
-    {
-      return "Տե'ս դասերի տեքստային հիերարխիան:";
-    }
-    virtual QCString trPageIndex()
-    {
-      return "էջեր";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-    
-    virtual QCString trNote()
-    {
-      return "Նշում";
-    }
-    virtual QCString trPublicTypes()
-    {
-      return "Բաց տիպեր";
-    }
-    virtual QCString trPublicAttribs()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների դաշտեր";
-      }
-      else
-      {
-        return "Բաց ատրիբուտներ";
-      }
-    }
-    virtual QCString trStaticPublicAttribs()
-    {
-      return "Բաց ստատիկ ատրիբուտներ";
-    }
-    virtual QCString trProtectedTypes()
-    {
-      return "Պաշտպանված տիպեր";
-    }
-    virtual QCString trProtectedAttribs()
-    {
-      return "Պաշտպանված ատրիբուտներ";
-    }
-    virtual QCString trStaticProtectedAttribs()
-    {
-      return "Պաշտպանված ստատիկ ատրիբուտներ";
-    }
-    virtual QCString trPrivateTypes()
-    {
-      return "Փակ տիպեր";
-    }
-    virtual QCString trPrivateAttribs()
-    {
-      return "Փակ ատրիբուտներ";
-    }
-    virtual QCString trStaticPrivateAttribs()
-    {
-      return "Փակ ստատիկ ատրիբուտներ";
-    }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as a marker that is put before a todo item */
-    virtual QCString trTodo()
-    /*??*/
-    {
-      return "Կատարման ենթակա";
-    }
-    /*! Used as the header of the todo list */
-    virtual QCString trTodoList()
-    /*??*/
-    {
-      return "Խնդիրների ցուցակ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
-    virtual QCString trReferencedBy()
-    {
-      return "Օգտագործվում է հետևյալում - ";
-    }
-    virtual QCString trRemarks()
-    {
-      return "Դիտողություններ";
-    }
-    virtual QCString trAttention()
-    {
-      return "Ուշադրություն";
-    }
-    virtual QCString trInclByDepGraph()
-    {
-      return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
-			"ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
-    }
-    virtual QCString trSince()
-    /*??*/
-    {
-      return "Սկսած";
-    }
-    
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
-    /*! title of the graph legend page */
-    virtual QCString trLegendTitle()
-    {
-      return "Լեգենդ";
-    }
-    /*! page explaining how the dot graph's should be interpreted */
-    virtual QCString trLegendDocs()
-    {
-      return 
-		"Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
-        "Դիտարկենք հետևյալ օրինակը.\n"
-        "\\code\n"
-        "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
-        "class Invisible { };\n\n"
-        "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
-        "class Truncated : public Invisible { };\n\n"
-        "/* Չփաստագրված դաս */\n"
-        "class Undocumented { };\n\n"
-        "/*! Բաց ժառանգում */\n"
-        "class PublicBase : public Truncated { };\n\n"
-        "/*! Դասի ձևաչափ */\n"
-        "template<class T> class Templ {};\n\n"
-        "/*! Պաշտպանված ժառանգում */\n"
-        "class ProtectedBase { };\n\n"
-        "/*! Փակ ժառանգում */\n"
-        "class PrivateBase { };\n\n"
-        "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
-        "class Used { };\n\n"
-        "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
-        "class Inherited : public PublicBase,\n"
-        "                  protected ProtectedBase,\n"
-        "                  private PrivateBase,\n"
-        "                  public Undocumented,\n"
-        "                  public Templ<int>\n"
-        "{\n"
-        "  private:\n"
-        "    Used *m_usedClass;\n"
-        "};\n"
-        "\\endcode\n"
-        "Եթե \\c MAX_DOT_GRAPH_HEIGHT -ին վերագրված է  "
-        "240, ապա կստանանք հետևյալ գրաֆը."
-        "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
-        "<p>\n"
-        "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
-        "<ul>\n"
-        "<li>Լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
-		"որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
-		"<li>Սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
-		"<li>Մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
-        "<li>Կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
-		" ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
-		"եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
-        "</ul>\n"
-        "Սլաքները ունեն հետևյալ իմաստը.\n"
-        "<ul>\n"
-		"<li>Մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
-		"կապը ցուցադրելու համար:</li>\n"
-		"<li>Մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
-        "<li>Մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
-        "<li>Մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
-		"այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
-		"փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
-        "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
-		"որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
-        "</ul>\n";
-    }
-    /*! text for the link to the legend page */
-    virtual QCString trLegend()
-    {
-      return "լեգենդ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-    
-    /*! Used as a marker that is put before a test item */
-    virtual QCString trTest()
-    {
-      return "Թեստ";
-    }
-    /*! Used as the header of the test list */
-    virtual QCString trTestList()
-    {
-      return "Թեստերի ցուցակ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as a section header for KDE-2 IDL methods */
-    virtual QCString trDCOPMethods()
-    {
-      return "DCOP անդամ ֆունկցիաներ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as a section header for IDL properties */
-    virtual QCString trProperties()
-    {
-      return "Հատկություններ";
-    }
-    /*! Used as a section header for IDL property documentation */
-    virtual QCString trPropertyDocumentation()
-    {
-      return "Հատկություններ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used for Java classes in the summary section of Java packages */
-    virtual QCString trClasses()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "Տվյալների կառուցվածք";
-      }
-      else
-      {
-        return "Դասեր";
-      }
-    }
-    /*! Used as the title of a Java package */
-    virtual QCString trPackage(const char *name)
-    {
-      return (QCString)"Փաթեթ "+name;
-    }
-    /*! Title of the package index page */
-    virtual QCString trPackageList()
-    {
-      return "Փաթեթների ցուցակ";
-    }
-    /*! The description of the package index page */
-    virtual QCString trPackageListDescription()
-    {
-      return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
-    }
-    /*! The link name in the Quick links header for each page */
-    virtual QCString trPackages()
-    {
-      return "Փաթեթներ";
-    }
-    /*! Text shown before a multi-line define */
-    virtual QCString trDefineValue()
-    {
-      return "Արժեքներ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-    
-    /*! Used as a marker that is put before a \\bug item */
-    virtual QCString trBug()
-    {
-      return "Սխալ";
-    }
-    /*! Used as the header of the bug list */
-    virtual QCString trBugList()
-    {
-      return "Սխալների ցուցակ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-    /*! Used as ansicpg for RTF file */
-    virtual QCString trRTFansicp()
-    {
-      return "armscii-8";
-    }
-    /*! Used as ansicpg for RTF fcharset */
-    virtual QCString trRTFCharSet()
-    {
-      return "0";
-    }
-    /*! Used as header RTF general index */
-    virtual QCString trRTFGeneralIndex()
-    {
-      return "Ցուցիչ";
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trClass(bool first_capital, bool singular)
-    { 
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
-        return result; 
-      }
-      else
-      {
-        QCString result((first_capital ? "Դաս" : "դաս"));
-        if(!singular) result+="եր";
-        return result;
-      }
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trFile(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
-      if (!singular)  result+="եր";
-      return result; 
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trNamespace(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
-      if (!singular)  result+="ներ";
-      return result; 
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trGroup(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Խ" : "խ"));
-      result+=(singular ? "ումբ" : "մբեր");
-      return result; 
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trPage(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Էջ" : "էջ"));
-      if (!singular)  result+="եր";
-      return result;
-    }
-
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trMember(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Անդամ" : "անդամ"));
-      if (!singular)  result+="ներ";
-      return result; 
-    }
-   
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trGlobal(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
-      if (!singular)  result+="ներ";
-      return result; 
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This text is generated when the \\author command is used and
-     *  for the author section in man pages. */
-    virtual QCString trAuthor(bool first_capital, bool singular)
-    {                                                                         
-      QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
-      if (!singular) result+="ներ";
-      return result;
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This text is put before the list of members referenced by a member
-     */
-    virtual QCString trReferences()
-    {
-      return "Հղումներ - ";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.13
-//////////////////////////////////////////////////////////////////////////
-
-    /*! used in member documentation blocks to produce a list of 
-     *  members that are implemented by this one.
-     */
-    virtual QCString trImplementedFromList(int numEntries)
-    {
-      return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
-    }
-
-    /*! used in member documentation blocks to produce a list of
-     *  all members that implementation this member.
-     */
-    virtual QCString trImplementedInList(int numEntries)
-    {
-      return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
-    /*! used in RTF documentation as a heading for the Table
-     *  of Contents.
-     */
-    virtual QCString trRTFTableOfContents()
-    {
-      return "Բովանդակություն";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as the header of the list of item that have been 
-     *  flagged deprecated 
-     */
-    virtual QCString trDeprecatedList()
-    {
-      return "Հնացած սահմանումների ցուցակը";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as a header for declaration section of the events found in 
-     * a C# program
-     */
-    virtual QCString trEvents()
-    {
-      return "Պատահարներ";
-    }
-    /*! Header used for the documentation section of a class' events. */
-    virtual QCString trEventDocumentation()
-    {
-      return "Պատահարների ցուցակը";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used as a heading for a list of Java class types with package scope.
-     */
-    virtual QCString trPackageTypes()
-    { 
-      return "Փաթեթի տիպեր";
-    }
-    /*! Used as a heading for a list of Java class functions with package 
-     * scope. 
-     */
-    virtual QCString trPackageMembers()
-    { 
-      return "Փաթեթի ֆունկցիաներ";
-    }
-    /*! Used as a heading for a list of static Java class functions with 
-     *  package scope.
-     */
-    virtual QCString trStaticPackageMembers()
-    { 
-      return "Փաթեթի ստատիկ ֆունկցիաներ";
-    }
-    /*! Used as a heading for a list of Java class variables with package 
-     * scope.
-     */
-    virtual QCString trPackageAttribs()
-    { 
-      return "Փաթեթի ատրիբուտներ";
-    }
-    /*! Used as a heading for a list of static Java class variables with 
-     * package scope.
-     */
-    virtual QCString trStaticPackageAttribs()
-    { 
-      return "Փաթեթի ստատիկ ատրիբուտներ";
-    }
-    
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.1
-//////////////////////////////////////////////////////////////////////////
-
-    /*! Used in the quick index of a class/file/namespace member list page 
-     *  to link to the unfiltered list of all members.
-     */
-    virtual QCString trAll()
-    {
-      return "Բոլոր";
-    }
-    /*! Put in front of the call graph for a function. */
-    virtual QCString trCallGraph()
-    {
-      return "Այս ֆունկցիայի կանչերի գրաֆը.";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
-    /*! When the search engine is enabled this text is put in the header 
-     *  of each page before the field where one can enter the text to search 
-     *  for. 
-     */
-    virtual QCString trSearchForIndex()
-    {
-      return "Որոնում";
-    }
-    /*! This string is used as the title for the page listing the search
-     *  results.
-     */
-    virtual QCString trSearchResultsTitle()
-    {
-      return "Որոնման արդյունքները";
-    }
-    /*! This string is put just before listing the search results. The
-     *  text can be different depending on the number of documents found.
-     *  Inside the text you can put the special marker $num to insert
-     *  the number representing the actual number of search results.
-     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
-     *  value 2 represents 2 or more matches. HTML markup is allowed inside
-     *  the returned string.
-     */
-    virtual QCString trSearchResults(int numDocuments)
-    {
-      if (numDocuments==0)
-      {
-        return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
-      }
-      else if( numDocuments == 1 )
-      {
-        return "Հայտնաբերվել է 1 փաստաթուղթ:";
-      }
-      else 
-      {
-        return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
-          "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
-      }
-    }
-    /*! This string is put before the list of matched words, for each search 
-     *  result. What follows is the list of words that matched the query.
-     */
-    virtual QCString trSearchMatches()
-    {
-      return "Որոնման արդյունքներ:";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.8
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is used in HTML as the title of page with source code for file filename
-     */
-    virtual QCString trSourceFile(QCString& filename)
-    {
-      return "Ելակետային ֆայլ " + filename;
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is used as the name of the chapter containing the directory
-     *  hierarchy.
-     */
-    virtual QCString trDirIndex()
-    { return "Ֆայլադարանների հիերարխիա"; }
-
-    /*! This is used as the name of the chapter containing the documentation
-     *  of the directories.
-     */
-    virtual QCString trDirDocumentation()
-    { return "Ֆայլադարաններ"; }
-
-    /*! This is used as the title of the directory index and also in the
-     *  Quick links of a HTML page, to link to the directory hierarchy.
-     */
-    virtual QCString trDirectories()
-    { return "Ֆայլադրաններ"; }
-
-    /*! This returns a sentences that introduces the directory hierarchy. 
-     *  and the fact that it is sorted alphabetically per level
-     */
-    virtual QCString trDirDescription()
-    { return "Այս ֆայլադարանների հիերարխիան կարգավորված է կոպտորեն, "
-			"բայց ոչ ամբողջապես, այբբենական կարգով."; 
-	}
-
-    /*! This returns the title of a directory page. The name of the
-     *  directory is passed via \a dirName.
-     */
-    virtual QCString trDirReference(const char *dirName)
-    { QCString result=dirName; result+=" Ֆայլադարան"; return result; }
-
-    /*! This returns the word directory with or without starting capital
-     *  (\a first_capital) and in sigular or plural form (\a singular).
-     */
-    virtual QCString trDir(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));
-      if (!singular) result+="ներ";
-      return result; 
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.1
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This text is added to the documentation when the \\overload command
-     *  is used for a overloaded function.
-     */
-    virtual QCString trOverloadText()
-    {
-       return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
-			  "Այն տարբերվում է նախնականից միայն արգումնետներով:";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.6
-//////////////////////////////////////////////////////////////////////////
-
-    /*! This is used to introduce a caller (or called-by) graph */
-    virtual QCString trCallerGraph()
-    {
-      return "Այս ֆունկցիայի կանչերի գրաֆը.";
-    }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for enumeration values
-     */
-    virtual QCString trEnumerationValueDocumentation()
-    { return "Համարակալումներ"; }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.5.4 (mainly for Fortran)
-//////////////////////////////////////////////////////////////////////////
-    /*! header that is put before the list of member subprograms (Fortran). */
-    virtual QCString trMemberFunctionDocumentationFortran()
-    { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }
-
-    /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
-    virtual QCString trCompoundListFortran()
-    { return "Տվյալների տիպերի ցուցակը"; }
-
-    /*! This is put above each page as a link to all members of compounds (Fortran). */
-    virtual QCString trCompoundMembersFortran()
-    { return "Տվյալների դաշտեր"; }
-
-    /*! This is an introduction to the annotated compound list (Fortran). */
-    virtual QCString trCompoundListDescriptionFortran()
-    { return "Տվյալների տիպերը` կարճ բացատրություններով."; }
-
-    /*! This is an introduction to the page with all data types (Fortran). */
-    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
-    {
-      QCString result="Բոլոր ";
-      if (!extractAll)
-      {
-        result+="փաստագրված ";
-      }
-      result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
-      if (!extractAll) 
-      {
-		result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";
-      }
-      else 
-      {
-        result+="տվյալների տիպերը, որոնց նրանք պատկանում են";
-      }
-      return result;
-    }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     * annotated compound index (Fortran).
-     */
-    virtual QCString trCompoundIndexFortran()
-    { return "Տվյալների տիպեր"; }
-
-    /*! This is used in LaTeX as the title of the chapter containing
-     *  the documentation of all data types (Fortran).
-     */
-    virtual QCString trTypeDocumentation()
-    { return "Տվյալների տիպեր"; }
-
-    /*! This is used in the documentation of a file as a header before the 
-     *  list of (global) subprograms (Fortran).
-     */
-    virtual QCString trSubprograms()
-    { return "Ֆունկցիաներ/ենթածրագրեր"; }
-
-    /*! This is used in the documentation of a file/namespace before the list 
-     *  of documentation blocks for subprograms (Fortran)
-     */
-    virtual QCString trSubprogramDocumentation()
-    { return "Ֆունկցիաներ/ենթածրագրեր"; }
-
-    /*! This is used in the documentation of a file/namespace/group before 
-     *  the list of links to documented compounds (Fortran)
-     */
-     virtual QCString trDataTypes()
-    { return "Տվյալների տիպեր"; }
-    
-    /*! used as the title of page containing all the index of all modules (Fortran). */
-    virtual QCString trModulesList()
-    { return "Մոդուլների ցուցակ"; }
-
-    /*! used as an introduction to the modules list (Fortran) */
-    virtual QCString trModulesListDescription(bool extractAll)
-    {
-      QCString result="Բոլոր";
-      if (!extractAll) result+="փաստագրված ";
-      result+="մոդուլների ցուցակը` կարճ բացատրություններով.";
-      return result;
-    }
-
-    /*! used as the title of the HTML page of a module/type (Fortran) */
-    virtual QCString trCompoundReferenceFortran(const char *clName,
-                                    ClassDef::CompoundType compType,
-                                    bool isTemplate)
-    {
-      QCString result=(QCString)clName;
-      if (!isTemplate) 
-      {
-		switch(compType)
-		{
-		  case ClassDef::Class:      result+=" Մոդուլ"; break;
-		  case ClassDef::Struct:     result+=" Տիպ"; break;
-		  case ClassDef::Union:      result+=" Միավորում"; break;
-		  case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;
-		  case ClassDef::Protocol:   result+=" Արձանագրություն"; break;
-		  case ClassDef::Category:   result+=" Դասակարգում"; break;
-		  case ClassDef::Exception:  result+=" Բացառություն"; break;
-		}
-      }
-      else
-      {
-		switch(compType)
-		{
-		  case ClassDef::Class:      result+=" Մոդուլի"; break;
-		  case ClassDef::Struct:     result+=" Տիպի"; break;
-		  case ClassDef::Union:      result+=" Միավորման"; break;
-		  case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;
-		  case ClassDef::Protocol:   result+=" Արձանագրության"; break;
-		  case ClassDef::Category:   result+=" Դասակարգման"; break;
-		  case ClassDef::Exception:  result+=" Բացառության"; break;
-		}
-		result+=" Ձևանմուշ";
-      }
-      return result;
-    }
-    /*! used as the title of the HTML page of a module (Fortran) */
-    virtual QCString trModuleReference(const char *namespaceName)
-    {
-      return QCString("Մոդուլ ") + namespaceName;
-    }
-    
-    /*! This is put above each page as a link to all members of modules. (Fortran) */
-    virtual QCString trModulesMembers()
-    { return "Մոդուլի անդամներ"; }
-
-    /*! This is an introduction to the page with all modules members (Fortran) */
-    virtual QCString trModulesMemberDescription(bool extractAll)
-    { 
-      QCString result="Մոդուլի բոլոր ";
-      if (!extractAll) result+="փաստագրված ";
-      result+="անդամների ցուցակը` հղումներով դեպի ";
-      if (extractAll) 
-      {
-        result+="բոլոր անդամների փաստագրությունները.";
-      }
-      else 
-      {
-        result+="մոդուլները, որոնց նրանք պատկանում են.";
-      }
-      return result;
-    }
-
-    /*! This is used in LaTeX as the title of the chapter with the 
-     *  index of all modules (Fortran).
-     */
-    virtual QCString trModulesIndex()
-    { return "Մոդուլներ"; }
-    
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trModule(bool first_capital, bool singular)
-    {       
-      QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));
-      if (!singular)  result+="ներ"; 
-      return result; 
-    }
-    /*! This is put at the bottom of a module documentation page and is
-     *  followed by a list of files that were used to generate the page.
-     */
-    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
-        bool single)
-    { // here s is one of " Module", " Struct" or " Union"
-      // single is true implies a single file
-      QCString result=(QCString)"Այս ";
-      switch(compType)
-      {
-        case ClassDef::Class:      result+="մոդուլի"; break;
-        case ClassDef::Struct:     result+="տիպի"; break;
-        case ClassDef::Union:      result+="միավորման"; break;
-        case ClassDef::Interface:  result+="ինտերֆեյսի"; break;
-        case ClassDef::Protocol:   result+="արձանագրության"; break;
-        case ClassDef::Category:   result+="դասակարգման"; break;
-        case ClassDef::Exception:  result+="բացառության"; break;
-      }
-      result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";
-      if (single) result+="ից."; else result+="երից.";
-      return result;
-    }
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trType(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Տիպ" : "տիպ"));
-      if (!singular)  result+="եր";
-      return result; 
-    }
-    /*! This is used for translation of the word that will possibly
-     *  be followed by a single name or by a list of names 
-     *  of the category.
-     */
-    virtual QCString trSubprogram(bool first_capital, bool singular)
-    { 
-      QCString result((first_capital ? "Ե" : "ե"));
-      if (singular)  result+="նթածրագիր"; else result+="նթածրագրեր"; 
-      return result; 
-    }
-
-    /*! C# Type Constraint list */
-    virtual QCString trTypeConstraints()
-    {
-      return "Տիպերի Սահմանափակումներ";
-    }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.6.0 (mainly for the new search engine)
-//////////////////////////////////////////////////////////////////////////
-
-    /*! directory relation for \a name */
-    virtual QCString trDirRelation(const char *name)
-    {
-      return QCString(name)+" Կապ";
-    }
-
-    /*! Loading message shown when loading search results */
-    virtual QCString trLoading()
-    {
-      return "Բեռնում...";
-    }
-
-    /*! Label used for search results in the global namespace */
-    virtual QCString trGlobalNamespace()
-    {
-      return "Գլոբալ անունների տարածություն";
-    }
-
-    /*! Message shown while searching */
-    virtual QCString trSearching()
-    {
-      return "Որոնում...";
-    }
-
-    /*! Text shown when no search results are found */
-    virtual QCString trNoMatches()
-    {
-      return "Անարդյունք";
-    }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.6.3 (missing items for the directory pages)
-//////////////////////////////////////////////////////////////////////////
-
-    /*! introduction text for the directory dependency graph */
-    virtual QCString trDirDependency(const char *name)
-    {
-      return (QCString)name + " -ի կախվածությունների գծագիր";
-    }
-
-    /*! when clicking a directory dependency label, a page with a
-     *  table is shown. The heading for the first column mentions the
-     *  source file that has a relation to another file.
-     */
-    virtual QCString trFileIn(const char *name)
-    {
-      return (QCString)"Ֆայլը " + name + " ում";
-    }
-
-    /*! when clicking a directory dependency label, a page with a
-     *  table is shown. The heading for the second column mentions the
-     *  destination file that is included.
-     */
-    virtual QCString trIncludesFileIn(const char *name)
-    {
-      return (QCString)"Ներառում է ֆայլը " + name + " ում";
-    }
-
-    /** Compiles a date string.
-     *  @param year Year in 4 digits
-     *  @param month Month of the year: 1=January
-     *  @param day Day of the Month: 1..31
-     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
-     *  @param hour Hour of the day: 0..23
-     *  @param minutes Minutes in the hour: 0..59
-     *  @param seconds Seconds within the minute: 0..59
-     *  @param includeTime Include time in the result string?
-     */
-    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
-                                int hour,int minutes,int seconds,
-                                bool includeTime)
-    {
-      static const char *days[]   = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",
-								"Ուրբաթ,","Շաբաթ,","Կիրակի," };
-      static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",
-								"Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };
-      QCString sdate;
-      sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
-      if (includeTime)
-      {
-        QCString stime;
-        stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);
-        sdate+=stime;
-      }
-      return sdate;
-    }
-};
-
-#endif
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+/*
+ * Translation by
+ * Armen Tangamyan <armen.tangamyan@anu.edu.au>
+ */
+
+#ifndef TRANSLATOR_AM_H
+#define TRANSLATOR_AM_H
+
+class TranslatorArmenian : public TranslatorAdapter_1_7_5
+{
+  public:
+    /*! Used for identification of the language. */
+    virtual QCString idLanguage()
+    { return "armenian"; }
+
+    /* Used to get the command(s) for the language support. */
+    virtual QCString latexLanguageSupportCommand()
+    {
+        return "<pre>\\usepackage[latin]{armtex}\n"
+			   "\\usepackage[armscii8]{inputenc}\n</pre>"; 
+    }
+
+    /*! return the language charset. This will be used for the HTML output */
+    virtual QCString idLanguageCharset()
+    {
+        return "utf-8"; 
+    }
+
+    // --- Language translation methods -------------------
+
+    /*! used in the compound documentation before a list of related functions. */
+    virtual QCString trRelatedFunctions()
+    { return "Դասին վերաբերվող ֆունկցիաներ"; }
+
+    /*! subscript for the related functions. */
+    virtual QCString trRelatedSubscript()
+    { return "(Հաշվի առեք, որ սրանք անդամ ֆունկցիաներ չեն)"; }
+
+    /*! header that is put before the detailed description of files, classes and namespaces. */
+    virtual QCString trDetailedDescription()
+    { return "Մանրամասն նկարագրություն"; }
+
+    /*! header that is put before the list of typedefs. */
+    virtual QCString trMemberTypedefDocumentation()
+    { return "Անդամ տիպի սահմանումներ (typedef)"; }
+
+    /*! header that is put before the list of enumerations. */
+    virtual QCString trMemberEnumerationDocumentation()
+    { return "Անդամ hամարակալումներ"; }
+
+    /*! header that is put before the list of member functions. */
+    virtual QCString trMemberFunctionDocumentation()
+    { return "Անդամ ֆունկցիաներ"; }
+
+    /*! header that is put before the list of member attributes. */
+    virtual QCString trMemberDataDocumentation()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Դաշտեր";
+      }
+      else
+      {
+        return "Անդամ տվյալներ";
+      }
+    }
+
+    /*! this is the text of a link put after brief descriptions. */
+    virtual QCString trMore()
+    { return "Մանրամասն..."; }
+
+    /*! put in the class documentation */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trListOfAllMembers()
+    {
+      return "Բոլոր անդամների ցուցակը";
+    }
+
+    /*! used as the title of the "list of all members" page of a class */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trMemberList()
+    {
+      return "Անդամների ցուցակ";
+    }
+
+    /*! this is the first part of a sentence that is followed by a class name */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return "Սա դասի անդամների ամբողջական ցուցակն է "; }
+
+    /*! this is the remainder of the sentence after the class name */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trIncludingInheritedMembers()
+    { return ", ներառյալ բոլոր ժառանգված անդամները"; }
+
+    /*! this is put at the author sections at the bottom of man pages.
+     *  parameter s is name of the project name.
+     */
+    virtual QCString trGeneratedAutomatically(const char *s)
+    { QCString result="Ավտոմատ ստեղծված է ելքային կոդից, Doxygen-ի միջոցով, ";
+      if (s) result+=s+(QCString)" համար:";
+      return result;
+    }
+
+    /*! put after an enum name in the list of all members */
+    virtual QCString trEnumName()
+    { return "համարակալման անուն"; }
+
+    /*! put after an enum value in the list of all members */
+    virtual QCString trEnumValue()
+    { return "համարակալման արժեք"; }
+
+    /*! put after an undocumented member in the list of all members */
+    virtual QCString trDefinedIn()
+    { return "սահմանված"; }
+
+    // quick reference sections
+
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \\group command).
+     */
+    virtual QCString trModules()
+    { return "Մոդուլներ"; }
+
+    /*! This is put above each page as a link to the class hierarchy */
+    virtual QCString trClassHierarchy()
+    { return "Դասերի հիերարխա"; }
+
+    /*! This is put above each page as a link to the list of annotated classes */
+    virtual QCString trCompoundList()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածք";
+      }
+      else
+      {
+        return "Դասերի ցուցակ";
+      }
+    }
+
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return "Ֆայլերի ցուցակ"; }
+
+    /*! This is put above each page as a link to all members of compounds. */
+    virtual QCString trCompoundMembers()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների դաշտեր";
+      }
+      else
+      {
+        return "Դասի անդամներ";
+      }
+    }
+
+    /*! This is put above each page as a link to all members of files. */
+    /*??*/
+    virtual QCString trFileMembers()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Գլոբալներ"; 
+      }
+      else
+      {
+        return "Ֆայլի անդամներ"; 
+      }
+    }
+
+    /*! This is put above each page as a link to all related pages. */
+    virtual QCString trRelatedPages()
+    { return "Նմանատիպ էջեր"; }
+
+    /*! This is put above each page as a link to all examples. */
+    virtual QCString trExamples()
+    { return "Օրինակներ"; }
+
+    /*! This is put above each page as a link to the search engine. */
+    virtual QCString trSearch()
+    { return "Որոնում"; }
+
+    /*! This is an introduction to the class hierarchy. */
+    virtual QCString trClassHierarchyDescription()
+    { return "Այս ժառանգման ցուցակը կոպտորեն է տեսակավորված, "
+             "բայց ոչ ամբողջապես, այբբենական կարգով.";
+	}
+
+    /*! This is an introduction to the list with all files. */
+    virtual QCString trFileListDescription(bool extractAll)
+    {
+      QCString result="Բոլոր ";
+      if (!extractAll) result+="փաստագրված ";
+      result+="ֆայլերի մի ցուցակ` կարճ բացատրություններով:";
+      return result;
+    }
+
+    /*! This is an introduction to the annotated compound list. */
+    virtual QCString trCompoundListDescription()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածքը` կարճ բացատրություններով.";
+      }
+      else
+      {
+        return "Դասերը, կառուցվածքները, միավորումները "
+				"և ինտերֆեյսները` կարճ բացատրություններով.";
+      }
+    }
+
+    /*! This is an introduction to the page with all class members. */
+    virtual QCString trCompoundMembersDescription(bool extractAll)
+    {
+        QCString result="Բոլոր ";
+        if(!extractAll) result+="փաստագրված ";
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+          result+="կառուցվածքների և միավորումների դաշտերի ";
+        else
+          result+="դասի անդամների ";
+		result+="ցուցակը`";
+		result+=" հղումներով դեպի ";
+        if(!extractAll)
+        {
+          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+            result+="կառուցվածք/միավորում փաստագրությունները բոլոր անդամների համար.";
+          else
+            result+="դասի փաստագրությունը բոլոր անդամների համար.";
+        }
+        else
+        {
+          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+            result += "կառուցվածքները/միավորումները, որոնց նրանք պատկանում են.";
+          else
+            result += "դասերը, որոնց նրանք պատկանում են.";
+        }
+        return result;
+    }
+
+    /*! This is an introduction to the page with all file members. */
+    virtual QCString trFileMembersDescription(bool extractAll)
+    {
+      QCString result="Բոլոր ";
+      if (!extractAll) result+="փաստագրված ";
+
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="ֆունկցիաների, փոփոխականների, մակրո-հայտարարությունների, "
+                "համարակալումների և տիպի սահմանումների (typedef)";
+      }
+      else
+      {
+        result+="ֆայլի անդամների ";
+      }
+	  result+="ցուցակը`";
+      result+=" հղումներով դեպի ";
+      if (extractAll)
+        result+="ֆայլերը, որոնց նրանք պատկանում են.";
+      else
+        result+="փաստագրությունը.";
+      return result;
+    }
+
+    /*! This is an introduction to the page with the list of all examples */
+    virtual QCString trExamplesDescription()
+    { return "Բոլոր օրինակների ցուցակը."; }
+
+    /*! This is an introduction to the page with the list of related pages */
+    virtual QCString trRelatedPagesDescription()
+    { return "Բոլոր նմանատիպ փաստագրության էջերի ցուցակը."; }
+
+    /*! This is an introduction to the page with the list of class/file groups */
+    virtual QCString trModulesDescription()
+    { return "Բոլոր մոդուլների ցուցակը."; }
+
+    // index titles (the project name is prepended for these) 
+
+
+    /*! This is used in HTML as the title of index.html. */
+    virtual QCString trDocumentation()
+    { return " - Փաստագրություն"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
+    virtual QCString trModuleIndex()
+    { return "Մոդուլներ"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
+    virtual QCString trHierarchicalIndex()
+    { return "Դասակարգումներ"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
+    virtual QCString trCompoundIndex()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածք";
+      }
+      else
+      {
+        return "Դասեր";
+      }
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
+    virtual QCString trFileIndex()
+    { return "Ֆայլեր"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
+    virtual QCString trModuleDocumentation()
+    { return "Մոդուլներ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
+    virtual QCString trClassDocumentation()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածքներ";
+      }
+      else
+      {
+        return "Դասեր";
+      }
+    }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
+    virtual QCString trFileDocumentation()
+    { return "Ֆայլեր"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
+    virtual QCString trExampleDocumentation()
+    { return "Օրինակներ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
+    virtual QCString trPageDocumentation()
+    { return "Էջեր"; }
+
+    /*! This is used in LaTeX as the title of the document */
+    virtual QCString trReferenceManual()
+    { return "Հղումների ձեռնարկ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
+    virtual QCString trDefines()
+    { return "Մակրոսներ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
+    virtual QCString trFuncProtos()
+    { return "Ֆունկցիաների նախատիպեր"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
+    virtual QCString trTypedefs()
+    { return "Տիպի սահմանումներ (typedef)"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
+    virtual QCString trEnumerations()
+    { return "Համարակալումներ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
+    virtual QCString trFunctions()
+    { return "Ֆունկցիաներ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trVariables()
+    { return "Փոփոխականներ"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trEnumerationValues()
+    { return "Հաշվիչ"; }
+
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
+    virtual QCString trDefineDocumentation()
+    { return "Մակրոսներ"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return "Ֆունկցիաների նախատիպեր"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
+    virtual QCString trTypedefDocumentation()
+    { return "Տիպի սահմանումներ (typedef)"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
+    virtual QCString trEnumerationTypeDocumentation()
+    { return "Համարակալման տիպեր"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
+    virtual QCString trFunctionDocumentation()
+    { return "Ֆունկցիաներ"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
+    virtual QCString trVariableDocumentation()
+    { return "Փոփոխականներ"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
+    virtual QCString trCompounds()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածք";
+      }
+      else
+      { 
+        return "Դասեր";
+      }
+
+    }
+
+    /*! This is used in the documentation of a group before the list of 
+     *  links to documented files
+     */
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
+    { 
+      QCString result=(QCString)"Ստեղծվել է "+date;
+      if (projName) result+=projName+QCString(" -ի համար,");
+      result+=(QCString)" հետևյալ համակարգով.";
+      return result;
+    }
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
+    virtual QCString trWrittenBy()
+    {
+      return "Հեղինակ - ";
+    }
+
+    /*! this text is put before a class diagram */
+    virtual QCString trClassDiagram(const char *clName)
+    {
+      return clName+QCString(" -ի ժառանգման գծագիրը.");
+    }
+
+    /*! this text is generated when the \\internal command is used. */
+    virtual QCString trForInternalUseOnly()
+    { return "Միայն ներքին օգտագործման համար"; }
+
+    /*! this text is generated when the \\warning command is used. */
+    virtual QCString trWarning()
+    { return "Զգուշացում"; }
+
+    /*! this text is generated when the \\version command is used. */
+    virtual QCString trVersion()
+    { return "Տարբերակ"; }
+
+    /*! this text is generated when the \\date command is used. */
+    virtual QCString trDate()
+    { return "Տարեթիվ"; }
+
+    /*! this text is generated when the \\return command is used. */
+    virtual QCString trReturns()
+    { return "Վերադարձնում է"; }
+
+    /*! this text is generated when the \\sa command is used. */
+    virtual QCString trSeeAlso()
+    { return "Տեսեք նաև"; }
+
+    /*! this text is generated when the \\param command is used. */
+    virtual QCString trParameters()
+    { return "Պարամետրեր"; }
+
+    /*! this text is generated when the \\exception command is used. */
+    virtual QCString trExceptions()
+    { return "Բացառություններ"; }
+
+    /*! this text is used in the title page of a LaTeX document. */
+    virtual QCString trGeneratedBy()
+    { return "Ստեղծված է հետևյալ համակարգի կողմից"; }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307 
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used as the title of page containing all the index of all namespaces. */
+    virtual QCString trNamespaceList()
+    { return "Անունների տարածությունների ցուցակ"; }
+
+    /*! used as an introduction to the namespace list */
+    virtual QCString trNamespaceListDescription(bool extractAll)
+    {
+      QCString result="Բոլոր ";
+      if (!extractAll) result+="փաստագրված ";
+      result+="անունների տարածությունների ցուցակը` կարճ բացատրություններով.";
+      return result;
+    }
+
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
+    virtual QCString trFriends()
+    { return "Ընկերներ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used in the class documentation as a header before the list of all
+     * related classes 
+     */
+    virtual QCString trRelatedFunctionDocumentation()
+    { return "Դասի ընկերներ և կապված ֆունկցիաներ"; }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used as the title of the HTML page of a class/struct/union */
+    virtual QCString trCompoundReference(const char *clName,
+                                 ClassDef::CompoundType compType,
+                                 bool isTemplate)
+    {
+		QCString result=(QCString)clName;
+		if (isTemplate)
+		{		  
+		  switch(compType)
+		  {
+			case ClassDef::Class:      result+=" Դասի"; break;
+			case ClassDef::Struct:     result+=" Կառուցվածքի"; break;
+			case ClassDef::Union:      result+=" Միավորման"; break;
+			case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;
+			case ClassDef::Protocol:   result+=" Արձանագրության"; break;
+			case ClassDef::Category:   result+=" Դասակարգման"; break;
+			case ClassDef::Exception:  result+=" Բացառության"; break;
+		  }
+		  result+=" Ձևանմուշներ";
+		}
+		else
+		{
+		  switch(compType)
+		  {
+			case ClassDef::Class:      result+=" Դաս"; break;
+			case ClassDef::Struct:     result+=" Կառուցվածք"; break;
+			case ClassDef::Union:      result+=" Միավորում"; break;
+			case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;
+			case ClassDef::Protocol:   result+=" Արձանագրություն"; break;
+			case ClassDef::Category:   result+=" Դասակարգում"; break;
+			case ClassDef::Exception:  result+=" Բացառություն"; break;
+		  }
+		}
+		return result;
+	}
+
+    /*! used as the title of the HTML page of a file */
+    virtual QCString trFileReference(const char *fileName)
+    {
+      return fileName+QCString(" ֆայլեր");
+    }
+
+    /*! used as the title of the HTML page of a namespace */
+    virtual QCString trNamespaceReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" անունների տարածություններ";
+      return result;
+    }
+    
+    virtual QCString trPublicMembers()
+    { return "Բաց անդամ ֆունկցիաներ"; }
+    virtual QCString trPublicSlots()
+    { return "Բաց սլոթեր"; }
+    virtual QCString trSignals()
+    { return "Ազդանշաններ"; }
+    virtual QCString trStaticPublicMembers()
+    { return "Բաց ստատիկ անդամ ֆունկցիաներ"; }
+    virtual QCString trProtectedMembers()
+    { return "Պաշտպանված անդամ ֆունկցիաներ"; }
+    virtual QCString trProtectedSlots()
+    { return "Պաշտպանված սլոթեր"; }
+    virtual QCString trStaticProtectedMembers()
+    { return "Պաշտպանված ստատիկ անդամ ֆունկցիաներ"; }
+    virtual QCString trPrivateMembers()
+    { return "Փակ ֆունկցիաներ"; }
+    virtual QCString trPrivateSlots()
+    { return "Փակ սլոթեր"; }
+    virtual QCString trStaticPrivateMembers()
+    { return "Փակ ստատիկ անդամ ֆունկցիաներ"; }
+    
+    /*! this function is used to produce a comma-separated list of items.
+     *  use generateMarker(i) to indicate where item i should be put.
+     */
+    virtual QCString trWriteList(int numEntries)
+    {
+      QCString result;
+      int i;
+      // the inherits list contain `numEntries' classes
+      for (i=0;i<numEntries;i++) 
+      {
+        // use generateMarker to generate placeholders for the class links!
+        result+=generateMarker(i); // generate marker for entry i in the list 
+                                   // (order is left to right)
+        
+        if (i!=numEntries-1)  // not the last entry, so we need a separator
+        {
+          if (i<numEntries-2) // not the fore last entry 
+            result+=", ";
+          else                // the fore last entry
+            result+=" և ";
+        }
+      }
+      return result; 
+    }
+    
+    /*! used in class documentation to produce a list of base classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritsList(int numEntries)
+    {
+      return "Հենքային դասեր - "+trWriteList(numEntries)+":";
+    }
+
+    /*! used in class documentation to produce a list of super classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritedByList(int numEntries)
+    {
+      return "Ժառանգորդ դասեր - "+trWriteList(numEntries)+":";
+    }
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are hidden by this one.
+     */
+    virtual QCString trReimplementedFromList(int numEntries)
+    {
+      return "Վերասահմանված ֆունկցիաներ - "+trWriteList(numEntries)+":";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all member that overwrite the implementation of this member.
+     */
+    virtual QCString trReimplementedInList(int numEntries)
+    {
+      return "Վերասահմանված է "+trWriteList(numEntries)+" ում:";
+    }
+
+    /*! This is put above each page as a link to all members of namespaces. */
+    virtual QCString trNamespaceMembers()
+    { return "Անունների տարածության անդամներ"; }
+
+    /*! This is an introduction to the page with all namespace members */
+    virtual QCString trNamespaceMemberDescription(bool extractAll)
+    {
+      QCString result="Բոլոր ";
+      if (!extractAll) result+="փաստագրված ";
+      result+="անունների տարածության անդամների ցուցակը` "
+			"հղումներով դեպի ";
+      if (extractAll) 
+        result+="բոլոր անդամների անունների տարածության փաստագրությունը.";
+      else 
+        result+="անունների տարածությունը, որին նրանք պատկանում են.";
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all namespaces.
+     */
+    virtual QCString trNamespaceIndex()
+    { return "Անունների տարածություններ"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all namespaces.
+     */
+    virtual QCString trNamespaceDocumentation()
+    { return "Անունների տարածություն"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in the documentation before the list of all
+     *  namespaces in a file.
+     */
+    virtual QCString trNamespaces()
+    { return "Անունների տարածություններ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { 
+      QCString result = (QCString)"Այս ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="դասի"; break;
+        case ClassDef::Struct:     result+="կառուցվածքի"; break;
+        case ClassDef::Union:      result+="միավորման"; break;
+        case ClassDef::Interface:  result+="ինտերֆեյսի"; break;
+        case ClassDef::Protocol:   result+="արձանագրության"; break;
+        case ClassDef::Category:   result+="դասակարգման"; break;
+        case ClassDef::Exception:  result+="բացառության"; break;
+      }
+      result+=" փաստագրությունը ստեղծվել է հետևյալ ֆայլ";
+      if (single) result+="ից."; else result+="երից.";
+      return result;
+    }
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    { return "Այբբենական ցուցակ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the heading text for the retval command. */
+    virtual QCString trReturnValues()
+    { return "Վերադարձվող արժեքներ"; }
+
+    /*! This is in the (quick) index as a link to the main page (index.html)
+     */
+    virtual QCString trMainPage()
+    { return "Գլխավոր էջ"; }
+
+    /*! This is used in references to page that are put in the LaTeX 
+     *  documentation. It should be an abbreviation of the word page.
+     */
+    virtual QCString trPageAbbreviation()
+    { return "էջ:"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDefinedAtLineInSourceFile()
+    {
+      return "Սահմանումը @1 ֆայլի @0 տողում է:";
+    }
+    virtual QCString trDefinedInSourceFile()
+    {
+      return "Սահմանումը @0 ֆայլում է:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDeprecated()
+    {
+      return "Հնացած է";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! this text is put before a collaboration diagram */
+    virtual QCString trCollaborationDiagram(const char *clName)
+    {
+      return (QCString)clName+"-ի համագործակցությունների գծագիր.";
+    }
+    /*! this text is put before an include dependency graph */
+    virtual QCString trInclDepGraph(const char *fName)
+    {
+      return (QCString)fName+"-ի ներառումների կախվածությունների գծագիր.";
+    }
+    /*! header that is put before the list of constructor/destructors. */
+    virtual QCString trConstructorDocumentation()
+    {
+      return "Կառուցիչներ"; 
+    }
+    /*! Used in the file documentation to point to the corresponding sources. */
+    virtual QCString trGotoSourceCode()
+    {
+      return "Տե'ս այս ֆայլի ելքային կոդը";
+    }
+    /*! Used in the file sources to point to the corresponding documentation. */
+    virtual QCString trGotoDocumentation()
+    {
+      return "Տե'ս այս ֆայլի փաստագրությունը:";
+    }
+    /*! Text for the \\pre command */
+    virtual QCString trPrecondition()
+    {
+      return "Նախապայման";
+    }
+    /*! Text for the \\post command */
+    virtual QCString trPostcondition()
+    {
+      return "Հետպայման";
+    }
+    /*! Text for the \\invariant command */
+    virtual QCString trInvariant()
+    {
+      return "Անփոփոխ";
+    }
+    /*! Text shown before a multi-line variable/enum initialization */
+    virtual QCString trInitialValue()
+    {
+      return "Նախնական արժեք";
+    }
+    /*! Text used the source code in the file index */
+    virtual QCString trCode()
+    {
+      return "Ելքային կոդ";
+    }
+    virtual QCString trGraphicalHierarchy()
+    {
+      return "Գրաֆիկական դասերի հիերարխիա:";
+    }
+    virtual QCString trGotoGraphicalHierarchy()
+    {
+      return "Տե'ս դասերի գրաֆիկական հիերարխիան:";
+    }
+    virtual QCString trGotoTextualHierarchy()
+    {
+      return "Տե'ս դասերի տեքստային հիերարխիան:";
+    }
+    virtual QCString trPageIndex()
+    {
+      return "էջեր";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+    
+    virtual QCString trNote()
+    {
+      return "Նշում";
+    }
+    virtual QCString trPublicTypes()
+    {
+      return "Բաց տիպեր";
+    }
+    virtual QCString trPublicAttribs()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների դաշտեր";
+      }
+      else
+      {
+        return "Բաց ատրիբուտներ";
+      }
+    }
+    virtual QCString trStaticPublicAttribs()
+    {
+      return "Բաց ստատիկ ատրիբուտներ";
+    }
+    virtual QCString trProtectedTypes()
+    {
+      return "Պաշտպանված տիպեր";
+    }
+    virtual QCString trProtectedAttribs()
+    {
+      return "Պաշտպանված ատրիբուտներ";
+    }
+    virtual QCString trStaticProtectedAttribs()
+    {
+      return "Պաշտպանված ստատիկ ատրիբուտներ";
+    }
+    virtual QCString trPrivateTypes()
+    {
+      return "Փակ տիպեր";
+    }
+    virtual QCString trPrivateAttribs()
+    {
+      return "Փակ ատրիբուտներ";
+    }
+    virtual QCString trStaticPrivateAttribs()
+    {
+      return "Փակ ստատիկ ատրիբուտներ";
+    }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a todo item */
+    virtual QCString trTodo()
+    /*??*/
+    {
+      return "Կատարման ենթակա";
+    }
+    /*! Used as the header of the todo list */
+    virtual QCString trTodoList()
+    /*??*/
+    {
+      return "Խնդիրների ցուցակ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trReferencedBy()
+    {
+      return "Օգտագործվում է հետևյալում - ";
+    }
+    virtual QCString trRemarks()
+    {
+      return "Դիտողություններ";
+    }
+    virtual QCString trAttention()
+    {
+      return "Ուշադրություն";
+    }
+    virtual QCString trInclByDepGraph()
+    {
+      return "Այս գրաֆը ցույց է տալիս, թե որ ֆայլերն են "
+			"ուղղակի կամ անուղղակի ներառում տվյալ ֆայլը.";
+    }
+    virtual QCString trSince()
+    /*??*/
+    {
+      return "Սկսած";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! title of the graph legend page */
+    virtual QCString trLegendTitle()
+    {
+      return "Լեգենդ";
+    }
+    /*! page explaining how the dot graph's should be interpreted */
+    virtual QCString trLegendDocs()
+    {
+      return 
+		"Այս էջը նկարագրում է, թե ինչպես մեկնաբանել doxygen-ի ստեղծած գրաֆները:<p>\n"
+        "Դիտարկենք հետևյալ օրինակը.\n"
+        "\\code\n"
+        "/*! Կրճատման հետևանքով անտեսանելի դաս */\n"
+        "class Invisible { };\n\n"
+        "/*! Կրճատված դաս, ժառանգությունների հարաբերությունը փակ է */\n"
+        "class Truncated : public Invisible { };\n\n"
+        "/* Չփաստագրված դաս */\n"
+        "class Undocumented { };\n\n"
+        "/*! Բաց ժառանգում */\n"
+        "class PublicBase : public Truncated { };\n\n"
+        "/*! Դասի ձևաչափ */\n"
+        "template<class T> class Templ {};\n\n"
+        "/*! Պաշտպանված ժառանգում */\n"
+        "class ProtectedBase { };\n\n"
+        "/*! Փակ ժառանգում */\n"
+        "class PrivateBase { };\n\n"
+        "/*! Դաս, որը օգտագործվում է Inherited դասի կողմից */\n"
+        "class Used { };\n\n"
+        "/*! Դաս, որը ժառանգում է մի շարք այլ դասերից */\n"
+        "class Inherited : public PublicBase,\n"
+        "                  protected ProtectedBase,\n"
+        "                  private PrivateBase,\n"
+        "                  public Undocumented,\n"
+        "                  public Templ<int>\n"
+        "{\n"
+        "  private:\n"
+        "    Used *m_usedClass;\n"
+        "};\n"
+        "\\endcode\n"
+        "Եթե \\c MAX_DOT_GRAPH_HEIGHT -ին վերագրված է  "
+        "240, ապա կստանանք հետևյալ գրաֆը."
+        "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+        "<p>\n"
+        "Այս գրաֆի ուղղանկյունները ունեն հետևյալ իմաստը.\n"
+        "<ul>\n"
+        "<li>Լցոնվաց մոխրագույն ուղղանկյունը ներկայացնում է այն դասը կամ կառուցվածքը, "
+		"որի համար ստեղծվել է տվյալ գրաֆը:</li>\n"
+		"<li>Սև եզրերով ուղղանկյունը նշանակում է փաստագրված դաս կամ կարուցվածք:</li>\n"
+		"<li>Մոխրագույն եզրերով ուղղանկյունը նշանակում է չփաստագրված դաս կամ կառուցվածք:</li>\n"
+        "<li>Կարմիր եզրերով ուղղանկյունը նշանակում է դաս կամ կառուցվածք, որի համար\n"
+		" ոչ բոլոր ժառանգում/պարունակում կապերն են ցուցադրված: Գրաֆը կրճատված է, "
+		"եթե այն չի տեղավորվում նշված սահմաններում:</li>\n"
+        "</ul>\n"
+        "Սլաքները ունեն հետևյալ իմաստը.\n"
+        "<ul>\n"
+		"<li>Մուգ կապույտ սլաքը օգտագործվում է երկու դասերի միջև բաց ժառանգում "
+		"կապը ցուցադրելու համար:</li>\n"
+		"<li>Մուգ կանաչ սլաքը օգտագործվում է պաշտպանված ժառանգման համար:</li>\n"
+        "<li>Մուգ կարմիր սլաքը օգտագործվում է փակ ժառանգման համար:</li>\n"
+        "<li>Մանուշակագույն կետագիծ սլաքը օգտագորշվում է, եթե դասը պարունակվում է"
+		"այլ դասում կամ օգտագորշվում է այլ դասի կողմից: Սլաքը պիտակավորվաշ է"
+		"փոփոխական(ներ)ով, որի միջոցով մատնանշված դասը կամ կառուցվածքը հասանելի է:</li>\n"
+        "<li>Դեզին կետագիծ սլաքը ցույց է տալիս ձևանմուշի օրինակի կապը այն ձևանմուշի հետ, "
+		"որից այն իրականցվել է. Սլաքը պիտակավորված է օրինակի ձևանմուշային պարամետրերով:</li>\n"
+        "</ul>\n";
+    }
+    /*! text for the link to the legend page */
+    virtual QCString trLegend()
+    {
+      return "լեգենդ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a test item */
+    virtual QCString trTest()
+    {
+      return "Թեստ";
+    }
+    /*! Used as the header of the test list */
+    virtual QCString trTestList()
+    {
+      return "Թեստերի ցուցակ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for KDE-2 IDL methods */
+    virtual QCString trDCOPMethods()
+    {
+      return "DCOP անդամ ֆունկցիաներ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for IDL properties */
+    virtual QCString trProperties()
+    {
+      return "Հատկություններ";
+    }
+    /*! Used as a section header for IDL property documentation */
+    virtual QCString trPropertyDocumentation()
+    {
+      return "Հատկություններ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used for Java classes in the summary section of Java packages */
+    virtual QCString trClasses()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Տվյալների կառուցվածք";
+      }
+      else
+      {
+        return "Դասեր";
+      }
+    }
+    /*! Used as the title of a Java package */
+    virtual QCString trPackage(const char *name)
+    {
+      return (QCString)"Փաթեթ "+name;
+    }
+    /*! Title of the package index page */
+    virtual QCString trPackageList()
+    {
+      return "Փաթեթների ցուցակ";
+    }
+    /*! The description of the package index page */
+    virtual QCString trPackageListDescription()
+    {
+      return "Բոլոր փաթեթները` կարճ բացատրություններով (եթե հասանելի են).";
+    }
+    /*! The link name in the Quick links header for each page */
+    virtual QCString trPackages()
+    {
+      return "Փաթեթներ";
+    }
+    /*! Text shown before a multi-line define */
+    virtual QCString trDefineValue()
+    {
+      return "Արժեքներ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a \\bug item */
+    virtual QCString trBug()
+    {
+      return "Սխալ";
+    }
+    /*! Used as the header of the bug list */
+    virtual QCString trBugList()
+    {
+      return "Սխալների ցուցակ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+    /*! Used as ansicpg for RTF file */
+    virtual QCString trRTFansicp()
+    {
+      return "armscii-8";
+    }
+    /*! Used as ansicpg for RTF fcharset */
+    virtual QCString trRTFCharSet()
+    {
+      return "0";
+    }
+    /*! Used as header RTF general index */
+    virtual QCString trRTFGeneralIndex()
+    {
+      return "Ցուցիչ";
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trClass(bool first_capital, bool singular)
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        QCString result((first_capital ? "Տվյալների կառուցվածք" : "տվյալների կառուցվածք"));
+        return result; 
+      }
+      else
+      {
+        QCString result((first_capital ? "Դաս" : "դաս"));
+        if(!singular) result+="եր";
+        return result;
+      }
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trFile(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Ֆայլ" : "ֆայլ"));
+      if (!singular)  result+="եր";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trNamespace(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Անունների տարածություն" : "անունների տարածություն"));
+      if (!singular)  result+="ներ";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGroup(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Խ" : "խ"));
+      result+=(singular ? "ումբ" : "մբեր");
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trPage(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Էջ" : "էջ"));
+      if (!singular)  result+="եր";
+      return result;
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trMember(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Անդամ" : "անդամ"));
+      if (!singular)  result+="ներ";
+      return result; 
+    }
+   
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGlobal(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Գլոբալ" : "գլոբալ"));
+      if (!singular)  result+="ներ";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is generated when the \\author command is used and
+     *  for the author section in man pages. */
+    virtual QCString trAuthor(bool first_capital, bool singular)
+    {                                                                         
+      QCString result((first_capital ? "Հեղինակ" : "հեղինակ"));
+      if (!singular) result+="ներ";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is put before the list of members referenced by a member
+     */
+    virtual QCString trReferences()
+    {
+      return "Հղումներ - ";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are implemented by this one.
+     */
+    virtual QCString trImplementedFromList(int numEntries)
+    {
+      return "Իրագործում է հետևյալ դաս(եր)ի ֆունկցիաները - "+trWriteList(numEntries)+":";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all members that implementation this member.
+     */
+    virtual QCString trImplementedInList(int numEntries)
+    {
+      return "Իրագործվում է հետևյալում - "+trWriteList(numEntries)+":";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in RTF documentation as a heading for the Table
+     *  of Contents.
+     */
+    virtual QCString trRTFTableOfContents()
+    {
+      return "Բովանդակություն";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as the header of the list of item that have been 
+     *  flagged deprecated 
+     */
+    virtual QCString trDeprecatedList()
+    {
+      return "Հնացած սահմանումների ցուցակը";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a header for declaration section of the events found in 
+     * a C# program
+     */
+    virtual QCString trEvents()
+    {
+      return "Պատահարներ";
+    }
+    /*! Header used for the documentation section of a class' events. */
+    virtual QCString trEventDocumentation()
+    {
+      return "Պատահարների ցուցակը";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a heading for a list of Java class types with package scope.
+     */
+    virtual QCString trPackageTypes()
+    { 
+      return "Փաթեթի տիպեր";
+    }
+    /*! Used as a heading for a list of Java class functions with package 
+     * scope. 
+     */
+    virtual QCString trPackageMembers()
+    { 
+      return "Փաթեթի ֆունկցիաներ";
+    }
+    /*! Used as a heading for a list of static Java class functions with 
+     *  package scope.
+     */
+    virtual QCString trStaticPackageMembers()
+    { 
+      return "Փաթեթի ստատիկ ֆունկցիաներ";
+    }
+    /*! Used as a heading for a list of Java class variables with package 
+     * scope.
+     */
+    virtual QCString trPackageAttribs()
+    { 
+      return "Փաթեթի ատրիբուտներ";
+    }
+    /*! Used as a heading for a list of static Java class variables with 
+     * package scope.
+     */
+    virtual QCString trStaticPackageAttribs()
+    { 
+      return "Փաթեթի ստատիկ ատրիբուտներ";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used in the quick index of a class/file/namespace member list page 
+     *  to link to the unfiltered list of all members.
+     */
+    virtual QCString trAll()
+    {
+      return "Բոլոր";
+    }
+    /*! Put in front of the call graph for a function. */
+    virtual QCString trCallGraph()
+    {
+      return "Այս ֆունկցիայի կանչերի գրաֆը.";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! When the search engine is enabled this text is put in the header 
+     *  of each page before the field where one can enter the text to search 
+     *  for. 
+     */
+    virtual QCString trSearchForIndex()
+    {
+      return "Որոնում";
+    }
+    /*! This string is used as the title for the page listing the search
+     *  results.
+     */
+    virtual QCString trSearchResultsTitle()
+    {
+      return "Որոնման արդյունքները";
+    }
+    /*! This string is put just before listing the search results. The
+     *  text can be different depending on the number of documents found.
+     *  Inside the text you can put the special marker $num to insert
+     *  the number representing the actual number of search results.
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  value 2 represents 2 or more matches. HTML markup is allowed inside
+     *  the returned string.
+     */
+    virtual QCString trSearchResults(int numDocuments)
+    {
+      if (numDocuments==0)
+      {
+        return "Ներեցեք, բայց Ձեր որոնումը արդյունք չտվեց:";
+      }
+      else if( numDocuments == 1 )
+      {
+        return "Հայտնաբերվել է 1 փաստաթուղթ:";
+      }
+      else 
+      {
+        return "Հայտնաբերվել է <b>$num</b> փաստաթուղթ:"
+          "Փաստաթղթերը դասակարգված են ըստ համապասխանության";
+      }
+    }
+    /*! This string is put before the list of matched words, for each search 
+     *  result. What follows is the list of words that matched the query.
+     */
+    virtual QCString trSearchMatches()
+    {
+      return "Որոնման արդյունքներ:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      return "Ելակետային ֆայլ " + filename;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the name of the chapter containing the directory
+     *  hierarchy.
+     */
+    virtual QCString trDirIndex()
+    { return "Ֆայլադարանների հիերարխիա"; }
+
+    /*! This is used as the name of the chapter containing the documentation
+     *  of the directories.
+     */
+    virtual QCString trDirDocumentation()
+    { return "Ֆայլադարաններ"; }
+
+    /*! This is used as the title of the directory index and also in the
+     *  Quick links of a HTML page, to link to the directory hierarchy.
+     */
+    virtual QCString trDirectories()
+    { return "Ֆայլադրաններ"; }
+
+    /*! This returns a sentences that introduces the directory hierarchy. 
+     *  and the fact that it is sorted alphabetically per level
+     */
+    virtual QCString trDirDescription()
+    { return "Այս ֆայլադարանների հիերարխիան կարգավորված է կոպտորեն, "
+			"բայց ոչ ամբողջապես, այբբենական կարգով."; 
+	}
+
+    /*! This returns the title of a directory page. The name of the
+     *  directory is passed via \a dirName.
+     */
+    virtual QCString trDirReference(const char *dirName)
+    { QCString result=dirName; result+=" Ֆայլադարան"; return result; }
+
+    /*! This returns the word directory with or without starting capital
+     *  (\a first_capital) and in sigular or plural form (\a singular).
+     */
+    virtual QCString trDir(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Ֆայլադարան" : "ֆայլադարան"));
+      if (!singular) result+="ներ";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is added to the documentation when the \\overload command
+     *  is used for a overloaded function.
+     */
+    virtual QCString trOverloadText()
+    {
+       return "Սա վերաբեռնված ֆունկցիա է` տրամադրված հարմարության համար: "
+			  "Այն տարբերվում է նախնականից միայն արգումնետներով:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used to introduce a caller (or called-by) graph */
+    virtual QCString trCallerGraph()
+    {
+      return "Այս ֆունկցիայի կանչերի գրաֆը.";
+    }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Համարակալումներ"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+    /*! header that is put before the list of member subprograms (Fortran). */
+    virtual QCString trMemberFunctionDocumentationFortran()
+    { return "Անդամ ֆունցիաներ/ենթածրագրեր"; }
+
+    /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
+    virtual QCString trCompoundListFortran()
+    { return "Տվյալների տիպերի ցուցակը"; }
+
+    /*! This is put above each page as a link to all members of compounds (Fortran). */
+    virtual QCString trCompoundMembersFortran()
+    { return "Տվյալների դաշտեր"; }
+
+    /*! This is an introduction to the annotated compound list (Fortran). */
+    virtual QCString trCompoundListDescriptionFortran()
+    { return "Տվյալների տիպերը` կարճ բացատրություններով."; }
+
+    /*! This is an introduction to the page with all data types (Fortran). */
+    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+    {
+      QCString result="Բոլոր ";
+      if (!extractAll)
+      {
+        result+="փաստագրված ";
+      }
+      result+="տվյալների տիպերի անդամների ցուցակը` հղումներով դեպի ";
+      if (!extractAll) 
+      {
+		result+="բոլոր անդամների տվյալների կառուցվածքի փաստագրությունը";
+      }
+      else 
+      {
+        result+="տվյալների տիպերը, որոնց նրանք պատկանում են";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index (Fortran).
+     */
+    virtual QCString trCompoundIndexFortran()
+    { return "Տվյալների տիպեր"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all data types (Fortran).
+     */
+    virtual QCString trTypeDocumentation()
+    { return "Տվյալների տիպեր"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) subprograms (Fortran).
+     */
+    virtual QCString trSubprograms()
+    { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for subprograms (Fortran)
+     */
+    virtual QCString trSubprogramDocumentation()
+    { return "Ֆունկցիաներ/ենթածրագրեր"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds (Fortran)
+     */
+     virtual QCString trDataTypes()
+    { return "Տվյալների տիպեր"; }
+    
+    /*! used as the title of page containing all the index of all modules (Fortran). */
+    virtual QCString trModulesList()
+    { return "Մոդուլների ցուցակ"; }
+
+    /*! used as an introduction to the modules list (Fortran) */
+    virtual QCString trModulesListDescription(bool extractAll)
+    {
+      QCString result="Բոլոր";
+      if (!extractAll) result+="փաստագրված ";
+      result+="մոդուլների ցուցակը` կարճ բացատրություններով.";
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a module/type (Fortran) */
+    virtual QCString trCompoundReferenceFortran(const char *clName,
+                                    ClassDef::CompoundType compType,
+                                    bool isTemplate)
+    {
+      QCString result=(QCString)clName;
+      if (!isTemplate) 
+      {
+		switch(compType)
+		{
+		  case ClassDef::Class:      result+=" Մոդուլ"; break;
+		  case ClassDef::Struct:     result+=" Տիպ"; break;
+		  case ClassDef::Union:      result+=" Միավորում"; break;
+		  case ClassDef::Interface:  result+=" Ինտերֆեյս"; break;
+		  case ClassDef::Protocol:   result+=" Արձանագրություն"; break;
+		  case ClassDef::Category:   result+=" Դասակարգում"; break;
+		  case ClassDef::Exception:  result+=" Բացառություն"; break;
+		}
+      }
+      else
+      {
+		switch(compType)
+		{
+		  case ClassDef::Class:      result+=" Մոդուլի"; break;
+		  case ClassDef::Struct:     result+=" Տիպի"; break;
+		  case ClassDef::Union:      result+=" Միավորման"; break;
+		  case ClassDef::Interface:  result+=" Ինտերֆեյսի"; break;
+		  case ClassDef::Protocol:   result+=" Արձանագրության"; break;
+		  case ClassDef::Category:   result+=" Դասակարգման"; break;
+		  case ClassDef::Exception:  result+=" Բացառության"; break;
+		}
+		result+=" Ձևանմուշ";
+      }
+      return result;
+    }
+    /*! used as the title of the HTML page of a module (Fortran) */
+    virtual QCString trModuleReference(const char *namespaceName)
+    {
+      return QCString("Մոդուլ ") + namespaceName;
+    }
+    
+    /*! This is put above each page as a link to all members of modules. (Fortran) */
+    virtual QCString trModulesMembers()
+    { return "Մոդուլի անդամներ"; }
+
+    /*! This is an introduction to the page with all modules members (Fortran) */
+    virtual QCString trModulesMemberDescription(bool extractAll)
+    { 
+      QCString result="Մոդուլի բոլոր ";
+      if (!extractAll) result+="փաստագրված ";
+      result+="անդամների ցուցակը` հղումներով դեպի ";
+      if (extractAll) 
+      {
+        result+="բոլոր անդամների փաստագրությունները.";
+      }
+      else 
+      {
+        result+="մոդուլները, որոնց նրանք պատկանում են.";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all modules (Fortran).
+     */
+    virtual QCString trModulesIndex()
+    { return "Մոդուլներ"; }
+    
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trModule(bool first_capital, bool singular)
+    {       
+      QCString result((first_capital ? "Մոդուլ" : "մոդուլ"));
+      if (!singular)  result+="ներ"; 
+      return result; 
+    }
+    /*! This is put at the bottom of a module documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Module", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"Այս ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="մոդուլի"; break;
+        case ClassDef::Struct:     result+="տիպի"; break;
+        case ClassDef::Union:      result+="միավորման"; break;
+        case ClassDef::Interface:  result+="ինտերֆեյսի"; break;
+        case ClassDef::Protocol:   result+="արձանագրության"; break;
+        case ClassDef::Category:   result+="դասակարգման"; break;
+        case ClassDef::Exception:  result+="բացառության"; break;
+      }
+      result+=" փաստագրությունը ստեղծվել է հետևալ ֆայլ";
+      if (single) result+="ից."; else result+="երից.";
+      return result;
+    }
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trType(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Տիպ" : "տիպ"));
+      if (!singular)  result+="եր";
+      return result; 
+    }
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trSubprogram(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Ե" : "ե"));
+      if (singular)  result+="նթածրագիր"; else result+="նթածրագրեր"; 
+      return result; 
+    }
+
+    /*! C# Type Constraint list */
+    virtual QCString trTypeConstraints()
+    {
+      return "Տիպերի Սահմանափակումներ";
+    }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! directory relation for \a name */
+    virtual QCString trDirRelation(const char *name)
+    {
+      return QCString(name)+" Կապ";
+    }
+
+    /*! Loading message shown when loading search results */
+    virtual QCString trLoading()
+    {
+      return "Բեռնում...";
+    }
+
+    /*! Label used for search results in the global namespace */
+    virtual QCString trGlobalNamespace()
+    {
+      return "Գլոբալ անունների տարածություն";
+    }
+
+    /*! Message shown while searching */
+    virtual QCString trSearching()
+    {
+      return "Որոնում...";
+    }
+
+    /*! Text shown when no search results are found */
+    virtual QCString trNoMatches()
+    {
+      return "Անարդյունք";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! introduction text for the directory dependency graph */
+    virtual QCString trDirDependency(const char *name)
+    {
+      return (QCString)name + " -ի կախվածությունների գծագիր";
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the first column mentions the
+     *  source file that has a relation to another file.
+     */
+    virtual QCString trFileIn(const char *name)
+    {
+      return (QCString)"Ֆայլը " + name + " ում";
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the second column mentions the
+     *  destination file that is included.
+     */
+    virtual QCString trIncludesFileIn(const char *name)
+    {
+      return (QCString)"Ներառում է ֆայլը " + name + " ում";
+    }
+
+    /** Compiles a date string.
+     *  @param year Year in 4 digits
+     *  @param month Month of the year: 1=January
+     *  @param day Day of the Month: 1..31
+     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+     *  @param hour Hour of the day: 0..23
+     *  @param minutes Minutes in the hour: 0..59
+     *  @param seconds Seconds within the minute: 0..59
+     *  @param includeTime Include time in the result string?
+     */
+    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+                                int hour,int minutes,int seconds,
+                                bool includeTime)
+    {
+      static const char *days[]   = { "Երկուշաբթի,","Երեքշաբթի,","Չորեքշաբթի,","Հինգշաբթի,",
+								"Ուրբաթ,","Շաբաթ,","Կիրակի," };
+      static const char *months[] = { "Հունիսի","Փետրվարի","Մարտի","Ապրրիլի","Մայիսի","Հունիսի",
+								"Հուլիսի","Օգոստոսի","Սեպտեմբերի","Հոկտեբմերի","Նոյեմբերի","Դեկտեմբերի" };
+      QCString sdate;
+      sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+      if (includeTime)
+      {
+        QCString stime;
+        stime.sprintf(" %.2d:%.2d:%.2d ",hour,minutes,seconds);
+        sdate+=stime;
+      }
+      return sdate;
+    }
+};
+
+#endif
diff --git a/src/translator_br.h b/src/translator_br.h
index 5d04b40..5fa1565 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -32,7 +32,7 @@
 #ifndef TRANSLATOR_BR_H
 #define TRANSLATOR_BR_H
 
-class TranslatorBrazilian : public Translator
+class TranslatorBrazilian : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translator_cn.h b/src/translator_cn.h
index a04ed5d..10d0e6a 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -24,7 +24,7 @@
 */
 #define CN_SPC
 
-class TranslatorChinese : public Translator
+class TranslatorChinese : public TranslatorAdapter_1_7_5
 {
   public:
 		/*! Used for identification of the language. The identification
diff --git a/src/translator_cz.h b/src/translator_cz.h
index 9d3e65c..5c37fab 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -81,7 +81,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_7_5
 {
   public:
     // --- Language control methods -------------------
diff --git a/src/translator_de.h b/src/translator_de.h
index 8a9ca21..be08109 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -129,7 +129,7 @@
 #ifndef TRANSLATOR_DE_H
 #define TRANSLATOR_DE_H
 
-class TranslatorGerman : public Translator
+class TranslatorGerman : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translator_dk.h b/src/translator_dk.h
index be9dcc7..d43fea5 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -88,7 +88,7 @@
 #define TRANSLATOR_DK_H
 
 // class TranslatorDanish : public TranslatorAdapter_1_5_4
-class TranslatorDanish : public Translator
+class TranslatorDanish : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translator_en.h b/src/translator_en.h
index f6f01b1..5d312a4 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -1870,6 +1870,21 @@ class TranslatorEnglish : public Translator
       return sdate;
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Header for the page with bibliographic citations */
+    virtual QCString trCiteReferences()
+    { return "Bibliographic References"; }
+
+    /*! Text for copyright paragraph */
+    virtual QCString trCopyright()
+    { return "Copyright"; }
+
+    /*! Header for the graph showing the directory dependencies */
+    virtual QCString trDirDepGraph(const char *name)
+    { return QCString("Directory dependency graph for ")+name+":"; }
 
 };
 
diff --git a/src/translator_eo.h b/src/translator_eo.h
index ebc6fc0..0deb979 100644
--- a/src/translator_eo.h
+++ b/src/translator_eo.h
@@ -42,7 +42,7 @@
  Translator class (by the local maintainer) when the localized
  translator is made up-to-date again.
 */
-class TranslatorEsperanto : public Translator
+class TranslatorEsperanto : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translator_es.h b/src/translator_es.h
index 29ea370..7b57f3b 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -31,7 +31,7 @@
 #ifndef TRANSLATOR_ES_H
 #define TRANSLATOR_ES_H
 
-class TranslatorSpanish : public Translator
+class TranslatorSpanish : public TranslatorAdapter_1_7_5
 {
 
   public:
diff --git a/src/translator_fa.h b/src/translator_fa.h
index 4e77fc9..6459d8d 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -39,7 +39,7 @@
 #define HtmlDivEnd          QCString("</div>")
 
 
-class TranslatorPersian : public Translator
+class TranslatorPersian : public TranslatorAdapter_1_7_5
 {
   private:
   	/** Converts english digits of an input string to persian equivalents.
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 01a8025..bbcca74 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -1972,6 +1972,17 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
       return "Aucune correspondance";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3
+//////////////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trCiteReferences()
+    { return "Bibliographie"; }
+
 };
 
 #endif
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 5fc4ba3..63ee61d 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -26,7 +26,7 @@
 #ifndef TRANSLATOR_GR_H
 #define TRANSLATOR_GR_H
 
-class TranslatorGreek : public Translator
+class TranslatorGreek : public TranslatorAdapter_1_7_5
 {
   protected:
     friend class TranslatorAdapterBase;
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 6056b09..47e0e08 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -81,7 +81,7 @@
 #ifndef TRANSLATOR_HR_H
 #define TRANSLATOR_HR_H
 
-class TranslatorCroatian : public Translator
+class TranslatorCroatian : public TranslatorAdapter_1_7_5
 {
   private:
   
diff --git a/src/translator_it.h b/src/translator_it.h
index 04a7f55..cf8db94 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -84,7 +84,7 @@
 #ifndef TRANSLATOR_IT_H
 #define TRANSLATOR_IT_H
 
-class TranslatorItalian : public Translator
+class TranslatorItalian : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 8bffa4c..3b8ea72 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -18,7 +18,7 @@
 #ifndef TRANSLATOR_NL_H
 #define TRANSLATOR_NL_H
 
-class TranslatorDutch : public Translator
+class TranslatorDutch : public TranslatorAdapter_1_7_5
 {
   public:
     QCString idLanguage()
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 31e1f0f..922845a 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -26,7 +26,7 @@
 #ifndef TRANSLATOR_RU_H
 #define TRANSLATOR_RU_H
 
-class TranslatorRussian : public Translator
+class TranslatorRussian : public TranslatorAdapter_1_7_5
 {
   public:
     /*! Used for identification of the language. */
diff --git a/src/translator_sk.h b/src/translator_sk.h
index 6496fd6..675963e 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -28,7 +28,7 @@
 #ifndef TRANSLATOR_SK_H
 #define TRANSLATOR_SK_H
 
-class TranslatorSlovak : public Translator
+class TranslatorSlovak : public TranslatorAdapter_1_7_5
 {
   public:
     // --- Language control methods -------------------
diff --git a/src/translator_tr.h b/src/translator_tr.h
index 178a44b..cf74639 100644
--- a/src/translator_tr.h
+++ b/src/translator_tr.h
@@ -40,7 +40,7 @@
  Translator class (by the local maintainer) when the localized
  translator is made up-to-date again.
 */
-class TranslatorTurkish : public Translator
+class TranslatorTurkish : public TranslatorAdapter_1_7_5
 {
   public:
 
diff --git a/src/translatordecoder.h b/src/translatordecoder.h
index a9df3d6..90f01fa 100644
--- a/src/translatordecoder.h
+++ b/src/translatordecoder.h
@@ -738,6 +738,16 @@ class TranslatorDecoder : public Translator
                                              hour,minutes,seconds,includeTime)); 
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    QCString trCiteReferences()
+    { return toUtf8(m_translator->trCiteReferences()); }
+    QCString trCopyright()
+    { return toUtf8(m_translator->trCopyright()); }
+    QCString trDirDepGraph(const char *name)
+    { return toUtf8(m_translator->trDirDepGraph(fromUtf8(name))); }
 
 //////////////////////////////////////////////////////////////////////////
   private:
diff --git a/src/util.cpp b/src/util.cpp
index 3621f50..12399cc 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -7030,3 +7030,32 @@ QCString replaceColorMarkers(const char *str)
   return result;
 }
 
+bool copyFile(const QCString &src,const QCString &dest)
+{
+  QFile sf(src);
+  if (sf.open(IO_ReadOnly))
+  {
+    QFileInfo fi(src);
+    QFile df(dest);
+    if (df.open(IO_WriteOnly))
+    {
+      char *buffer = new char[fi.size()];
+      sf.readBlock(buffer,fi.size());
+      df.writeBlock(buffer,fi.size());
+      df.flush();
+      delete[] buffer;
+    }
+    else
+    {
+      err("error: could not write to file %s\n",dest.data());
+      return FALSE;
+    }
+  }
+  else
+  {
+    err("error: could not open user specified file %s\n",src.data());
+    return FALSE;
+  }
+  return TRUE;
+}
+
diff --git a/src/util.h b/src/util.h
index 0336ab0..a6c1d76 100644
--- a/src/util.h
+++ b/src/util.h
@@ -402,6 +402,7 @@ struct ColoredImgDataItem
 
 void writeColoredImgData(const char *dir,ColoredImgDataItem data[]);
 QCString replaceColorMarkers(const char *str);
+bool copyFile(const QCString &src,const QCString &dest);
 
 #endif
 
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l
index 2d3288b..a6966cd 100644
--- a/src/vhdlscanner.l
+++ b/src/vhdlscanner.l
@@ -207,7 +207,7 @@ static void deleteSpecChars(char* str,char *buf)
   {
     if ((*str == '\t') || (*str == '\n') || (*str == '\r') || (*str == ' ')) 
     {
-      *str++;
+      str++;
     }
     else
     {
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index 2698c01..cd6eba0 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -329,6 +329,14 @@ void XmlDocVisitor::visit(DocSimpleSectSep *)
   m_t << "<simplesectsep/>";
 }
 
+void XmlDocVisitor::visit(DocCite *cite)
+{
+  if (m_hide) return;
+  if (!cite->file().isEmpty()) startLink(cite->ref(),cite->file(),cite->anchor());
+  filter(cite->text());
+  if (!cite->file().isEmpty()) endLink();
+}
+
 //--------------------------------------
 // visitor functions for compound nodes
 //--------------------------------------
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
index 8f31c42..7d2ab4b 100644
--- a/src/xmldocvisitor.h
+++ b/src/xmldocvisitor.h
@@ -52,6 +52,7 @@ class XmlDocVisitor : public DocVisitor
     void visit(DocFormula *);
     void visit(DocIndexEntry *);
     void visit(DocSimpleSectSep *);
+    void visit(DocCite *);
 
     //--------------------------------------
     // visitor functions for compound nodes
diff --git a/winbuild/Doxygen.vcproj b/winbuild/Doxygen.vcproj
index 26cb2d2..f8340f7 100644
--- a/winbuild/Doxygen.vcproj
+++ b/winbuild/Doxygen.vcproj
@@ -252,6 +252,10 @@
 				</FileConfiguration>
 			</File>
 			<File
+				RelativePath="..\src\cite.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\src\classdef.cpp"
 				>
 				<FileConfiguration
@@ -2003,6 +2007,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\cite.h"
+				>
+			</File>
+			<File
 				RelativePath="..\src\classdef.h"
 				>
 			</File>
@@ -2103,6 +2111,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\doxygen_bst.h"
+				>
+			</File>
+			<File
 				RelativePath="..\src\doxygen_css.h"
 				>
 			</File>
@@ -2275,6 +2287,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\navtree_css.h"
+				>
+			</File>
+			<File
+				RelativePath="..\src\navtree_js.h"
+				>
+			</File>
+			<File
 				RelativePath="..\src\objcache.h"
 				>
 			</File>
-- 
cgit v0.12

