From f89f62167124ab7e92eba22942a3fd812bea9e01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?=
 <mickael.remond@process-one.net>
Date: Mon, 28 Nov 2005 10:55:45 +0000
Subject: Documentation update

SVN Revision: 445
---
 doc/guide.tex | 1822 ++++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 1218 insertions(+), 604 deletions(-)

(limited to 'doc/guide.tex')

diff --git a/doc/guide.tex b/doc/guide.tex
index de5f8ede0..61965b82d 100644
--- a/doc/guide.tex
+++ b/doc/guide.tex
@@ -1,19 +1,27 @@
 \documentclass[a4paper,10pt]{article}
 
+%% Packages
+\usepackage{float}
 \usepackage{graphics}
 \usepackage{hevea}
+\usepackage[pdftex,colorlinks,unicode,urlcolor=blue,linkcolor=blue,
+        pdftitle=Ejabberd\ Installation\ and\ Operation\ Guide,pdfauthor=Alexey\
+        Shchepin,pdfsubject=ejabberd,pdfkeywords=ejabberd,
+        pdfpagelabels=false]{hyperref}
+\usepackage{makeidx}
+%\usepackage{showidx} % Only for verifying the index entries.
 \usepackage{verbatim}
+\usepackage{geometry}
 
-\usepackage[twosideshift=0pt]{geometry}
-
-\usepackage[pdftex,colorlinks,unicode,urlcolor=blue,linkcolor=blue,pdftitle=Ejabberd\
-        Installation\ and\ Operation\ Guide,pdfauthor=Alexey\
-        Shchepin,pdfsubject=ejabberd,pdfkeywords=ejabberd]{hyperref}
+%% Index
+\makeindex
+% Remove the index anchors from the HTML version to save size and bandwith.
+\newcommand{\ind}[1]{\begin{latexonly}\index{#1}\end{latexonly}}
 
+%% Images
 \newcommand{\logoscale}{0.7}
 \newcommand{\imgscale}{0.58}
 \newcommand{\insimg}[1]{\insscaleimg{\imgscale}{#1}}
-
 \newcommand{\insscaleimg}[2]{
   \imgsrc{#2}{}
   \begin{latexonly}
@@ -21,8 +29,9 @@
   \end{latexonly}
 }
 
+%% Various
 \newcommand{\bracehack}{\def\{{\char"7B}\def\}{\char"7D}}
-
+\newcommand{\titem}[1]{\item[\bracehack\texttt{#1}]}
 \newcommand{\ns}[1]{\texttt{#1}}
 \newcommand{\jid}[1]{\texttt{#1}}
 \newcommand{\option}[1]{\texttt{#1}}
@@ -33,6 +42,7 @@
 \newcommand{\ejabberd}{\texttt{ejabberd}}
 \newcommand{\Jabber}{Jabber}
 
+%% Modules
 \newcommand{\module}[1]{\texttt{#1}}
 \newcommand{\modannounce}{\module{mod\_announce}}
 \newcommand{\modconfigure}{\module{mod\_configure}}
@@ -54,140 +64,128 @@
 \newcommand{\modvcard}{\module{mod\_vcard}}
 \newcommand{\modversion}{\module{mod\_version}}
 
-\newcommand{\titem}[1]{\item[\bracehack\texttt{#1}]}
+%% Common options
+\newcommand{\iqdiscitem}[1]{\titem{iqdisc} \ind{options!iqdisc}This specifies 
+the processing discipline for #1 IQ queries
+(see section~\ref{sec:modiqdiscoption}).}
+\newcommand{\hostitem}[1]{
+  \titem{hosts} \ind{options!hosts} This option defines the hostnames of the
+  service (see section~\ref{sec:modhostsoption}). If neither \texttt{hosts} nor
+  the old \texttt{host} is present, the prefix ``\jid{#1.}'' is added to all
+  \ejabberd{} hostnames.
+}
+
+%% Title page
+\include{version}
+\title{Ejabberd \version\ Installation and Operation Guide}
+\author{Alexey Shchepin \\
+  \ahrefurl{mailto:alexey@sevcom.net} \\
+  \ahrefurl{xmpp:aleksey@jabber.ru}}
 
-%\setcounter{tocdepth}{3}
+%% Options
+\newcommand{\marking}[1]{#1} % Marking disabled
+\newcommand{\quoting}[2][yozhik]{} % Quotes disabled
+\newcommand{\new}{\begin{latexonly}\marginpar{\textsc{new}}\end{latexonly}} % Highlight new features
+\newcommand{\improved}{\begin{latexonly}\marginpar{\textsc{improved}}\end{latexonly}} % Highlight improved features
+\newcommand{\moreinfo}[1]{} % Hide details
+
+%% Footnotes
 \begin{latexonly}
 \global\parskip=9pt plus 3pt minus 1pt
 \global\parindent=0pt
-
 \gdef\ahrefurl#1{\href{#1}{\texttt{#1}}}
 \gdef\footahref#1#2{#2\footnote{\href{#1}{\texttt{#1}}}}
 \end{latexonly}
-
 \newcommand{\tjepref}[2]{\footahref{http://www.jabber.org/jeps/jep-#1.html}{#2}}
 \newcommand{\jepref}[1]{\tjepref{#1}{JEP-#1}}
 
-\newcommand{\iqdiscitem}[1]{\titem{iqdisc} #1 IQ queries processing
-discipline (see~\ref{sec:modiqdiscoption}).}
-\newcommand{\hostitem}[1]{
-  \titem{host} Defines hostname of the service
-  (see~\ref{sec:modhostoption}).
-  \titem{hosts} Defines hostnames of the service
-  (see~\ref{sec:modhostsoption}).  If neither \texttt{host} nor \texttt{hosts}
-  are not present, then prefix \jid{#1.} is added to all \ejabberd{} hostnames.
-}
-
-\title{Ejabberd Installation and Operation Guide}
-\author{Alexey Shchepin \\
-  \ahrefurl{mailto:alexey@sevcom.net} \\
-  \ahrefurl{xmpp:aleksey@jabber.ru}}
-\date{July 31, 2005}
-
 \begin{document}
+
+\label{sec:titlepage}
 \begin{titlepage}
   \maketitle{}
-  
-  {\centering
-    \insscaleimg{\logoscale}{logo.png}
+
+  \begin{center}
+  {\insscaleimg{\logoscale}{logo.png}
     \par
   }
-\end{titlepage}
-%\newpage
-\tableofcontents{}
+  \end{center}
 
-\newpage
-\section{Introduction}
-\label{sec:intro}
+  \begin{quotation}\textit{I can thoroughly recommend ejabberd for ease of setup --
+  Kevin Smith, Current maintainer of the Psi project}\end{quotation}
 
-\ejabberd{} is a Free and Open Source fault-tolerant distributed \Jabber{}
-server.  It is written mostly in Erlang.
+\end{titlepage}
 
-The main features of \ejabberd{} are:
-\begin{itemize}
-\item Works on most of popular platforms: *nix (tested on Linux, FreeBSD and
-  NetBSD) and Win32
-\item Distributed: You can run \ejabberd{} on a cluster of machines to let all of
-  them serve one Jabber domain.
-\item Fault-tolerance: You can setup an \ejabberd{} cluster so that all the
-  information required for a properly working service will be stored
-  permanently on more than one node.  This means that if one of the nodes
-  crashes, then the others will continue working without disruption.
-  You can also add or replace nodes ``on the fly''.
-\item Support for virtual hosting
-\item Built-in \tjepref{0045}{Multi-User Chat} service
-\item Built-in IRC transport
-\item Built-in \tjepref{0060}{Publish-Subscribe} service
-\item Built-in Jabber Users Directory service based on users vCards
-\item Built-in web-based administration interface
-\item Built-in \tjepref{0025}{HTTP Polling} service
-\item SSL support
-\item Support for LDAP authentication
-\item Ability to interface with external components (JIT, MSN-t, Yahoo-t, etc.)
-\item Migration from jabberd14 is possible
-\item Mostly XMPP-compliant
-\item Support for \tjepref{0030}{Service Discovery}.
-\item Support for \tjepref{0039}{Statistics Gathering}.
-\item Support for \ns{xml:lang}
-\end{itemize}
+% Set the page counter to 2 so that the titlepage and the second page do not
+% have the same page number. This fixes the PDFLaTeX warning "destination with
+% the same identifier".
+\begin{latexonly}
+\setcounter{page}{2}
+\end{latexonly}
 
-The misfeatures of \ejabberd{} are:
-\begin{itemize}
-\item No support for authentication and STARTTLS in S2S connections
-\end{itemize}
+\tableofcontents{}
 
+% Input introduction.tex
+\input{introduction}
 
 \section{Installation from Source}
 \label{sec:installation}
+\ind{installation}
 
 \subsection{Installation Requirements}
 \label{sec:installreq}
 
-\subsubsection{Unix}
+\subsubsection{``Unix-like'' operating systems}
 \label{sec:installrequnix}
+\ind{installation!requirements for ``Unix-like'' operating systems}
 
-To compile \ejabberd{}, you will need the following packages:
+To compile \ejabberd{} on a ``Unix-like'' operating system, you need:
 \begin{itemize}
 \item GNU Make;
 \item GCC;
-\item libexpat 1.95 or later;
-\item Erlang/OTP R8B or later;
-\item OpenSSL 0.9.6 or later (optional).
+\item libexpat 1.95 or higher;
+\item Erlang/OTP R8B or higher;
+\item OpenSSL 0.9.6 or higher (optional).
 \end{itemize}
 
 \subsubsection{Windows}
 \label{sec:installreqwin}
+\ind{installation!requirements for Windows}
 
-To compile \ejabberd{} in MS Windows environment, you will need the following
-packages:
+To compile \ejabberd{} on a Windows flavour, you need:
 \begin{itemize}
 \item MS Visual C++ 6.0 Compiler
-\item \footahref{http://erlang.org/download/otp\_win32\_R10B-1a.exe}{Erlang/OTP R10B-1a}
-\item \footahref{http://prdownloads.sourceforge.net/expat/expat\_win32bin\_1\_95\_7.exe?download}{Expat 1.95.7}
+\item \footahref{http://erlang.org/download.html}{Erlang/OTP R8B or higher}
+\item \footahref{http://sourceforge.net/project/showfiles.php?group\_id=10127\&package\_id=11277}{Expat 1.95.7 or higher}
 \item
-\footahref{http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.1.tar.gz}{Iconv 1.9.1}
+\footahref{http://www.gnu.org/software/libiconv/}{Iconv 1.9.1}
 (optional)
 \item \footahref{http://www.slproweb.com/products/Win32OpenSSL.html}{Shining Light OpenSSL}
 (to enable SSL connections)
 \end{itemize}
 
-
-\subsection{Obtaining}
+\subsection{Obtaining \ejabberd{}}
 \label{sec:obtaining}
 
-Stable \ejabberd{} release can be obtained at
+\ind{download}
+Released versions of \ejabberd{} can be obtained from \\
 \ahrefurl{http://www.process-one.net/en/projects/ejabberd/download.html}.
 
-The latest alpha version can be retrieved from Subversion repository\@.
+\ind{Subversion repository}
+The latest development version can be retrieved from the Subversion repository\@.
 \begin{verbatim}
-  svn co svn://svn.process-one.net/opt/data/svn/ejabberd/trunk ejabberd
+  svn co http://svn.process-one.net/ejabberd/trunk ejabberd
 \end{verbatim}
 
-
 \subsection{Compilation}
 \label{sec:compilation}
-\subsubsection{Unix}
+\ind{compilation}
+
+\subsubsection{``Unix-like'' operating systems}
 \label{sec:compilationunix}
+\ind{compilation!on ``Unix-like'' operating systems}
+
+Compile \ejabberd{} on a ``Unix-like'' operating system by executing:
 
 \begin{verbatim}
   ./configure
@@ -196,50 +194,53 @@ The latest alpha version can be retrieved from Subversion repository\@.
   make install
 \end{verbatim}
 
-This will install \ejabberd{} to \verb|/var/lib/ejabberd| directory,
-\verb|ejabberd.cfg| to \verb|/etc/ejabberd| directory and create
-\verb|/var/log/ejabberd| directory for log files.
+These commands will:
+\begin{itemize}
+\item install \ejabberd{} into the directory \verb|/var/lib/ejabberd|,
+\item install the configuration file into \verb|/etc/ejabberd|,
+\item create a directory called \verb|/var/log/ejabberd| to store log files.
+\end{itemize}
 
 \subsubsection{Windows}
 \label{sec:compilationwin}
+\ind{compilation!on Windows}
 
 \begin{itemize}
 \item Install Erlang emulator (for example, into \verb|C:\Program Files\erl5.3|).
 \item Install Expat library into \verb|C:\Program Files\Expat-1.95.7|
   directory.
-  
+
   Copy file \verb|C:\Program Files\Expat-1.95.7\Libs\libexpat.dll|
   to your Windows system directory (for example, \verb|C:\WINNT| or
   \verb|C:\WINNT\System32|)
-\item Build and install Iconv library into \verb|C:\Program Files\iconv-1.9.1| directory.
-  
+\item Build and install the Iconv library into the directory
+  \verb|C:\Program Files\iconv-1.9.1|.
+
   Copy file \verb|C:\Program Files\iconv-1.9.1\bin\iconv.dll| to your
-  Windows system directory.
-  
-  Note: Instead of copying libexpat.dll and iconv.dll to Windows
-  directory, you can add directories
+  Windows system directory (more installation instructions can be found in the
+  file README.woe32 in the iconv distribution).
+
+  Note: instead of copying libexpat.dll and iconv.dll to the Windows
+  directory, you can add the directories
   \verb|C:\Program Files\Expat-1.95.7\Libs| and
-  \verb|C:\Program Files\iconv-1.9.1\bin| to \verb|PATH| environment
+  \verb|C:\Program Files\iconv-1.9.1\bin| to the \verb|PATH| environment
   variable.
-\item Being in \verb|ejabberd\src| directory run:
+\item While in the directory \verb|ejabberd\src| run:
 \begin{verbatim}
 configure.bat
 nmake -f Makefile.win32
 \end{verbatim}
-\item Edit file \verb|ejabberd\src\ejabberd.cfg| and run
+\item Edit the file \verb|ejabberd\src\ejabberd.cfg| and run
 \begin{verbatim}
 werl -s ejabberd -name ejabberd
 \end{verbatim}
 \end{itemize}
 
-%\subsection{Initial Configuration}
-%\label{sec:initconfig}
-
-
 \subsection{Starting}
 \label{sec:starting}
+\ind{starting}
 
-To start \ejabberd{}, use the following command:
+Execute the following command to start \ejabberd{}:
 \begin{verbatim}
   erl -pa /var/lib/ejabberd/ebin -name ejabberd -s ejabberd
 \end{verbatim}
@@ -247,15 +248,16 @@ or
 \begin{verbatim}
   erl -pa /var/lib/ejabberd/ebin -sname ejabberd -s ejabberd
 \end{verbatim}
-In the latter case Erlang node will be identified using only first part of host
-name, i.\,e. other Erlang nodes outside this domain can't contact this node.
+In the latter case the Erlang node will be identified using only the first part
+of the host name, i.\,e. other Erlang nodes outside this domain can't contact
+this node.
 
-Note that when using above command \ejabberd{} will search for config file
-in current directory and will use current directory for storing user database
-and logging.
+Note that when using the above command, \ejabberd{} will search for the
+configuration file in the current directory and will use the current directory
+for storing its user database and for logging.
 
-To specify path to config file, log files and Mnesia database directory,
-you may use the following command:
+To specify the path to the configuration file, the log files and the Mnesia
+database directory, you may use the following command:
 \begin{verbatim}
   erl -pa /var/lib/ejabberd/ebin \
       -sname ejabberd \
@@ -266,17 +268,18 @@ you may use the following command:
       -mnesia dir \"/var/lib/ejabberd/spool\"
 \end{verbatim}
 
-You can find other useful options in Erlang manual page (\shell{erl -man erl}).
+You can find other useful options in the Erlang manual page
+(\shell{erl -man erl}).
 
-To use more than 1024 connections, you should set environment variable
+To use more than 1024 connections, you should set the environment variable
 \verb|ERL_MAX_PORTS|:
 \begin{verbatim}
   export ERL_MAX_PORTS=32000
 \end{verbatim}
-Note that with this value \ejabberd{} will use more memory (approximately 6MB
+Note that with this value, \ejabberd{} will use more memory (approximately 6\,MB
 more).
 
-To reduce memory usage, you may set environment variable
+To reduce memory usage, you may set the environment variable
 \verb|ERL_FULLSWEEP_AFTER|:
 \begin{verbatim}
   export ERL_FULLSWEEP_AFTER=0
@@ -289,138 +292,153 @@ But in this case \ejabberd{} can start to work slower.
 
 \subsection{Initial Configuration}
 \label{sec:initconfig}
+\ind{configuration file}
 
-The configuration file is initially loaded the first time \ejabberd{} is
-executed, when it is parsed and stored in a database.  Subsequently the
-configuration is loaded from the database and any commands in the configuration
-file are appended to the entries in the database.  The configuration file
-consists of a sequence of Erlang terms. Parts of lines after \term{`\%'} sign
-are ignored.  Each term is tuple, where first element is name of option, and
-other are option values. E.\,g.\ if this file does not contain a ``host''
-definition, then old value stored in the database will be used.
+The configuration file will be loaded the first time you start \ejabberd{}. The
+content from this file will be parsed and stored in a database. Subsequently the
+configuration will be loaded from the database and any commands in the
+configuration file are appended to the entries in the database. The
+configuration file contains a sequence of Erlang terms. Lines beginning with a
+\term{`\%'} sign are ignored. Each term is a tuple of which the first element is
+the name of an option, and any further elements are that option's values. If the
+configuration file do not contain for instance the ``hosts'' option, the old
+host name(s) stored in the database will be used.
 
 
-To override old values stored in the database the following lines can be added
-in config:
+You can override the old values stored in the database by adding next lines to
+the configuration file:
 \begin{verbatim}
   override_global.
   override_local.
   override_acls.
 \end{verbatim}
-With this lines old global or local options or ACLs will be removed before
-adding new ones.
-
+With these lines the old global options, local options and ACLs will be removed
+before new ones are added.
 
 \subsubsection{Host Names}
 \label{sec:confighostname}
+\ind{options!hosts}\ind{host names}
 
-Option \option{hosts} defines a list of \Jabber{} domains that \ejabberd{}
-serves.  E.\,g.\ to serve \jid{example.org} and \jid{example.com} domains add
-the following line in the config:
-\begin{verbatim}
-  {hosts, ["example.org", "example.com"]}.
-\end{verbatim}
+The option \option{hosts} defines a list containing one or more domains that
+\ejabberd{} will serve.
 
-Option \option{host} defines one \Jabber{} domain that \ejabberd{} serves.
-E.\,g.\ to serve only \jid{example.org} domain add the following line in the
-config:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item Serving one domain:
+\begin{itemize}
+\item \begin{verbatim}
+  {hosts, ["example.org"]}.
+\end{verbatim}
+\item Backwards compatibility with older \ejabberd{} versions can be retained
+  with:
+  \begin{verbatim}
   {host, "example.org"}.
 \end{verbatim}
-It have the same effect as
+\end{itemize}
+\item Serving two domains:
 \begin{verbatim}
-  {hosts, ["example.org"]}.
+  {hosts, ["one.org", "two.org"]}.
 \end{verbatim}
-
-%This option is mandatory.
+\end{itemize}
 
 \subsubsection{Default Language}
 \label{sec:configlanguage}
+\ind{options!language}\ind{language}
+
+The option \option{language} defines the default language of server strings that
+can be seen by \Jabber{} clients. If a \Jabber{} client do not support
+\option{xml:lang}, the specified language is used. The default value for the
+option \option{language} is \term{"en"}. In order to take effect there must be a
+translation file \term{<language>.msg} in \ejabberd{}'s \term{msgs} directory.
 
-Option \option{language} defines default language of \ejabberd{} messages, sent
-to users. Default value is \term{"en"}. In order to take effect there must be a
-translation file \term{<language>.msg} in \ejabberd{} \term{msgs} directory.
-E.\,g.\ to use Russian as default language add the following line in the config:
+Examples:
+\begin{itemize}
+\item To set Russian as default language:
 \begin{verbatim}
   {language, "ru"}.
 \end{verbatim}
-
+\item To set Spanish as default language:
+\begin{verbatim}
+  {language, "es"}.
+\end{verbatim}
+\end{itemize}
 
 \subsubsection{Access Rules}
 \label{sec:configaccess}
+\ind{options!acl}\ind{access rules}\ind{ACL}\ind{Access Control List}
 
-Access control in \ejabberd{} is performed via Access Control Lists (ACL).  The
-declarations of ACL in config file have following syntax:
+Access control in \ejabberd{} is performed via Access Control Lists (ACLs). The
+declarations of ACLs in the configuration file have the following syntax:
 \begin{verbatim}
   {acl, <aclname>, {<acltype>, ...}}.
 \end{verbatim}
 
-\term{<acltype>} can be one of following:
+\term{<acltype>} can be one of the following:
 \begin{description}
-\titem{all} Matches all JIDs.  Example:
+\titem{all} Matches all JIDs. Example:
 \begin{verbatim}
 {acl, all, all}.
 \end{verbatim}
-\titem{\{user, <username>\}} Matches user with name
-  \term{<username>} at the first virtual host.  Example:
+\titem{\{user, <username>\}} Matches the user with the name
+  \term{<username>} at the first virtual host. Example:
 \begin{verbatim}
-{acl, admin, {user, "aleksey"}}.
+{acl, admin, {user, "yozhik"}}.
 \end{verbatim}
-\titem{\{user, <username>, <server>\}} Matches user with JID
-  \term{<username>@<server>} and any resource.  Example:
+\titem{\{user, <username>, <server>\}} Matches the user with the JID
+  \term{<username>@<server>} and any resource. Example:
 \begin{verbatim}
-{acl, admin, {user, "aleksey", "jabber.ru"}}.
+{acl, admin, {user, "yozhik", "example.org"}}.
 \end{verbatim}
 \titem{\{server, <server>\}} Matches any JID from server
-  \term{<server>}.  Example:
+  \term{<server>}. Example:
 \begin{verbatim}
-{acl, jabberorg, {server, "jabber.org"}}.
+{acl, exampleorg, {server, "example.org"}}.
 \end{verbatim}
-\titem{\{user\_regexp, <regexp>\}} Matches local user with name that
-  matches \term{<regexp>} at the first virtual host.  Example:
+\titem{\{user\_regexp, <regexp>\}} Matches any local user with a name that
+  matches \term{<regexp>} at the first virtual host. Example:
 \begin{verbatim}
 {acl, tests, {user, "^test[0-9]*$"}}.
 \end{verbatim}
 %$
-\titem{\{user\_regexp, <regexp>, <server>\}} Matches user with name
-  that matches \term{<regexp>} and from server \term{<server>}.  Example:
+\titem{\{user\_regexp, <regexp>, <server>\}} Matches any user with a name
+  that matches \term{<regexp>} at server \term{<server>}. Example:
 \begin{verbatim}
 {acl, tests, {user, "^test", "example.org"}}.
 \end{verbatim}
-\titem{\{server\_regexp, <regexp>\}} Matches any JID from server that
-  matches \term{<regexp>}.  Example:
+\titem{\{server\_regexp, <regexp>\}} Matches any JID from the server that
+  matches \term{<regexp>}. Example:
 \begin{verbatim}
 {acl, icq, {server, "^icq\\."}}.
 \end{verbatim}
-\titem{\{node\_regexp, <user\_regexp>, <server\_regexp>\}} Matches user
-  with name that matches \term{<user\_regexp>} and from server that matches
-  \term{<server\_regexp>}.  Example:
+\titem{\{node\_regexp, <user\_regexp>, <server\_regexp>\}} Matches any user
+  with a name that matches \term{<user\_regexp>} at any server that matches
+  \term{<server\_regexp>}. Example:
 \begin{verbatim}
-{acl, aleksey, {node_regexp, "^aleksey$", "^jabber.(ru|org)$"}}.
+{acl, yohzik, {node_regexp, "^yohzik$", "^example.(com|org)$"}}.
 \end{verbatim}
 \titem{\{user\_glob, <glob>\}}
 \titem{\{user\_glob, <glob>, <server>\}}
 \titem{\{server\_glob, <glob>\}}
-\titem{\{node\_glob, <user\_glob>, <server\_glob>\}} This is same as
-  above, but uses shell glob patterns instead of regexp.  These patterns can
-  have following special characters:
+\titem{\{node\_glob, <user\_glob>, <server\_glob>\}} This is the same as
+  above. However, it uses shell glob patterns instead of regexp. These patterns
+  can have the following special characters:
   \begin{description}
   \titem{*} matches any string including the null string.
   \titem{?} matches any single character.
-  \titem{[...]} matches any of the enclosed characters.  Character
+  \titem{[...]} matches any of the enclosed characters. Character
     ranges are specified by a pair of characters separated by a \term{`-'}.
-    If the first character after \term{`['} is a \term{`!'}, then any
+    If the first character after \term{`['} is a \term{`!'}, any
     character not enclosed is matched.
   \end{description}
 \end{description}
 
 The following ACLs are pre-defined:
 \begin{description}
-\titem{all} Matches all JIDs.
-\titem{none} Matches none JIDs.
+\titem{all} Matches any JID.
+\titem{none} Matches no JID.
 \end{description}
 
-An entry allowing or denying access to different services would look similar to
+An entry allowing or denying access to different services looks similar to
 this:
 \begin{verbatim}
   {access, <accessname>, [{allow, <aclname>},
@@ -429,9 +447,9 @@ this:
                          ]}.
 \end{verbatim}
 When a JID is checked to have access to \term{<accessname>}, the server
-sequentially checks if this JID mathes one of the ACLs that are second elements
-in each tuple in list.  If it is matched, then the first element of matched
-tuple is returned else ``\term{deny}'' is returned.
+sequentially checks if that JID mathes any of the ACLs that are named in the
+second elements of the tuples in the list. If it matches, the first element of
+the first matched tuple is returned, otherwise ``\term{deny}'' is returned.
 
 Example:
 \begin{verbatim}
@@ -440,118 +458,161 @@ Example:
                        {allow, all}]}.
 \end{verbatim}
 
-Following access rules pre-defined:
+The following access rules are pre-defined:
 \begin{description}
 \titem{all} Always returns ``\term{allow}''
 \titem{none} Always returns ``\term{deny}''
 \end{description}
 
-
-\subsubsection{Shapers Configuration}
+\subsubsection{Shapers}
 \label{sec:configshaper}
+\ind{options!shaper}\ind{options!maxrate}\ind{shapers}\ind{maxrate}\ind{traffic speed}
 
-With shapers is possible to bound connection traffic.  The declarations of
-shapers in config file have following syntax:
+Shapers enable you to limit connection traffic. The syntax of
+shapers is like this:
 \begin{verbatim}
   {shaper, <shapername>, <kind>}.
 \end{verbatim}
-Currently implemented only one kind of shaper: \term{maxrate}.  It have
+Currently only one kind of shaper called \term{maxrate} is available. It has the
 following syntax:
 \begin{verbatim}
   {maxrate, <rate>}
 \end{verbatim}
-where \term{<rate>} means maximum allowed incomig rate in bytes/second.
-E.\,g.\ to define shaper with name ``\term{normal}'' and maximum allowed rate
-1000\,bytes/s, add following line in config:
+where \term{<rate>} stands for the maximum allowed incomig rate in bytes per
+second.
+
+Examples:
+\begin{itemize}
+\item To define a shaper named ``\term{normal}'' with traffic speed limited to
+1,000\,bytes/second:
 \begin{verbatim}
   {shaper, normal, {maxrate, 1000}}.
 \end{verbatim}
-
+\item To define a shaper named ``\term{fast}'' with traffic speed limited to
+50,000\,bytes/second:
+\begin{verbatim}
+  {shaper, fast, {maxrate, 50000}}.
+\end{verbatim}
+\end{itemize}
 
 \subsubsection{Listened Sockets}
 \label{sec:configlistened}
+\ind{options!listen}
 
-Option \option{listen} defines list of listened sockets and what services
-runned on them.  Each element of list is a tuple with following elements:
+The option \option{listen} defines for which addresses and ports \ejabberd{}
+will listen and what services will be run on them. Each element of the list is a
+tuple with the following elements:
 \begin{itemize}
-\item Port number;
-\item Module that serves this port;
+\item Port number.
+\item Module that serves this port.
 \item Options to this module.
 \end{itemize}
 
-Currently these modules are implemented:
-\begin{description}
-  \titem{ejabberd\_c2s} This module serves C2S connections.
-  
-  The following options are defined:
-  \begin{description}
-    \titem{\{access, <access rule>\}} This option defines access of users
-    to this C2S port.  Default value is ``\term{all}''.
-    \titem{\{shaper, <access rule>\}} This option is like previous, but
-    use shapers instead of ``\term{allow}'' and ``\term{deny}''.  Default
-    value is ``\term{none}''.
-    \titem{\{ip, IPAddress\}} This option specifies which network interface to
-    listen on. For example \verb|{ip, {192, 168, 1, 1}}|.
-    \titem{inet6} Set up the socket for IPv6.
-    \titem{starttls} This option specifies that STARTTLS extension is available
-    on connections to this port.  You should also set ``\verb|certfile|''
-    option.
-    \titem{tls} This option specifies that traffic on this port will be
-    encrypted using SSL immediately after connecting.  You should also set
-    ``\verb|certfile|'' option.
-    \titem{ssl} This option specifies that traffic on this port will be
-    encrypted using SSL.  You should also set ``\verb|certfile|'' option.  It
-    is recommended to use \term{tls} option instead.
-    \titem{\{certfile, Path\}} Path to a file containing the SSL certificate.
-  \end{description}
-  \titem{ejabberd\_s2s\_in} This module serves incoming S2S connections.
-  \titem{ejabberd\_service} This module serves connections from \Jabber{}
-  services (i.\,e.\ that use the \ns{jabber:component:accept} namespace).
-  
-  The following additional options are defined for \term{ejabberd\_service}
-  (options \option{access}, \option{shaper}, \option{ip}, \option{inet6} are
-  still valid):
-  \begin{description}
-    \titem{\{host, Hostname, [HostOptions]\}} This option defines hostname of connected
-    service and allows to specify additional options, e.\,g.\
-    \poption{\{password, Secret\}}.
-    \titem{\{hosts, [Hostnames], [HostOptions]\}} The same as above, but allows to
-    specify several hostnames.
-  \end{description}
-  \titem{ejabberd\_http} This module serves incoming HTTP connections.
+\ind{modules!ejabberd\_c2s}\ind{modules!ejabberd\_s2s\_in}\ind{modules!ejabberd\_service}\ind{modules!ejabberd\_http}\ind{protocols!JEP-0114: Jabber Component Protocol}
+Currently next modules are implemented:
+\begin{table}[H]
+  \centering
+  \begin{tabular}{|l|l|l|l|l|}
+  \hline \texttt{ejabberd\_c2s}& Description& Handles c2s connections.\\
+    \cline{2-3} & Options& \texttt{access}, \texttt{certfile}, \texttt{inet6},
+    \texttt{ip}, \texttt{shaper}, \texttt{ssl}, \texttt{tls},
+    \texttt{starttls},\\
+    & &\texttt{starttls\_required}\\
+  \hline \texttt{ejabberd\_s2s\_in}& Description& Handles incoming s2s
+  connections.\\
+    \cline{2-3} & Options& \texttt{inet6}, \texttt{ip}\\
+  \hline \texttt{ejabberd\_service}& Description& Interacts with external
+  components (*).\\
+    \cline{2-3} & Options& \texttt{access}, \texttt{hosts}, \texttt{inet6},
+    \texttt{ip}, \texttt{shaper}\\
+  \hline \texttt{ejabberd\_http}& Description& Handles incoming HTTP
+  connections.\\
+    \cline{2-3} & Options& \texttt{certfile}, \texttt{http\_poll},
+    \texttt{inet6}, \texttt{ip}, \texttt{tls}, \texttt{web\_admin}\\
+  \hline
+  \end{tabular}
+\end{table}
 
-  The following options are defined:
-  \begin{description}
-    \titem{http\_poll} This option enables \jepref{0025} (HTTP Polling)
-    support.  It is available then at \verb|http://server:port/http-poll/|.
-    
-    \titem{web\_admin} This option enables web-based interface for \ejabberd{}
-    administration which is available at \verb|http://server:port/admin/|,
-    login and password should be equal to username and password of one of
-    registered users who have permission defined in ``configure'' access rule.
-  \end{description}
+(*) The mechanism for \footahref{http://ejabberd.jabber.ru/tutorials-transports}{external components} is defined in Jabber Component Protocol (\jepref{0114}).
+
+The following options are available:
+\begin{description}
+  \titem{\{access, <access rule>\}} \ind{options!access}This option defines
+    access to the port. The default value is ``\term{all}''.
+  \titem{\{certfile, Path\}} Path to a file containing the SSL certificate.
+  \titem{\{hosts, [Hostnames], [HostOptions]\}} \ind{options!hosts}This option
+    defines one or more hostnames of connected services and enables you to
+    specify additional options including \poption{\{password, Secret\}}.
+  \titem{http\_poll} \ind{options!http\_poll}\ind{protocols!JEP-0025: HTTP Polling}\ind{JWChat}\ind{web-based Jabber client}
+    This option enables HTTP Polling (\jepref{0025}) support. HTTP Polling
+    enables access via HTTP requests to \ejabberd{} from behind firewalls which
+    do not allow outgoing sockets on port 5222.
+
+    If HTTP Polling is enabled, it will be available at
+    \verb|http://server:port/http-poll/|. Be aware that support for HTTP Polling
+    is also needed in the \Jabber{} client. Remark also that HTTP Polling can be
+    interesting to host a web-based \Jabber{} client such as
+    \footahref{http://jwchat.sourceforge.net/}{JWChat} (there is a tutorial to
+    \footahref{http://ejabberd.jabber.ru/jwchat}{install JWChat} with
+    instructions for \ejabberd{}).
+  \titem{inet6} \ind{options!inet6}\ind{IPv6}Set up the socket for IPv6.
+  \titem{\{ip, IPAddress\}} \ind{options!ip}This option specifies which network
+    interface to listen for. For example \verb|{ip, {192, 168, 1, 1}}|.
+  \titem{\{shaper, <access rule>\}} \ind{options!shaper}This option defines a
+    shaper for the port (see section~\ref{sec:configshaper}). The default value
+    is ``\term{none}''.
+  \titem{ssl} \ind{options!ssl}\ind{SSL}This option specifies that traffic on
+    the port will be encrypted using SSL. You should also set the
+    \option{certfile} option. It is recommended to use the \term{tls} option
+    instead.
+  \titem{starttls} \ind{options!starttls}\ind{modules!STARTTLS}This option
+    specifies that STARTTLS encryption is available on connections to the port.
+    You should also set the \option{certfile} option.
+  \titem{starttls\_required} \ind{options!starttls\_required}This option
+    specifies that STARTTLS encryption is required on connections to the port.
+    No unencrypted connections will be allowed. You should also set the
+    \option{certfile} option.
+  \titem{tls} \ind{options!tls}\ind{TLS}This option specifies that traffic on
+    the port will be encrypted using SSL immediately after connecting. You
+    should also set the \option{certfile} option.
+  \titem{web\_admin} \ind{options!web\_admin}\ind{web interface}This option
+    enables the web interface for \ejabberd{} administration which is available
+    at \verb|http://server:port/admin/|. Login and password are the username and
+    password of one of the registered users who are granted access by the
+    ``configure'' access rule.
 \end{description}
 
-For example, the following configuration defines that:
+For instance, the following configuration defines that:
 \begin{itemize}
-\item C2S connections are listened on port 5222 and 5223 (SSL) and denied for
-  user ``\term{bad}''
-\item S2S connections are listened on port 5269
-\item HTTP connections are listened on port 5280 and administration interface
-  and HTTP Polling support are enabled
-\item All users except admins have traffic limit 1000\,B/s
-\item AIM transport \jid{aim.example.org} is connected to port 5233 with
-  password ``\term{aimsecret}''
-\item JIT transports \jid{icq.example.org} and \jid{sms.example.org} are
-  connected to port 5234 with password ``\term{jitsecret}''
-\item MSN transport \jid{msn.example.org} is connected to port 5235 with
-  password ``\term{msnsecret}''
-\item Yahoo! transport \jid{yahoo.example.org} is connected to port 5236 with
-  password ``\term{yahoosecret}''
-\item Gadu-Gadu transport \jid{gg.example.org} is connected to port 5237 with
-  password ``\term{ggsecret}''
-\item ILE service \jid{ile.example.org} is connected to port 5238 with
-  password ``\term{ilesecret}''
+\item c2s connections are listened for on port 5222 and 5223 (SSL) and denied
+  for the user ``\term{bad}''
+\item s2s connections are listened for on port 5269
+\item Port 5280 is serving the web interface and the HTTP Polling service. Note
+  that it is also possible to serve them on different ports. The second
+  example in section~\ref{sec:webadm} shows how exactly this can be done.
+\item All users except for the administrators have a traffic of limit 
+  1,000\,Bytes/second
+\item \ind{transports!AIM}The
+  \footahref{http://ejabberd.jabber.ru/pyaimt}{AIM transport}
+  \jid{aim.example.org} is connected to port 5233 with password
+  ``\term{aimsecret}''
+\item \ind{transports!ICQ}The ICQ transport JIT (\jid{icq.example.org} and
+  \jid{sms.example.org}) is connected to port 5234 with password
+  ``\term{jitsecret}''
+\item \ind{transports!MSN}The
+  \footahref{http://ejabberd.jabber.ru/pymsnt}{MSN transport}
+  \jid{msn.example.org} is connected to port 5235 with password
+  ``\term{msnsecret}''
+\item \ind{transports!Yahoo}The
+  \footahref{http://ejabberd.jabber.ru/yahoo-transport-2}{Yahoo! transport}
+  \jid{yahoo.example.org} is connected to port 5236 with password
+  ``\term{yahoosecret}''
+\item \ind{transports!Gadu-Gadu}The \footahref{http://ejabberd.jabber.ru/jabber-gg-transport}{Gadu-Gadu transport} \jid{gg.example.org} is
+  connected to port 5237 with password ``\term{ggsecret}''
+\item \ind{transports!email notifier}The
+  \footahref{http://ejabberd.jabber.ru/jmc}{Jabber Mail Component}
+  \jid{jmc.example.org} is connected to port 5238 with password
+  ``\term{jmcsecret}''
 \end{itemize}
 \begin{verbatim}
   {acl, blocked, {user, "bad"}}.
@@ -576,13 +637,13 @@ For example, the following configuration defines that:
                                [{password, "yahoosecret"}]}]},
     {5237, ejabberd_service, [{host, "gg.example.org",
                                [{password, "ggsecret"}]}]},
-    {5238, ejabberd_service, [{host, "ile.example.org",
-                               [{password, "ilesecret"}]}]}
+    {5238, ejabberd_service, [{host, "jmc.example.org",
+                               [{password, "jmcsecret"}]}]}
    ]
   }.
 \end{verbatim}
-Note, that for jabberd14- or wpjabberd-based services you have to make the
-transports log and do XDB by themselves:
+Note, that for \ind{jabberd 1.4}jabberd 1.4- or \ind{WPJabber}WPJabber-based
+services you have to make the transports log and do \ind{XDB}XDB by themselves:
 \begin{verbatim}
   <!--
      You have to add elogger and rlogger entries here when using ejabberd.
@@ -598,8 +659,8 @@ transports log and do XDB by themselves:
 
   <!--
      Some Jabber server implementations do not provide
-     XDB services (for example jabberd 2.0 and ejabberd).
-     xdb_file_so is loaded in to handle all XDB requests.
+     XDB services (for example, jabberd2 and ejabberd).
+     xdb_file.so is loaded in to handle all XDB requests.
   -->
 
   <xdb id="xdb">
@@ -614,16 +675,17 @@ transports log and do XDB by themselves:
   </xdb>
 \end{verbatim}
 
-
 \subsubsection{Modules}
 \label{sec:configmodules}
+\ind{modules}
 
-Option \term{modules} defines the list of modules that will be loaded after
-\ejabberd{} startup.  Each list element is a tuple where first element is a
-name of a module and second is list of options to this module.  See
-section~\ref{sec:modules} for detailed information on each module.
+The option \term{modules} defines the list of modules that will be loaded after
+\ejabberd{} startup. Each entry in the list is a tuple in which the first
+element is the name of a module and the second is a list of options for that
+module. Read section~\ref{sec:modules} for detailed information about each
+module.
 
-Example:
+Example:\ind{modules!overview}
 \begin{verbatim}
   {modules,
    [{mod_register,  []},
@@ -635,7 +697,7 @@ Example:
     {mod_vcard,     []},
     {mod_offline,   []},
     {mod_announce,  [{access, announce}]},
-    {mod_echo,      [{host, "echo.example.org"}]},
+    {mod_echo,      [{hosts, ["echo.example.org"]}]},
     {mod_private,   []},
     {mod_irc,       []},
     {mod_muc,       []},
@@ -646,266 +708,415 @@ Example:
    ]}.
 \end{verbatim}
 
-
-\subsubsection{Virtual Host Configuration}
+\subsubsection{Virtual Hosting}
 \label{sec:configvirtualhost}
+\ind{virtual hosting}\ind{virtual hosts}
 
-Options can be defined separately for different virtual hosts using
-\term{host\_config} option.  It have the have following syntax:
+Options can be defined separately for every virtual host using the
+\term{host\_config} option.\ind{options!host\_config} It has the following
+syntax:
 \begin{verbatim}
   {host_config, <hostname>, [<option>, <option>, ...]}.
 \end{verbatim}
 
-Example:
+Examples:
+\begin{itemize}
+\item Domain \jid{one.org} is using the internal authentication method while
+  domain \jid{two.org} is using the \ind{LDAP}LDAP server running on the domain
+  \jid{localhost} to perform authentication:
 \begin{verbatim}
-{host_config, "example.org", [{auth_method, internal}]}.
+{host_config, "one.org", [{auth_method, internal}]}.
 
-{host_config, "example.com", [{auth_method, ldap},
+{host_config, "two.org", [{auth_method, ldap},
                               {ldap_servers, ["localhost"]},
                               {ldap_uidattr, "uid"},
                               {ldap_rootdn, "dc=localdomain"},
                               {ldap_rootdn, "dc=example,dc=com"},
                               {ldap_password, ""}]}.
 \end{verbatim}
+\item Domain \jid{one.org} is using \ind{ODBC}ODBC to perform authentication
+  while domain \jid{two.org} is using the LDAP servers running on the domains
+  \jid{localhost} and \jid{otherhost}:
+\begin{verbatim}
+{host_config, "one.org", [{auth_method, odbc},
+                              {odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}]}.
+
+{host_config, "two.org", [{auth_method, ldap},
+                              {ldap_servers, ["localhost", "otherhost"]},
+                              {ldap_uidattr, "uid"},
+                              {ldap_rootdn, "dc=localdomain"},
+                              {ldap_rootdn, "dc=example,dc=com"},
+                              {ldap_password, ""}]}.
+\end{verbatim}
+\end{itemize}
 
+\subsection{Creating an Initial Administrator}
+\label{sec:initialadmin}
 
+Before the web interface can be entered to perform administration tasks, an
+account with administrator rights is needed on your \ejabberd{} deployment.
+
+Instructions to create an initial administrator account:
+\begin{enumerate}
+\item Register an account on your \ejabberd{} deployment. An account can be
+  created in two ways:
+  \begin{enumerate}
+  \item Using the tool \term{ejabberdctl}\ind{ejabberdctl} (see
+    section~\ref{sec:ejabberdctl}):
+    \begin{verbatim}
+% ejabberdctl node@host register admin example.org password
+\end{verbatim} 
+  \item Using In-Band Registration (see section~\ref{sec:modregister}): you can
+    use a \Jabber{} client to register an account.
+  \end{enumerate}
+\item Edit the configuration file to promote the account created in the previous
+  step to an account with administrator rights. Note that if you want to add
+  more administrators, a seperate acl entry is needed for each administrator.
+  \begin{verbatim}
+  {acl, admins, {user, "admin", "example.org"}}.
+  {access, configure, [{allow, admins}]}.
+\end{verbatim} 
+\item Restart \ejabberd{} to load the new configuration.
+\item Open the web interface (\verb|http://server:port/admin/|) in your
+  favourite browser. Make sure to enter the \emph{full} JID as username (in this
+  example: \jid{admin@example.org}. The reason that you also need to enter the
+  suffix, is because \ejabberd{}'s virtual hosting support.
+\end{enumerate}
 
 \subsection{Online Configuration and Monitoring}
 \label{sec:onlineconfig}
 
-\subsubsection{Web-based Administration Interface}
+\subsubsection{Web Interface}
 \label{sec:webadm}
+\ind{web interface}
 
-To perform online reconfiguration of \ejabberd{} you need to enable
-\term{ejabberd\_http} listener with option \term{web\_admin} (see
-section~\ref{sec:configlistened}).  After that you can open URL
-\verb|http://server:port/admin/| with you favorite web-browser and enter
-username and password of an \ejabberd{} user with administrator rights.  E.\,g.
-with such config:
-\begin{verbatim}
+To perform online configuration of \ejabberd{} you need to enable the
+\term{ejabberd\_http} listener with the option \term{web\_admin} (see
+section~\ref{sec:configlistened}). Then you can open 
+\verb|http://server:port/admin/| in your favourite web browser. You
+will be asked to enter the username (the \emph{full} \Jabber{} ID) and password
+of an \ejabberd{} user with administrator rights. After authentication
+you will see a page similar to figure~\ref{fig:webadmmain}.
+
+\begin{figure}[htbp]
+  \centering
+  \insimg{webadmmain.png}
+  \caption{Top page from the web interface}
+  \label{fig:webadmmain}
+\end{figure}
+Here you can edit access restrictions, manage users, create backups,
+manage the database, enable/disable ports listened for, view server
+statistics,\ldots
+
+Examples:
+\begin{itemize}
+\item You can serve the web interface on the same port as the
+  \ind{protocols!JEP-0025: HTTP Polling}HTTP Polling interface. In this example
+  you should point your web browser to \verb|http://example.org:5280/admin/| to
+  administer all virtual hosts or to
+  \verb|http://example.org:5280/admin/server/two.org/| to administer only the
+  virtual host \jid{two.org}. Before you get access to the web interface you
+  need to enter as username, the JID and password from a registered user that is
+  allowed to configure \ejabberd{}. In this example you can enter as username
+ ``\jid{admin@one.org}'' to administer all virtual hosts (first URL). If you
+  log in with ``\jid{admin@two.org}'' on \\
+  \verb|http://example.org:5280/admin/server/two.org/| you can only administer
+  the virtual host \jid{two.org}.
+  \begin{verbatim}
   ...
-  {host, "example.org"}.
+  {acl, admins, {user, "admin", "one.org"}}.
+  {host_config, "two.org", [{acl, admins, {user, "admin", "two.org"}}]}.
+  {access, configure, [{allow, admins}]}.
+  ...
+  {hosts, ["example.org"]}.
   ...
   {listen,
    [...
-    {5280, ejabberd_http, [web_admin]},
+    {5280, ejabberd_http, [http_poll, web_admin]},
     ...
    ]
   }.
 \end{verbatim}
-you should enter URL \verb|http://example.org:5280/admin/|.  After
-authentication you should see something like in figure~\ref{fig:webadmmain}.
-\begin{figure}[htbp]
-  \centering
-  \insimg{webadmmain.png}
-  \caption{Web-administration top page}
-  \label{fig:webadmmain}
-\end{figure}
-Here you can edit access restrictions, manage users, create backup files,
-manage DB, enable/disable listened ports, and view statistics.
-
+\item For security reasons, you can serve the web interface on a secured
+  connection, on a port differing from the HTTP Polling interface, and bind it
+  to the internal LAN IP. The web interface will be accessible by pointing your
+  web browser to \verb|https://192.168.1.1:5280/admin/|:
+  \begin{verbatim}
+  ...
+  {hosts, ["example.org"]}.
+  ...
+  {listen,
+   [...
+    {5270, ejabberd_http,    [http_poll]},
+    {5280, ejabberd_http,    [web_admin, {ip, {192, 168, 1, 1}},
+                              tls, {certfile, "/usr/local/etc/server.pem"}]},
+    ...
+   ]
+  }.
+\end{verbatim}
+\end{itemize}
 
-\subsubsection{\term{ejabberdctl} tool}
+\subsubsection{\term{ejabberdctl}}
 \label{sec:ejabberdctl}
 
-It is possible to do some administration operations using \term{ejabberdctl}
-command-line tool.  You can check available options running this command
-without arguments:
+It is possible to do some administration operations using the command
+line tool \term{ejabberdctl}. You can list all available options by
+running \term{ejabberdctl} without arguments:
 \begin{verbatim}
 % ejabberdctl
 Usage: ejabberdctl node command
 
 Available commands:
+  status                        get ejabberd status
   stop                          stop ejabberd
   restart                       restart ejabberd
   reopen-log                    reopen log file
-  register user password        register a user
-  unregister user               unregister a user
-  backup file                   store a database backup in file
+  register user server password register a user
+  unregister user server        unregister a user
+  backup file                   store a database backup to file
   restore file                  restore a database backup from file
   install-fallback file         install a database fallback from file
-  dump file                     dump a database in a text file
+  dump file                     dump a database to a text file
   load file                     restore a database from a text file
+  import-file file              import user data from jabberd 1.4 spool file
+  import-dir dir                import user data from jabberd 1.4 spool directory
   registered-users              list all registered users
+  delete-expired-messages       delete expired offline messages from database
 
 Example:
   ejabberdctl ejabberd@host restart
 \end{verbatim}
 
+Additional information:
+\begin{description}
+\titem{reopen-log } If you use a tool to rotate logs, you have to configure it
+  so that this command is executed after each rotation.
+\titem {backup, restore, install-fallback, dump, load} You can use these
+  commands to create and restore backups. 
+%%More information about backuping can
+%%  be found in section~\ref{sec:backup}.
+\titem{import-file, import-dir} \ind{migration!from jabberd 1.4}\ind{migration!from jabberd2}
+  These options can be used to migrate from other \Jabber{}/XMPP servers. There
+  exist tutorials to \footahref{http://ejabberd.jabber.ru/jabberd1-to-ejabberd}{migrate from jabberd 1.4}
+  and to \footahref{http://ejabberd.jabber.ru/jabberd2-to-ejabberd}{migrate from jabberd2}.
+\titem{delete-expired-messages} This option can be used to delete old messages
+  in offline storage. This might be useful when the number of offline messages
+  is very high.
+\end{description}
+
+
+\section{Firewall Settings}
+\label{sec:firewall}
+\ind{firewall}\ind{ports}\ind{SASL}\ind{TLS}\ind{clustering!ports}
+
+You need to take the following ports in mind when configuring your firewall:
+\begin{table}[H]
+  \centering
+  \begin{tabular}{|l|l|}
+    \hline Port& Description\\
+    \hline \hline 5222& SASL and unencrypted c2s connections.\\
+    \hline 5223& Obsolete SSL c2s connections.\\
+    \hline 5269& s2s connections.\\
+    \hline 4369& Only for clustering (see~\ref{sec:clustering}).\\
+    \hline port range& Only for clustring (see~\ref{sec:clustering}). This range
+    is configurable (see~\ref{sec:starting}).\\
+    \hline
+  \end{tabular}
+\end{table}
+
+
+\section{SRV Records}
+\label{sec:srv}
+\ind{SRV Records}\ind{clustering!SRV Records}
+
+\begin{itemize}
+\item General information:
+  \footahref{http://en.wikipedia.org/wiki/SRV\_record}{SRV record}
+\item Practical information:
+  \footahref{http://jabberd.jabberstudio.org/2/docs/section05.html\#5\_7}{Setting DNS SRV Records}
+\end{itemize}
 
 
 \section{Clustering}
 \label{sec:clustering}
+\ind{clustering}
 
-
-\subsection{How it works}
+\subsection{How it Works}
 \label{sec:howitworks}
+\ind{clustering!how it works}
 
-A \Jabber{} domain is served by one or more \ejabberd{} nodes.  These nodes can
-be runned on different machines that are connected via a network.  They all
+A \Jabber{} domain is served by one or more \ejabberd{} nodes. These nodes can
+be run on different machines that are connected via a network. They all
 must have the ability to connect to port 4369 of all another nodes, and must
 have the same magic cookie (see Erlang/OTP documentation, in other words the
 file \term{\~{}ejabberd/.erlang.cookie} must be the same on all nodes). This is
-needed because all nodes exchange information about connected users, S2S
+needed because all nodes exchange information about connected users, s2s
 connections, registered services, etc\ldots
 
-Each \ejabberd{} node have following modules:
+Each \ejabberd{} node has the following modules:
 \begin{itemize}
-\item router;
-\item local router.
-\item session manager;
-\item S2S manager;
+\item router,
+\item local router,
+\item session manager,
+\item s2s manager.
 \end{itemize}
 
-
 \subsubsection{Router}
+\ind{clustering!router}
 
-This module is the main router of \Jabber{} packets on each node.  It
-routes them based on their destinations domains.  It uses a global
-routing table.  A domain of packet destination is searched in the
-routing table, and if it is found, then the packet is routed to
-appropriate process.  If no, then it is sent to the S2S manager.
-
+This module is the main router of \Jabber{} packets on each node. It
+routes them based on their destination's domains. It uses a global
+routing table. The domain of the packet's destination is searched in the
+routing table, and if it is found, the packet is routed to the
+appropriate process. If not, it is sent to the s2s manager.
 
 \subsubsection{Local Router}
+\ind{clustering!local router}
 
 This module routes packets which have a destination domain equal to
-this server name.  If destination JID has a non-empty user part, then
-it is routed to the session manager, else it is processed depending on
-its content.
-
+one of this server's host names. If the destination JID has a non-empty user
+part, it is routed to the session manager, otherwise it is processed depending
+on its content.
 
 \subsubsection{Session Manager}
+\ind{clustering!session manager}
 
-This module routes packets to local users.  It searches to what user
-resource a packet must be sent via a presence table.  Then packet is
-either routed to appropriate C2S process, or stored in offline
+This module routes packets to local users. It looks up to which user
+resource a packet must be sent via a presence table. Then the packet is
+either routed to the appropriate c2s process, or stored in offline
 storage, or bounced back.
 
+\subsubsection{s2s Manager}
+\ind{clustering!s2s manager}
 
-\subsubsection{S2S Manager}
-
-This module routes packets to other \Jabber{} servers.  First, it
-checks if an opened S2S connection from the domain of the packet
-source to the domain of packet destination is existing.  If it is
-existing, then the S2S manager routes the packet to the process
-serving this connection, else a new connection is opened.
+This module routes packets to other \Jabber{} servers. First, it
+checks if an opened s2s connection from the domain of the packet's
+source to the domain of the packet's destination exists. If that is the case,
+the s2s manager routes the packet to the process
+serving this connection, otherwise a new connection is opened.
 
-
-\subsection{How to setup ejabberd cluster}
+\subsection{Clustering Setup}
 \label{sec:cluster}
+\ind{clustering!setup}
 
-Suppose you already setuped ejabberd on one of machines (\term{first}), and
-you need to setup another one to make \ejabberd{} cluster.  Then do
+Suppose you already configured \ejabberd{} on one machine named (\term{first}),
+and you need to setup another one to make an \ejabberd{} cluster. Then do
 following steps:
 
 \begin{enumerate}
 \item Copy \verb|~ejabberd/.erlang.cookie| file from \term{first} to
   \term{second}.
-  
+
   (alt) You can also add ``\verb|-cookie content_of_.erlang.cookie|''
   option to all ``\shell{erl}'' commands below.
-  
-\item On \term{second} run under `\term{ejabberd}' user in a directory
-  where ejabberd will work later the following command:
+
+\item On \term{second} run as the `\term{ejabberd}' user in the directory
+  where \ejabberd{} will work later the following command:
 
 \begin{verbatim}
 erl -sname ejabberd \
     -mnesia extra_db_nodes "['ejabberd@first']" \
     -s mnesia
 \end{verbatim}
-  
-  This will start mnesia serving same DB as \node{ejabberd@first}.
-  You can check this running ``\verb|mnesia:info().|'' command.  You
+
+  This will start Mnesia serving the same database as \node{ejabberd@first}.
+  You can check this by running the command ``\verb|mnesia:info().|''. You
   should see a lot of remote tables and a line like the following:
 
 \begin{verbatim}
 running db nodes   = [ejabberd@first, ejabberd@second]
 \end{verbatim}
 
-  
+
 \item Now run the following in the same ``\shell{erl}'' session:
 
 \begin{verbatim}
 mnesia:change_table_copy_type(schema, node(), disc_copies).
 \end{verbatim}
 
-  This will create local disc storage for DB.
-  
+  This will create local disc storage for the database.
+
   (alt) Change storage type of `\term{scheme}' table to ``RAM and disc
-  copy'' on second node via web interface.
+  copy'' on the second node via the web interface.
+
 
-  
 \item Now you can add replicas of various tables to this node with
   ``\verb|mnesia:add_table_copy|'' or
   ``\verb|mnesia:change_table_copy_type|'' as above (just replace
   ``\verb|schema|'' with another table name and ``\verb|disc_copies|''
   can be replaced with ``\verb|ram_copies|'' or
   ``\verb|disc_only_copies|'').
-  
-  What tables to replicate is very depend on your needs, you can get
-  some hints from ``\verb|mnesia:info().|'' command, by looking at
-  size of tables and default storage type for each table on 'first'.
-  
-  Replicating of table makes lookup in this table faster on this node,
-  but writing will be slower.  And of course if machine with one of
-  replicas is down, other replicas will be used.
-  
-  Also section 5.3 (Table Fragmentation) of
-  \footahref{http://www.erlang.se/doc/doc-5.4/lib/mnesia-4.2/doc/html/index.html}
-  {Mnesia Reference Manual} can be useful.
-  
+
+  Which tables to replicate is very dependant on your needs, you can get
+  some hints from the command ``\verb|mnesia:info().|'', by looking at the
+  size of tables and the default storage type for each table on 'first'.
+
+  Replicating a table makes lookups in this table faster on this node.
+  Writing, on the other hand, will be slower. And of course if machine with one
+  of the replicas is down, other replicas will be used.
+
+  Also \footahref{http://www.erlang.se/doc/doc-5.4.9/lib/mnesia-4.2.2/doc/html/Mnesia\_chap5.html\#5.3}
+  {section 5.3 (Table Fragmentation) of Mnesia User's Guide} can be helpful.
+  % The above URL needs update every Erlang release!
+
   (alt) Same as in previous item, but for other tables.
 
-  
+
 \item Run ``\verb|init:stop().|'' or just ``\verb|q().|'' to exit from
-  erlang shell.  This probably can take some time if mnesia is not yet
-  transfer and process all data it needed from \term{first}.
+  the Erlang shell. This probably can take some time if Mnesia has not yet
+  transfered and processed all data it needed from \term{first}.
 
-  
-\item Now run ejabberd on \term{second} with almost the same config as
+
+\item Now run \ejabberd{} on \term{second} with almost the same config as
   on \term{first} (you probably don't need to duplicate ``\verb|acl|''
   and ``\verb|access|'' options --- they will be taken from
   \term{first}, and \verb|mod_muc| and \verb|mod_irc| should be
-  enabled only on one machine in cluster).
+  enabled only on one machine in the cluster).
 \end{enumerate}
 
 You can repeat these steps for other machines supposed to serve this
 domain.
 
+% TODO
+% See also the section about ejabberdctl!!!!
+%\section{Backup and Restore}
+%\label{sec:backup}
+%\ind{backup}
 
 \appendix{}
 
 \section{Built-in Modules}
 \label{sec:modules}
+\ind{modules}
 
 \subsection{Common Options}
 \label{sec:modcommonopts}
 
-The following options are used by many modules, so they are described in
-separate section.
+The following options are used by many modules. Therefore, they are described in
+this separate section.
 
 \subsubsection{\option{iqdisc}}
 \label{sec:modiqdiscoption}
+\ind{options!iqdisc}
 
 Many modules define handlers for processing IQ queries of different namespaces
-to this server or to user (e.\,g.\ to \jid{example.org} or to
-\jid{user@example.org}).  This option defines processing discipline of
-these queries.  Possible values are:
+to this server or to a user (e.\,g.\ to \jid{example.org} or to
+\jid{user@example.org}). This option defines processing discipline for
+these queries. Possible values are:
 \begin{description}
-\titem{no\_queue} All queries of namespace with this processing
-  discipline processed immediately.  This also means that no other packets can
-  be processed until finished this.  Hence this discipline is not recommended
-  if processing of query can take relatively long time.
-\titem{one\_queue} In this case created separate queue for processing
-  of IQ queries of namespace with this discipline, and processing of this queue
-  is done in parallel with processing of other packets. This discipline is most
-  recommended.
-\titem{parallel} In this case for all packets with this discipline
-  spawned separate Erlang process, so all these packets processed in parallel.
-  Although spawning of Erlang process have relatively low cost, this can broke
-  server normal work, because Erlang emulator have limit on number of processes
-  (32000 by default).
+\titem{no\_queue} All queries of a namespace with this processing discipline are
+  processed immediately. This also means that no other packets can be processed
+  until this one has been completely processed. Hence this discipline is not
+  recommended if the processing of a query can take a relatively long time.
+\titem{one\_queue} In this case a separate queue is created for the processing
+  of IQ queries of a namespace with this discipline. In addition, the processing
+  of this queue is done in parallel with that of other packets. This discipline
+  is most recommended.
+\titem{parallel} For every packet with this discipline a separate Erlang process
+  is spawned. Consequently, all these packets are processed in parallel.
+  Although spawning of Erlang process has a relatively low cost, this can break
+  the server's normal work, because the Erlang emulator has a limit on the
+  number of processes (32000 by default).
 \end{description}
 
 Example:
@@ -918,13 +1129,29 @@ Example:
    ]}.
 \end{verbatim}
 
-\subsubsection{\option{host}}
-\label{sec:modhostoption}
+\subsubsection{\option{hosts}}
+\label{sec:modhostsoption}
+\ind{options!hosts}
 
-This option explicitly defines hostname for the module which acts as a service.
+A module acting as a service can have one or more hostnames. These hostnames
+can be defined with the \option{hosts} option.
 
-Example:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item Serving the \ind{modules!\modecho{}}echo module on one domain:
+  \begin{itemize}
+  \item
+    \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_echo, [{hosts, ["echo.example.org"]}]},
+    ...
+   ]}.
+\end{verbatim}
+  \item Backwards compatibility with older ejabberd versions can be retained
+    with:
+    \begin{verbatim}
   {modules,
    [
     ...
@@ -932,63 +1159,61 @@ Example:
     ...
    ]}.
 \end{verbatim}
-
-\subsubsection{\option{hosts}}
-\label{sec:modhostsoption}
-
-This option explicitly defines a list of hostnames for the module which acts as
-a service.
-
-Example:
-\begin{verbatim}
+  \end{itemize}
+  \item Serving the echo module on tho domains:
+    \begin{verbatim}
   {modules,
    [
     ...
-    {mod_echo, [{hosts, ["echo.example.org", "echo.example.com"]}]},
+    {mod_echo, [{hosts, ["echo.one.org", "echo.two.org"]}]},
     ...
    ]}.
 \end{verbatim}
-
+\end{itemize}
 
 \subsection{\modannounce{}}
 \label{sec:modannounce}
-
-This module adds support for broadcast announce messages and MOTD.
-When the module is loaded, it handles messages sent to the following JID's
-(suppose that main server has address \jid{example.org}):
+\ind{modules!\modannounce{}}\ind{MOTD}\ind{message of the day}\ind{announcements}
+
+This module enables configured users to broadcast announcements and to set
+the message of the day (MOTD). Configured users can do these actions with their
+\Jabber{} client by sending messages to specific JIDs. These JIDs are listed in
+next paragraph. The first JID in each entry will apply only to the virtual host
+\jid{example.org}, while the JID between brackets will apply to all virtual
+hosts:
 \begin{description}
-\titem{example.org/announce/all} Message is sent to all registered users at
-\jid{example.org}.  If the user is online and connected to several resources,
-only resource with the highest priority will receive the message.  If the
-registered user is not connected, the message will be stored offline (if
-oflline storage is available).
-\titem{example.org/announce/online} Message is sent to all connected users at
-\jid{example.org}.  If the user is online and connected to several resources,
-all resources will receive the message.
-\titem{example.org/announce/all-hosts/online} Message is sent to all connected
-users at every virtual host.  If the user is online and connected to several
-resources, all resources will receive the message.
-\titem{example.org/announce/motd} Message is set as MOTD (Message of the Day)
-and is sent to users at \jid{example.org} as they login.  In addition the
-message is sent to all connected users (similar to \term{announce/online}
-resource).
-\titem{example.org/announce/motd/update} Message is set as MOTD (Message of the
-Day) and is sent to users at \jid{example.org} as they login.  The message
-is \emph{not sent} to all connected users.
-\titem{example.org/announce/motd/delete} Any message sent to this JID
-removes existing MOTD.
+\titem{example.org/announce/all (example.org/announce/all-hosts/all)} The
+  message is sent to all registered users. If the user is online and connected
+  to several resources, only the resource with the highest priority will receive
+  the message. If the registered user is not connected, the message will be
+  stored offline in assumption that \ind{modules!\modoffline{}}offline storage
+  (see section~\ref{sec:modoffline}) is enabled.
+\titem{example.org/announce/online (example.org/announce/all-hosts/online)}The
+  message is sent to all connected users. If the user is online and connected
+  to several resources, all resources will receive the message.
+\titem{example.org/announce/motd (example.org/announce/all-hosts/motd)}The
+  message is set as the message of the day (MOTD) and is sent to users when they
+  login. In addition the message is sent to all connected users (similar to
+  \term{announce/online}).
+\titem{example.org/announce/motd/update (example.org/announce/all-hosts/motd/update)}
+  The message is set as message of the day (MOTD) and is sent to users when they
+  login. The message is \emph{not sent} to any currently connected user.
+\titem{example.org/announce/motd/delete (example.org/announce/all-hosts/motd/delete)}
+  Any message sent to this JID removes the existing message of the day (MOTD).
 \end{description}
 
 Options:
 \begin{description}
-\titem{access} Specifies who is allowed to send announce messages
-and set MOTD (default value is \term{none}).
+\titem{access} \ind{options!access}This option specifies who is allowed to
+  send announcements and to set the message of the day (by default, nobody is
+  able to send such messages).
 \end{description}
 
-Example:
-\begin{verbatim}
-  % Only admins can send announcement messages:
-  {access, announce, [{allow, admin}]}.
+Examples:
+\begin{itemize}
+\item Only administrators can send announcements:
+  \begin{verbatim}
+  {access, announce, [{allow, admins}]}.
 
   {modules,
    [
@@ -997,67 +1222,146 @@ Example:
     ...
    ]}.
 \end{verbatim}
-
-
-\subsection{\modconfigure{}}
-\label{sec:modconfigure}
-
-Options:
-\begin{description}
-\iqdiscitem{\ns{ejabberd:config}}
-\end{description}
-
+\item Administrators as well as the direction can send announcements:
+  \begin{verbatim}
+  {acl, direction, {user, "big_boss", "example.org"}}.
+  {acl, direction, {user, "assistant", "example.org"}}.
+  {acl, admins, {user, "admin", "example.org"}}.
+  ...
+  {access, announce, [{allow, admins},
+                      {allow, direction}]}.
+  ...
+  {modules,
+   [
+    ...
+    {mod_announce, [{access, announce}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\moddisco{}}
 \label{sec:moddisco}
+\ind{modules!\moddisco{}}\ind{protocols!JEP-0030: Service Discovery}\ind{protocols!JEP-0011: Jabber Browsing}\ind{protocols!JEP-0094: Agent Information}
 
-This module adds support for \jepref{0030} (Service Discovery).
+This module adds support for Service Discovery (\jepref{0030}). With
+this module enabled, services on your server can be discovered by
+\Jabber{} clients. Note that \ejabberd{} has no modules with support
+for the superseded Jabber Browsing (\jepref{0011}) and Agent Information
+(\jepref{0094}). Accordingly, \Jabber{} clients need to have support for
+the newer Service Discovery protocol if you want them be able to discover
+the services you offer.
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{http://jabber.org/protocol/disco\#items} and
-  \ns{http://jabber.org/protocol/disco\#info}}
-\titem{extra\_domains} List of domains that will be added to server
-  items reply
+\iqdiscitem{Service Discovery (\ns{http://jabber.org/protocol/disco\#items} and
+  \ns{http://jabber.org/protocol/disco\#info})}
+\titem{extra\_domains} \ind{options!extra\_domains}With this option,
+  extra domains can be added to the Service Discovery item list.
 \end{description}
 
-Example:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item To serve a link to the Jabber User Directory on \jid{jabber.org}:
+  \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_disco, [{extra_domains, ["users.jabber.org"]}]},
+    ...
+   ]}.
+\end{verbatim}
+\item To serve a link to the transports on another server:
+  \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_disco, [{extra_domains, ["icq.example.com",
+                                  "msn.example.com"]}]},
+    ...
+   ]}.
+\end{verbatim}
+\item To serve a link to a few friendly servers:
+  \begin{verbatim}
   {modules,
    [
     ...
-    {mod_disco, [{extra_domains, ["jit.example.com",
-                                  "etc.example.com"]}]},
+    {mod_disco, [{extra_domains, ["example.org",
+                                  "example.com"]}]},
     ...
    ]}.
 \end{verbatim}
+\end{itemize}
 
 
 \subsection{\modecho{}}
 \label{sec:modecho}
+\ind{modules!\modecho{}}\ind{debugging}
 
-This module acts as a service and simply returns to sender any \Jabber{}
-packet.  Module may be useful for debugging.
+This module simply echoes any \Jabber{}
+packet back to the sender. This mirror can be of interest for
+\ejabberd{} and \Jabber{} client debugging.
 
 Options:
 \begin{description}
 \hostitem{echo}
 \end{description}
 
+Examples:
+\begin{itemize}
+\item Mirror, mirror, on the wall, who is the most beautiful
+  of them all?
+  \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_echo, [{hosts, ["mirror.example.org"]}]},
+    ...
+   ]}.
+\end{verbatim}
+\item If you still do not understand the inner workings of \modecho{},
+  you can find a few more examples in section~\ref{sec:modhostsoption}.
+\end{itemize}
 
 \subsection{\modirc{}}
 \label{sec:modirc}
+\ind{modules!\modirc{}}\ind{IRC}
 
-This module implements IRC transport.
+This module is an IRC transport that can be used to join channels on IRC
+servers.
+
+End user information:
+\ind{protocols!groupchat 1.0}\ind{protocols!JEP-0045: Multi-User Chat}
+\begin{itemize}
+\item A \Jabber{} client with ``groupchat 1.0'' support or Multi-User
+  Chat support (\jepref{0045}) is necessary to join IRC channels.
+\item An IRC channel can be joined in nearly the same way as joining a
+  \Jabber{} Multi-User Chat room. The difference is that the room name will
+  be ``channel\%\jid{irc.example.org}'' in case \jid{irc.example.org} is
+  the IRC server hosting ``channel''. And of course the host should point
+  to the IRC transport instead of the Multi-User Chat service.
+\item You can register your nickame by sending ``IDENTIFY password'' to \\
+  \jid{nickserver!irc.example.org@irc.jabberserver.org}.
+\item Entering your password is possible by sending ``LOGIN nick password'' \\
+  to \jid{nickserver!irc.example.org@irc.jabberserver.org}.
+\item When using a popular \Jabber{} server, it can occur that no
+  connection can be achieved with some IRC servers because they limit the
+  number of conections from one IP.
+\end{itemize}
 
 Options:
 \begin{description}
 \hostitem{irc}
-\titem{access} Specifies who is allowed to use IRC transport (default value is \term{all}).
+\titem{access} \ind{options!access}This option can be used to specify who
+  may use the IRC transport (default value: \term{all}).
 \end{description}
 
-Example:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item In the first example, the IRC transport is available on (all) your
+  virtual host(s) with the prefix ``\jid{irc.}''. Furthermore, anyone is
+  able to use the transport.
+  \begin{verbatim}
   {modules,
    [
     ...
@@ -1065,92 +1369,214 @@ Example:
     ...
    ]}.
 \end{verbatim}
-
+% bug in current svn!!: irc-transport.two.org will *not* show up in the service discovery items; instead you will see irc.two.org!!!!
+\item In next example the IRC transport is available on two virtual hosts
+  with different prefixes on each host. Moreover, the transport is only
+  accessible by paying customers registered on our domains and on other servers.
+  \begin{verbatim}
+  {acl, paying_customers, {user, "customer1", "one.org"}}.
+  {acl, paying_customers, {user, "customer2", "two.org"}}.
+  {acl, paying_customers, {user, "customer3", "example.org"}}.
+  ...
+  {access, paying_customers, [{allow, paying_customers},
+                              {deny, all}]}.
+  ...
+  {modules,
+   [
+    ...
+    {mod_irc, [{access, paying_customers},
+               {hosts, ["irc.one.org", "irc-transport.two.org"]}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modlast{}}
 \label{sec:modlast}
+\ind{modules!\modlast{}}\ind{protocols!JEP-0012: Last Activity}
 
-This module adds support for \jepref{0012} (Last Activity)
+This module adds support for Last Activity (\jepref{0012}). It can be used to
+discover when a disconnected user last accessed the server, to know when a
+connected user was last active on the server, or to query the uptime of the
+\ejabberd{} server.
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:last}}
+\iqdiscitem{Last activity (\ns{jabber:iq:last})}
 \end{description}
 
-
 \subsection{\modmuc{}}
 \label{sec:modmuc}
+\ind{modules!\modmuc{}}\ind{protocols!JEP-0045: Multi-User Chat}\ind{conferencing}
+
+With this module enabled, your server will support Multi-User Chat
+(\jepref{0045}). End users will be able to join text conferences. Notice
+that this module is not (yet) clusterable.
 
-This module implements \jepref{0045} (Multi-User Chat) service.
+
+Some of the features of Multi-User Chat:
+\begin{itemize}
+\item Sending private messages to room participants.
+\item Inviting users.
+\item Setting a conference topic.
+\item Creating password protected rooms.
+\item Kicking and banning participants.
+\end{itemize}
 
 Options:
 \begin{description}
 \hostitem{conference}
-\titem{access} Specifies who is allowed to use MUC service (default value is \term{all}).
-\titem{access\_create} Specifies who is allowed to create new rooms at
-  MUC service (default value is \term{all}).
-\titem{access\_admin} Specifies who is allowed to administrate MUC service
-(default value is \term{none}, which means that only creator may administer her room).
+\titem{access} \ind{options!access}You can specify who is allowed to use
+  the Multi-User Chat service (by default, everyone is allowed to use it).
+\titem{access\_create} \ind{options!access\_create}To configure who is
+  allowed to create new rooms at the Multi-User Chat service, this option
+  can be used (by default, everybody is allowed to create rooms).
+\titem{access\_admin} \ind{options!access\_admin}This option specifies
+  who is allowed to administrate the Multi-User Chat service (the default
+  value is \term{none}, which means that only the room creator can
+  administer his room).
 \end{description}
 
-Example:
-\begin{verbatim}
-  % Define admin ACL
-  {acl, admin, {user, "admin"}}
-
-  % Define MUC admin access rule
-  {access, muc_admin, [{allow, admin}]}
-
+Examples:
+\begin{itemize}
+\item In the first example everyone is allowed to use the Multi-User Chat
+  service. Everyone will also be able to create new rooms but only the user
+  \jid{admin@example.org} is allowed to administrate any room. In this
+  example he is also a global administrator.
+  \begin{verbatim}
+  {acl, admins, {user, "admin", "example.org"}}.
+  ...
+  {access, muc_admins, [{allow, admins}]}.
+  ...
   {modules,
    [
     ...
     {mod_muc, [{access, all},
                {access_create, all},
-               {access_admin, muc_admin}]},
+               {access_admin, muc_admins}]},
     ...
    ]}.
 \end{verbatim}
-
+\item In the second example the Multi-User Chat service is only accessible by
+  paying customers registered on our domains and on other servers. Of course
+  the administrator is also allowed to access rooms. In addition, he is the
+  only authority able to create and administer rooms.
+  \begin{verbatim}
+  {acl, paying_customers, {user, "customer1", "one.org"}}.
+  {acl, paying_customers, {user, "customer2", "two.org"}}.
+  {acl, paying_customers, {user, "customer3", "example.org"}}.
+  {acl, admins, {user, "admin", "example.org"}}.
+  ...
+  {access, muc_admins, [{allow, admins},
+                        {deny, all}]}.
+  {access, muc_access, [{allow, paying_customers},
+                        {allow, admins},
+                        {deny, all}]}.
+  ...
+  {modules,
+   [
+    ...
+    {mod_muc, [{access, muc_access},
+               {access_create, muc_admins},
+               {access_admin, muc_admins}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modoffline{}}
 \label{sec:modoffline}
+\ind{modules!\modoffline{}}
 
-This module implements offline message storage.
-
+This module implements offline message storage. This means that all messages
+sent to an offline user will be stored on the server until that user comes
+online again. Thus it is very similar to how email works. Note that
+\term{ejabberdctl}\ind{ejabberdctl} has a command to delete expired messages
+(see section~\ref{sec:ejabberdctl}).
 
 \subsection{\modprivacy{}}
 \label{sec:modprivacy}
+\ind{modules!\modprivacy{}}\ind{Blocking Communication}\ind{Privacy Rules}\ind{protocols!RFC 3921: XMPP IM}
 
-This module implements Privacy Rules as defined in XMPP IM
-(see \ahrefurl{http://www.jabber.org/ietf/}).
+This module implements Blocking Communication (also known as Privacy Rules)
+as defined in section 10 from XMPP IM. If end users have support for it in
+their \Jabber{} client, they will be able to:
+\begin{quote}
+\begin{itemize}
+\item Retrieving one's privacy lists. 
+\item Adding, removing, and editing one's privacy lists. 
+\item Setting, changing, or declining active lists. 
+\item Setting, changing, or declining the default list (i.e., the list that
+  is active by default). 
+\item Allowing or blocking messages based on JID, group, or subscription type
+  (or globally). 
+\item Allowing or blocking inbound presence notifications based on JID, group,
+  or subscription type (or globally). 
+\item Allowing or blocking outbound presence notifications based on JID, group,
+  or subscription type (or globally). 
+\item Allowing or blocking IQ stanzas based on JID, group, or subscription type
+  (or globally). 
+\item Allowing or blocking all communications based on JID, group, or
+  subscription type (or globally).
+\end{itemize}
+(from \ahrefurl{http://www.xmpp.org/specs/rfc3921.html\#privacy})
+\end{quote}
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:privacy}}
+\iqdiscitem{Blocking Communication (\ns{jabber:iq:privacy})}
 \end{description}
 
-
 \subsection{\modprivate{}}
 \label{sec:modprivate}
+\ind{modules!\modprivate{}}\ind{protocols!JEP-0049: Private XML Storage}\ind{protocols!JEP-0048: Bookmark Storage}
 
-This module adds support of \jepref{0049} (Private XML Storage).
+This module adds support for Private XML Storage (\jepref{0049}):
+\begin{quote}
+Using this method, Jabber entities can store private data on the server and
+retrieve it whenever necessary. The data stored might be anything, as long as
+it is valid XML. One typical usage for this namespace is the server-side storage
+of client-specific preferences; another is Bookmark Storage (\jepref{0048}).
+\end{quote}
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:private}}
+\iqdiscitem{Private XML Storage (\ns{jabber:iq:private})}
 \end{description}
 
-
 \subsection{\modpubsub{}}
 \label{sec:modpubsub}
+\ind{modules!\modpubsub{}}\ind{protocols!JEP-0060: Publish-Subscribe}
+
+This module offers a Publish-Subscribe Service (\jepref{0060}).
+Publish-Subscribe can be used to develop (examples are taken from the JEP):
+\begin{quote}
+\begin{itemize}
+\item news feeds and content syndacation,
+\item avatar management,
+\item shared bookmarks,
+\item auction and trading systems,
+\item online catalogs,
+\item workflow systems,
+\item network management systems,
+\item NNTP gateways,
+\item vCard/profile management,
+\item and weblogs.
+\end{itemize}
+\end{quote} 
 
-This module implements \jepref{0060} (Publish-Subscribe Service).
+\ind{J-EAI}\ind{EAI}\ind{ESB}\ind{Enterprise Application Integration}\ind{Enterprise Service Bus}
+Another example is \footahref{http://www.process-one.net/en/projects/j-eai/}{J-EAI}.
+This is an XMPP-based Enterprise Application Integration (EAI) platform (also
+known as ESB, the Enterprise Service Bus). The J-EAI project builts upon
+\ejabberd{}'s codebase and has contributed several features to \modpubsub{}.
 
 Options:
 \begin{description}
 \hostitem{pubsub}
-\titem{served\_hosts} Specifies which hosts are served by the service.
-If absent then only main \ejabberd{} host is served.
+\titem{served\_hosts} \ind{options!served\_hosts}To specify which hosts needs to
+  be served, you can use this option. If absent, only the main \ejabberd{}
+  host is served. % Not a straigtforward description! This needs to be improved!
 \end{description}
 
 Example:
@@ -1164,31 +1590,41 @@ Example:
    ]}.
 \end{verbatim}
 
-
 \subsection{\modregister{}}
 \label{sec:modregister}
+\ind{modules!\modregister{}}\ind{protocols!JEP-0077: In-Band Registration}\ind{public registration}
+
+This module adds support for In-Band Registration (\jepref{0077}). This protocol
+enables end users to use a \Jabber{} client to:
+\begin{itemize}
+\item Register a new account on the server.
+\item Change the password from an existing account on the server.
+\item Delete an existing account on the server.
+\end{itemize}
 
-This module adds support for \jepref{0077} (In-Band Registration).
 
 Options:
 \begin{description}
-\titem{access} Specifies rule to restrict registration.
-If this rule returns ``deny'' on requested user name, then
-registration is not allowed for it. (default value is \term{all}, which means
-no restrictions).
-\iqdiscitem{\ns{jabber:iq:register}}
+\titem{access} \ind{options!access}This option can be configured to specify
+  rules to restrict registration. If a rule returns ``deny'' on the requested
+  user name, registration for that user name is dennied. (there are no
+  restrictions by default).
+\iqdiscitem{In-Band Registration (\ns{jabber:iq:register})}
 \end{description}
 
-Example:
-\begin{verbatim}
-  % Deny registration for users with too short name
+Examples:
+\begin{itemize}
+\item Next example prohibits the registration of too short account names and of
+  account names with exotic characters in it:
+  \begin{verbatim}
   {acl, shortname, {user_glob, "?"}}.
   {acl, shortname, {user_glob, "??"}}.
-  % Another variant: {acl, shortname, {user_regexp, "^..?$"}}.
-
+  {acl, strangename, {user_regexp, "^..?$"}}.
+  ...
   {access, register, [{deny, shortname},
+                      {deny, strangename},
                       {allow, all}]}.
-
+  ...
   {modules,
    [
     ...
@@ -1196,34 +1632,55 @@ Example:
     ...
    ]}.
 \end{verbatim}
+\item The in-band registration of new accounts can be prohibited by changing the
+  \option{access} option. If you really want to disable all In-Band Registration
+  functionality, that is changing passwords in-band and deleting accounts
+  in-band, you have to remove \modregister{} from the modules list. In this
+  example all In-Band Registration functionality is disabled:
+  \begin{verbatim}
+  {access, register, [{deny, all}]}.
 
+  {modules,
+   [
+    ...
+%    {mod_register, [{access, register}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modroster{}}
 \label{sec:modroster}
+\ind{modules!\modroster{}}\ind{roster management}\ind{protocols!RFC 3921: XMPP IM}
 
-This module implements roster management.
+This module implements roster management as defined in \footahref{http://www.xmpp.org/specs/rfc3921.html\#roster}{RFC 3921: XMPP IM}.
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:roster}}
+\iqdiscitem{Roster Management (\ns{jabber:iq:roster})}
 \end{description}
 
-
 \subsection{\modservicelog{}}
 \label{sec:modservicelog}
+\ind{modules!\modservicelog{}}\ind{message auditing}\ind{Bandersnatch}
 
-This module adds support for logging of user packets via any jabber service.
-These packets encapsulated in <route/> element and sended to specified
-services.
+This module adds support for logging end user packets via a \Jabber{} message
+auditing service such as
+\footahref{http://www.funkypenguin.co.za/bandersnatch/}{Bandersnatch}. All user
+packets are encapsulated in a \verb|<route/>| element and sent to the specified
+service(s).
 
 Options:
 \begin{description}
-  \titem{loggers} Specifies a list of services which will receive users
-  packets.
+\titem{loggers} \ind{options!loggers}With this option a (list of) service(s)
+  that will receive the packets can be specified.
 \end{description}
 
-Example:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item To log all end user packets to the Bandersnatch service running on
+  \jid{bandersnatch.example.com}:
+  \begin{verbatim}
   {modules,
    [
     ...
@@ -1231,171 +1688,258 @@ Example:
     ...
    ]}.
 \end{verbatim}
-
+\item To log all end user packets to the Bandersnatch service running on
+  \jid{bandersnatch.example.com} and the backup service on 
+  \jid{bandersnatch.example.org}:
+  \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_service_log, [{loggers, ["bandersnatch.example.com",
+                                  "bandersnatch.example.org"]}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modsharedroster{}}
 \label{sec:modsharedroster}
+\ind{modules!\modsharedroster{}}\ind{shared roster groups}
 
-This module implements shared roster groups support.
+This module enables you to create shared roster groups. This means that you can
+create groups of people that can see members from (other) groups in their
+rosters. The big advantages of this feature are that end users do not need to
+manually add all users to their rosters, and that they cannot permanently delete
+users from the shared roster groups.
 
-You can edit shared roster groups via web-interface.  Each group has an unique
-ID and the following parameters:
+Shared roster groups can be edited \emph{only} via the web interface. Each group
+has a unique identification and the following parameters:
 \begin{description}
-\item[Name] The name of the group, which will be displayed in roster.
-\item[Description] Textual description of this group, doesn't affect anything.
-\item[Members] List of full JIDs of group members, entered one per line in
-  web-interface.
-\item[Displayed groups] List of IDs of groups which will be in rosters of this
-  group members.
+\item[Name] The name of the group, which will be displayed in the roster.
+\item[Description] The description of the group. This parameter doesn't affect
+  anything.
+\item[Members] A list of full JIDs of group members, entered one per line in
+  the web interface.
+\item[Displayed groups] A list of groups that will be in the rosters of this
+  group's members.
 \end{description}
 
-For example, to have a group of users which can see each other in roster,
-create a group like on table~\ref{tab:srge1}.
-\begin{table}[htbp]
+Examples:
+\begin{itemize}
+\item Take the case of a computer club that wants all its members seeing each
+  other in their rosters. To achieve this, they need to create a shared roster
+  group similar to next table:
+\begin{table}[H]
   \centering
   \begin{tabular}{|l|l|}
-    & Group `\texttt{users}'\\
-    Name& Users\\
-    Members&
+    \hline Identification& Group `\texttt{club\_members}'\\
+    \hline Name& Club Members\\
+    \hline Description& Members from the computer club\\
+    \hline Members&
     {\begin{tabular}{l}
-        \jid{user1@example.org}\\
-        \jid{user2@example.org}\\
-        \jid{user3@example.org}
+        \jid{member1@example.org}\\
+        \jid{member2@example.org}\\
+        \jid{member3@example.org}
       \end{tabular}
     }\\
-    Displayed groups& \texttt{users}
+    \hline Displayed groups& \texttt{club\_members}\\
+    \hline
   \end{tabular}
-  \caption{Shared group example N1}
-  \label{tab:srge1}
 \end{table}
-
-To have 3 groups `\texttt{managers}', `\texttt{workgroup1}', and
-`\texttt{workgroup2}', where group `\texttt{managers}' can see members of all
-groups, and other two groups can see `\texttt{managers}' group and themselves,
-create groups like on table~\ref{tab:srge2}.
-\begin{table}[htbp]
+\item In another case we have a company which has three divisions: Management,
+  Marketing and Sales. All group members should see all other members in their
+  rosters. Additonally, all managers should have all marketing and sales people
+  in their roster. Simultaneously, all marketeers and the whole sales team
+  should see all managers. This scenario can be achieved by creating shared
+  roster groups as shown in the following table:
+\begin{table}[H]
   \centering
   \begin{tabular}{|l|l|l|l|}
-    &
-    Group `\texttt{managers}'&
-    Group `\texttt{workgroup1}'&
-    Group `\texttt{workgroup2}'\\
-    Name& Managers& Workgroup1& Workgroup2\\
+    \hline Identification&
+    Group `\texttt{management}'&
+    Group `\texttt{marketing}'&
+    Group `\texttt{sales}'\\
+    \hline Name& Management& Marketing& Sales\\
+    \hline Description& \\
     Members&
     {\begin{tabular}{l}
         \jid{manager1@example.org}\\
         \jid{manager2@example.org}\\
-        \jid{manager3@example.org}
+        \jid{manager3@example.org}\\
+        \jid{manager4@example.org}
       \end{tabular}
     }&
     {\begin{tabular}{l}
-        \jid{user1@example.org}\\
-        \jid{user2@example.org}\\
-        \jid{user3@example.org}
+        \jid{marketeer1@example.org}\\
+        \jid{marketeer2@example.org}\\
+        \jid{marketeer3@example.org}\\
+        \jid{marketeer4@example.org}
       \end{tabular}
     }&
     {\begin{tabular}{l}
-        \jid{user4@example.org}\\
-        \jid{user5@example.org}\\
-        \jid{user6@example.org}
+        \jid{saleswoman1@example.org}\\
+        \jid{salesman1@example.org}\\
+        \jid{saleswoman2@example.org}\\
+        \jid{salesman2@example.org}
       \end{tabular}
     }\\
-    Displayed groups&
+    \hline Displayed groups&
     {\begin{tabular}{l}
-        \texttt{managers}\\
-        \texttt{workgroup1}\\
-        \texttt{workgroup2}
+        \texttt{management}\\
+        \texttt{marketing}\\
+        \texttt{sales}
       \end{tabular}
     }&
     {\begin{tabular}{l}
-        \texttt{managers}\\
-        \texttt{workgroup1}
+        \texttt{management}\\
+        \texttt{marketing}
       \end{tabular}
     }&
     {\begin{tabular}{l}
-        \texttt{managers}\\
-        \texttt{workgroup2}
+        \texttt{management}\\
+        \texttt{sales}
       \end{tabular}
-    }
+    }\\
+    \hline
   \end{tabular}
-  \caption{Shared group example N2}
-  \label{tab:srge2}
 \end{table}
+\end{itemize}
 
 \subsection{\modstats{}}
 \label{sec:modstats}
+\ind{modules!\modstats{}}\ind{protocols!JEP-0039: Statistics Gathering}\ind{statistics}
 
-This module adds support for \jepref{0039} (Statistics Gathering).
+This module adds support for Statistics Gathering (\jepref{0039}). This protocol
+allows you to retrieve next statistics from your \ejabberd{} deployment:
+\begin{itemize}
+\item Total number of registered users on the current virtual host (users/total).
+\item Total number of registered users on all virtual hosts (users/all-hosts/total).
+\item Total number of online users on the current virtual host (users/online).
+\item Total number of online users on all virtual hosts (users/all-hosts/online).
+\end{itemize}
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{http://jabber.org/protocol/stats}}
+\iqdiscitem{Statistics Gathering (\ns{http://jabber.org/protocol/stats})}
 \end{description}
 
+As there are only a small amount of clients (for \ind{Tkabber}example
+\footahref{http://tkabber.jabber.ru/}{Tkabber}) and software libraries with
+support for this JEP, a few examples are given of the XML you need to send
+in order to get the statistics. Here they are:
+\begin{itemize}
+\item You can request the number of online users on the current virtual host
+  (\jid{example.org}) by sending:
+  \begin{verbatim}
+<iq to='example.org' type='get'>
+  <query xmlns='http://jabber.org/protocol/stats'>
+    <stat name='users/online'/>
+  </query>
+</iq>
+\end{verbatim}
+\item You can request the total number of registered users on all virtual hosts
+  by sending:
+  \begin{verbatim}
+<iq to='example.org' type='get'>
+  <query xmlns='http://jabber.org/protocol/stats'>
+    <stat name='users/all-hosts/total'/>
+  </query>
+</iq>
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modtime{}}
 \label{sec:modtime}
+\ind{modules!\modtime{}}\ind{protocols!JEP-0090: Entity Time}
 
-This module answers UTC time on \ns{jabber:iq:time} queries.
+This module features support for Entity Time (\jepref{0090}). By using this JEP,
+you are able to discover the time at another entity's location.
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:time}}
+\iqdiscitem{Entity Time (\ns{jabber:iq:time})}
 \end{description}
 
-
 \subsection{\modvcard{}}
 \label{sec:modvcard}
+\ind{modules!\modvcard{}}\ind{JUD}\ind{Jabber User Directory}\ind{vCard}\ind{protocols!JEP-0054: vcard-temp}
 
-This module implements simple Jabber User Directory (based on user vCards)
-and answers server vCard on \ns{vcard-temp} queries.
+This module allows end users to store and retrieve their vCard, and to retrieve
+other users vCards, as defined in vcard-temp (\jepref{0054}). The module also
+implements an uncomplicated \Jabber{} User Directory based on the vCards of
+these users. Moreover, it enables the server to send its vCard when queried.
 
 Options:
 \begin{description}
 \hostitem{vjud}
 \iqdiscitem{\ns{vcard-temp}}
-\titem{search} Specifies whether search is enabled (value is \term{true}, default) or
-disabled (value is \term{false}) by the service. If \term{search} is set to \term{false},
-option \term{host} is ignored and service does not appear in Jabber Discovery items.
-\titem{matches} Limits the number of reported search results. If value is set to
-\term{infinity} then all search results are reported.  Default value is \term{30}.
-\titem{allow\_return\_all}  Specifies whether search with empty input fields can
-return all known users.  Default is \term{false}.
-\titem{search\_all\_hosts}  If set in \term{true} then search returns matched
-items at all virtual hosts.  Otherwise only current host items are returned.
-Default is \term{true}.
+\titem{search} \ind{options!search}This option specifies whether the search
+  functionality is enabled (value: \term{true}) or disabled
+  (value: \term{false}). If disabled, the option \term{hosts} will be
+  ignored and the \Jabber{} User Directory service will not appear in the
+  Service Discovery item list. The default value is \term{true}.
+\titem{matches} \ind{options!matches}With this option, the number of reported
+  search results can be limited. If the option's value is set to \term{infinity},
+  all search results are reported. The default value is \term{30}.
+\titem{allow\_return\_all} \ind{options!allow\_return\_all}This option enables
+  you to specify if search operations with empty input fields should return
+  all users who added some information to their vCard. The default value is
+  \term{false}.
+\titem{search\_all\_hosts} \ind{options!search\_all\_hosts}If this option is
+  set to \term{true}, search operations will apply to all virtual hosts.
+  Otherwise only the current host will be searched. The default value is
+  \term{true}.
 \end{description}
 
-Example:
-\begin{verbatim}
+Examples:
+\begin{itemize}
+\item In this first situation, search results are limited to twenty items,
+  every user who added information to their vCard will be listed when people
+  do an empty search, and only users from the current host will be returned:
+  \begin{verbatim}
   {modules,
    [
     ...
     {mod_vcard, [{search, true},
                  {matches, 20},
                  {allow_return_all, true},
-                 {search_all_hosts, false}]}
+                 {search_all_hosts, false}]},
     ...
    ]}.
 \end{verbatim}
-
+\item The second situation differs in a way that search results are not limited,
+  and that all virtual hosts will be searched instead of only the current one:
+  \begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_vcard, [{search, true},
+                 {matches, infinity},
+                 {allow_return_all, true}]},
+    ...
+   ]}.
+\end{verbatim}
+\end{itemize}
 
 \subsection{\modversion{}}
 \label{sec:modversion}
+\ind{modules!\modversion{}}\ind{protocols!JEP-0092: Software Version}
 
-This module answers \ejabberd{} version on \ns{jabber:iq:version} queries.
+This module implements Software Version (\jepref{0092}). Consequently, it
+answers \ejabberd{}'s version when queried.
 
 Options:
 \begin{description}
-\iqdiscitem{\ns{jabber:iq:version}}
+\iqdiscitem{Software Version (\ns{jabber:iq:version})}
 \end{description}
 
 
-\section{I18n/L10n}
+\section{Internationalization and Localization}
 \label{sec:i18nl10n}
+\ind{xml:lang}\ind{internationalization}\ind{localization}\ind{i18n}\ind{l10n}
 
-All built-in modules support \texttt{xml:lang} attribute inside IQ queries.
-E.\,g.\ on figure~\ref{fig:discorus} showed the reply on the following query:
+All built-in modules support the \texttt{xml:lang} attribute inside IQ queries.
+Figure~\ref{fig:discorus}, for example, shows the reply to the following query:
 \begin{verbatim}
   <iq id='5'
       to='example.org'
@@ -1408,20 +1952,90 @@ E.\,g.\ on figure~\ref{fig:discorus} showed the reply on the following query:
 \begin{figure}[htbp]
   \centering
   \insimg{discorus.png}
-  \caption{Discovery result when \texttt{xml:lang='ru'}}
+  \caption{Service Discovery when \texttt{xml:lang='ru'}}
   \label{fig:discorus}
 \end{figure}
 
-Also web-interface supports \verb|Accept-Language| HTTP header (see
-figure~\ref{fig:webadmmainru}, compare it with figure~\ref{fig:webadmmain})
+The web interface also supports the \verb|Accept-Language| HTTP header (compare
+figure~\ref{fig:webadmmainru} with figure~\ref{fig:webadmmain})
 
 \begin{figure}[htbp]
   \centering
   \insimg{webadmmainru.png}
-  \caption{Web-administration top page with HTTP header
-    ``\verb|Accept-Language: ru|''}
+  \caption{Top page from the web interface with HTTP header
+    ``Accept-Language: ru''}
   \label{fig:webadmmainru}
 \end{figure}
 
+\newpage
+\section{Release Notes}
+\label{sec:releasenotes}
+\ind{release notes}
+
+\subsection{ejabberd 0.9}
+\verbatiminput{release_notes_0.9.txt}
+
+\subsection{ejabberd 0.9.1}
+\verbatiminput{release_notes_0.9.1.txt}
+
+\subsection{ejabberd 0.9.8}
+\verbatiminput{release_notes_0.9.8.txt}
+
+
+\section{Acknowledgements}
+\label{sec:acknowledgements}
+\ind{acknowledgements}
+Thanks to all people who contributed to this guide:
+\begin{itemize}
+\item Alexey Shchepin (\ahrefurl{xmpp:aleksey@jabber.ru})
+\item Florian Zumbiehl (\ahrefurl{xmpp:florz@florz.de})
+\item Michael Grigutsch (\ahrefurl{xmpp:migri@jabber.i-pobox.net})
+\item Micka\"el R\'emond (\ahrefurl{xmpp:mremond@erlang-projects.org})
+\item Sander Devrieze (\ahrefurl{xmpp:sander@devrieze.dyndns.org})
+\item Sergei Golovan (\ahrefurl{xmpp:sgolovan@nes.ru})
+\item Vsevolod Pelipas (\ahrefurl{xmpp:vsevoload@jabber.ru})
+\end{itemize}
+
+% TODO
+%\section{Glossary}
+%\label{sec:glossary}
+%\ind{glossary}
+
+%\begin{description}
+%\titem{c2s} 
+%\titem{s2s}
+%\titem{STARTTLS}
+%\titem{JEP} (\Jabber{} Enhancement Proposal)
+%\titem{Resource}
+%\titem{Roster}
+%\titem{Transport}
+%\titem{JID} (\Jabber{} ID) <Wikipedia>
+%\titem{JUD} (\Jabber{} User Directory)
+%\titem{vCard} <Wikipedia>
+%\titem{Publish-Subscribe}
+%\titem{Namespace}
+%\titem{Erlang} <Wikipedia>
+%\titem{Fault-tolerant}
+%\titem{Distributed} <Wikipedia>
+%\titem{Node} <Wikipedia>
+%\titem{Tuple} <Wikipedia>
+%\titem{Regular Expression}
+%\titem{ACL} (Access Control List) <Wikipedia>
+%\titem{IPv6} <Wikipedia>
+%\titem{XDB} ???
+%\titem{LDAP} (Lightweight Directory Access Protocol) <Wikipedia>
+%\titem{ODBC} (Open Database Connectivity) <Wikipedia>
+%\titem{Virtual Hosting} <Wikipedia>
+%\titem{}
+%\titem{}
+
+%\end{description}
+
+
+
+% Remove the index from the HTML version to save size and bandwith.
+\begin{latexonly}
+\printindex
+\end{latexonly}
 
 \end{document}
-- 
cgit v1.2.3

