GUACAMOLE-639: Merge documentation noting libtool as a build-time dependency.
diff --git a/src/chapters/adhoc-connections.xml b/src/chapters/adhoc-connections.xml
index 04a730f..0bb5112 100644
--- a/src/chapters/adhoc-connections.xml
+++ b/src/chapters/adhoc-connections.xml
@@ -4,9 +4,14 @@
     xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
     <title>Ad-hoc Connections</title>
     <indexterm>
-        <primary>adhoc-connections</primary>
+        <primary>connections</primary>
         <secondary>adhoc</secondary>
-        <secondary>quickconnect</secondary>
+    </indexterm>
+    <indexterm>
+        <primary>adhoc</primary>
+    </indexterm>
+    <indexterm>
+        <primary>quickconnect</primary>
     </indexterm>
     <para>The quickconnect extension provides a connection bar on the Guacamole Client home page
         that allows users to type in the URI of a server to which they want to connect and the client
@@ -43,7 +48,7 @@
                 xlink:href="http://guacamole.apache.org/releases/"
                 >http://guacamole.apache.org/releases/</link>.</para>
         <para>The quickconnect extension is packaged as a <filename>.tar.gz</filename> file containing
-            only the extension itself, <filename>guacamole-auth-quickconnect-0.9.14.jar</filename>, which must
+            only the extension itself, <filename>guacamole-auth-quickconnect-1.0.0.jar</filename>, which must
             ultimately be placed in <filename>GUACAMOLE_HOME/extensions</filename>.</para>
     </section>
     <section xml:id="installing-quickconnect">
@@ -60,7 +65,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Place the <filename>guacamole-auth-quickconnect-0.9.14.jar</filename> file in
+                <para>Place the <filename>guacamole-auth-quickconnect-1.0.0.jar</filename> file in
                     the <filename>GUACAMOLE_HOME/extensions</filename> directory.</para>
             </step>
         </procedure>
@@ -83,36 +88,48 @@
     <section xml:id="using-quickconnect">
         <title>Using the quickconnect extension</title>
         <para>The quickconnect extension provides a field on the home page that allows you to enter
-             a Uniform Resource Identifier (URI) to create a connection.  A URI is in the form:</para>
-            <informalexample><uri>
-<replaceable>protocol</replaceable>://<replaceable>username</replaceable>:<replaceable>password</replaceable>@<replaceable>host</replaceable>:<replaceable>port</replaceable>/?<replaceable>parameters</replaceable>
-</uri></informalexample>
-            <para>The <replaceable>protocol</replaceable> field can have any of the protocols supported by
-            Guacamole, as documented in <xref linkend="configuring-guacamole"/>.  Many of the
-            protocols define a default <replaceable>port</replaceable> value, with the exception of VNC.
-            The <replaceable>parameters</replaceable> field can specify any of the protocol-specific
-            parameters as documented on the configuration page.</para>
-        <para>To establish a connection, simply type in a valid URI and either press "Enter" or click
-            the connect button.  This extension will parse the URI and create a new connection, and
-            immediately start that connection in the current browser.</para>
+            a Uniform Resource Identifier (URI) to create a connection. A URI is in the form:</para>
+        <informalexample>
+            <para><uri><replaceable>protocol</replaceable>://<replaceable>username</replaceable>:<replaceable>password</replaceable>@<replaceable>host</replaceable>:<replaceable>port</replaceable>/?<replaceable>parameters</replaceable></uri></para>
+        </informalexample>
+        <para>The <replaceable>protocol</replaceable> field can have any of the protocols supported
+            by Guacamole, as documented in <xref linkend="configuring-guacamole"/>. Many of the
+            protocols define a default <replaceable>port</replaceable> value, with the exception of
+            VNC. The <replaceable>parameters</replaceable> field can specify any of the
+            protocol-specific parameters as documented on the configuration page.</para>
+        <para>To establish a connection, simply type in a valid URI and either press "Enter" or
+            click the connect button. This extension will parse the URI and create a new connection,
+            and immediately start that connection in the current browser.</para>
         <para>Here are a few examples of URIs:</para>
         <itemizedlist>
-            <listitem><informalexample><uri>ssh://linux1.example.com/</uri></informalexample>
-                <para>Connect to the server linux1.example.com using the SSH protocol on the default SSH port (22).
-                    This will result in prompting for both username and password.</para></listitem>
-            <listitem><informalexample><uri>vnc://linux1.example.com:5900/</uri></informalexample>
-                <para>Connect to the server linux1.example.com using the VNC protocol and specifying the
-                    port as 5900.</para></listitem>
-            <listitem><informalexample><uri>
-rdp://localuser@windows1.example.com/?security=rdp&amp;ignore-cert=true&amp;disable-audio=true&amp;enable-drive=true&amp;drive-path=/mnt/usb
-                    </uri>
+            <listitem>
+                <informalexample>
+                    <para><uri>ssh://linux1.example.com/</uri></para>
+                </informalexample>
+                <para>Connect to the server linux1.example.com using the SSH protocol on the default
+                    SSH port (22). This will result in prompting for both username and
+                    password.</para>
+            </listitem>
+            <listitem>
+                <informalexample>
+                    <para><uri>vnc://linux1.example.com:5900/</uri></para>
+                </informalexample>
+                <para>Connect to the server linux1.example.com using the VNC protocol and specifying
+                    the port as 5900.</para>
+            </listitem>
+            <listitem>
+                <informalexample>
+                    <para><uri>
+                            rdp://localuser@windows1.example.com/?security=rdp&amp;ignore-cert=true&amp;disable-audio=true&amp;enable-drive=true&amp;drive-path=/mnt/usb
+                        </uri></para>
                 </informalexample>
                 <para>Connect to the server windows1.example.com using the RDP protocol and the user
-                    "localuser".  This URI also specifies several RDP-specific parameters on the
-                    connection, including forcing security mode to RDP (security=rdp), 
-                    ignoring any certificate errors (ignore-cert=true), disabling audio pass-through
-                    (disable-audio=true), and enabling filesystem redirection (enable-drive=true)
-                    to the /mnt/usb folder on the system running guacd (drive-path=/mnt/usb).</para></listitem>
+                    "localuser". This URI also specifies several RDP-specific parameters on the
+                    connection, including forcing security mode to RDP (security=rdp), ignoring any
+                    certificate errors (ignore-cert=true), disabling audio pass-through
+                    (disable-audio=true), and enabling filesystem redirection (enable-drive=true) to
+                    the /mnt/usb folder on the system running guacd (drive-path=/mnt/usb).</para>
+            </listitem>
         </itemizedlist>
     </section>
 </chapter>
diff --git a/src/chapters/cas-auth.xml b/src/chapters/cas-auth.xml
index 799425d..83037f9 100644
--- a/src/chapters/cas-auth.xml
+++ b/src/chapters/cas-auth.xml
@@ -23,7 +23,7 @@
                 >http://guacamole.apache.org/releases/</link>.</para>
         <para>The CAS authentication extension is packaged as a <filename>.tar.gz</filename>
             file containing only the extension itself,
-                <filename>guacamole-auth-cas-0.9.14.jar</filename>, which must
+                <filename>guacamole-auth-cas-1.0.0.jar</filename>, which must
             ultimately be placed in <filename>GUACAMOLE_HOME/extensions</filename>.</para>
     </section>
     <section xml:id="installing-cas-auth">
@@ -40,7 +40,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-cas-0.9.14.jar</filename> within
+                <para>Copy <filename>guacamole-auth-cas-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
diff --git a/src/chapters/configuring.xml b/src/chapters/configuring.xml
index 9493ffb..b2f62ae 100644
--- a/src/chapters/configuring.xml
+++ b/src/chapters/configuring.xml
@@ -685,7 +685,7 @@
                     events:</para>
                 <informalexample>
                     <screen><prompt>$</prompt> <userinput>guaclog <replaceable>/path/to/recording/NAME</replaceable></userinput><computeroutput>
-guaclog: INFO: Guacamole input log interpreter (guaclog) version 0.9.14
+guaclog: INFO: Guacamole input log interpreter (guaclog) version 1.0.0
 guaclog: INFO: 1 input file(s) provided.
 guaclog: INFO: Writing input events from "<replaceable>/path/to/recording/NAME</replaceable>" to "<replaceable annotations="">/path/to/recording/NAME</replaceable>.txt" ...
 guaclog: INFO: All files interpreted successfully.</computeroutput>
@@ -1865,7 +1865,7 @@
                     events:</para>
                 <informalexample>
                     <screen><prompt>$</prompt> <userinput>guaclog <replaceable>/path/to/recording/NAME</replaceable></userinput><computeroutput>
-guaclog: INFO: Guacamole input log interpreter (guaclog) version 0.9.14
+guaclog: INFO: Guacamole input log interpreter (guaclog) version 1.0.0
 guaclog: INFO: 1 input file(s) provided.
 guaclog: INFO: Writing input events from "<replaceable>/path/to/recording/NAME</replaceable>" to "<replaceable annotations="">/path/to/recording/NAME</replaceable>.txt" ...
 guaclog: INFO: All files interpreted successfully.</computeroutput>
@@ -3378,7 +3378,7 @@
                     events:</para>
                 <informalexample>
                     <screen><prompt>$</prompt> <userinput>guaclog <replaceable>/path/to/recording/NAME</replaceable></userinput><computeroutput>
-guaclog: INFO: Guacamole input log interpreter (guaclog) version 0.9.14
+guaclog: INFO: Guacamole input log interpreter (guaclog) version 1.0.0
 guaclog: INFO: 1 input file(s) provided.
 guaclog: INFO: Writing input events from "<replaceable>/path/to/recording/NAME</replaceable>" to "<replaceable annotations="">/path/to/recording/NAME</replaceable>.txt" ...
 guaclog: INFO: All files interpreted successfully.</computeroutput>
@@ -4084,7 +4084,7 @@
                     events:</para>
                 <informalexample>
                     <screen><prompt>$</prompt> <userinput>guaclog <replaceable>/path/to/recording/NAME</replaceable></userinput><computeroutput>
-guaclog: INFO: Guacamole input log interpreter (guaclog) version 0.9.14
+guaclog: INFO: Guacamole input log interpreter (guaclog) version 1.0.0
 guaclog: INFO: 1 input file(s) provided.
 guaclog: INFO: Writing input events from "<replaceable>/path/to/recording/NAME</replaceable>" to "<replaceable annotations="">/path/to/recording/NAME</replaceable>.txt" ...
 guaclog: INFO: All files interpreted successfully.</computeroutput>
@@ -4308,21 +4308,6 @@
                             time that the connection began.</para>
                     </listitem>
                 </varlistentry>
-                <varlistentry>
-                    <term><varname>${GUAC_ATTR_<replaceable>CUSTOM_ATTRIBUTE_NAME</replaceable>}</varname></term>
-                    <listitem>
-                        <para>An attribute value specified on the current Guacamole user.
-                            <replaceable>CUSTOM_ATTRIBUTE_NAME</replaceable> is a custom
-                            user attribute that may be obtained from any of the authentication
-                            modules that implement the feature. There are an arbitrary
-                            number of these tokens. If no attributes are specified
-                            then this token does not exist.</para>
-                        <para>For example, if an attribute name is specified as "mail" then a token would
-                            be set as <varname>${GUAC_ATTR_MAIL}</varname> with the value of "mail" in the authentication
-                            module that "mail" is specified in. For a practical example, see
-                            <property>ldap-user-attributes</property> in <xref linkend="ldap-auth"/>.</para>
-                    </listitem>
-                </varlistentry>
             </variablelist>
             <para>Note that these tokens are replaced dynamically each time a connection is used. If
                 two different users access the same connection at the same time, both users will be
diff --git a/src/chapters/custom-auth.xml b/src/chapters/custom-auth.xml
index ec283ed..0412015 100644
--- a/src/chapters/custom-auth.xml
+++ b/src/chapters/custom-auth.xml
@@ -58,7 +58,7 @@
     &lt;groupId>org.apache.guacamole&lt;/groupId>
     &lt;artifactId>guacamole-auth-tutorial&lt;/artifactId>
     &lt;packaging>jar&lt;/packaging>
-    &lt;version>0.9.14&lt;/version>
+    &lt;version>1.0.0&lt;/version>
     &lt;name>guacamole-auth-tutorial&lt;/name>
 
     &lt;properties>
@@ -88,7 +88,7 @@
         &lt;dependency>
             &lt;groupId>org.apache.guacamole&lt;/groupId>
             &lt;artifactId>guacamole-ext&lt;/artifactId>
-            &lt;version>0.9.14&lt;/version>
+            &lt;version>1.0.0&lt;/version>
             &lt;scope>provided&lt;/scope>
         &lt;/dependency>
 
@@ -172,7 +172,7 @@
             <title>The required <filename>guac-manifest.json</filename></title>
             <programlisting>{
 
-    "guacamoleVersion" : "0.9.14",
+    "guacamoleVersion" : "1.0.0",
 
     "name"      : "Tutorial Authentication Extension",
     "namespace" : "guac-auth-tutorial",
@@ -196,7 +196,7 @@
             <screen><prompt>$</prompt> mvn package
 <computeroutput>[INFO] Scanning for projects...
 [INFO] ------------------------------------------------------------------------
-[INFO] Building guacamole-auth-tutorial 0.9.14
+[INFO] Building guacamole-auth-tutorial 1.0.0
 [INFO] ------------------------------------------------------------------------
 ...
 [INFO] ------------------------------------------------------------------------
@@ -210,7 +210,7 @@
         </informalexample>
         <para>Assuming you see the "<computeroutput>BUILD SUCCESS</computeroutput>" message when you
             build the extension, there will be a new file,
-                <filename>target/guacamole-auth-tutorial-0.9.14.jar</filename>, which can be
+                <filename>target/guacamole-auth-tutorial-1.0.0.jar</filename>, which can be
             installed within Guacamole and tested. If you changed the name or version of the project
             in the <filename>pom.xml</filename> file, the name of this new <filename>.jar</filename>
             file will be different, but it can still be found within
@@ -472,7 +472,7 @@
             user running Tomcat.</para>
         <para>To install your extension, ensure that the required properties have been added to your
                 <filename>guacamole.properties</filename>, copy the
-                <filename>target/guacamole-auth-tutorial-0.9.14.jar</filename> file into
+                <filename>target/guacamole-auth-tutorial-1.0.0.jar</filename> file into
                 <filename>GUACAMOLE_HOME/extensions</filename> and restart Tomcat. Guacamole will
             automatically load your extension, logging an informative message that it has done
             so:</para>
diff --git a/src/chapters/duo-auth.xml b/src/chapters/duo-auth.xml
index 79b6a99..3f735ce 100644
--- a/src/chapters/duo-auth.xml
+++ b/src/chapters/duo-auth.xml
@@ -55,7 +55,7 @@
                 >http://guacamole.apache.org/releases/</link>.</para>
         <para>The Duo authentication extension is packaged as a <filename>.tar.gz</filename> file
             containing only the extension itself,
-                <filename>guacamole-auth-duo-0.9.14.jar</filename>, which must ultimately
+                <filename>guacamole-auth-duo-1.0.0.jar</filename>, which must ultimately
             be placed in <filename>GUACAMOLE_HOME/extensions</filename>.</para>
     </section>
     <section xml:id="installing-duo-auth">
@@ -69,7 +69,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-duo-0.9.14.jar</filename> within
+                <para>Copy <filename>guacamole-auth-duo-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
diff --git a/src/chapters/event-listeners.xml b/src/chapters/event-listeners.xml
index 3250b6e..0a70a74 100644
--- a/src/chapters/event-listeners.xml
+++ b/src/chapters/event-listeners.xml
@@ -52,7 +52,7 @@
     &lt;groupId>org.apache.guacamole&lt;/groupId>
     &lt;artifactId>guacamole-listener-tutorial&lt;/artifactId>
     &lt;packaging>jar&lt;/packaging>
-    &lt;version>0.9.14&lt;/version>
+    &lt;version>1.0.0&lt;/version>
     &lt;name>guacamole-listener-tutorial&lt;/name>
 
     &lt;properties>
@@ -82,7 +82,7 @@
         &lt;dependency>
             &lt;groupId>org.apache.guacamole&lt;/groupId>
             &lt;artifactId>guacamole-ext&lt;/artifactId>
-            &lt;version>0.9.14&lt;/version>
+            &lt;version>1.0.0&lt;/version>
             &lt;scope>provided&lt;/scope>
         &lt;/dependency>
 
@@ -159,7 +159,7 @@
             <title>The required <filename>guac-manifest.json</filename></title>
             <programlisting>{
 
-    "guacamoleVersion" : "0.9.14",
+    "guacamoleVersion" : "1.0.0",
 
     "name"      : "Tutorial Listener Extension",
     "namespace" : "guac-listener-tutorial",
@@ -179,7 +179,7 @@
             <screen><prompt>$</prompt> mvn package
 <computeroutput>[INFO] Scanning for projects...
 [INFO] ---------------------------------------------------------------
-[INFO] Building guacamole-listener-tutorial 0.9.14
+[INFO] Building guacamole-listener-tutorial 1.0.0
 [INFO] ---------------------------------------------------------------
 ...
 [INFO] ---------------------------------------------------------------
@@ -193,7 +193,7 @@
         </informalexample>
         <para>Assuming you see the "<computeroutput>BUILD SUCCESS</computeroutput>" message when you
             build the extension, there will be a new file,
-                <filename>target/guacamole-listener-tutorial-0.9.14.jar</filename>, which can be
+                <filename>target/guacamole-listener-tutorial-1.0.0.jar</filename>, which can be
             installed within Guacamole (see <xref xmlns:xlink="http://www.w3.org/1999/xlink"
                 linkend="custom-listener-installing"/> at the end of this chapter). It should log
             event notifications that occur during, for example, authentication attempts.
@@ -341,7 +341,7 @@
             will be the <filename>.guacamole</filename> directory within the home directory of the
             user running Tomcat.</para>
         <para>To install your extension, copy the
-            <filename>target/guacamole-listener-tutorial-0.9.14.jar</filename> file into
+            <filename>target/guacamole-listener-tutorial-1.0.0.jar</filename> file into
             <filename>GUACAMOLE_HOME/extensions</filename> and restart Tomcat. Guacamole will
             automatically load your extension, logging an informative message that it has done
             so:</para>
diff --git a/src/chapters/guacamole-ext.xml b/src/chapters/guacamole-ext.xml
index 7bcfc20..b40b22a 100644
--- a/src/chapters/guacamole-ext.xml
+++ b/src/chapters/guacamole-ext.xml
@@ -186,7 +186,7 @@
                     <filename>guac-manifest.json</filename> will look something like this:</para>
             <informalexample>
                 <programlisting>{
-    "guacamoleVersion" : "0.9.14",
+    "guacamoleVersion" : "1.0.0",
     "name" : "My Extension",
     "namespace" : "my-extension"
 }</programlisting>
@@ -198,7 +198,7 @@
             <informalexample>
                 <programlisting>{
 
-    "guacamoleVersion" : "0.9.14",
+    "guacamoleVersion" : "1.0.0",
 
     "name"      : "My Extension",
     "namespace" : "my-extension",
diff --git a/src/chapters/header-auth.xml b/src/chapters/header-auth.xml
index e0b741f..f313be0 100644
--- a/src/chapters/header-auth.xml
+++ b/src/chapters/header-auth.xml
@@ -29,7 +29,7 @@
                 >http://guacamole.apache.org/releases/</link>.</para>
         <para>The HTTP header authentication extension is packaged as a <filename>.tar.gz</filename>
             file containing only the extension itself,
-                <filename>guacamole-auth-header-0.9.14.jar</filename>, which must
+                <filename>guacamole-auth-header-1.0.0.jar</filename>, which must
             ultimately be placed in <filename>GUACAMOLE_HOME/extensions</filename>.</para>
     </section>
     <section xml:id="installing-header-auth">
@@ -46,7 +46,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-header-0.9.14.jar</filename> within
+                <para>Copy <filename>guacamole-auth-header-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
diff --git a/src/chapters/images/totp-auth-factor-1.png b/src/chapters/images/totp-auth-factor-1.png
new file mode 100644
index 0000000..3a82976
--- /dev/null
+++ b/src/chapters/images/totp-auth-factor-1.png
Binary files differ
diff --git a/src/chapters/images/totp-auth-factor-2.png b/src/chapters/images/totp-auth-factor-2.png
new file mode 100644
index 0000000..c2a649f
--- /dev/null
+++ b/src/chapters/images/totp-auth-factor-2.png
Binary files differ
diff --git a/src/chapters/images/totp-enroll-detail.png b/src/chapters/images/totp-enroll-detail.png
new file mode 100644
index 0000000..afde141
--- /dev/null
+++ b/src/chapters/images/totp-enroll-detail.png
Binary files differ
diff --git a/src/chapters/images/totp-enroll.png b/src/chapters/images/totp-enroll.png
new file mode 100644
index 0000000..97474b6
--- /dev/null
+++ b/src/chapters/images/totp-enroll.png
Binary files differ
diff --git a/src/chapters/installing.xml b/src/chapters/installing.xml
index a964170..70840c7 100644
--- a/src/chapters/installing.xml
+++ b/src/chapters/installing.xml
@@ -579,8 +579,8 @@
                 of a <filename>.tar.gz</filename> archive which you can extract from the command
                 line:</para>
             <informalexample>
-                <screen><prompt>$</prompt> <userinput>tar -xzf guacamole-server-0.9.14.tar.gz</userinput>
-<prompt>$</prompt> <userinput>cd guacamole-server-0.9.14/</userinput>
+                <screen><prompt>$</prompt> <userinput>tar -xzf guacamole-server-1.0.0.tar.gz</userinput>
+<prompt>$</prompt> <userinput>cd guacamole-server-1.0.0/</userinput>
 <prompt>$</prompt></screen>
             </informalexample>
             <para>If you want the absolute latest code, and don't care that the code hasn't been as
@@ -632,7 +632,7 @@
 ...
 
 ------------------------------------------------
-guacamole-server version 0.9.14
+guacamole-server version 1.0.0
 ------------------------------------------------
 
    Library status:
@@ -649,6 +649,7 @@
      libvorbis ........... yes
      libpulse ............ yes
      libwebp ............. yes
+     wsock32 ............. no
 
    Protocol support:
 
@@ -664,6 +665,7 @@
       guaclog .... yes
 
    Init scripts: /etc/init.d
+   Systemd units: no
 
 Type "make" to compile guacamole-server.
 </computeroutput>
@@ -809,8 +811,8 @@
                 <filename>.tar.gz</filename> archive which you can extract from the command
             line:</para>
         <informalexample>
-            <screen><prompt>$</prompt> <userinput>tar -xzf guacamole-client-0.9.14.tar.gz</userinput>
-<prompt>$</prompt> <userinput>cd guacamole-client-0.9.14/</userinput>
+            <screen><prompt>$</prompt> <userinput>tar -xzf guacamole-client-1.0.0.tar.gz</userinput>
+<prompt>$</prompt> <userinput>cd guacamole-client-1.0.0/</userinput>
 <prompt>$</prompt></screen>
         </informalexample>
         <para>As with <package>guacamole-server</package>, if you want the absolute latest code, and
@@ -844,34 +846,52 @@
 [INFO] guacamole-ext
 [INFO] guacamole-common-js
 [INFO] guacamole
+[INFO] guacamole-auth-cas
+[INFO] guacamole-auth-duo
+[INFO] guacamole-auth-header
 [INFO] guacamole-auth-jdbc
 [INFO] guacamole-auth-jdbc-base
 [INFO] guacamole-auth-jdbc-mysql
 [INFO] guacamole-auth-jdbc-postgresql
+[INFO] guacamole-auth-jdbc-sqlserver
+[INFO] guacamole-auth-jdbc-dist
 [INFO] guacamole-auth-ldap
-[INFO] guacamole-auth-noauth
+[INFO] guacamole-auth-openid
+[INFO] guacamole-auth-quickconnect
+[INFO] guacamole-auth-totp
+[INFO] guacamole-example
+[INFO] guacamole-playback-example
 [INFO] guacamole-client
 ...
 [INFO] ------------------------------------------------------------------------
 [INFO] Reactor Summary:
 [INFO] 
-[INFO] guacamole-common ................................... SUCCESS [  7.566 s]
-[INFO] guacamole-ext ...................................... SUCCESS [  5.594 s]
-[INFO] guacamole-common-js ................................ SUCCESS [  1.249 s]
-[INFO] guacamole .......................................... SUCCESS [  8.474 s]
-[INFO] guacamole-auth-jdbc ................................ SUCCESS [  0.592 s]
-[INFO] guacamole-auth-jdbc-base ........................... SUCCESS [  2.548 s]
-[INFO] guacamole-auth-jdbc-mysql .......................... SUCCESS [  2.557 s]
-[INFO] guacamole-auth-jdbc-postgresql ..................... SUCCESS [  1.990 s]
-[INFO] guacamole-auth-ldap ................................ SUCCESS [  1.314 s]
-[INFO] guacamole-auth-noauth .............................. SUCCESS [  0.961 s]
-[INFO] guacamole-client ................................... SUCCESS [  1.721 s]
+[INFO] guacamole-common ................................... SUCCESS [ 21.852 s]
+[INFO] guacamole-ext ...................................... SUCCESS [  9.055 s]
+[INFO] guacamole-common-js ................................ SUCCESS [  1.988 s]
+[INFO] guacamole .......................................... SUCCESS [ 18.040 s]
+[INFO] guacamole-auth-cas ................................. SUCCESS [  4.203 s]
+[INFO] guacamole-auth-duo ................................. SUCCESS [  2.251 s]
+[INFO] guacamole-auth-header .............................. SUCCESS [  1.399 s]
+[INFO] guacamole-auth-jdbc ................................ SUCCESS [  1.396 s]
+[INFO] guacamole-auth-jdbc-base ........................... SUCCESS [  3.266 s]
+[INFO] guacamole-auth-jdbc-mysql .......................... SUCCESS [  4.665 s]
+[INFO] guacamole-auth-jdbc-postgresql ..................... SUCCESS [  3.764 s]
+[INFO] guacamole-auth-jdbc-sqlserver ...................... SUCCESS [  3.738 s]
+[INFO] guacamole-auth-jdbc-dist ........................... SUCCESS [  1.214 s]
+[INFO] guacamole-auth-ldap ................................ SUCCESS [  1.991 s]
+[INFO] guacamole-auth-openid .............................. SUCCESS [  2.204 s]
+[INFO] guacamole-auth-quickconnect ........................ SUCCESS [  2.983 s]
+[INFO] guacamole-auth-totp ................................ SUCCESS [  8.154 s]
+[INFO] guacamole-example .................................. SUCCESS [  0.895 s]
+[INFO] guacamole-playback-example ......................... SUCCESS [  0.795 s]
+[INFO] guacamole-client ................................... SUCCESS [  7.478 s]
 [INFO] ------------------------------------------------------------------------
 [INFO] BUILD SUCCESS
 [INFO] ------------------------------------------------------------------------
-[INFO] Total time: 34.701 s
-[INFO] Finished at: 2015-06-08T17:03:15-07:00
-[INFO] Final Memory: 34M/340M
+[INFO] Total time: 01:41 min
+[INFO] Finished at: 2018-10-15T17:08:29-07:00
+[INFO] Final Memory: 42M/379M
 [INFO] ------------------------------------------------------------------------</computeroutput>
 <prompt>$</prompt></screen>
         </informalexample>
@@ -904,7 +924,7 @@
             application from the name of the <filename>.war</filename> file, you will likely want to
             rename this to simply <filename>guacamole.war</filename> while copying:</para>
         <informalexample>
-            <screen><prompt>#</prompt> <userinput>cp guacamole/target/guacamole-0.9.14.war <replaceable>/var/lib/tomcat/webapps</replaceable>/guacamole.war</userinput>
+            <screen><prompt>#</prompt> <userinput>cp guacamole/target/guacamole-1.0.0.war <replaceable>/var/lib/tomcat/webapps</replaceable>/guacamole.war</userinput>
 <prompt>#</prompt></screen>
         </informalexample>
         <para>Again, if you are using a different servlet container or if Tomcat is installed to a
@@ -922,7 +942,7 @@
 Starting Tomcat... OK</computeroutput>
 <prompt>#</prompt> <userinput>/etc/init.d/guacd start</userinput>
 <computeroutput>Starting guacd: SUCCESS
-guacd[6229]: INFO:  Guacamole proxy daemon (guacd) version 0.9.14 started</computeroutput>
+guacd[6229]: INFO:  Guacamole proxy daemon (guacd) version 1.0.0 started</computeroutput>
 <prompt>#</prompt></screen>
         </informalexample>
         <important>
diff --git a/src/chapters/jdbc-auth.xml b/src/chapters/jdbc-auth.xml
index 2964b46..eca6b58 100644
--- a/src/chapters/jdbc-auth.xml
+++ b/src/chapters/jdbc-auth.xml
@@ -61,11 +61,11 @@
                 <term><filename>mysql/</filename></term>
                 <listitem>
                     <para>Contains the MySQL/MariaDB authentication extension,
-                            <filename>guacamole-auth-jdbc-mysql-0.9.14.jar</filename>,
-                        along with a <filename>schema/</filename> directory containing
-                        MySQL-specific SQL scripts required to set up the database. The
-                            <filename>guacamole-auth-jdbc-mysql-0.9.14.jar</filename>
-                        file will ultimately need to be placed within
+                            <filename>guacamole-auth-jdbc-mysql-1.0.0.jar</filename>, along with a
+                            <filename>schema/</filename> directory containing MySQL-specific SQL
+                        scripts required to set up the database. The
+                            <filename>guacamole-auth-jdbc-mysql-1.0.0.jar</filename> file will
+                        ultimately need to be placed within
                             <filename>GUACAMOLE_HOME/extensions</filename>, while the MySQL JDBC
                         driver must be placed within <filename>GUACAMOLE_HOME/lib</filename>.</para>
                     <para><emphasis>The MySQL JDBC driver is not included with the
@@ -81,11 +81,11 @@
                 <term><filename>postgresql/</filename></term>
                 <listitem>
                     <para>Contains the PostgreSQL authentication extension,
-                            <filename>guacamole-auth-jdbc-postgresql-0.9.14.jar</filename>,
-                        along with a <filename>schema/</filename> directory containing
-                        PostgreSQL-specific SQL scripts required to set up the database. The
-                            <filename>guacamole-auth-jdbc-postgresql-0.9.14.jar</filename>
-                        file will ultimately need to be placed within
+                            <filename>guacamole-auth-jdbc-postgresql-1.0.0.jar</filename>, along
+                        with a <filename>schema/</filename> directory containing PostgreSQL-specific
+                        SQL scripts required to set up the database. The
+                            <filename>guacamole-auth-jdbc-postgresql-1.0.0.jar</filename> file will
+                        ultimately need to be placed within
                             <filename>GUACAMOLE_HOME/extensions</filename>, while the PostgreSQL
                         JDBC driver must be placed within
                         <filename>GUACAMOLE_HOME/lib</filename>.</para>
@@ -101,12 +101,12 @@
                 <term><filename>sqlserver/</filename></term>
                 <listitem>
                     <para>Contains the SQL Server authentication extension,
-                        <filename>guacamole-auth-jdbc-sqlserver-0.9.14.jar</filename>,
-                        along with a <filename>schema/</filename> directory contains SQL Server-specific
-                        scripts requires to set up the database.  The JAR extension file will need to be
-                        placed within the <filename>GUACAMOLE_HOME/extensions</filename> folder, while the
-                        SQL Server JDBC driver must be placed within the <filename>GUACAMOLE_HOME/lib</filename>
-                        directory.</para>
+                            <filename>guacamole-auth-jdbc-sqlserver-1.0.0.jar</filename>, along with
+                        a <filename>schema/</filename> directory contains SQL Server-specific
+                        scripts requires to set up the database. The JAR extension file will need to
+                        be placed within the <filename>GUACAMOLE_HOME/extensions</filename> folder,
+                        while the SQL Server JDBC driver must be placed within the
+                            <filename>GUACAMOLE_HOME/lib</filename> directory.</para>
                     <para><emphasis>The SQL Server JDBC driver is not included with the extension.</emphasis>  You
                         must obtain the JDBC driver <filename>.jar</filename> yourself and place it in the directory.
                         Furthermore, the SQL Server authentication extension supports a number of TDS-compatible
@@ -396,11 +396,11 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-jdbc-mysql-0.9.14.jar</filename>
+                <para>Copy <filename>guacamole-auth-jdbc-mysql-1.0.0.jar</filename>
                     <emphasis>or</emphasis>
-                    <filename>guacamole-auth-jdbc-postgresql-0.9.14.jar</filename>
+                    <filename>guacamole-auth-jdbc-postgresql-1.0.0.jar</filename>
                     <emphasis>or</emphasis>
-                    <filename>guacamole-auth-jdbc-sqlserver-0.9.14.jar</filename> within
+                    <filename>guacamole-auth-jdbc-sqlserver-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>, depending on whether you are
                     using MySQL/MariaDB, PostgreSQL, or SQL Server.</para>
             </step>
diff --git a/src/chapters/ldap-auth.xml b/src/chapters/ldap-auth.xml
index 9796676..d9f09e9 100644
--- a/src/chapters/ldap-auth.xml
+++ b/src/chapters/ldap-auth.xml
@@ -83,7 +83,7 @@
             containing:</para>
         <variablelist>
             <varlistentry>
-                <term><filename>guacamole-auth-ldap-0.9.14.jar</filename></term>
+                <term><filename>guacamole-auth-ldap-1.0.0.jar</filename></term>
                 <listitem>
                     <para>The Guacamole LDAP support extension itself, which must be placed in
                             <filename>GUACAMOLE_HOME/extensions</filename>.</para>
@@ -211,7 +211,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-ldap-0.9.14.jar</filename> within
+                <para>Copy <filename>guacamole-auth-ldap-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
@@ -359,27 +359,62 @@
                 <varlistentry>
                     <term><property>ldap-user-attributes</property></term>
                     <listitem>
-                        <para>The attribute or attributes to retrieve from the LDAP directory
-                            for the currently logged-in user. These attributes are stored as
-                            tokens with the prefix "GUAC_ATTR_" and the name of the attribute appended
-                            in uppercase letters. The value of the token is the value of the attribute
-                            in the LDAP directory for the currently logged-in user. If the attribute
-                            has no value in the LDAP directory then the token is not saved.
-                            If the attribute has multiple values in the LDAP directory then the token
-                            saves the first value of the attribute. Multiple attributes can be
-                            specified here, separated by commas.</para>
-                        <para>For example, if <property>ldap-user-attributes</property> is
-                            "<systemitem>mail, workstation</systemitem>", then a GUAC_ATTR_MAIL
-                            token would be set to the value of the mail attribute in the LDAP directory
-                            for the currently logged-in user and a GUAC_ATTR_WORKSTATION token
-                            would be set to the value of the workstation attribute similarly,
-                            contingent on the fact that the attributes have a value in the LDAP directory.
-                            So, the tokens could be used like this:
-                            <varname>${GUAC_ATTR_MAIL}</varname> or <varname>${GUAC_ATTR_WORKSTATION}</varname>.
-                            If the value of mail in the LDAP directory is "example@email.com" then
-                            <varname>${GUAC_ATTR_MAIL}</varname> would have the value "example@email.com".
-                            Tokens usage is discussed more in <xref linkend="configuring-guacamole"/> in
-                            <xref linkend="parameter-tokens"/>.</para>
+                        <para>The attribute or attributes to retrieve from the LDAP directory for
+                            the currently logged-in user, separated by commas. If specified, the
+                            attributes listed here are retrieved from each authenticated user and
+                            dynamically applied to the parameters of that user's connections as
+                                <link linkend="parameter-tokens">parameter tokens</link> with the
+                            prefix "<varname>LDAP_</varname>".</para>
+                        <para>When a user authenticates with LDAP and accesses a particular
+                            Guacamole connection, the values of these tokens will be the values of
+                            their corresponding attributes at the time of authentication. If the
+                            attribute has no value for the current user, then the corresponding
+                            token is not applied. If the attribute has multiple values, then the
+                            first value of the attribute is used.</para>
+                        <para>When converting an LDAP attribute name into a parameter token name,
+                            the name of the attribute is transformed into uppercase with each word
+                            separated by underscores, a naming convention referred to as "uppercase
+                            with underscores" or "<link
+                                xlink:href="https://en.wikipedia.org/wiki/Naming_convention_(programming)#Multiple-word_identifiers"
+                                >screaming snake case</link>". For example:</para>
+                        <table frame="all">
+                            <title>Example LDAP attribute / parameter token conversions</title>
+                            <tgroup cols="2">
+                                <colspec colname="c1" colnum="1" colwidth="1.0*"/>
+                                <colspec colname="c2" colnum="2" colwidth="1.0*"/>
+                                <thead>
+                                    <row>
+                                        <entry>LDAP Attribute</entry>
+                                        <entry>Parameter Token</entry>
+                                    </row>
+                                </thead>
+                                <tbody>
+                                    <row>
+                                        <entry><varname>lowercase-with-dashes</varname></entry>
+                                        <entry><varname>${LDAP_LOWERCASE_WITH_DASHES}</varname></entry>
+                                    </row>
+                                    <row>
+                                        <entry><varname>CamelCase</varname></entry>
+                                        <entry><varname>${LDAP_CAMEL_CASE}</varname></entry>
+                                    </row>
+                                    <row>
+                                        <entry><varname>headlessCamelCase</varname></entry>
+                                        <entry><varname>${LDAP_HEADLESS_CAMEL_CASE}</varname></entry>
+                                    </row>
+                                    <row>
+                                        <entry><varname>lettersAndNumbers1234</varname></entry>
+                                        <entry><varname>${LDAP_LETTERS_AND_NUMBERS_1234}</varname></entry>
+                                    </row>
+                                    <row>
+                                        <entry><varname>aRANDOM_mixOf-3NAMINGConventions</varname></entry>
+                                        <entry><varname>${LDAP_A_RANDOM_MIX_OF_3_NAMING_CONVENTIONS}</varname></entry>
+                                    </row>
+                                </tbody>
+                            </tgroup>
+                        </table>
+                        <para>Usage of parameter tokens is discussed in more detail in <xref
+                                linkend="configuring-guacamole"/> in <xref
+                                linkend="parameter-tokens"/>.</para>
                     </listitem>
                 </varlistentry>
                 <varlistentry>
diff --git a/src/chapters/openid-auth.xml b/src/chapters/openid-auth.xml
index 7d9365a..dbcd2dd 100644
--- a/src/chapters/openid-auth.xml
+++ b/src/chapters/openid-auth.xml
@@ -31,7 +31,7 @@
                 >http://guacamole.apache.org/releases/</link>.</para>
         <para>The OpenID Connect authentication extension is packaged as a
                 <filename>.tar.gz</filename> file containing only the extension itself,
-                <filename>guacamole-auth-openid-0.9.14.jar</filename>, which must ultimately be
+                <filename>guacamole-auth-openid-1.0.0.jar</filename>, which must ultimately be
             placed in <filename>GUACAMOLE_HOME/extensions</filename>.</para>
     </section>
     <section xml:id="installing-openid-auth">
@@ -48,7 +48,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-openid-0.9.14.jar</filename> within
+                <para>Copy <filename>guacamole-auth-openid-1.0.0.jar</filename> within
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
diff --git a/src/chapters/radius-auth.xml b/src/chapters/radius-auth.xml
index db2b38b..4334e97 100644
--- a/src/chapters/radius-auth.xml
+++ b/src/chapters/radius-auth.xml
@@ -29,7 +29,7 @@
             <screen><prompt>$</prompt> <userinput>mvn clean package -Plgpl-extensions</userinput>
 <computeroutput>[INFO] --- maven-assembly-plugin:2.5.3:single (make-source-archive) @ guacamole-client ---
 [INFO] Reading assembly descriptor: project-assembly.xml
-[INFO] Building tar: /home/guac/guacamole-client/target/guacamole-client-0.9.14.tar.gz
+[INFO] Building tar: /home/guac/guacamole-client/target/guacamole-client-1.0.0.tar.gz
 [INFO] ------------------------------------------------------------------------
 [INFO] Reactor Summary:
 [INFO] 
@@ -65,7 +65,7 @@
 
         <para>After the build completes successfully, the extension will be in the
             <filename>extensions/guacamole-auth-radius/target/</filename> directory, and will be
-            called guacamole-auth-radius-0.9.14.jar.  This extension file can be copied to
+            called guacamole-auth-radius-1.0.0.jar.  This extension file can be copied to
             the <filename>GUACAMOLE_HOME/extensions</filename> directory.
             <emphasis>If you are unsure where <varname>GUACAMOLE_HOME</varname> is located on
             your system, please consult <xref linkend="configuring-guacamole"/> before
@@ -86,7 +86,7 @@
                     does not already exist.</para>
             </step>
             <step>
-                <para>Copy <filename>guacamole-auth-radius-0.9.14.jar</filename> into
+                <para>Copy <filename>guacamole-auth-radius-1.0.0.jar</filename> into
                         <filename>GUACAMOLE_HOME/extensions</filename>.</para>
             </step>
             <step>
diff --git a/src/chapters/totp-auth.xml b/src/chapters/totp-auth.xml
new file mode 100644
index 0000000..4d85c66
--- /dev/null
+++ b/src/chapters/totp-auth.xml
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<chapter xml:id="totp-auth" xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en"
+    xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>TOTP two-factor authentication</title>
+    <indexterm>
+        <primary>TOTP</primary>
+    </indexterm>
+    <para>Guacamole supports TOTP as a second authentication factor, layered on top of any other
+        authentication extension, including those available from the main project website, providing
+            <link linkend="totp-prerequisites">base requirements for key storage and
+            enrollment</link> are met. The TOTP authentication extension allows users to be
+        additionally verified against a user-specific and secret key generated during <link
+            linkend="totp-enrollment">enrollment of their authentication device</link>.</para>
+    <important>
+        <para>This chapter involves modifying the contents of <varname>GUACAMOLE_HOME</varname> -
+            the Guacamole configuration directory. If you are unsure where
+                <varname>GUACAMOLE_HOME</varname> is located on your system, please consult <xref
+                linkend="configuring-guacamole"/> before proceeding.</para>
+    </important>
+    <section xml:id="totp-prerequisites">
+        <title>Prerequisites</title>
+        <para>The enrollment process used by Guacamole's TOTP support needs to be able to store an
+            automatically-generated key within the user's account, and will be operating with the
+            privileges of that user when it does so. With this in mind, there are requirements which
+            must be satisfied for TOTP to work as expected:</para>
+        <itemizedlist>
+            <listitem>
+                <para>Another extension must be installed which supports storage of arbitrary data
+                    from other extensions. <emphasis>Currently the only extensions provided with
+                        Guacamole which support this kind of storage are the <link
+                            linkend="jdbc-auth">database authentication
+                        extensions</link>.</emphasis></para>
+            </listitem>
+            <listitem>
+                <para>Within whichever extension provides the storage described above, users
+                    requiring TOTP must be granted permission to update their own accounts (to
+                    update their passwords, etc.). This privilege is managed within the <link
+                        linkend="user-management">administrative web interface</link> with a
+                    checkbox labeled "change own password". <emphasis>If a user lacks this
+                        permission, the TOTP extension will not be able to generate and store the
+                        user's TOTP key during enrollment, and TOTP will be disabled for that
+                        user.</emphasis></para>
+            </listitem>
+        </itemizedlist>
+        <para>It is thus recommended that authentication against a database be fully configured
+            prior to setting up TOTP. Instructions walking through the setup of database
+            authentication for Guacamole are provided in <xref linkend="jdbc-auth"/>.</para>
+    </section>
+    <section xml:id="totp-architecture">
+        <title>How TOTP works with Guacamole</title>
+        <para>Guacamole provides support for TOTP as a second authentication factor. To make use of
+            the TOTP authentication extension, some other authentication mechanism will need be
+            configured, as well. When a user attempts to log into Guacamole, other installed
+            authentication methods will be queried first:</para>
+        <informalfigure>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="images/totp-auth-factor-1.png" format="PNG"
+                        contentwidth="2in"/>
+                </imageobject>
+            </mediaobject>
+        </informalfigure>
+        <para>Only after authentication has succeeded with one of those methods will Guacamole
+            prompt the user to further verify their identity with an authentication code:</para>
+        <informalfigure>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="images/totp-auth-factor-2.png" format="PNG"
+                        contentwidth="4in"/>
+                </imageobject>
+            </mediaobject>
+        </informalfigure>
+        <para>If both the initial authentication attempt and verification using TOTP succeed, the
+            user will be allowed in. If either mechanism fails, access to Guacamole is
+            denied.</para>
+        <section xml:id="totp-enrollment">
+            <title>Enrollment</title>
+            <para>If the user does not yet have a TOTP key associated with their account (they have
+                not yet completed enrollment), they be required to enroll an authentication device
+                after passing the first authentication factor. A QR code containing an
+                automatically-generated key will be presented to the user to be scanned by their
+                authentication app or device:</para>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="images/totp-enroll.png" format="PNG" contentwidth="4in"/>
+                </imageobject>
+            </mediaobject>
+            <para>If the authentication device does not support scanning QR codes for enrollment,
+                the details within the QR code can be revealed by clicking the "Show" link next to
+                the "Details" header. These values can then be entered manually:</para>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="images/totp-enroll-detail.png" format="PNG"
+                        contentwidth="4in"/>
+                </imageobject>
+            </mediaobject>
+            <para>Enrollment is completed once the user enters a valid authentication code generated
+                by their device using the provided key.</para>
+        </section>
+    </section>
+    <section xml:id="totp-downloading">
+        <title>Downloading the TOTP extension</title>
+        <para>The TOTP authentication extension is available separately from the main
+                <filename>guacamole.war</filename>. The link for this and all other
+            officially-supported and compatible extensions for a particular version of Guacamole are
+            provided on the release notes for that version. You can find the release notes for
+            current versions of Guacamole here: <link
+                xlink:href="http://guacamole.apache.org/releases/"
+                >http://guacamole.apache.org/releases/</link>.</para>
+        <para>The TOTP authentication extension is packaged as a <filename>.tar.gz</filename> file
+            containing only the extension itself,
+            <filename>guacamole-auth-totp-1.0.0.jar</filename>, which must ultimately be placed in
+                <filename>GUACAMOLE_HOME/extensions</filename>.</para>
+    </section>
+    <section xml:id="installing-totp-auth">
+        <title>Installing TOTP authentication</title>
+        <para>Guacamole extensions are self-contained <filename>.jar</filename> files which are
+            located within the <filename>GUACAMOLE_HOME/extensions</filename> directory. To install
+            the TOTP authentication extension, you must:</para>
+        <procedure>
+            <step>
+                <para>Create the <filename>GUACAMOLE_HOME/extensions</filename> directory, if it
+                    does not already exist.</para>
+            </step>
+            <step>
+                <para>Copy <filename>guacamole-auth-totp-1.0.0.jar</filename> within
+                        <filename>GUACAMOLE_HOME/extensions</filename>.</para>
+            </step>
+            <step>
+                <para>Configure Guacamole to use TOTP authentication, as described below.</para>
+            </step>
+        </procedure>
+        <important>
+            <para>You will need to restart Guacamole by restarting your servlet container in order
+                to complete the installation. Doing this will disconnect all active users, so be
+                sure that it is safe to do so prior to attempting installation. If you do not
+                configure the TOTP authentication properly, Guacamole will not start up again until
+                the configuration is fixed.</para>
+        </important>
+        <section xml:id="guac-totp-config">
+            <title>Configuring Guacamole for TOTP</title>
+            <indexterm>
+                <primary>configuring TOTP</primary>
+            </indexterm>
+            <indexterm>
+                <primary>TOTP</primary>
+                <secondary>configuration</secondary>
+            </indexterm>
+            <para>With the exception of <link linkend="totp-prerequisites">the storage and
+                    permission requirements described above</link>, the TOTP extension should work
+                out-of-the-box without any additional configuration. Defaults have been chosen for
+                all configuration parameters such that the TOTP extension will be compatible with
+                Google Authenticator and similar, popular TOTP implementations.</para>
+            <para>If your intended authentication application or device has different requirements,
+                or you wish to override the defaults, additional properties may be specified within
+                    <filename>guacamole.properties</filename>:</para>
+            <variablelist>
+                <varlistentry>
+                    <term><property>totp-issuer</property></term>
+                    <listitem>
+                        <para>The human-readable name of the entity issuing user accounts. If not
+                            specified, "Apache Guacamole" will be used by default.</para>
+                    </listitem>
+                </varlistentry>
+                <varlistentry>
+                    <term><property>totp-digits</property></term>
+                    <listitem>
+                        <para>The number of digits which should be included in each generated TOTP
+                            code. Legal values are 6, 7, or 8. By default, 6-digit codes are
+                            generated.</para>
+                    </listitem>
+                </varlistentry>
+                <varlistentry>
+                    <term><property>totp-period</property></term>
+                    <listitem>
+                        <para>The duration that each generated code should remain valid, in seconds.
+                            By default, each code remains valid for 30 seconds.</para>
+                    </listitem>
+                </varlistentry>
+                <varlistentry>
+                    <term><property>totp-mode</property></term>
+                    <listitem>
+                        <para>The hash algorithm that should be used to generate TOTP codes. Legal
+                            values are "sha1", "sha256", and "sha512". By default, "sha1" is
+                            used.</para>
+                    </listitem>
+                </varlistentry>
+            </variablelist>
+        </section>
+        <section xml:id="completing-totp-install">
+            <title>Completing the installation</title>
+            <para>Guacamole will only reread <filename>guacamole.properties</filename> and load
+                newly-installed extensions during startup, so your servlet container will need to be
+                restarted before TOTP authentication will take effect. Restart your servlet
+                container and give the new authentication a try.</para>
+            <para>
+                <important>
+                    <para>You only need to restart your servlet container. <emphasis>You do not need
+                            to restart <package>guacd</package></emphasis>.</para>
+                    <para><package>guacd</package> is completely independent of the web application
+                        and does not deal with <filename>guacamole.properties</filename> or the
+                        authentication system in any way. Since you are already restarting the
+                        servlet container, restarting <package>guacd</package> as well technically
+                        won't hurt anything, but doing so is completely pointless.</para>
+                </important>
+            </para>
+            <para>If Guacamole does not come back online after restarting your servlet container,
+                check the logs. Problems in the configuration of the TOTP extension may prevent
+                Guacamole from starting up, and any such errors will be recorded in the logs of your
+                servlet container.</para>
+        </section>
+    </section>
+</chapter>
diff --git a/src/chapters/yourown.xml b/src/chapters/yourown.xml
index 7a2a479..a8889f8 100644
--- a/src/chapters/yourown.xml
+++ b/src/chapters/yourown.xml
@@ -112,7 +112,7 @@
     &lt;groupId>org.apache.guacamole&lt;/groupId>
     &lt;artifactId>guacamole-tutorial&lt;/artifactId>
     &lt;packaging>war&lt;/packaging>
-    &lt;version>0.9.14&lt;/version>
+    &lt;version>1.0.0&lt;/version>
     &lt;name>guacamole-tutorial&lt;/name>
 
     &lt;properties>
@@ -201,7 +201,7 @@
             </informalexample>
             <para>Assuming you see the "<computeroutput>BUILD SUCCESSFUL</computeroutput>" message
                 when you build the web application, there will be a new file,
-                    <filename>target/guacamole-tutorial-0.9.14.war</filename>, which
+                    <filename>target/guacamole-tutorial-1.0.0.war</filename>, which
                 can be deployed to your servlet container and tested. If you changed the name or
                 version of the project in the <filename>pom.xml</filename> file, the name of this new
                     <filename>.war</filename> file will be different, but it can still be found
@@ -304,7 +304,7 @@
         &lt;dependency>
             &lt;groupId>org.apache.guacamole&lt;/groupId>
             &lt;artifactId>guacamole-common&lt;/artifactId>
-            &lt;version>0.9.14&lt;/version>
+            &lt;version>1.0.0&lt;/version>
             &lt;scope>compile&lt;/scope>
         &lt;/dependency>
 
@@ -312,7 +312,7 @@
         &lt;dependency>
             &lt;groupId>org.apache.guacamole&lt;/groupId>
             &lt;artifactId>guacamole-common-js&lt;/artifactId>
-            &lt;version>0.9.14&lt;/version>
+            &lt;version>1.0.0&lt;/version>
             &lt;type>zip&lt;/type>
             &lt;scope>runtime&lt;/scope>
         &lt;/dependency>
@@ -331,7 +331,7 @@
                 web application should build successfully, and the Guacamole JavaScript API should
                 be accessible in the <filename>guacamole-common-js/</filename> subdirectory of your
                 web application after it is deployed. A quick check that you can access
-                    <uri>/guacamole-tutorial-0.9.14/guacamole-common-js/all.min.js</uri>
+                    <uri>/guacamole-tutorial-1.0.0/guacamole-common-js/all.min.js</uri>
                 is probably worth the effort.</para>
         </section>
         <section xml:id="simple-tunnel">
@@ -430,7 +430,7 @@
                 to the URL we wish to use when making HTTP requests to the servlet:
                     <uri>/tunnel</uri>. This URL is relative to the context root of the web
                 application. In the case of this web application, the final absolute URL will be
-                    <uri>/guacamole-tutorial-0.9.14/tunnel</uri>.</para>
+                    <uri>/guacamole-tutorial-1.0.0/tunnel</uri>.</para>
         </section>
         <section xml:id="simple-client">
             <title>Adding the client</title>
diff --git a/src/gug.xml b/src/gug.xml
index 424df7b..adf2a0c 100644
--- a/src/gug.xml
+++ b/src/gug.xml
@@ -3,7 +3,7 @@
     xmlns:xi="http://www.w3.org/2001/XInclude">
     <info>
         <title>Guacamole Manual</title>
-        <edition>0.9.14</edition>
+        <edition>1.0.0</edition>
         <legalnotice>
             <para>Licensed to the Apache Software Foundation (ASF) under one or more contributor
                 license agreements. See the <link xmlns:xlink="http://www.w3.org/1999/xlink"
@@ -42,7 +42,7 @@
             application, etc.) to give a good starting point beyond simply looking at the Guacamole
             codebase.</para>
         <para>This particular edition of the <citetitle>Guacamole Manual</citetitle> covers
-            Guacamole version 0.9.14. New releases which create new features or break
+            Guacamole version 1.0.0. New releases which create new features or break
             compatibility will result in new editions of the user's guide, as will any necessary
             corrections. As the official documentation for the project, this book will always be
             freely available in its entirety online.</para>
@@ -161,6 +161,7 @@
         <xi:include href="chapters/jdbc-auth.xml"/>
         <xi:include href="chapters/ldap-auth.xml"/>
         <xi:include href="chapters/duo-auth.xml"/>
+        <xi:include href="chapters/totp-auth.xml"/>
         <xi:include href="chapters/header-auth.xml"/>
         <xi:include href="chapters/cas-auth.xml"/>
         <xi:include href="chapters/openid-auth.xml"/>
diff --git a/tutorials/guacamole-auth-tutorial/pom.xml b/tutorials/guacamole-auth-tutorial/pom.xml
index 6e31acd..21b0862 100644
--- a/tutorials/guacamole-auth-tutorial/pom.xml
+++ b/tutorials/guacamole-auth-tutorial/pom.xml
@@ -7,7 +7,7 @@
     <groupId>org.apache.guacamole</groupId>
     <artifactId>guacamole-auth-tutorial</artifactId>
     <packaging>jar</packaging>
-    <version>0.9.14</version>
+    <version>1.0.0</version>
     <name>guacamole-auth-tutorial</name>
 
     <properties>
@@ -37,7 +37,7 @@
         <dependency>
             <groupId>org.apache.guacamole</groupId>
             <artifactId>guacamole-ext</artifactId>
-            <version>0.9.14</version>
+            <version>1.0.0</version>
             <scope>provided</scope>
         </dependency>
 
diff --git a/tutorials/guacamole-auth-tutorial/src/main/resources/guac-manifest.json b/tutorials/guacamole-auth-tutorial/src/main/resources/guac-manifest.json
index b6c1b26..bfa18a6 100644
--- a/tutorials/guacamole-auth-tutorial/src/main/resources/guac-manifest.json
+++ b/tutorials/guacamole-auth-tutorial/src/main/resources/guac-manifest.json
@@ -1,6 +1,6 @@
 {
 
-    "guacamoleVersion" : "0.9.14",
+    "guacamoleVersion" : "1.0.0",
 
     "name"      : "Tutorial Authentication Extension",
     "namespace" : "guac-auth-tutorial",
diff --git a/tutorials/guacamole-tutorial/pom.xml b/tutorials/guacamole-tutorial/pom.xml
index 2105f34..7ff060f 100644
--- a/tutorials/guacamole-tutorial/pom.xml
+++ b/tutorials/guacamole-tutorial/pom.xml
@@ -7,7 +7,7 @@
     <groupId>org.apache.guacamole</groupId>
     <artifactId>guacamole-tutorial</artifactId>
     <packaging>war</packaging>
-    <version>0.9.14</version>
+    <version>1.0.0</version>
     <name>guacamole-tutorial</name>
 
     <properties>
@@ -62,7 +62,7 @@
         <dependency>
             <groupId>org.apache.guacamole</groupId>
             <artifactId>guacamole-common</artifactId>
-            <version>0.9.14</version>
+            <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
 
@@ -70,7 +70,7 @@
         <dependency>
             <groupId>org.apache.guacamole</groupId>
             <artifactId>guacamole-common-js</artifactId>
-            <version>0.9.14</version>
+            <version>1.0.0</version>
             <type>zip</type>
             <scope>runtime</scope>
         </dependency>