# HG changeset patch
# Node ID e5a50132dbb0
# Parent  862153de4f30
diff --git a/convey.yaml b/convey.yaml
--- a/convey.yaml
+++ b/convey.yaml
@@ -46,7 +46,7 @@
     type: docker/export
     files:
       - build-docs/doc/reference/finch/finch/:finch3-docs
-      - build-docs/doc/reference/libpurple/html/:purple3-docs
+      - build-docs/doc/reference/libpurple/libpurple/:purple3-docs
       - build-docs/doc/reference/pidgin/pidgin/:pidgin3-docs
       - build-docs/doc/reference/protocols/facebook/facebook/:facebook3-docs
 
diff --git a/doc/reference/libpurple/code_contributions.xml b/doc/reference/libpurple/code_contributions.md
rename from doc/reference/libpurple/code_contributions.xml
rename to doc/reference/libpurple/code_contributions.md
--- a/doc/reference/libpurple/code_contributions.xml
+++ b/doc/reference/libpurple/code_contributions.md
@@ -1,127 +1,92 @@
-<?xml version='1.0' encoding="UTF-8"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-code-contributions">
-  <title>Code Contributions</title>
+Title: Code Contributions
+Slug: code-contributions
+
+## Code Contributions
 
-  <sect2 id="introduction">
-    <title>Introduction</title>
-    <para>
-      All of the Pidgin related projects use
-      <ulink url="https://reviewboard.org">Review Board</ulink> for handling
-      contributions at
-      <ulink url="https://reviews.imfreedom.org">reviews.imfreedom.org</ulink>.
-    </para>
-  </sect2>
+### Introduction
+
+All of the Pidgin related projects use [Review
+Board](https://reviewboard.org/") for handling contributions at
+[reviews.imfreedom.org](https://reviews.imfreedom.org).
 
-  <sect2 id="first-time-setup">
-    <title>First Time Setup</title>
-    <para>
-      There are a few things you'll need to set up to be able to submit a code
-      review to these projects. This includes installing
-      <ulink url="https://www.reviewboard.org/downloads/rbtools/">RBTools</ulink>
-      as well as some additional
-      <ulink url="https://www.mercurial-scm.org/">Mercurial</ulink>
-      configuration.
-    </para>
+### First Time Setup
 
-    <sect3 id="install-rbtools">
-      <title>Install RBTools</title>
+There are a few things you'll need to set up to be able to submit a code
+review to these projects. This includes installing
+[RBTools](https://www.reviewboard.org/downloads/rbtools/)
+as well as some additional
+[Mercurial](https://www.mercurial-scm.org/)
+configuration.
 
-      <para>
-        The recommended way to install RBTools is via pip and can be done with
-        the following command.
-      </para>
+#### Install RBTools
 
-      <programlisting>
-pip3 install -U "RBTools>=1.0.3"
-</programlisting>
+The recommended way to install RBTools is via pip and can be done with the
+following command.
 
-      <para>
-        Once RBTools is installed you need to make sure that <code>rbt</code>
-        is available on your <code>$PATH</code>. To do this, you may need to
-        add <code>$HOME/.local/bin</code> to your <code>$PATH</code>. The exact
-        procedure to do this is dependent on your setup and outside of the
-        scope of this document.
-      </para>
-    </sect3>
+```sh
+pip3 install -U "RBTools>=1.0.3"
+```
+Once RBTools is installed you need to make sure that `rbt` is available on your
+`$PATH`. To do this, you may need to add `$HOME/.local/bin` to your `$PATH`.
+The exact procedure to do this is dependent on your setup and outside of the
+scope of this document.
 
-    <sect3 id="configure-mercurial">
-      <title>Mercurial Configuration</title>
+#### Mercurial Configuration
 
-      <para>
-        This configuration for Mercurial is to make your life as a contributor
-        easier. There a few different ways to configure Mercurial, but these
-        instructions will update your user specific configuration in
-        <code>$HOME/.hgrc</code>.
-      </para>
+This configuration for Mercurial is to make your life as a contributor easier.
+There a few different ways to configure Mercurial, but these instructions will
+update your user specific configuration in `$HOME/.hgrc`.
 
-      <para>
-        The first thing we need to do is to install the evolve extension. This
-        extension makes rewriting history safe and we use it extensively in our
-        repositories. You can install it with a simple <code>pip3 install -U
-        hg-evolve</code>. We will enable it below with some other bundled
-        extensions, but you can find more information about it
-        <ulink url="https://www.mercurial-scm.org/wiki/EvolveExtension">here</ulink>.
-      </para>
+The first thing we need to do is to install the evolve extension. This
+extension makes rewriting history safe and we use it extensively in our
+repositories. You can install it with a simple `pip3 install -U hg-evolve`. We
+will enable it below with some other bundled extensions, but you can find more
+information about it
+[here](https://www.mercurial-scm.org/wiki/EvolveExtension).
+
+When working with Mercurial repositories it is very important to make sure that
+your username is set properly as it is added to every commit you make. To set
+your username you must add it to the `[ui]` section in your `$HOME/.hgrc` like
+the following example.
 
-      <para>
-        When working with Mercurial repositories it is very important to make
-        sure that your username is set properly as it is added to every commit
-        you make. To set your username you must add it to the <code>[ui]</code>
-        section in your <code>$HOME/.hgrc</code> like the following example.
-      </para>
-
-      <programlisting>
+```ini
 [ui]
-username = Full Name &lt;email@example.com&gt;
-</programlisting>
+username = Full Name <email@example.com>
+```
 
-      <para>
-         Next we need to make sure that the <emphasis>evolve</emphasis>
-         and <emphasis>rebase</emphasis> extensions are loaded. To do so add the
-         lines in the following example. You do not need to put anything after
-         the <code>=</code> as this will tell Mercurial to look for them in the
-         default places for extensions.
-      </para>
+Next we need to make sure that the ***evolve*** and ***rebase*** extensions are
+loaded. To do so add the lines in the following example. You do not need to put
+anything after the `=` as this will tell Mercurial to look for them in the
+default places for extensions.
 
-      <programlisting>
+```ini
 [extensions]
 evolve =
 rebase =
-</programlisting>
+```
 
-      <para>
-        Next we're going to create a <emphasis>revsetalias</emphasis>. This will
-        be used to make it easier to look at your history and submit your review
-        request.
-      </para>
+Next we're going to create a ***revsetalias***. This will be used to make it
+easier to look at your history and submit your review request.
 
-      <programlisting>
+```ini
 [revsetalias]
 wip = only(.,default)
-</programlisting>
+```
 
-      <para>
-        This alias will show us just the commits that are on our working branch
-        and not on the default branch. The default branch is where all
-        accepted code contributions go. Optionally, you can add the
-        <code>wip</code> command alias below which will show you the revision
-        history of what you are working on.
-      </para>
+This alias will show us just the commits that are on our working branch and not
+on the default branch. The default branch is where all accepted code
+contributions go. Optionally, you can add the `wip` command alias below which
+will show you the revision history of what you are working on.
 
-      <programlisting>
+```ini
 [alias]
 wip = log --graph --rev wip
-</programlisting>
+```
 
-      <para>
-        There are quite a few other useful configuration changes you can make,
-        and a few examples can be found below.
-      </para>
+There are quite a few other useful configuration changes you can make, and a
+few examples can be found below.
 
-      <programlisting>
+```ini
 [ui]
 # update a large number of settings for a better user experience, highly
 # recommended!!
@@ -130,16 +95,14 @@
 [alias]
 # make hg log show the graph as well as commit phase
 lg = log --graph --template phases
-</programlisting>
+```
 
-      <para>
-        Below is all of the above configuration settings to make it easier to
-        copy/paste.
-      </para>
+Below is all of the above configuration settings to make it easier to
+copy/paste.
 
-      <programlisting>
+```ini
 [ui]
-username = Full Name &lt;email@example.com&gt;
+username = Full Name <email@example.com>
 # update a large number of settings for a better user experience, highly
 # recommended!!
 tweakdefaults = true
@@ -157,304 +120,211 @@
 
 [revsetalias]
 wip = only(.,default)
-</programlisting>
-    </sect3>
+```
 
-    <sect3 id="login">
-      <title>Log in to Review Board</title>
+#### Log in to Review Board
 
-      <para>
-        To be able to submit a review request you need to have an account on
-        our JetBrains Hub instance at
-        <ulink url="https://hub.imfreedom.org">hub.imfreedom.org</ulink>. You
-        can create an account here in a number of ways and even turn on two
-        factor authentication. But please note that if you turn on two factor
-        authentication you will need to create an
-        <ulink url="https://www.jetbrains.com/help/hub/application-passwords.html">application password</ulink>
-        to be able to login to Review Board.
-      </para>
+To be able to submit a review request you need to have an account on our
+JetBrains Hub instance at [hub.imfreedom.org](https://hub.imfreedom.org). You
+can create an account here in a number of ways and even turn on two factor
+authentication. But please note that if you turn on two factor authentication
+you will need to create an [application
+password](https://www.jetbrains.com/help/hub/application-passwords.html) to be
+able to login to Review Board.
 
-      <para>
-        Once you have that account you can use it to login our Review Board
-        instance at
-        <ulink url="https://reviews.imfreedom.org">reviews.imfreedom.org</ulink>.
-        Please note, you will have to login via the web interface before being
-        able to use RBTools.
-      </para>
+Once you have that account you can use it to login our Review Board instance at
+[reviews.imfreedom.org](https://reviews.imfreedom.org).  Please note, you will
+have to login via the web interface before being able to use RBTools.
 
-      <para>
-        Once you have an account and have logged into our Review Board site, you
-        can begin using RBTools. In your shell, navigate to a Mercurial clone of
-        one of the Pidgin or purple-related projects, then run the
-        <code>rbt login</code> command. You should only need to do this once,
-        unless you change your password or have run the <code>rbt logout</code>
-        command.
-      </para>
-    </sect3>
-  </sect2>
+Once you have an account and have logged into our Review Board site, you can
+begin using RBTools. In your shell, navigate to a Mercurial clone of one of the
+Pidgin or purple-related projects, then run the `rbt login` command. You should
+only need to do this once, unless you change your password or have run the `rbt
+logout` command.
+
+### Creating a New Review Request
 
-  <sect2 id="create">
-    <title>Creating a New Review Request</title>
+Before starting a new review request, you should make sure that your
+local copy of the repository is up to date. To do so, make sure you are
+on the ***default*** branch via
+`hg update default`. Once you are on the
+***default*** branch, you can update your copy with
+`hg pull --update`. Now that you're starting with the most
+recent code, you can proceed with your contributions.
 
-    <para>
-      Before starting a new review request, you should make sure that your
-      local copy of the repository is up to date. To do so, make sure you are
-      on the <emphasis>default</emphasis> branch via
-      <code>hg update default</code>. Once you are on the
-      <emphasis>default</emphasis> branch, you can update your copy with
-      <code>hg pull --update</code>. Now that you're starting with the most
-      recent code, you can proceed with your contributions.
-    </para>
+While it's not mandatory, it is highly recommended that you work on your
+contributions via a branch. If you don't go this path, you will have
+issues after your review request is merged. This branch name can be
+whatever you like as it will not end up in the main repositories, and
+you can delete it from your local repository after it is merged. See
+[cleanup](#cleanup) for more information.
 
-    <para>
-      While it's not mandatory, it is highly recommended that you work on your
-      contributions via a branch. If you don't go this path, you will have
-      issues after your review request is merged. This branch name can be
-      whatever you like as it will not end up in the main repositories, and
-      you can delete it from your local repository after it is merged. See
-      <link linkend="cleanup">cleanup</link> for more information.
-    </para>
+You can create the branch with the following command:
 
-    <para>
-      You can create the branch with the following command:
-    </para>
+```sh
+hg branch my-new-branch-name
+```
 
-    <programlisting>
-hg branch my-new-branch-name
-</programlisting>
+Now that you have a branch started, you can go ahead and work like you normally
+would, committing your code at logical times, etc. Once you have some work
+committed and you are ready to create a new review request, you can type `rbt
+post wip` and you should be good to go. This will create a new review request
+using all of the committed work in your repository and will output something
+like below.
 
-    <para>
-      Now that you have a branch started, you can go ahead and work like you
-      normally would, committing your code at logical times, etc. Once you
-      have some work committed and you are ready to create a new review
-      request, you can type <code>rbt post wip</code> and you should be good to
-      go. This will create a new review request using all of the committed work
-      in your repository and will output something like below.
-    </para>
-
-    <programlisting language="screen">
+```sh
 Review request #403 posted.
 
 https://reviews.imfreedom.org/r/403/
 https://reviews.imfreedom.org/r/403/diff/
-</programlisting>
+```
 
-    <para>
-      At this point, your review request has been posted, but it is not yet
-      published. This means no one can review it yet. To do that, you need to
-      go to the URL that was output from your <code>rbt post</code> command
-      and verify that everything looks correct. If this review request fixes
-      any bugs, please make sure to enter their numbers in the bugs field on
-      the right. Also, be sure to review the actual diff yourself to make sure
-      it includes what you intended it to and nothing extra.
-    </para>
+At this point, your review request has been posted, but it is not yet
+published. This means no one can review it yet. To do that, you need to go to
+the URL that was output from your `rbt post` command and verify that everything
+looks correct. If this review request fixes any bugs, please make sure to enter
+their numbers in the bugs field on the right. Also, be sure to review the
+actual diff yourself to make sure it includes what you intended it to and
+nothing extra.
 
-    <para>
-      Once you are happy with the review request, you can hit the publish
-      button which will make the review request public and alert the reviewers
-      of its creation. Optionally you can pass <code>--open</code> to
-      <code>rbt post</code> in the future to automatically open the draft
-      review in your web browser.
-    </para>
+Once you are happy with the review request, you can hit the publish button
+which will make the review request public and alert the reviewers of its
+creation. Optionally you can pass `--open` to `rbt post` in the future to
+automatically open the draft review in your web browser.
 
-    <para>
-      <code>rbt post</code> has a ton of options, so be sure to check them out
-      with <code>rbt post --help</code>. There are even options to
-      automatically fill out the bugs fixed fields among other things.
-    </para>
-  </sect2>
+`rbt post` has a ton of options, so be sure to check them out with `rbt post
+--help`. There are even options to automatically fill out the bugs fixed fields
+among other things.
 
-  <sect2 id="update">
-    <title>Updating an Existing Review Request</title>
+### Updating an Existing Review Request
 
-    <para>
-      Typically with a code review, you're going to need to make some updates.
-      However there's also a good chance that your original branching point
-      has changed as other contributions are accepted. To deal with this you'll
-      need to rebase your branch on top of the new changes.
-    </para>
+Typically with a code review, you're going to need to make some updates.
+However there's also a good chance that your original branching point has
+changed as other contributions are accepted. To deal with this you'll need to
+rebase your branch on top of the new changes.
 
-    <para>
-      Rebasing, as the name suggests is the act of replaying your previous
-      commits on top of a new base revision. Mercurial makes this pretty easy.
-      First, make sure you are on your branch with
-      <code>hg up my-branch-name</code>.  Now you can preview the rebase with
-      <code>hg rebase -d default --keepbranches --dry-run</code>. We prefer
-      doing a dry-run just to make sure there aren't any major surprises. You
-      may run into some conflicts, but those will have to be fixed regardless.
-    </para>
+Rebasing, as the name suggests is the act of replaying your previous
+commits on top of a new base revision. Mercurial makes this pretty easy.
+First, make sure you are on your branch with
+`hg up my-branch-name`.  Now you can preview the rebase with
+`hg rebase -d default --keepbranches --dry-run`. We prefer
+doing a dry-run just to make sure there aren't any major surprises. You
+may run into some conflicts, but those will have to be fixed regardless.
 
-    <para>
-      If everything looks good, you can run the actual rebase with
-      <code>hg rebase -d default --keepbranches</code>. Again if you run into
-      any conflicts, you will have to resolve them and they will cause the
-      dry-run to fail. Once you have fixed the merge conflicts, you'll then
-      need to mark the files as resolved with
-      <code>hg resolve --mark filename</code>. When you have resolved all of
-      the conflicted files you can continue the rebase with
-      <code>hg rebase --continue</code>. You may run into multiple conflicts,
-      so just repeat until you're done.
-    </para>
+If everything looks good, you can run the actual rebase with `hg rebase -d
+default --keepbranches`. Again if you run into any conflicts, you will have to
+resolve them and they will cause the dry-run to fail. Once you have fixed the
+merge conflicts, you'll then need to mark the files as resolved with `hg
+resolve --mark filename`. When you have resolved all of the conflicted files
+you can continue the rebase with `hg rebase --continue`. You may run into
+multiple conflicts, so just repeat until you're done.
 
-    <para>
-      After rebasing you can start addressing the comments in your review and
-      commit them.  Once they are committed, you can update your existing
-      review request with <code>rbt post --update</code>. If for some reason
-      <code>rbt</code> can not figure out the proper review request to
-      update, you can pass the number in via
-      <code>rbt post --review-request-id #</code>. Note that when using
-      <code>--review-request-id</code> you no longer need to specify
-      <code>--update</code>.
-    </para>
+After rebasing you can start addressing the comments in your review and commit
+them.  Once they are committed, you can update your existing review request
+with `rbt post --update`. If for some reason `rbt` can not figure out the
+proper review request to update, you can pass the number in via `rbt post
+--review-request-id #`. Note that when using `--review-request-id` you no
+longer need to specify `--update`.
 
-    <para>
-      Just like an initial <code>rbt post</code>, the updated version will be
-      in a draft state until you publish it. So again, you'll need to visit the
-      URL that was output, verify everything, and click the publish button.
-    </para>
-  </sect2>
+Just like an initial `rbt post`, the updated version will be in a draft state
+until you publish it. So again, you'll need to visit the URL that was output,
+verify everything, and click the publish button.
 
-  <sect2 id="land">
-    <title>Landing a Review Request</title>
+### Landing a Review Request
+
+This will typically only be done by the Pidgin developers with push access. If
+you want to test a patch from a review request, please see the [patch](#path)
+section below.
 
-    <para>
-      This will typically only be done by the Pidgin developers with push
-      access. If you want to test a patch from a review request, please see the
-      <link linkend="patch">patch</link> section below.
-    </para>
-
-    <para>
-      It is <emphasis>HIGHLY</emphasis> recommended that you use a separate
-      clone of the repository in question when you want to land review requests.
-      This makes it much easier to avoid accidentally pushing development work
-      to the canonical repository which makes everyone's life easier. Also, the
-      mainline repositories now auto publish, so if you do not selectively push
-      commits, all of your draft commits will be published. You can name this
-      additional clone whatever you like, but using something like
-      <code>pidgin-clean</code> is a fairly common practice. This makes it easy
-      for you to know that this clone is only meant for landing review requests,
-      and other admistrative work like updating the ChangeLog and COPYRIGHT
-      files.
-    </para>
+It is ***HIGHLY*** recommended that you use a separate clone of the repository
+in question when you want to land review requests.  This makes it much easier
+to avoid accidentally pushing development work to the canonical repository
+which makes everyone's life easier. Also, the mainline repositories now auto
+publish, so if you do not selectively push commits, all of your draft commits
+will be published. You can name this additional clone whatever you like, but
+using something like `pidgin-clean` is a fairly common practice. This makes it
+easy for you to know that this clone is only meant for landing review requests,
+and other admistrative work like updating the ChangeLog and COPYRIGHT files.
 
-    <para>
-      When you are ready to land a review request you need to make sure you are
-      on the proper branch. In most cases this will be the branch named
-      <emphasis>default</emphasis> and can be verified by running the command
-      <code>hg branch</code>. Next you need to make sure that your local copy
-      is up to date. You can do this by running <code>hg pull --update</code>.
-    </para>
+When you are ready to land a review request you need to make sure you are on
+the proper branch. In most cases this will be the branch named ***default***
+and can be verified by running the command `hg branch`. Next you need to make
+sure that your local copy is up to date. You can do this by running `hg pull
+--update`.
 
-    <para>
-      Please note, if you run <code>hg pull</code> and then immediately run
-      <code>hg pull --update</code> you will <emphasis>not</emphasis> update to
-      the most recent commit as this new invocation of <code>hg pull</code> has
-      not actually pulled in any new commits. To properly update, you'll need
-      to run <code>hg update</code> instead.
-    </para>
+Please note, if you run `hg pull` and then immediately run `hg pull --update`
+you will ***not*** update to the most recent commit as this new invocation of
+`hg pull` has not actually pulled in any new commits. To properly update,
+you'll need to run `hg update` instead.
 
-    <para>
-      Once your local copy is up to date you can land the review request with
-      <code>rbt land --no-push --review-request-id #</code> where <code>#</code>
-      is the number of the review request you are landing. The
-      <code>--no-push</code> argument is to disable pushing this commit
-      immediately. Most of our configuration already enables this flag for you,
-      but if you're in doubt, please use the <code>--no-push</code> argument.
-    </para>
+Once your local copy is up to date you can land the review request with `rbt
+land --no-push --review-request-id #` where `#` is the number of the review
+request you are landing. The `--no-push` argument is to disable pushing this
+commit immediately. Most of our configuration already enables this flag for
+you, but if you're in doubt, please use the `--no-push` argument.
 
-    <para>
-      Once the review request has been landed, make sure to verify that the
-      revision history looks correct, run a test build as well as the unit
-      tests, and if everything looks good, you can continue with the
-      housekeeping before we finally push the new commits.
-    </para>
+Once the review request has been landed, make sure to verify that the revision
+history looks correct, run a test build as well as the unit tests, and if
+everything looks good, you can continue with the housekeeping before we finally
+push the new commits.
 
-    <para>
-      The housekeeping we need to do entails a few things. If this is a big new
-      feature or bug fix, we should be documenting this in the ChangeLog file
-      for the repository. Please follow the existing convention of mentioning
-      the contributor as well as the issues addressed and the review request
-      number. Likewise, if this is someone's first contribution you will need
-      to add them to the COPYRIGHT file in the repository as well. If you had
-      to update either of these files, review your changes and commit them
-      directly.
-    </para>
+The housekeeping we need to do entails a few things. If this is a big new
+feature or bug fix, we should be documenting this in the ChangeLog file for the
+repository. Please follow the existing convention of mentioning the contributor
+as well as the issues addressed and the review request number. Likewise, if
+this is someone's first contribution you will need to add them to the COPYRIGHT
+file in the repository as well. If you had to update either of these files,
+review your changes and commit them directly.
 
-    <para>
-      Now that any updates to ChangeLog and COPYRIGHT are completed, we can
-      actually start pushing the changes back to the canonical repository.
-      Currently not all of the canonical repositories are publishing
-      repositories so we'll need to manually mark the commits as public. This
-      is easily accomplished with <code>hg phase --public</code>.
-      <emphasis>Note</emphasis>, if you are not using a separate clone of the
-      canonical repository you will need to specify a revision to avoid
-      publishing every commit in your repository. If you run into issues or
-      have more questions about phases see the
-      <ulink url="https://www.mercurial-scm.org/wiki/Phases">official documentation</ulink>.
-    </para>
+Now that any updates to ChangeLog and COPYRIGHT are completed, we can actually
+start pushing the changes back to the canonical repository.  Currently not all
+of the canonical repositories are publishing repositories so we'll need to
+manually mark the commits as public. This is easily accomplished with `hg phase
+--public`.  ***Note***, if you are not using a separate clone of the canonical
+repository you will need to specify a revision to avoid publishing every commit
+in your repository. If you run into issues or have more questions about phases
+see the [official documentation](https://www.mercurial-scm.org/wiki/Phases).
 
-    <para>
-      Now that the changes have been made public, we can finally push to the
-      canonical repository with <code>hg push</code>. Once that is done, you'll
-      also need to go and mark the review request as
-      <emphasis>Submitted</emphasis> in the Review Board web interface.
-    </para>
-  </sect2>
+Now that the changes have been made public, we can finally push to the
+canonical repository with `hg push`. Once that is done, you'll also need to go
+and mark the review request as ***Submitted*** in the Review Board web
+interface.
 
-  <sect2 id="patch">
-    <title>Testing Patches Locally</title>
+### Testing Patches Locally
+
+If you want to test a patch locally for any reason, you first need to make sure
+that you are on the target branch for the review request which is listed on the
+review request page. In most cases this will be the ***default*** branch.
+Regardless you'll need to run `hg up branch-name` before applying the patch.
 
-    <para>
-      If you want to test a patch locally for any reason, you first need to
-      make sure that you are on the target branch for the review request which
-      is listed on the review request page. In most cases this will be the
-      <emphasis>default</emphasis> branch. Regardless you'll need to run
-      <code>hg up branch-name</code> before applying the patch.
-    </para>
-
-    <para>
-      Now that you are on the correct branch, you can apply the patch with
-      <code>rbt patch #</code> where <code>#</code> is the id of the review
-      request you want to test. This will apply the patch from the review
-      request to your working copy without committing it.
-    </para>
+Now that you are on the correct branch, you can apply the patch with
+`rbt patch #` where `#` is the id of the review request you want to test. This
+will apply the patch from the review request to your working copy without
+committing it.
 
-    <para>
-      Once you're done with your testing you can remove the changes with
-      <code>hg revert --no-backup --all</code>. This will return your
-      repository to exactly what it was before the patch was applied. The
-      <code>--no-backup</code> argument says to not save the changes that you
-      are reverting and the <code>--all</code> argument tells Mercurial to
-      revert all files.
-    </para>
-  </sect2>
+Once you're done with your testing you can remove the changes with `hg revert
+--no-backup --all`. This will return your repository to exactly what it was
+before the patch was applied. The `--no-backup` argument says to not save the
+changes that you are reverting and the `--all` argument tells Mercurial to
+revert all files.
+
+### Cleaning up a Landed of Discarded Review Request
 
-  <sect2 id="cleanup">
-    <title>Cleaning up a Landed or Discarded Review Request</title>
+Whether or not your pull request has been accepted, you probably want to clean
+it up from your local repository. To do so, you need to update to a branch
+other than the branch you built it on. In the following example, we're going to
+remove the branch named ***my-new-branch-name*** that we used to create a
+review request.
 
-    <para>
-      Whether or not your pull request has been accepted, you probably want to
-      clean it up from your local repository. To do so, you need to update to
-      a branch other than the branch you built it on. In the following example,
-      we're going to remove the branch named
-      <emphasis>my-new-branch-name</emphasis> that we used to create a review
-      request.
-    </para>
-
-    <programlisting>
+```sh
 hg up default
 hg prune -r 'branch(my-new-branch-name)'
-</programlisting>
+```
 
-    <para>
-      Now, all commits that were on the <emphasis>my-new-branch-name</emphasis>
-      branch will have their contents removed but interally Mercurial keeps
-      track that these revisions have been deleted.
-    </para>
+Now, all commits that were on the ***my-new-branch-name*** branch will have
+their contents removed but interally Mercurial keeps track that these revisions
+have been deleted.
 
-    <para>
-      You can repeat this for any other branches you need to clean up, and
-      you're done!
-    </para>
-  </sect2>
-</chapter>
+You can repeat this for any other branches you need to clean up, and you're
+done!
+
diff --git a/doc/reference/libpurple/libpurple-docs.xml b/doc/reference/libpurple/libpurple-docs.xml
deleted file mode 100644
--- a/doc/reference/libpurple/libpurple-docs.xml
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-
-<!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
-<!ENTITY version SYSTEM "version.xml">
-]>
-<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
-  <bookinfo>
-    <title>Purple Reference Manual</title>
-    <abstract>
-      <title>Libpurple &version;</title>
-      <para>
-        libpurple is intended to be the core of an IM program. Pidgin is a GTK+
-        frontend to libpurple, and Finch is an ncurses frontend built using
-        libgnt (GLib Ncurses Toolkit).
-      </para>
-    </abstract>
-  </bookinfo>
-
-  <part id="development">
-    <title>Development</title>
-
-    <xi:include href="mercurial.xml" />
-    <xi:include href="code_contributions.xml" />
-  </part>
-
-  <part id="tutorial">
-    <title>Tutorials</title>
-
-      <xi:include href="tut_c_plugins.xml" />
-      <xi:include href="tut_signals.xml" />
-  </part>
-
-  <part id="API">
-	  <title>API Reference</title>
-
-      <xi:include href="xml/account.xml" />
-      <xi:include href="xml/accounts.xml" />
-      <xi:include href="xml/action.xml" />
-      <xi:include href="xml/blistnode.xml" />
-      <xi:include href="xml/buddy.xml" />
-      <xi:include href="xml/buddylist.xml" />
-      <xi:include href="xml/buddyicon.xml" />
-      <xi:include href="xml/chat.xml" />
-      <xi:include href="xml/circularbuffer.xml" />
-      <xi:include href="xml/contact.xml" />
-      <xi:include href="xml/connection.xml" />
-      <xi:include href="xml/conversations.xml" />
-      <xi:include href="xml/countingnode.xml" />
-      <xi:include href="xml/debug.xml" />
-      <xi:include href="xml/eventloop.xml" />
-      <xi:include href="xml/group.xml" />
-      <xi:include href="xml/xfer.xml" />
-      <xi:include href="xml/idle.xml" />
-      <xi:include href="xml/memorypool.xml" />
-      <xi:include href="xml/nat-pmp.xml" />
-      <xi:include href="xml/network.xml" />
-      <xi:include href="xml/notify.xml" />
-      <xi:include href="xml/plugins.xml" />
-      <xi:include href="xml/prefs.xml" />
-      <xi:include href="xml/pluginpref.xml" />
-      <xi:include href="xml/proxy.xml" />
-      <xi:include href="xml/purple-gio.xml" />
-      <xi:include href="xml/purpleaccountoption.xml" />
-      <xi:include href="xml/purpleaccountpresence.xml" />
-      <xi:include href="xml/purpleaccountusersplit.xml" />
-      <xi:include href="xml/purpleattentiontype.xml" />
-      <xi:include href="xml/purplebuddypresence.xml" />
-      <xi:include href="xml/purplechatconversation.xml" />
-      <xi:include href="xml/purplechatuser.xml" />
-      <xi:include href="xml/purpleconversation.xml" />
-      <xi:include href="xml/purpleconversationmanager.xml" />
-      <xi:include href="xml/purpleconversationuiops.xml" />
-      <xi:include href="xml/purpledebugui.xml" />
-      <xi:include href="xml/purplehistoryadapter.xml" />
-      <xi:include href="xml/purplehistorymanager.xml" />
-      <xi:include href="xml/purpleimconversation.xml" />
-      <xi:include href="xml/purplekeyvaluepair.xml" />
-      <xi:include href="xml/purplemarkup.xml" />
-      <xi:include href="xml/purpleoptions.xml" />
-      <xi:include href="xml/purpleplugininfo.xml" />
-      <xi:include href="xml/purplepresence.xml" />
-      <xi:include href="xml/purplewhiteboard.xml" />
-      <xi:include href="xml/purplewhiteboardmanager.xml" />
-      <xi:include href="xml/purplewhiteboardops.xml" />
-      <xi:include href="xml/purplewhiteboarduiops.xml" />
-      <xi:include href="xml/purpleuiinfo.xml" />
-      <xi:include href="xml/queuedoutputstream.xml" />
-      <xi:include href="xml/signals.xml" />
-      <xi:include href="xml/request.xml" />
-      <xi:include href="xml/request-datasheet.xml" />
-      <xi:include href="xml/roomlist.xml" />
-      <xi:include href="xml/savedstatuses.xml" />
-      <xi:include href="xml/server.xml" />
-      <xi:include href="xml/core.xml" />
-      <xi:include href="xml/status.xml" />
-      <xi:include href="xml/stun.xml" />
-      <xi:include href="xml/theme.xml" />
-      <xi:include href="xml/theme-loader.xml" />
-      <xi:include href="xml/theme-manager.xml" />
-      <xi:include href="xml/trie.xml" />
-      <xi:include href="xml/upnp.xml" />
-      <xi:include href="xml/xmlnode.xml" />
-      <xi:include href="xml/version.xml" />
-      <xi:include href="xml/util.xml" />
-  </part>
-
-  <part id="Credentials">
-    <title>Credentials</title>
-
-    <xi:include href="xml/purplecredentialmanager.xml" />
-    <xi:include href="xml/purplecredentialprovider.xml" />
-    <xi:include href="xml/purplenoopcredentialprovider.xml" />
-  </part>
-
-  <part id="Protocols">
-    <title>Protocols</title>
-
-    <xi:include href="xml/protocol.xml" />
-    <xi:include href="xml/protocols.xml" />
-    <xi:include href="xml/purpleprotocolattention.xml" />
-    <xi:include href="xml/purpleprotocolchat.xml" />
-    <xi:include href="xml/purpleprotocolclient.xml" />
-    <xi:include href="xml/purpleprotocolfactory.xml" />
-    <xi:include href="xml/purpleprotocolim.xml" />
-    <xi:include href="xml/purpleprotocolmanager.xml" />
-    <xi:include href="xml/purpleprotocolmedia.xml" />
-    <xi:include href="xml/purpleprotocolprivacy.xml" />
-    <xi:include href="xml/purpleprotocolroomlist.xml" />
-    <xi:include href="xml/purpleprotocolserver.xml" />
-  </part>
-
-  <part id="Submodules">
-    <title>Submodules</title>
-    <chapter id="messages">
-      <title>Messaging</title>
-
-        <xi:include href="xml/purplemessage.xml" />
-        <xi:include href="xml/purpleattachment.xml" />
-        <xi:include href="xml/cmds.xml" />
-    </chapter>
-
-    <chapter id="image">
-      <title>Graphics</title>
-
-        <xi:include href="xml/image.xml" />
-        <xi:include href="xml/image-store.xml" />
-    </chapter>
-
-    <chapter id="media">
-      <title>Media APIs</title>
-
-        <xi:include href="xml/media.xml" />
-        <xi:include href="xml/media-gst.xml" />
-        <xi:include href="xml/mediamanager.xml" />
-        <xi:include href="xml/candidate.xml" />
-        <xi:include href="xml/codec.xml" />
-        <xi:include href="xml/backend-iface.xml" />
-        <xi:include href="xml/enum-types.xml" />
-    </chapter>
-  </part>
-
-  <part id="signals">
-    <title>Purple-signals Reference</title>
-
-      <xi:include href="signals_account.xml" />
-      <xi:include href="signals_blist.xml" />
-      <xi:include href="signals_certificate.xml" />
-      <xi:include href="signals_cmd.xml" />
-      <xi:include href="signals_connection.xml" />
-      <xi:include href="signals_conversation.xml" />
-      <xi:include href="signals_core.xml" />
-      <xi:include href="signals_xfer.xml" />
-      <xi:include href="signals_log.xml" />
-      <xi:include href="signals_notify.xml" />
-      <xi:include href="signals_plugin.xml" />
-      <xi:include href="signals_savedstatus.xml" />
-      <xi:include href="signals_jabber.xml" />
-  </part>
-
-  <xi:include href="plugin_ids.xml" />
-  <xi:include href="plugin_i18n.xml" />
-  <xi:include href="ui_ops.xml" />
-
-  <part>
-    <title>Appendices</title>
-
-    <index id="api-index-full">
-      <title>API Index</title>
-      <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
-    </index>
-
-    <index id="api-deprecated">
-      <title>Index of deprecated symbols</title>
-      <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
-    </index>
-
-    <index id="api-3.0.0">
-      <title>Index of new symbols in 3.0.0</title>
-      <xi:include href="xml/api-index-3.0.0.xml"><xi:fallback /></xi:include>
-    </index>
-    <index id="api-2.14.0">
-      <title>Index of new symbols in 2.14.0</title>
-      <xi:include href="xml/api-index-2.14.0.xml"><xi:fallback /></xi:include>
-    </index>
-    <index id="api-2.13.0">
-      <title>Index of new symbols in 2.13.0</title>
-      <xi:include href="xml/api-index-2.13.0.xml"><xi:fallback /></xi:include>
-    </index>
-    <index id="api-2.11.0">
-      <title>Index of new symbols in 2.11.0</title>
-      <xi:include href="xml/api-index-2.11.0.xml"><xi:fallback /></xi:include>
-    </index>
-
-    <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
-  </part>
-</book>
diff --git a/doc/reference/libpurple/libpurple.toml.in b/doc/reference/libpurple/libpurple.toml.in
new file mode 100644
--- /dev/null
+++ b/doc/reference/libpurple/libpurple.toml.in
@@ -0,0 +1,60 @@
+[library]
+version = "@PURPLE_VERSION@"
+browse_url = "https://keep.imfreedom.org/pidgin/pidgin/"
+repository_url = "https://keep.imfreedom.org/pidgin/pidgin/"
+website_url = "https://keep.imfreedom.org/pidgin/pidgin/"
+authors = "Pidgin Developers"
+logo_url = ""
+license = "GPL-2.0-or-later"
+description = "Purple Universal Chat Library"
+dependencies = [ "GLib-2.0", "GObject-2.0", "GPlugin-1.0" ]
+devhelp = true
+search_index = true
+
+  [dependencies."GLib-2.0"]
+  name = "GLib"
+  description = "General-purpose, portable utility library."
+  docs_url = "https://docs.gtk.org/glib/"
+
+  [dependencies."GObject-2.0"]
+  name = "GObject"
+  description = "The base type system library"
+  docs_url = "https://docs.gtk.org/gobject/"
+
+  [dependencies."GPlugin-1.0"]
+  name = "GPlugin"
+  description = "GPlugin Plugin Library"
+  docs_urls = "https://docs.imfreedom.org/gplugin/"
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+base_url = "https://keep.imfreedom.org/pidgin/pidgin/file/default/"
+
+[extra]
+# The same order will be used when generating the index
+content_files = [
+	"code_contributions.md",
+	"mercurial.md",
+	"plugin_i18n.md",
+	"plugin_ids.md",
+	"signals_account.md",
+	"signals_blist.md",
+	"signals_cmd.md",
+	"signals_connection.md",
+	"signals_conversation.md",
+	"signals_core.md",
+	"signals_imgstore.md",
+	"signals_jabber.md",
+	"signals_notify.md",
+	"signals_plugin.md",
+	"signals_savedstatus.md",
+	"signals_xfer.md",
+	"tut_c_plugins.md",
+]
+content_images = [
+]
+urlmap_file = "urlmap.js"
diff --git a/doc/reference/libpurple/mercurial.xml b/doc/reference/libpurple/mercurial.md
rename from doc/reference/libpurple/mercurial.xml
rename to doc/reference/libpurple/mercurial.md
--- a/doc/reference/libpurple/mercurial.xml
+++ b/doc/reference/libpurple/mercurial.md
@@ -1,96 +1,50 @@
-<?xml version='1.0' encoding="UTF-8"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-using-mercurial">
-  <title>Using Pidgin Mercurial</title>
+Title: Using Pidgin Mercurial
+Slug: using-pidgin-mercurial
 
-  <sect2 id="introduction">
-    <title>Introduction</title>
+## Using Pidgin Mercurial
 
-    <para>
-      These instructions will help you clone a copy of any of the Pidgin
-      related <ulink url="https://mercurial-scm.org">Mercurial</ulink>
-      repositories and keep them up to date.
-    </para>
+### Introduction
 
-    <note>
-      These instructions are just for cloning/updating the Pidgin repositories.
-      If you're looking for documentation on contributing code, please see the
-      <link linkend="chapter-code-contributions">Code Contributions</link>
-      page after you have successfully cloned the repository from this page.
-    </note>
-  </sect2>
-
-  <sect2 id="cloning">
-    <title>Cloning</title>
+These instructions will help you clone a copy of any of the Pidgin
+related [Mercurial](https://mercurial-scm.org)
+repositories and keep them up to date.
 
-    <para>
-      In Distributed Version Control, <emphasis>cloning</emphasis> is the act
-      of acquiring a source repository. All of the Pidgin repositories are
-      hosted in Mercurial at
-      <ulink url="https://keep.imfreedom.org/">keep.imfreedom.org</ulink>. To
-      clone them you will be using the command
-      <code>hg clone &lt;URL&gt;</code>. The specific URL can be looked up in
-      the table below depending what you are trying to clone.
-    </para>
+These instructions are just for cloning/updating the Pidgin repositories.
+If you're looking for documentation on contributing code, please see the
+[Code Contributions](code_contributions.html)
+page after you have successfully cloned the repository from this page.
 
-    <note>
-      If you are trying build Pidgin 3, you can just clone that repository and
-      the build system will automatically clone the other repositories for you.
-    </note>
+### Cloning
 
-    <table label="Repository URLs">
-      <tgroup cols="3">
-        <thead>
-          <row>
-            <entry>Name</entry>
-            <entry>URL</entry>
-            <entry>Description</entry>
-          </row>
-        </thead>
-        <tbody>
-          <row>
-            <entry>GPlugin</entry>
-            <entry>
-              <ulink url="https://keep.imfreedom.org/gplugin/gplugin"></ulink>
-            </entry>
-            <entry>The plugin library used in Pidgin 3.</entry>
-          </row>
-          <row>
-            <entry>LibGNT</entry>
-            <entry>
-              <ulink url="https://keep.imfreedom.org/libgnt/libgnt"></ulink>
-            </entry>
-            <entry>The toolkit library used in Finch.</entry>
-          </row>
-          <row>
-            <entry>Pidgin</entry>
-            <entry>
-              <ulink url="https://keep.imfreedom.org/pidgin/pidgin"></ulink>
-            </entry>
-            <entry>
-              The main pidgin repository that contains LibPurple, Pidgin, and
-              Finch.
-            </entry>
-          </row>
-          <row>
-            <entry>Talkatu</entry>
-            <entry>
-              <ulink url="https://keep.imfreedom.org/talkatu/talkatu"></ulink>
-            </entry>
-            <entry>The conversation widgets used in Pidgin 3.</entry>
-          </row>
-        </tbody>
-      </tgroup>
-    </table>
+In Distributed Version Control, ***cloning*** is the act
+of acquiring a source repository. All of the Pidgin repositories are
+hosted in Mercurial at
+[keep.imfreedom.org](https://keep.imfreedom.org/). To
+clone them you will be using the command
+`hg clone <URL>`. The specific URL can be looked up in
+the table below depending what you are trying to clone.
+
+> If you are trying build Pidgin 3, you can just clone that repository and
+> the build system will automatically clone the other repositories for you.
+
+#### Repositories
 
-    <para>
-      You can see an example clone of Talkatu below but all of the repositories
-      will output a similar result.
-    </para>
+[GPlugin](https://keep.imfreedom.org/gplugin/gplugin/)
+: The plugin library used in Pidgin 3.
+
+[LibGNT](https://keep.imfreedom.org/libgnt/libgnt/)
+: The toolkit library used in Finch.
 
-    <programlisting language="screen">
+[Pidgin](https://keep.imfreedom.org/pidgin/pidgin/)
+: The main Pidgin repository that contains LibPurple, Pidgin, and Finch.
+
+[Talkatu](https://keep.imfreedom.org/talkatu/talkatu/)
+: The conversation widgets used in Pidgin 3.
+
+You can see an example clone of Talkatu below but all of the repositories will
+output a similar result.
+
+```sh
 $ hg clone https://keep.imfreedom.org/talkatu/talkatu
 destination directory: talkatu
 requesting all changes
@@ -101,44 +55,31 @@
 new changesets 0feed1461a4a:f0fda4aace2d
 updating to branch default
 109 files updated, 0 files merged, 0 files removed, 0 files unresolved
-</programlisting>
-  </sect2>
+```
 
-  <sect2 id="updating">
-    <title>Keeping Your Clone Up to Date</title>
+### Keeping Your Code Up To Date
 
-    <para>
-      If you are just tracking Pidgin development and are not contributing,
-      chances are you are still on the <emphasis>default</emphasis> branch. But
-      let's make sure, and run <code>hg update default</code>.  This will change
-      to the <emphasis>default</emphasis> branch if you're not currently on it
-      or do nothing.
-    </para>
+If you are just tracking Pidgin development and are not contributing, chances
+are you are still on the ***default*** branch. But let's make sure, and run
+`hg update default`.  This will change to the ***default*** branch if you're
+not currently on it or do nothing.
 
-    <para>
-      Now that you are on the <emphasis>default</emphasis> branch, you can
-      simply run <code>hg pull --update</code> to pull in all new changes and
-      update your local copy. Please note, if you accidentally run
-      <code>hg pull</code>, that is without the update, a subsequent
-      <code>hg pull --update</code> will not update to the latest revisions as
-      this invocation of <code>hg pull</code> did not find any new revisions. To
-      properly update in this scenario, you'll need to run
-      <code>hg update</code>.
-    </para>
+Now that you are on the ***default*** branch, you can
+simply run `hg pull --update` to pull in all new changes and
+update your local copy. Please note, if you accidentally run
+`hg pull`, that is without the update, a subsequent
+`hg pull --update` will not update to the latest revisions as
+this invocation of `hg pull` did not find any new revisions. To
+properly update in this scenario, you'll need to run
+`hg update`.
 
-    <para>
-      Below is an example of updating Talkatu when it's already up to date.
-    </para>
+Below is an example of updating Talkatu when it's already up to date.
 
-    <programlisting>
+```sh
 $ hg pull --update
 pulling from https://keep.imfreedom.org/talkatu/talkatu
 searching for changes
 no changes found
-</programlisting>
+```
 
-    <para>
-      At this point you can review the code, build it, patch it, etc.
-    </para>
-  </sect2>
-</chapter>
+At this point you can review the code, build it, patch it, etc.
diff --git a/doc/reference/libpurple/meson.build b/doc/reference/libpurple/meson.build
--- a/doc/reference/libpurple/meson.build
+++ b/doc/reference/libpurple/meson.build
@@ -1,71 +1,51 @@
-DOC_MODULE = 'libpurple'
-
-# Header files or dirs to ignore when scanning. Use base file/dir names
-ignore_hfiles = [
-    'example',
-    'plugins',
-    'protocols',
-    'tests',
-    'tests.h',
-    'win32',
-    'backend-fs2.h',
-    'glibcompat.h',
-    'internal.h',
-    'purple.h',
-    'purpleenums.h',
-    'purpleprivate.h',
-]
-
-# Extra options to supply to gtkdoc-scan.
-scan_args = [
-    '--deprecated-guards=PURPLE_DISABLE_DEPRECATED',
-    '--rebuild-types',
-    '--rebuild-sections',
-    '--ignore-headers=' + ' '.join(ignore_hfiles),
-]
-
-# Extra options to supply to gtkdoc-mkdb.
-mkdb_args = [
-    '--ignore-files=' + ' '.join(ignore_hfiles),
-]
-
-# Extra options to supply to gtkdoc-fixxref
-fixxref_args = [
+libpurple_doc_content_files = [
+	'code_contributions.md',
+	'mercurial.md',
+	'plugin_i18n.md',
+	'plugin_ids.md',
+	'signals_account.md',
+	'signals_blist.md',
+	'signals_cmd.md',
+	'signals_connection.md',
+	'signals_conversation.md',
+	'signals_core.md',
+	'signals_imgstore.md',
+	'signals_jabber.md',
+	'signals_notify.md',
+	'signals_plugin.md',
+	'signals_savedstatus.md',
+	'signals_xfer.md',
+	'tut_c_plugins.md',
 ]
 
-libpurple_version_xml = configure_file(
-    input : 'version.xml.in',
-    output : 'version.xml',
-    configuration : version_conf)
+if get_option('doc')
+	libpurple_toml = configure_file(
+		input : 'libpurple.toml.in',
+		output : 'libpurple.toml',
+		configuration : version_conf,
+		install : true,
+		install_dir : docs_dir / 'libpurple',
+	)
 
-content_files = [
-    'plugin_i18n.xml',
-    'plugin_ids.xml',
-    'signals_account.xml',
-    'signals_blist.xml',
-    'signals_certificate.xml',
-    'signals_cmd.xml',
-    'signals_connection.xml',
-    'signals_conversation.xml',
-    'signals_core.xml',
-    'signals_jabber.xml',
-    'signals_log.xml',
-    'signals_notify.xml',
-    'signals_plugin.xml',
-    'signals_savedstatus.xml',
-    'signals_xfer.xml',
-    'tut_c_plugins.xml',
-    'tut_signals.xml',
-    'ui_ops.xml',
-]
+	libpurple_doc = custom_target('libpurple-doc',
+		input : [ libpurple_toml, libpurple_gir[0] ],
+		output : 'libpurple',
+		command : [
+			gidocgen,
+			'generate',
+			'--quiet',
+			'--fatal-warnings',
+			'--config=@INPUT0@',
+			'--output-dir=@OUTPUT@',
+			'--no-namespace-dir',
+			'--content-dir=@0@'.format(meson.current_source_dir()),
+			'--add-include-path=@0@'.format(meson.global_build_root() / 'subprojects/gplugin/gplugin'),
+			'@INPUT1@'
+		],
+		depend_files : [ libpurple_doc_content_files ],
+		build_by_default : true,
+		install : true,
+		install_dir : docs_dir,
+	)
+endif
 
-libpurple_doc = gnome.gtkdoc(DOC_MODULE,
-    main_xml : DOC_MODULE + '-docs.xml',
-    src_dir : libpurple_inc,
-    dependencies : libpurple_dep,
-    install : true,
-    scan_args : scan_args,
-    mkdb_args : mkdb_args,
-    fixxref_args: fixxref_args,
-    gobject_typesfile : DOC_MODULE + '.types',
-    content_files : content_files)
diff --git a/doc/reference/libpurple/plugin_i18n.xml b/doc/reference/libpurple/plugin_i18n.md
rename from doc/reference/libpurple/plugin_i18n.xml
rename to doc/reference/libpurple/plugin_i18n.md
--- a/doc/reference/libpurple/plugin_i18n.xml
+++ b/doc/reference/libpurple/plugin_i18n.md
@@ -1,175 +1,140 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-plugin-i18n">
-  <title>Third Party Plugin Translation</title>
+Title: Third Party Plugin Translation
+Slug: 3rd-party-plugin-i18n
 
-  <sect2 id="plugin-i18n-introduction">
-  <title>Introduction</title>
+## Third Party Plugin Translation
 
-  <para>
-  For the purpose of this document we're going to assume that your plugin:
+### Introduction
+
+For the purpose of this document we're going to assume that your plugin:
 
-  <itemizedlist>
-    <listitem><para>
-Is set up to use autotools.  It may be possible to add translation support
-without autotools, but we have no idea how.  We may not want to know, either ;)
-    </para></listitem>
-    <listitem><para>
-Has an autogen.sh.  You may have also called this bootstrap.sh or similar.
-    </para></listitem>
-    <listitem><para>
-Resides in a source tree that has <literal>configure.ac</literal> and
-<literal>Makefile.am</literal> in the top-level directory as well as a
-<literal>src</literal> directory in which the plugin's source is located.  A
-<literal>Makefile.am</literal> should also exist in the <literal>src</literal>
-directory.
-    </para></listitem>
-  </itemizedlist>
-  </para>
-  </sect2>
+* Is set up to use autotools. It may be possible to add translation support
+without autotools, but we have no idea how. We may not want to know, either ;)
+* Has an autogen.sh. You may have also called this bootstrap.sh or similar.
+* Resides in a source tree that has `configure.ac` and `Makefile.am` in the
+top-level directory as well as a `src` directory in which the plugin's source
+is located. A `Makefile.am` should also exist in the `src` directory.
+
+### Steps To Follow
 
-  <sect2 id="plugin-i18n-steps">
-  <title>Steps to follow</title>
+For a plugin to have translation support there are a few steps that need to
+followed:
 
-  <para>
-  For a plugin to have translation support there are a few steps that need to
-  followed:
+* In your `autogen.sh`, add the following after your other utility checks:
 
-  <itemizedlist>
-    <listitem><para>
-In your autogen.sh, add the following after your other utility checks:
-<programlisting>
-(intltoolize --version) &lt; /dev/null &gt; /dev/null 2&gt;&amp;1 || {
+```sh
+(intltoolize --version) < /dev/null > /dev/null 2>&1 || {
     echo;
-    echo "You must have intltool installed to compile &lt;YOUR PLUGIN NAME&gt;";
+    echo "You must have intltool installed to compile <YOUR PLUGIN NAME>";
     echo;
     exit;
 }
-</programlisting>
-Then before your call to aclocal add:
-<programlisting>
+```
+
+* Then before your call to aclocal add:
+
+```sh
 intltoolize --force --copy
-</programlisting>
-    </para></listitem>
-    <listitem><para>
-Now edit configure.ac and add the following:
-<programlisting>
+```
+
+* Now edit `configure.ac` and add the following:
+
+```m4
 AC_PROG_INTLTOOL
 
-GETTEXT_PACKAGE=&lt;YOUR PLUGIN NAME&gt;
+GETTEXT_PACKAGE=<YOUR PLUGIN NAME>
 AC_SUBST(GETTEXT_PACKAGE)
 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define the gettext package to be used])
 
 ALL_LINGUAS=""
 AM_GLIB_GNU_GETTEXT
-</programlisting>
+```
+
 The position of these macros in the file don't really matter, but if you
 have issues either play around with it or feel free to ask one of the Pidgin
-developers.  Finally add 'po/Makefile.in' to you 'AC_OUTPUT' command.
-    </para></listitem>
-    <listitem><para>
-Now create a directory named 'po'.
-    </para></listitem>
-    <listitem><para>
-'cd' into the 'po' directory.
-    </para></listitem>
-    <listitem><para>
-Create/edit the file 'POTFILE.in' in your favorite editor.  Each line
+developers. Finally add `po/Makefile.in` to you `AC_OUTPUT` command.
+
+* Now create a directory named 'po'.
+
+* `cd` into the `po` directory.
+
+* Create/edit the file `POTFILES.in` in your favorite editor. Each line
 should be the name of a file that could or does have strings marked for
-translating (we're getting to that step).  These file names should be
+translating (we're getting to that step). These file names should be
 relative to the top directory of your plugin's source tree.
-    </para></listitem>
-    <listitem><para>
-'cd' back to the top directory of your plugin's source tree.
-    </para></listitem>
-    <listitem><para>
-Open 'Makefile.am' and add 'po' to your 'SUBDIRS' variable.
-    </para></listitem>
-    <listitem><para>
-While still in the top directory of your plugin's source tree,  execute
-'intltool-prepare'.  This will setup anything extra that intltool needs.
-    </para></listitem>
-    <listitem><para>
-Fire off 'autogen.sh' and when it's completed, verify that you have a
-'po/POTFILES' (notice the lack of a .in).  If you do, everything should be
+
+* `cd` back to the top directory of your plugin's source tree.
+
+* Open `Makefile.am` and add `po` to your `SUBDIRS` variable.
+
+* While still in the top directory of your plugin's source tree, execute
+`intltool-prepare`. This will setup anything extra that intltool needs.
+
+* Fire off `autogen.sh` and when it's completed, verify that you have a
+`po/POTFILES` (notice the lack of a .in). If you do, everything should be
 set on the autotools side.
-    </para></listitem>
-    <listitem><para>
-Take a break, stretch your legs, smoke a cigarette, whatever, because
+
+* Take a break, stretch your legs, smoke a cigarette, whatever, because
 we're done with the autotools part.
-    </para></listitem>
-    <listitem><para>
-When you're ready, 'cd' into the directory with the source files for your
+
+* When you're ready, `cd` into the directory with the source files for your
 plugin.
-    </para></listitem>
-    <listitem><para>
-Open the file containing the 'plugin_query' function.
-    </para></listitem>
-    <listitem><para>
-If you're not already, please make sure that you are including the
-'config.h' file for you plugin.  Note that 'config.h' could be whatever
-you told autohead to use with AM_CONFIG_HEADER.  Also add the following:
-<programlisting>
-#include &lt;glib/gi18n-lib.h&gt;
-</programlisting>
-Make sure that this include is after you include of your 'config.h',
-otherwise you will break your build.  Also note that if you wish to
+
+* Open the file containing the `plugin_query` function.
+
+* If you're not already, please make sure that you are including the
+`config.h` file for you plugin.  Note that `config.h` could be whatever
+you told autohead to use with AM_CONFIG_HEADER. Also add the following:
+
+```c
+#include <glib/gi18n-lib.h>
+```
+
+Make sure that this include is after you include of your `config.h`,
+otherwise you will break your build. Also note that if you wish to
 maintain compatibility with older versions of GLib, you will need to
 include additional preprocessor directives, which we won't cover here.
-    </para></listitem>
-    <listitem><para>
-This is where things get a bit goofy.  libpurple is going to try to
+
+* This is where things get a bit goofy. libpurple is going to try to
 translate our strings using the libpurple gettext package.  So we have to
 convert them before libpurple attempts to.
-    </para></listitem>
-    <listitem><para>
-To do this, we're going to change the entries for name, summary, and
-description to NULL.
-    </para></listitem>
-    <listitem><para>
-Next, locate your 'plugin_load' function.  Your name for this function will be
-the first parameter to GPLUGIN_NATIVE_PLUGIN_DECLARE() plus '_load'.
-    </para></listitem>
-    <listitem><para>
-Now add the following within your 'plugin_load' function:
-<programlisting>
+
+* To do this, we're going to change the entries for `name`, `summary`, and
+`description` to `NULL`.
+
+* Next, locate your `plugin_load` function.  Your name for this function will be
+the first parameter to `GPLUGIN_NATIVE_PLUGIN_DECLARE()` plus `_load`.
+
+* Now add the following within your 'plugin_load' function:
+
+```c
 	bindtextdomain(GETTEXT_PACKAGE, PURPLE_LOCALEDIR);
 	bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
 
-	info.name        = _("&lt;YOUR PLUGIN NAME&gt;");
-	info.summary     = _("&lt;YOUR PLUGIN SUMMARY&gt;");
-	info.description = _("&lt;YOUR PLUGIN DESCRIPTION&gt;");
-</programlisting>
-Note that the _() is intentional, and that it is telling intltool that
-this string should be translated.  There is also N_() which says that a
-string should only be marked for translation but should not be translated
-yet.
-    </para></listitem>
-    <listitem><para>
-Go through the rest of your code and mark all the other strings for
-translation with _().
-    </para></listitem>
-    <listitem><para>
-When thats done, feel free to commit your work, create your po template
+	info.name        = _("<YOUR PLUGIN NAME>");
+	info.summary     = _("<YOUR PLUGIN SUMMARY>");
+	info.description = _("<YOUR PLUGIN DESCRIPTION>");
+```
+
+> Note that the `_()` is intentional, and that it is telling intltool that
+> this string should be translated. There is also `N_()` which says that a
+> string should only be marked for translation but should not be translated
+> yet.
+
+* Go through the rest of your code and mark all the other strings for
+translation with `_()`.
+
+* When thats done, feel free to commit your work, create your po template
 (pot file) or whatever.
-    </para></listitem>
-    <listitem><para>
-To create you po template, 'cd' to 'po' and execute:
-<programlisting>
+
+* To create you po template, `cd` to `po` and execute:
+
+```sh
 intltool-update --pot
-</programlisting>
-    </para></listitem>
-    <listitem><para>
-To add new translations to your plugin, all you have to do is add the
-language code to the 'ALL_LINGUAS' variable in your configure.ac.  Take
-note that this list of languages should be separated by a space.  After
-you have added the language code to 'ALL_LINGUAS', drop the xx.po file
-into 'po', and re-'autogen.sh'.  After a full build you should now be
+```
+
+* To add new translations to your plugin, all you have to do is add the
+language code to the `ALL_LINGUAS` variable in your `configure.ac`. Take
+note that this list of languages should be separated by a space. After
+you have added the language code to `ALL_LINGUAS`, drop the `xx.po` file
+into `po`, and re-`autogen.sh`. After a full build you should now be
 able to use the translation.
-    </para></listitem>
-  </itemizedlist>
-  </para>
- </sect2>
-</chapter>
diff --git a/doc/reference/libpurple/plugin_ids.xml b/doc/reference/libpurple/plugin_ids.md
rename from doc/reference/libpurple/plugin_ids.xml
rename to doc/reference/libpurple/plugin_ids.md
--- a/doc/reference/libpurple/plugin_ids.xml
+++ b/doc/reference/libpurple/plugin_ids.md
@@ -1,120 +1,70 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-plugin-ids">
-  <title>Plugin IDs</title>
+Title: Plugin IDs
+Slug: plugin-ids
 
-  <sect2 id="plugin-ids-introduction">
-  <title>Introduction</title>
-  <para>
+## Plugin IDs
+
+### Introduction
+
 Every plugin contains a unique identifier. Third-party plugins (that is,
 plugins written by anyone who is not a libpurple, Pidgin, or Finch developer)
 are expected to use a plugin ID that follows a specific format. This format
 categorizes plugins and makes duplicate IDs highly unlikely.
-  </para>
-  </sect2>
 
-  <sect2 id="plugin-ids-format">
-  <title>Format</title>
-  <para>
+### Format
+
 The basic format of a plugin ID is as follows:
 
-<programlisting>
+```
 type-username-pluginname
-</programlisting>
-  </para>
+```
 
-  <para>
-The <emphasis>type</emphasis> indicator specifies the type of plugin. This must be one
+The ***type*** indicator specifies the type of plugin. This must be one
 of the following:
 
-  <table>
-  <title>Types of plugins</title>
-  <tgroup cols="2">
-    <colspec colwidth="*" colnum="1" align="left"/>
-    <colspec colwidth="*" colnum="2" align="left"/>
-    <thead>
-       <row>
-<entry><emphasis>type</emphasis></entry>
-<entry>description</entry>
-      </row>
-    </thead>
-    <tbody>
-      <row>
-<entry><literal>core</literal></entry>
-<entry>
-A core libpurple plugin, capable of being loaded in any program using libpurple.
-Core plugins may not contain any UI-specific code.
-</entry>
-      </row>
-      <row>
-<entry><literal>prpl</literal></entry>
-<entry>
-A protocol plugin. This is a core plugin which provides libpurple the ability to
-connect to another IM or chat network.
-</entry>
-      </row>
-      <row>
-<entry><literal>gtk</literal></entry>
-<entry>
-A GTK+ (a.k.a. Pidgin) plugin. These plugins may use GTK+ code, but may not use
-window toolkit code, such as X11, Win32, Cocoa, or Carbon.
-</entry>
-      </row>
-      <row>
-<entry><literal>gtk-x11</literal></entry>
-<entry>
-A GTK+ plugin that uses X11 code. These plugins may use both GTK+ code and X11
-code, allowing to hook into features specific to X11.
-</entry>
-      </row>
-      <row>
-<entry><literal>gtk-win32</literal></entry>
-<entry>
-A GTK+ plugin that uses Win32 code. These plugins may use both GTK+ code and
+#### Types Of Plugins
+
+core
+: A core libpurple plugin, capable of being loaded in any program using
+libpurple. Core plugins may not contain any UI-specific code.
+
+prpl
+: A protocol plugin. This is a core plugin which provides libpurple the ability
+to connect to another IM or chat network.
+
+gtk
+: A GTK+ (a.k.a. Pidgin) plugin. These plugins may use GTK+ code, but may not
+use window toolkit code, such as X11, Win32, Cocoa, or Carbon.
+
+gtk-x11
+: A GTK+ plugin that uses X11 code. These plugins may use both GTK+ code and
+X11 code, allowing to hook into features specific to X11.
+
+gtk-win32
+: A GTK+ plugin that uses Win32 code. These plugins may use both GTK+ code and
 Win32 code, allowing to hook into features available on Windows.
-</entry>
-      </row>
-      <row>
-<entry><literal>gnt</literal></entry>
-<entry>
-A GNT (a.k.a. Finch) plugin. These plugins may use GNT code.
-</entry>
-      </row>
-    </tbody>
-  </tgroup>
-  </table>
-  </para>
 
-  <para>
-The <emphasis>username</emphasis> must be a unique identifier for you. It
-<emphasis>should</emphasis> be your https://developer.pidgin.im Trac user ID. Failing that, you
+gnt
+: A GNT (a.k.a. Finch) plugin. These plugins may use GNT code.
+
+The ***username*** must be a unique identifier for you. It
+***should*** be your https://developer.pidgin.im Trac user ID. Failing that, you
 could use your SourceForge user ID or your Libera.chat IRC nickname, if you
 have either. The https://developer.pidgin.im Trac user ID is preferred.
-Do <emphasis>not</emphasis> leave this field blank!
-  </para>
+Do ***not*** leave this field blank!
 
-  <para>
-The <emphasis>pluginname</emphasis> is the name of your plugin. It is usually all
+The ***pluginname*** is the name of your plugin. It is usually all
 lowercase letters and matches the static plugin ID (the first argument to
 the GPLUGIN_NATIVE_PLUGIN_DECLARE() macro call), although it can be anything you
-like. Do <emphasis>not</emphasis> include version information in the plugin ID--the
-<literal>PurplePluginInfo</literal> object already has a property for this.
-  </para>
-  </sect2>
+like. Do ***not*** include version information in the plugin ID--the
+`PurplePluginInfo` object already has a property for this.
+
+### One Last Rule For Plugin IDs
 
-  <sect2 id="plugin-ids-nospaces">
-  <title>One Last Rule for Plugin IDs</title>
-  <para>
-Plugin IDs may <emphasis>NOT</emphasis> contain spaces. If you need a space, use another
+Plugin IDs may ***NOT*** contain spaces. If you need a space, use another
 hyphen (-).
-  </para>
-  </sect2>
 
-  <sect2 id="plugin-ids-exceptions">
-  <title>Exceptions to the Rule</title>
-  <para>
+### Exceptions To The Rule
+
 As with any rule there are exceptions. If you browse through the source
 tree you will see that the plugins we distribute with the Pidgin source
 do not contain a username field. This is because while one developer may
@@ -123,69 +73,35 @@
 field is also an indicator that the plugin is one of our plugins and not
 a third-party plugin.
 
-Another exception to the rule is the <ulink
-url="http://plugins.guifications.org/trac/wiki/PluginPack">Purple Plugin
-Pack</ulink>. All plugins whose lives started in the Purple Plugin Pack use
-<literal>"plugin_pack"</literal> for the username field to indicate origination in
+Another exception to the rule is the
+[Purple Plugin Pack](https://keep.imfreedom.org/pidgin/purple-plugin-pack/).
+All plugins whose lives started in the Purple Plugin Pack use
+`"plugin_pack"` for the username field to indicate origination in
 the Purple Plugin Pack.
 
 These two exceptions are mentioned here for completeness. We don't
 encourage breaking the conventions set forth by the rules outlined above.
-  </para>
-  </sect2>
 
-  <sect2 id="plugin-ids-examples">
-  <title>Examples of Well-Chosen Plugin IDs</title>
-  <para>
+### Examples Of Well-Chosen Plugin IDs
+
 The following is a list of well-chosen Plugin IDs listing a few good examples.
 
-  <table>
-  <title>Examples</title>
-  <tgroup cols="2">
-    <colspec colwidth="*" colnum="1" align="left"/>
-    <colspec colwidth="*" colnum="2" align="left"/>
-    <thead>
-       <row>
-<entry>id</entry>
-<entry>description</entry>
-      </row>
-    </thead>
-    <tbody>
-      <row>
-<entry><literal>"gtk-amc_grim-guifications"</literal></entry>
-<entry>
-This is the plugin ID for the Guifications 2.x plugin.
-</entry>
-      </row>
-      <row>
-<entry><literal>"gtk-rlaager-album"</literal></entry>
-<entry>
-This is the plugin ID for the Album plugin, which is now part of the
+gtk-amc_grim-guifications
+: This is the plugin ID for the Guifications 2.x plugin.
+
+gtk-rlaager-album
+: This is the plugin ID for the Album plugin, which is now part of the
 Purple Plugin Pack. Its ID follows the rules because its life started prior
 to its inclusion in the Plugin Pack.
-</entry>
-      </row>
-      <row>
-<entry><literal>"core-rlaager-irchelper"</literal></entry>
-<entry>
-This is the plugin ID for the IRC Helper plugin, which is now part of the
+
+core-rlaager-irchelper
+: This is the plugin ID for the IRC Helper plugin, which is now part of the
 Purple Plugin Pack. Its ID follows the rules because its life started prior
 to its inclusion in the Plugin Pack.
-</entry>
-      </row>
-    </tbody>
-  </tgroup>
-  </table>
-  </para>
-  </sect2>
 
-  <sect2 id="plugin-ids-plugin-db">
-  <title>Plugin Database</title>
-  <para>
+### Plugin Database
+
 Although it doesn't exist yet, in time there will be a plugin database
 on the Pidgin website, where users can download and install new plugins.
 Plugins will be accessed by your plugin ID, which is one reason why it
 must be unique. 
-  </para>
- </sect2>
-</chapter>
diff --git a/doc/reference/libpurple/signals_account.xml b/doc/reference/libpurple/signals_account.md
rename from doc/reference/libpurple/signals_account.xml
rename to doc/reference/libpurple/signals_account.md
--- a/doc/reference/libpurple/signals_account.xml
+++ b/doc/reference/libpurple/signals_account.md
@@ -1,521 +1,451 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-account">
-<title>Account signals</title>
+Title: Account Signals
+Slug: account-signals
+
+## Account Signals
+
+### Signal List
 
-<refsect1 id="accounts.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="accounts-account-created">account-created</link>&quot;
-  &quot;<link linkend="accounts-account-destroying">account-destroying</link>&quot;
-  &quot;<link linkend="accounts-account-added">account-added</link>&quot;
-  &quot;<link linkend="accounts-account-connecting">account-connecting</link>&quot;
-  &quot;<link linkend="accounts-account-removed">account-removed</link>&quot;
-  &quot;<link linkend="accounts-account-disabled">account-disabled</link>&quot;
-  &quot;<link linkend="accounts-account-enabled">account-enabled</link>&quot;
-  &quot;<link linkend="accounts-account-setting-info">account-setting-info</link>&quot;
-  &quot;<link linkend="accounts-account-set-info">account-set-info</link>&quot;
-  &quot;<link linkend="accounts-account-status-changed">account-status-changed</link>&quot;
-  &quot;<link linkend="accounts-account-actions-changed">account-actions-changed</link>&quot;
-  &quot;<link linkend="accounts-account-alias-changed">account-alias-changed</link>&quot;
-  &quot;<link linkend="accounts-account-authorization-requested">account-authorization-requested</link>&quot;
-  &quot;<link linkend="accounts-account-authorization-denied">account-authorization-denied</link>&quot;
-  &quot;<link linkend="accounts-account-authorization-granted">account-authorization-granted</link>&quot;
-  &quot;<link linkend="accounts-account-error-changed">account-error-changed</link>&quot;
-  &quot;<link linkend="accounts-account-signed-on">account-signed-on</link>&quot;
-  &quot;<link linkend="accounts-account-signed-off">account-signed-off</link>&quot;
-  &quot;<link linkend="accounts-account-connection-error">account-connection-error</link>&quot;
-</synopsis>
-</refsect1>
+* [account-created](#account-created)
+* [account-created](#account-created)
+* [account-destroying](#account-destroying)
+* [account-added](#account-added)
+* [account-connecting](#account-connecting)
+* [account-removed](#account-removed)
+* [account-disabled](#account-disabled)
+* [account-enabled](#account-enabled)
+* [account-setting-info](#account-setting-info)
+* [account-set-info](#account-set-info)
+* [account-status-changed](#account-status-changed)
+* [account-actions-changed](#account-actions-changed)
+* [account-alias-changed](#account-alias-changed)
+* [account-authorization-requested](#account-authorization-requested)
+* [account-authorization-denied](#account-authorization-denied)
+* [account-authorization-granted](#account-authorization-granted)
+* [account-error-changed](#account-error-changed)
+* [account-signed-on](#account-signed-on)
+* [account-signed-off](#account-signed-off)
+* [account-connection-error](#account-connection-error)
 
-<refsect1 id="accounts.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### account-created
 
-<refsect2 id="accounts-account-created" role="signal">
- <title>The <literal>&quot;account-created&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is created by calling purple_account_new.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-destroying
 
-<refsect2 id="accounts-account-destroying" role="signal">
- <title>The <literal>&quot;account-destroying&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is about to be destroyed.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-added" role="signal">
- <title>The <literal>&quot;account-added&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-added
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is added.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that was added. See <literal>purple_accounts_add</literal>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+
+**account**
+: The account that was added. See `purple_accounts_add()`.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-connecting
 
-<refsect2 id="accounts-account-connecting" role="signal">
- <title>The <literal>&quot;account-connecting&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-This is called when an account is in the process of connecting.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account in the process of connecting.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
+This is emitted when an account is in the process of connecting.
+
+**Parameters:**
+
+**account**
+: The account in the process of connecting.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
 
-<refsect2 id="accounts-account-removed" role="signal">
- <title>The <literal>&quot;account-removed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+#### account-removed
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is removed.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that was removed. See <literal>purple_accounts_remove</literal>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that was removed. See `purple_accounts_remove()`.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-disabled
 
-<refsect2 id="accounts-account-disabled" role="signal">
- <title>The <literal>&quot;account-disabled&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is disabled.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that was disabled.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that was disabled.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-enabled" role="signal">
- <title>The <literal>&quot;account-enabled&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-enabled
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account is enabled.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that was enabled.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters**:
+
+**account**
+: The account that was enabled.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-setting-info" role="signal">
- <title>The <literal>&quot;account-setting-info&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *new_info,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-setting-info
+
+```c
+void user_function(PurpleAccount *account, const gchar *new_info, gpointer user_data);
+```
+
 Emitted when a user is about to send his new user info, or profile, to the server.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that the info will be set on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>new_info</parameter>&#160;:</term>
-    <listitem><simpara>The new information to set.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that the info will be set on.
+
+**new_info**
+: The new information to set.
 
-<refsect2 id="accounts-account-set-info" role="signal">
- <title>The <literal>&quot;account-set-info&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *new_info,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-set-info
+
+```c
+void user_function(PurpleAccount *account, const gchar *new_info, gpointer user_data);
+```
+
 Emitted when a user sent his new user info, or profile, to the server.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that the info was set on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>new_info</parameter>&#160;:</term>
-    <listitem><simpara>The new information set.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that the info was set on.
+
+**new_info**
+: The new information set.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-status-changed" role="signal">
- <title>The <literal>&quot;account-status-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        PurpleStatus *old,
-                                                        PurpleStatus *new,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-status-changed
+
+```c
+void user_function(PurpleAccount *account,
+                   PurpleStatus *old,
+                   PurpleStatus *new,
+                   gpointer user_data);
+```
+
 Emitted when the status of an account changes (after the change).
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that changed status.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>old</parameter>&#160;:</term>
-    <listitem><simpara>The status before change.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>new</parameter>&#160;:</term>
-    <listitem><simpara>The status after change.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that changed status.
+
+**old**
+: The status before change.
+
+**new**
+: The status after change.
 
-<refsect2 id="accounts-account-actions-changed" role="signal">
- <title>The <literal>&quot;account-actions-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-actions-changed
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when the account actions are changed after initial connection.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account whose actions changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account whose actions changed.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-alias-changed
+
+```c
+void user_function(PurpleAccount *account, const gchar *old, gpointer user_data);
+```
 
-<refsect2 id="accounts-account-alias-changed" role="signal">
- <title>The <literal>&quot;account-alias-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *old,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when the alias of an account changes (after the change).
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account for which the alias was changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>old</parameter>&#160;:</term>
-    <listitem><simpara>The alias before change.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account for which the alias was changed.
+
+**old**
+: The alias before change.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-authorization-requested
 
-<refsect2 id="accounts-account-authorization-requested" role="signal">
- <title>The <literal>&quot;account-authorization-requested&quot;</literal> signal</title>
-<programlisting>
-int                 user_function                      (PurpleAccount *account,
-                                                        const char *user,
-                                                        const char *message,
-                                                        char **response,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+int user_function(PurpleAccount *account,
+                  const gchar *user,
+                  const gchar *message,
+                  gchar **response,
+                  gpointer user_data);
+```
+
 Emitted when a user requests authorization.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user requesting authorization.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The authorization request message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>response</parameter>&#160;:</term>
-    <listitem><simpara>The message to send in the response.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>PURPLE_ACCOUNT_RESPONSE_IGNORE to silently ignore the request, PURPLE_ACCOUNT_RESPONSE_DENY to block the request (the sender might get informed), PURPLE_ACCOUNT_RESPONSE_ACCEPT if the request should be granted. If PURPLE_ACCOUNT_RESPONSE_PASS is returned, then the user will be prompted with the request.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**user**
+: The name of the user requesting authorization.
+
+**message**
+: The authorization request message.
+
+**response**
+: The message to send in the response.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+**Returns:**
+
+`PURPLE_ACCOUNT_RESPONSE_IGNORE`
+: To silently ignore the request
+
+`PURPLE_ACCOUNT_RESPONSE_DENY`
+: To block the request (the sender might get informed)
 
-<refsect2 id="accounts-account-authorization-denied" role="signal">
- <title>The <literal>&quot;account-authorization-denied&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *user,
-                                                        const char *message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+`PURPLE_ACCOUNT_RESPONSE_ACCEPT`
+: If the request should be granted.
+
+`PURPLE_ACCOUNT_RESPONSE_PASS`
+: The user will be prompted with the request.
+
+----
+
+#### account-authorization-denied
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *user,
+                   const gchar *message,
+                   gpointer user_data);
+```
+
 Emitted when the authorization request for a buddy is denied.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user requesting authorization.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message to tell the buddy who was denied.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**user**
+: The name of the user requesting authorization.
 
-<refsect2 id="accounts-account-authorization-granted" role="signal">
- <title>The <literal>&quot;account-authorization-granted&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *user,
-                                                        const char *message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**message**
+: The message to tell the buddy who was denied.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-authorization-granted
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *user,
+                   const gchar *message,
+                   gpointer user_data);
+```
+
 Emitted when the authorization request for a buddy is granted.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user requesting authorization.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message to tell the buddy who was granted authorization.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Paramaters:**
+
+**account**
+: The account.
+
+**user**
+: The name of the user requesting authorization.
+
+**message**
+: The message to tell the buddy who was granted authorization.
 
-<refsect2 id="accounts-account-error-changed" role="signal">
- <title>The <literal>&quot;account-error-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const PurpleConnectionErrorInfo *old_error,
-                                                        const PurpleConnectionErrorInfo *current_error,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when <literal>account</literal>'s error changes.  You should not call purple_account_clear_current_error() while this signal is being emitted.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account whose error has changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>old_error</parameter>&#160;:</term>
-    <listitem><simpara>The account's previous error, or <literal>NULL</literal> if it had no error.  After this signal is emitted, <literal>old_error</literal> is not guaranteed to be a valid pointer.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>new_error</parameter>&#160;:</term>
-    <listitem><simpara>The account's new error, or <literal>NULL</literal> if it has no error. If not <literal>NULL</literal>, <literal>new_error</literal> will remain a valid until pointer just after the next time this signal is emitted for this <literal>account</literal>. See <literal>purple_account_get_current_error</literal>().</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-error-changed
+
+```c
+void user_function(PurpleAccount *account,
+                   const PurpleConnectionErrorInfo *old_error,
+                   const PurpleConnectionErrorInfo *current_error,
+                   gpointer user_data);
+```
+
+Emitted when `account`'s error changes.  You should not call purple_account_clear_current_error() while this signal is being emitted.
+
+**Parameters:**
+
+**account**
+: The account whose error has changed.
+
+**old_error**
+: The account's previous error, or `NULL` if it had no error.  After this signal is emitted, `old_error` is not guaranteed to be a valid pointer.
+
+**new_error**
+: The account's new error, or `NULL` if it has no error. If not `NULL`, `new_error` will remain a valid until pointer just after the next time this signal is emitted for this `account`. See `purple_account_get_current_error()`.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-signed-on" role="signal">
- <title>The <literal>&quot;account-signed-on&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-signed-on
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account has signed on.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that has signed on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that has signed on.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="accounts-account-signed-off" role="signal">
- <title>The <literal>&quot;account-signed-off&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### account-signed-off
+
+```c
+void user_function(PurpleAccount *account, gpointer user_data);
+```
+
 Emitted when an account has signed off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account that has signed off.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account that has signed off.
+
+**user_data**
+: User data set when the signal handler was connected.
+
+----
+
+#### account-connection-error
 
-<refsect2 id="accounts-account-connection-error" role="signal">
- <title>The <literal>&quot;account-connection-error&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *gc,
-                                                        PurpleConnectionError err,
-                                                        const gchar *desc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a connection error occurs, before <literal>"signed"</literal>-off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account on which the error has occurred.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>err</parameter>&#160;:</term>
-    <listitem><simpara>The error that occurred.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>desc</parameter>&#160;:</term>
-    <listitem><simpara>A description of the error, giving more information.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+void user_function(PurpleAccount *account,
+                   PurpleConnectionError err,
+                   const gchar *desc,
+                   gpointer user_data)
+```
+
+Emitted when a connection error occurs, before `"signed"`-off.
+
+**Parameters:**
 
-</refsect1>
+**account**
+: The account on which the error has occurred.
+
+**err**
+: The error that occurred.
 
-</chapter>
+**desc**
+: A description of the error, giving more information.
+
+**user_data**
+: User data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_blist.xml b/doc/reference/libpurple/signals_blist.md
rename from doc/reference/libpurple/signals_blist.xml
rename to doc/reference/libpurple/signals_blist.md
--- a/doc/reference/libpurple/signals_blist.xml
+++ b/doc/reference/libpurple/signals_blist.md
@@ -1,263 +1,225 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-blist">
-<title>Buddy List signals</title>
+Title: Buddy List Signals
+Slug: buddy-list-signals
+
+## Buddy List Signals
+
+### Signal List
 
-<refsect1 id="blist.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="blist-buddy-status-changed">buddy-status-changed</link>&quot;
-  &quot;<link linkend="blist-buddy-idle-changed">buddy-idle-changed</link>&quot;
-  &quot;<link linkend="blist-buddy-signed-on">buddy-signed-on</link>&quot;
-  &quot;<link linkend="blist-buddy-signed-off">buddy-signed-off</link>&quot;
-  &quot;<link linkend="blist-update-idle">update-idle</link>&quot;
-  &quot;<link linkend="blist-blist-node-extended-menu">blist-node-extended-menu</link>&quot;
-  &quot;<link linkend="blist-buddy-icon-changed">buddy-icon-changed</link>&quot;
-  &quot;<link linkend="blist-blist-node-aliased">blist-node-aliased</link>&quot;
-  &quot;<link linkend="blist-buddy-caps-changed">buddy-caps-changed</link>&quot;
-  &quot;<link linkend="blist-ui-caps-changed">ui-caps-changed</link>&quot;
-</synopsis>
-</refsect1>
+* [buddy-status-changed](#buddy-status-changed)
+* [buddy-idle-changed](#buddy-idle-changed)
+* [buddy-signed-on](#buddy-signed-on)
+* [buddy-signed-off](#buddy-signed-off)
+* [update-idle](#update-idle)
+* [blist-node-extended-menu](#blist-node-extended-menu)
+* [buddy-icon-changed](#buddy-icon-changed)
+* [blist-node-aliased](#blist-node-aliased)
+* [buddy-caps-changed](#buddy-caps-changed)
+* [ui-caps-changed](#ui-caps-changed)
 
-<refsect1 id="blist.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### buddy-status-changed
 
-<refsect2 id="blist-buddy-status-changed" role="signal">
- <title>The <literal>&quot;buddy-status-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        PurpleStatus *old_status,
-                                                        PurpleStatus *status,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleBuddy *buddy,
+                   PurpleStatus *old_status,
+                   PurpleStatus *status,
+                   gpointer user_data);
+```
+
 Emitted when a buddy on your buddy list goes away.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>buddy</parameter>&#160;:</term>
-    <listitem><simpara>The buddy whose status changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>old_status</parameter>&#160;:</term>
-    <listitem><simpara>The status that the buddy just changed from.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>status</parameter>&#160;:</term>
-    <listitem><simpara>The status that the buddy just changed to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**buddy**
+: The buddy whose status changed.
+
+**old_status**
+: The status that the buddy just changed from.
+
+**status**
+: The status that the buddy just changed to.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### buddy-idle-changed
+
+```c
+void user_function(PurpleBuddy *buddy,
+                   gboolean old_idle,
+                   gboolean idle,
+                   gpointer user_data);
+```
 
-<refsect2 id="blist-buddy-idle-changed" role="signal">
- <title>The <literal>&quot;buddy-idle-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        gboolean old_idle,
-                                                        gboolean idle,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when a buddy on your buddy list becomes idle.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>buddy</parameter>&#160;:</term>
-    <listitem><simpara>The buddy whose idle status changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>old_idle</parameter>&#160;:</term>
-    <listitem><simpara>Whether the buddy was idle.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>idle</parameter>&#160;:</term>
-    <listitem><simpara>Whether the buddy is currently idle.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**buddy**
+: The buddy whose idle status changed.
+
+**old_idle**
+: Whether the buddy was idle.
+
+**idle**
+: Whether the buddy is currently idle.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### buddy-signed-on
+
+```c
+void user_function(PurpleBuddy *buddy, gpointer user_data);
+```
+
+Emitted when a buddy on your buddy list signs on.
+
+**Parameters:**
 
-<refsect2 id="blist-buddy-signed-on" role="signal">
- <title>The <literal>&quot;buddy-signed-on&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a buddy on your buddy list signs on.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>buddy</parameter>&#160;:</term>
-    <listitem><simpara>The buddy that signed on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**buddy**
+: The buddy that signed on.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### buddy-signed-off
+
+```c
+void user_function(PurpleBuddy *buddy, gpointer user_data);
+```
 
-<refsect2 id="blist-buddy-signed-off" role="signal">
- <title>The <literal>&quot;buddy-signed-off&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when a buddy on your buddy list signs off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>buddy</parameter>&#160;:</term>
-    <listitem><simpara>The buddy that signed off.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**buddy**
+: The buddy that signed off.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### update-idle
 
-<refsect2 id="blist-update-idle" role="signal">
- <title>The <literal>&quot;update-idle&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(gpointer user_data);
+```
+
 Emitted when the buddy list is refreshed and the idle times are updated.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### blist-node-extended-menu
 
-<refsect2 id="blist-blist-node-extended-menu" role="signal">
- <title>The <literal>&quot;blist-node-extended-menu&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBlistNode *node,
-                                                        GList **menu,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a buddlist menu is being constructed <literal>menu</literal> is a pointer to a GList of PurpleMenuAction's allowing a plugin to add menu items.
-  </para>
-</refsect2>
+```c
+void user_function(PurpleBlistNode *node, GList **menu, gpointer user_data);
+```
+
+Emitted when a buddylist menu is being constructed `menu` is a pointer to a
+GList of PurpleMenuAction's allowing a plugin to add menu items.
+
+----
+
+#### blist-node-added
 
-<refsect2 id="blist-blist-node-added" role="signal">
- <title>The <literal>&quot;blist-node-added&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBlistNode *node,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleBlistNode *node, gpointer user_data);
+```
+
 Emitted when a new blist node is added to the buddy list.
-  </para>
-</refsect2>
+
+----
+
+#### blist-node-removed
+
+```c
+void user_function(PurpleBlistNode *node, gpointer user_data);
+```
 
-<refsect2 id="blist-blist-node-removed" role="signal">
- <title>The <literal>&quot;blist-node-removed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBlistNode *node,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when a blist node is removed from the buddy list.
-  </para>
-</refsect2>
+
+----
+
+#### buddy-icon-changed
 
-<refsect2 id="blist-buddy-icon-changed" role="signal">
- <title>The <literal>&quot;buddy-icon-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleBuddy *buddy, gpointer user_data);
+```
+
 Emitted when a buddy's icon is set.
-  </para>
-</refsect2>
+
+----
+
+#### blist-node-aliased
 
-<refsect2 id="blist-blist-node-aliased" role="signal">
- <title>The <literal>&quot;blist-node-aliased&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBlistNode *node,
-                                                        const char *old_alias,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleBlistNode *node,
+                   const gchar *old_alias,
+                   gpointer user_data);
+```
+
 Emitted when a blist node (buddy, chat, or contact) is aliased.
-  </para>
-</refsect2>
+
+----
+
+#### buddy-caps-changed
 
-<refsect2 id="blist-buddy-caps-changed" role="signal">
- <title>The <literal>&quot;buddy-caps-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleBuddy *buddy,
-                                                        PurpleMediaCaps newcaps,
-                                                        PurpleMediaCaps oldcaps,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleBuddy *buddy,
+                   PurpleMediaCaps newcaps,
+                   PurpleMediaCaps oldcaps,
+                   gpointer user_data);
+```
+
 Emitted when updating a buddy's media capabilities.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>buddy</parameter>&#160;:</term>
-    <listitem><simpara>The buddy.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>newcaps</parameter>&#160;:</term>
-    <listitem><simpara>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>oldcaps</parameter>&#160;:</term>
-    <listitem><simpara>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**buddy**
+: The buddy.
+
+**newcaps**
+: .
+
+**oldcaps**
+: .
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### ui-caps-changed
 
-<refsect2 id="blist-ui-caps-changed" role="signal">
- <title>The <literal>&quot;ui-caps-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleMediaCaps newcaps,
-                                                        PurpleMediaCaps oldcaps,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleMediaCaps newcaps,
+                   PurpleMediaCaps oldcaps,
+                   gpointer user_data);
+```
+
 Emitted when updating the media capabilities of the UI.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>newcaps</parameter>&#160;:</term>
-    <listitem><simpara>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>oldcaps</parameter>&#160;:</term>
-    <listitem><simpara>.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**newcaps**
+: .
 
-</refsect1>
+**oldcaps**
+: .
 
-</chapter>
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_certificate.xml b/doc/reference/libpurple/signals_certificate.xml
deleted file mode 100644
--- a/doc/reference/libpurple/signals_certificate.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-certificate">
-<title>Certificate signals</title>
-
-<refsect1 id="certificates.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="certificates-certificate-stored">certificate-stored</link>&quot;
-  &quot;<link linkend="certificates-certificate-deleted">certificate-deleted</link>&quot;
-</synopsis>
-</refsect1>
-
-<refsect1 id="certificates.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
-
-<refsect2 id="certificates-certificate-stored" role="signal">
- <title>The <literal>&quot;certificate-stored&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleCertificatePool *pool,
-                                                        const gchar *id,
-                                                        gpointer data)
-</programlisting>
-  <para>
-Emitted when a pool stores a certificate. Connect to the pool instance.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>pool</parameter>&#160;:</term>
-    <listitem><simpara>Pool the certificate has been stored into.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>Key the certificate was stored under.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
-
-<refsect2 id="certificates-certificate-deleted" role="signal">
- <title>The <literal>&quot;certificate-deleted&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleCertificatePool *pool,
-                                                        const gchar *id,
-                                                        gpointer data)
-</programlisting>
-  <para>
-Emitted when a pool deletes a certificate. Connect to the pool instance.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>pool</parameter>&#160;:</term>
-    <listitem><simpara>Pool the certificate was deleted from.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>Key that was deleted.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
-
-</refsect1>
-
-</chapter>
diff --git a/doc/reference/libpurple/signals_cmd.xml b/doc/reference/libpurple/signals_cmd.md
rename from doc/reference/libpurple/signals_cmd.xml
rename to doc/reference/libpurple/signals_cmd.md
--- a/doc/reference/libpurple/signals_cmd.xml
+++ b/doc/reference/libpurple/signals_cmd.md
@@ -1,73 +1,54 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-cmd">
-<title>Command signals</title>
+Title: Command Signals
+Slug: command-signals
+
+## Command Signals
+
+### Signal List
+
+* [cmd-added](#cmd-added)
+* [cmd-removed](#cmd-removed)
 
-<refsect1 id="cmds.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="cmds-cmd-added">cmd-added</link>&quot;
-  &quot;<link linkend="cmds-cmd-removed">cmd-removed</link>&quot;
-</synopsis>
-</refsect1>
+### Signal Details
+
+#### cmd-added
 
-<refsect1 id="cmds.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+```c
+void user_function(const gchar *command,
+                   PurpleCmdPriority priority,
+                   PurpleCmdFlag flag,
+                   gpointer user_data);
+```
 
-<refsect2 id="cmds-cmd-added" role="signal">
- <title>The <literal>&quot;cmd-added&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char *command,
-                                                        PurpleCmdPriority priority,
-                                                        PurpleCmdFlag flag,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when a new command is added.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>command</parameter>&#160;:</term>
-    <listitem><simpara>The new command.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>priority</parameter>&#160;:</term>
-    <listitem><simpara>The priority of the new command.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flag</parameter>&#160;:</term>
-    <listitem><simpara>The command flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**command**
+: The new command.
+
+**priority**
+: The priority of the new command.
+
+**flag**
+: The command flags.
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="cmds-cmd-removed" role="signal">
- <title>The <literal>&quot;cmd-removed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char *command,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### cmd-removed
+
+```c
+void user_function(const gchar *command, gpointer user_data);
+```
+
 Emitted when a command is removed.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>command</parameter>&#160;:</term>
-    <listitem><simpara>The removed command.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
 
-</refsect1>
+**command**
+: The removed command.
 
-</chapter>
+**user_data**
+: User data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_connection.xml b/doc/reference/libpurple/signals_connection.md
rename from doc/reference/libpurple/signals_connection.xml
rename to doc/reference/libpurple/signals_connection.md
--- a/doc/reference/libpurple/signals_connection.xml
+++ b/doc/reference/libpurple/signals_connection.md
@@ -1,200 +1,173 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-connection">
-<title>Connection signals</title>
+Title: Connection Signals
+Slug: connection-signals
+
+## Connection Signals
+
+### Signal List
 
-<refsect1 id="connections.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="connections-online">online</link>&quot;
-  &quot;<link linkend="connections-offline">offline</link>&quot;
-  &quot;<link linkend="connections-signing-on">signing-on</link>&quot;
-  &quot;<link linkend="connections-signed-on">signed-on</link>&quot;
-  &quot;<link linkend="connections-autojoin">autojoin</link>&quot;
-  &quot;<link linkend="connections-signing-off">signing-off</link>&quot;
-  &quot;<link linkend="connections-signed-off">signed-off</link>&quot;
-  &quot;<link linkend="connections-connection-error">connection-error</link>&quot;
-</synopsis>
-</refsect1>
+* [online](#online)
+* [offline](#offline)
+* [signing-on](#signing-on)
+* [signed-on](#signed-on)
+* [autojoin](#autojoin)
+* [signing-off](#signing-off)
+* [signed-off](#signed-off)
+* [connection-error](#connection-error)
 
-<refsect1 id="connections.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### online
 
-<refsect2 id="connections-online" role="signal">
- <title>The <literal>&quot;online&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(gpointer user_data);
+```
+
 Emitted when the first connection has connected when all connections were
 previously not connected.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="connections-offline" role="signal">
- <title>The <literal>&quot;online&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### offline
+
+```c
+void user_function(gpointer user_data);
+```
+
 Emitted when the last connected connection has disconnected.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+
+**Parameters:**
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="connections-signing-on" role="signal">
- <title>The <literal>&quot;signing-on&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### signing-on
+
+```c
+void user_function(PurpleConnection *gc, gpointer user_data);
+```
+
 Emitted when a connection is about to sign on.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection that is about to sign on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**gc**
+: The connection that is about to sign on.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### signed-on
+
+```c
+void user_function(PurpleConnection *gc, gpointer user_data);
+```
+
+Emitted when a connection has signed on.
+
+**Parameters:**
 
-<refsect2 id="connections-signed-on" role="signal">
- <title>The <literal>&quot;signed-on&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a connection has signed on.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection that has signed on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**gc**
+: The connection that has signed on.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### autojoin
+
+```c
+gboolean user_function(PurpleConnection *gc, gpointer user_data);
+```
+
+Emitted when a connection has signed on, after the signed-on signal, to signal
+UIs to autojoin chats if they wish. UIs should connect to this with
+`PURPLE_SIGNAL_PRIORITY_HIGHEST` to allow plugins to block this signal before
+the UI sees it and then re-emit it later.
+
+**Parameters:**
 
-<refsect2 id="connections-autojoin" role="signal">
- <title>The <literal>&quot;autojoin&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleConnection *gc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a connection has signed on, after the signed-on signal, to signal UIs to autojoin chats if they wish.  UIs should connect to this with <literal>PURPLE_SIGNAL_PRIORITY_HIGHEST</literal> to allow plugins to block this signal before the UI sees it and then re-emit it later.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection that has signed on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the signal was handled or <literal>FALSE</literal> otherwise.  In practice, the return value is irrelevant, as it really only exists so plugins can block the UI's autojoin.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**gc**
+: The connection that has signed on.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+`TRUE` If the signal was handled or `FALSE` otherwise.  In practice, the return
+value is irrelevant, as it really only exists so plugins can block the UI's
+autojoin.
+
+----
+
+#### signing-off
 
-<refsect2 id="connections-signing-off" role="signal">
- <title>The <literal>&quot;signing-off&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleConnection *gc, gpointer user_data);
+```
+
 Emitted when a connection is about to sign off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection that is about to sign off.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**gc**
+: The connection that is about to sign off.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### signed-off
 
-<refsect2 id="connections-signed-off" role="signal">
- <title>The <literal>&quot;signed-off&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleConnection *gc, gpointer user_data);
+```
+
 Emitted when a connection has signed off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection that has signed off.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**gc**
+: The connection that has signed off.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### connection-error
 
-<refsect2 id="connections-connection-error" role="signal">
- <title>The <literal>&quot;connection-error&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        PurpleConnectionError err,
-                                                        const gchar *desc,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a connection error occurs, before <literal>"signed"</literal>-off.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the error has occurred.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>err</parameter>&#160;:</term>
-    <listitem><simpara>The error that occurred.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>desc</parameter>&#160;:</term>
-    <listitem><simpara>A description of the error, giving more information.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+void user_function(PurpleConnection *gc,
+                   PurpleConnectionError err,
+                   const gchar *desc,
+                   gpointer user_data);
+```
+
+Emitted when a connection error occurs, before `"signed"`-off.
+
+**Parameters:**
 
-</refsect1>
+**gc**
+: The connection on which the error has occurred.
+
+**err**
+: The error that occurred.
 
-</chapter>
+**desc**
+: A description of the error, giving more information.
+
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_conversation.xml b/doc/reference/libpurple/signals_conversation.md
rename from doc/reference/libpurple/signals_conversation.xml
rename to doc/reference/libpurple/signals_conversation.md
--- a/doc/reference/libpurple/signals_conversation.xml
+++ b/doc/reference/libpurple/signals_conversation.md
@@ -1,1232 +1,1066 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-conversation">
-<title>Conversation signals</title>
+Title: Conversation Signals
+Slug: conversation-signals
+
+## Conversation Signals
+
+### Signal List
 
-<refsect1 id="conversations.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="conversations-writing-im-msg">writing-im-msg</link>&quot;
-  &quot;<link linkend="conversations-wrote-im-msg">wrote-im-msg</link>&quot;
-  &quot;<link linkend="conversations-sending-im-msg">sending-im-msg</link>&quot;
-  &quot;<link linkend="conversations-sent-im-msg">sent-im-msg</link>&quot;
-  &quot;<link linkend="conversations-receiving-im-msg">receiving-im-msg</link>&quot;
-  &quot;<link linkend="conversations-received-im-msg">received-im-msg</link>&quot;
-  &quot;<link linkend="conversations-blocked-im-msg">blocked-im-msg</link>&quot;
-  &quot;<link linkend="conversations-writing-chat-msg">writing-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-wrote-chat-msg">wrote-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-sending-chat-msg">sending-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-sent-chat-msg">sent-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-receiving-chat-msg">receiving-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-received-chat-msg">received-chat-msg</link>&quot;
-  &quot;<link linkend="conversations-conversation-created">conversation-created</link>&quot;
-  &quot;<link linkend="conversations-conversation-updated">conversation-updated</link>&quot;
-  &quot;<link linkend="conversations-deleting-conversation">deleting-conversation</link>&quot;
-  &quot;<link linkend="conversations-buddy-typing">buddy-typing</link>&quot;
-  &quot;<link linkend="conversations-buddy-typing-stopped">buddy-typing-stopped</link>&quot;
-  &quot;<link linkend="conversations-chat-user-joining">chat-user-joining</link>&quot;
-  &quot;<link linkend="conversations-chat-user-joined">chat-user-joined</link>&quot;
-  &quot;<link linkend="conversations-chat-user-flags">chat-user-flags</link>&quot;
-  &quot;<link linkend="conversations-chat-user-leaving">chat-user-leaving</link>&quot;
-  &quot;<link linkend="conversations-chat-user-left">chat-user-left</link>&quot;
-  &quot;<link linkend="conversations-chat-inviting-user">chat-inviting-user</link>&quot;
-  &quot;<link linkend="conversations-chat-invited-user">chat-invited-user</link>&quot;
-  &quot;<link linkend="conversations-chat-invited">chat-invited</link>&quot;
-  &quot;<link linkend="conversations-chat-invite-blocked">chat-invite-blocked</link>&quot;
-  &quot;<link linkend="conversations-chat-joined">chat-joined</link>&quot;
-  &quot;<link linkend="conversations-chat-join-failed">chat-join-failed</link>&quot;
-  &quot;<link linkend="conversations-chat-left">chat-left</link>&quot;
-  &quot;<link linkend="conversations-chat-topic-changed">chat-topic-changed</link>&quot;
-  &quot;<link linkend="conversations-cleared-message-history">cleared-message-history</link>&quot;
-  &quot;<link linkend="conversations-conversation-extended-menu">conversation-extended-menu</link>&quot;
-  &quot;<link linkend="conversations-sent-attention">sent-attention</link>&quot;
-  &quot;<link linkend="conversations-got-attention">got-attention</link>&quot;
-</synopsis>
-</refsect1>
+* [writing-im-msg](#writing-im-msg)
+* [wrote-im-msg](#wrote-im-msg)
+* [sending-im-msg](#sending-im-msg)
+* [sent-im-msg](#sent-im-msg)
+* [receiving-im-msg](#receiving-im-msg)
+* [received-im-msg](#received-im-msg)
+* [blocked-im-msg](#blocked-im-msg)
+* [writing-chat-msg](#writing-chat-msg)
+* [wrote-chat-msg](#wrote-chat-msg)
+* [sending-chat-msg](#sending-chat-msg)
+* [sent-chat-msg](#sent-chat-msg)
+* [receiving-chat-msg](#receiving-chat-msg)
+* [received-chat-msg](#received-chat-msg)
+* [conversation-created](#conversation-created)
+* [conversation-updated](#conversation-updated)
+* [deleting-conversation](#deleting-conversation)
+* [buddy-typing](#buddy-typing)
+* [buddy-typing-stopped](#buddy-typing-stopped)
+* [chat-user-joining](#chat-user-joining)
+* [chat-user-joined](#chat-user-joined)
+* [chat-user-flags](#chat-user-flags)
+* [chat-user-leaving](#chat-user-leaving)
+* [chat-user-left](#chat-user-left)
+* [chat-inviting-user](#chat-inviting-user)
+* [chat-invited-user](#chat-invited-user)
+* [chat-invited](#chat-invited)
+* [chat-invite-blocked](#chat-invite-blocked)
+* [chat-joined](#chat-joined)
+* [chat-join-failed](#chat-join-failed)
+* [chat-left](#chat-left)
+* [chat-topic-changed](#chat-topic-changed)
+* [cleared-message-history](#cleared-message-history)
+* [conversation-extended-menu](#conversation-extended-menu)
+* [sent-attention](#sent-attention)
+* [got-attention](#got-attention)
 
-<refsect1 id="conversations.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### writing-im-msg
 
-<refsect2 id="conversations-writing-im-msg" role="signal">
- <title>The <literal>&quot;writing-im-msg&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        char **message,
-                                                        PurpleIMConversation *im,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+gboolean user_function(PurpleAccount *account,
+                       const gchar *who,
+                       gchar **message,
+                       PurpleIMConversation *im,
+                       PurpleMessageFlags flags,
+                       gpointer user_data);
+```
+
 Emitted before a message is written in an IM conversation. If the message is changed, then the changed message is displayed and logged instead of the original message.
-  </para>
-  <note><para>
-Make sure to free <literal>*message</literal> before you replace it!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>im</parameter>&#160;:</term>
-    <listitem><simpara>The IM conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>Flags for this message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the message should be canceled, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+> Make sure to free `*message` before you replace it.
+
+**Parameters:**
+
+**account**
+: The account.
+
+**who**
+: The name of the user.
+
+**message**
+: A pointer to the message.
+
+**im**
+: The IM conversation.
+
+**flags**
+: Flags for this message.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+`TRUE` if the message should be canceled, or `FALSE` otherwise.
+
+----
+
+#### wrote-im-msg
 
-<refsect2 id="conversations-wrote-im-msg" role="signal">
- <title>The <literal>&quot;wrote-im-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        char *message,
-                                                        PurpleIMConversation *im,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *who,
+                   gchar *message,
+                   PurpleIMConversation *im,
+                   PurpleMessageFlags flags,
+                   gpointer user_data);
+```
+
 Emitted after a message is written and possibly displayed in a conversation.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>im</parameter>&#160;:</term>
-    <listitem><simpara>The IM conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>Flags for this message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**who**
+: The name of the user.
+
+**message**
+: The message.
+
+**im**
+: The IM conversation.
+
+**flags**
+: Flags for this message.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### sending-im-msg
 
-<refsect2 id="conversations-sending-im-msg" role="signal">
- <title>The <literal>&quot;sending-im-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *receiver,
-                                                        char **message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted before sending an IM to a user. <literal>message</literal> is a pointer to the message string, so the plugin can replace the message before being sent.
-  </para>
-  <note><para>
-Make sure to free <literal>*message</literal> before you replace it!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message is being sent on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>receiver</parameter>&#160;:</term>
-    <listitem><simpara>The username of the receiver.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the outgoing message. This can be modified.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *receiver,
+                   gchar **message,
+                   gpointer user_data);
+```
+
+Emitted before sending an IM to a user. `message` is a pointer to the message
+string, so the plugin can replace the message before being sent.
+
+> Make sure to free `*message` before you replace it!
+
+**Parameters:**
+
+**account**
+: The account the message is being sent on.
+
+**receiver**
+: The username of the receiver.
+
+**message**
+: A pointer to the outgoing message. This can be modified.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### sent-im-msg
 
-<refsect2 id="conversations-sent-im-msg" role="signal">
- <title>The <literal>&quot;sent-im-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *receiver,
-                                                        const char *message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *receiver,
+                   const gchar *message,
+                   gpointer user_data);
+```
+
 Emitted after sending an IM to a user.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was sent on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>receiver</parameter>&#160;:</term>
-    <listitem><simpara>The username of the receiver.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account the message was sent on.
+
+**receiver**
+: The username of the receiver.
+
+**message**
+: The message that was sent.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### receiving-im-msg
+
+```c
+gboolean user_function(PurpleAccount *account,
+                       gchar **sender,
+                       gchar **message,
+                       PurpleIMConversation *im,
+                       PurpleMessageFlags *flags,
+                       gpointer user_data)
+```
 
-<refsect2 id="conversations-receiving-im-msg" role="signal">
- <title>The <literal>&quot;receiving-im-msg&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleAccount *account,
-                                                        char **sender,
-                                                        char **message,
-                                                        PurpleIMConversation *im,
-                                                        PurpleMessageFlags *flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when an IM is received. The callback can replace the name of the sender, the message, or the flags by modifying the pointer to the strings and integer. This can also be used to cancel a message by returning <literal>TRUE</literal>.
-  </para>
-  <note><para>
-Make sure to free <literal>*sender</literal> and <literal>*message</literal> before you replace them!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was received on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>sender</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the username of the sender.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>im</parameter>&#160;:</term>
-    <listitem><simpara>The IM conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the IM message flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the message should be canceled, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+Emitted when an IM is received. The callback can replace the name of the sender, the message, or the flags by modifying the pointer to the strings and integer. This can also be used to cancel a message by returning `TRUE`.
+
+> Make sure to free `*sender` and `*message` before you replace them!
+
+**Parameters:**
+
+**account**
+: The account the message was received on.
+
+**sender**
+: A pointer to the username of the sender.
+
+**message**
+: A pointer to the message that was sent.
+
+**im**
+: The IM conversation.
+
+**flags**
+: A pointer to the IM message flags.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+`TRUE` if the message should be canceled, or `FALSE` otherwise.
+
+----
+
+#### received-im-msg
 
-<refsect2 id="conversations-received-im-msg" role="signal">
- <title>The <literal>&quot;received-im-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        char *sender,
-                                                        char *message,
-                                                        PurpleIMConversation *im,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   gchar *sender,
+                   gchar *message,
+                   PurpleIMConversation *im,
+                   PurpleMessageFlags flags,
+                   gpointer user_data);
+```
+
 Emitted after an IM is received.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was received on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>sender</parameter>&#160;:</term>
-    <listitem><simpara>The username of the sender.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>im</parameter>&#160;:</term>
-    <listitem><simpara>The IM conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>The IM message flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account the message was received on.
+
+**sender**
+: The username of the sender.
+
+**message**
+: The message that was sent.
+
+**im**
+: The IM conversation.
+
+**flags**
+: The IM message flags.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### blocked-im-msg
 
-<refsect2 id="conversations-blocked-im-msg" role="signal">
- <title>The <literal>&quot;blocked-im-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *sender,
-                                                        const char *message,
-                                                        PurpleMessageFlags flags,
-                                                        time_t when,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *sender,
+                   const gchar *message,
+                   PurpleMessageFlags flags,
+                   time_t when,
+                   gpointer user_data);
+```
+
 Emitted after an IM is blocked due to privacy settings.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was received on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>sender</parameter>&#160;:</term>
-    <listitem><simpara>The username of the sender.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message that was blocked.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>The IM message flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>when</parameter>&#160;:</term>
-    <listitem><simpara>The time the message was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account the message was received on.
+
+**sender**
+: The username of the sender.
+
+**message**
+: The message that was blocked.
+
+**flags**
+: The IM message flags.
 
-<refsect2 id="conversations-writing-chat-msg" role="signal">
- <title>The <literal>&quot;writing-chat-msg&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        char **message,
-                                                        PurpleChatConversation *chat,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**when**
+: The time the message was sent.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### writing-chat-msg
+
+```c
+gboolean user_function(PurpleAccount *account,
+                       const gchar *who,
+                       gchar **message,
+                       PurpleChatConversation *chat,
+                       PurpleMessageFlags flags,
+                       gpointer user_data);
+```
+
 Emitted before a message is written in a chat conversation. If the message is changed, then the changed message is displayed and logged instead of the original message.
-  </para>
-  <note><para>
-Make sure to free <literal>*message</literal> before you replace it!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>Flags for this message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the message should be canceled, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+> Make sure to free `*message` before you replace it!
+
+**Parameters:**
+
+**account**
+: The account.
+
+**who**
+: The name of the user.
+
+**message**
+: A pointer to the message.
+
+**chat**
+: The chat conversation.
+
+**flags**
+: Flags for this message.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+`TRUE` if the message should be canceled, or `FALSE` otherwise.
+
+----
+
+#### wrote-chat-msg
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *who,
+                   gchar *message,
+                   PurpleChatConversation *chat,
+                   PurpleMessageFlags flags,
+                   gpointer user_data);
+```
+
+Emitted after a message is written and possibly displayed in a chat.
+
+**Parameters:**
 
-<refsect2 id="conversations-wrote-chat-msg" role="signal">
- <title>The <literal>&quot;wrote-chat-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        char *message,
-                                                        PurpleChatConversation *chat,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted after a message is written and possibly displayed in a chat.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>Flags for this message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**account**
+: The account.
+
+**who**
+: The name of the user.
+
+**message**
+: The message.
+
+**chat**
+: The chat conversation.
+
+**flags**
+: Flags for this message.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### sending-chat-msg
+
+```c
+void user_function(PurpleAccount *account,
+                   gchar **message,
+                   gint id,
+                   gpointer user_data);
+```
+
+Emitted before sending a message to a chat. `message` is a pointer to the
+message string, so the plugin can replace the message before being sent.
+
+> Make sure to free `*message` before you replace it!
+
+**Parameters:**
+
+**account**
+: The account the message is being sent on.
+
+**message**
+: A pointer to the message that will be sent.
+
+**id**
+: The ID of the chat.
 
-<refsect2 id="conversations-sending-chat-msg" role="signal">
- <title>The <literal>&quot;sending-chat-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        char **message,
-                                                        int id,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted before sending a message to a chat. <literal>message</literal> is a pointer to the message string, so the plugin can replace the message before being sent.
-  </para>
-  <note><para>
-Make sure to free <literal>*message</literal> before you replace it!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message is being sent on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the message that will be sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>The ID of the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### sent-chat-msg
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *message,
+                   gint id,
+                   gpointer user_data)
+```
+
+Emitted after sending a message to a chat.
+
+**Parameters:**
+
+**account**
+: The account the message was sent on.
+
+**message**
+: The message that was sent.
+
+**id**
+: The ID of the chat.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
 
-<refsect2 id="conversations-sent-chat-msg" role="signal">
- <title>The <literal>&quot;sent-chat-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *message,
-                                                        int id,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted after sending a message to a chat.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was sent on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>The ID of the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+#### receiving-chat-msg
+
+```c
+gboolean user_function(PurpleAccount *account,
+                       gchar **sender,
+                       gchar **message,
+                       PurpleChatConversation *chat,
+                       gint *flags,
+                       gpointer user_data);
+```
+
+Emitted when a chat message is received. The callback can replace the name of the sender, the message, or the flags by modifying the pointer to the strings. This can also be used to cancel displaying a message by returning `TRUE`.
+
+> Make sure to free `*sender` and `*message` before you replace them!
+
+**Parameters:**
+
+**account**
+: The account the message was received on.
+
+**sender**
+: A pointer to the username of the sender.
+
+**message**
+: A pointer to the message that was sent.
+
+**chat**
+: The chat conversation.
+
+**flags**
+: A pointer to the chat message flags.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-receiving-chat-msg" role="signal">
- <title>The <literal>&quot;receiving-chat-msg&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleAccount *account,
-                                                        char **sender,
-                                                        char **message,
-                                                        PurpleChatConversation *chat,
-                                                        int *flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a chat message is received. The callback can replace the name of the sender, the message, or the flags by modifying the pointer to the strings. This can also be used to cancel displaying a message by returning <literal>TRUE</literal>.
-  </para>
-  <note><para>
-Make sure to free <literal>*sender</literal> and <literal>*message</literal> before you replace them!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was received on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>sender</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the username of the sender.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the chat message flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the message should be canceled, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Returns:**
+
+`TRUE` if the message should be canceled, or `FALSE` otherwise.
+
+----
+
+#### received-chat-msg
+
+```c
+void user_function(PurpleAccount *account,
+                   gchar *sender,
+                   gchar *message,
+                   PurpleChatConversation *chat,
+                   PurpleMessageFlags flags,
+                   gpointer user_data)
+```
+
+Emitted after a chat message is received.
+
+**Parameters:**
+
+**account**
+: The account the message was received on.
+
+**sender**
+: The username of the sender.
+
+**message**
+: The message that was sent.
+
+**chat**
+: The chat conversation.
 
-<refsect2 id="conversations-received-chat-msg" role="signal">
- <title>The <literal>&quot;received-chat-msg&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        char *sender,
-                                                        char *message,
-                                                        PurpleChatConversation *chat,
-                                                        PurpleMessageFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted after a chat message is received.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the message was received on.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>sender</parameter>&#160;:</term>
-    <listitem><simpara>The username of the sender.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The message that was sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>The chat message flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**flags**
+: The chat message flags.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### conversation-created
+
+```c
+void user_function(PurpleConversation *conv, gpointer user_data);
+```
+
+Emitted when a new conversation is created.
 
-<refsect2 id="conversations-conversation-created" role="signal">
- <title>The <literal>&quot;conversation-created&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConversation *conv,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a new conversation is created.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The new conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Parameters:**
+
+**conv**
+: The new conversation.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-conversation-updated" role="signal">
- <title>The <literal>&quot;conversation-updated&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConversation *conv,
-                                                        PurpleConvUpdateType type,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### conversation-updated
+
+```c
+void user_function(PurpleConversation *conv,
+                   PurpleConvUpdateType type,
+                   gpointer user_data);
+```
+
 Emitted when a conversation is updated.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation that was updated.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The type of update that was made.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**conv**
+: The conversation that was updated.
+
+**type**
+: The type of update that was made.
 
-<refsect2 id="conversations-deleting-conversation" role="signal">
- <title>The <literal>&quot;deleting-conversation&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConversation *conv,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### deleting-conversation
+
+```c
+void user_function(PurpleConversation *conv, gpointer user_data);
+```
+
 Emitted just before a conversation is to be destroyed.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation that's about to be destroyed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**conv**
+: The conversation that's about to be destroyed.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### buddy-typing
 
-<refsect2 id="conversations-buddy-typing" role="signal">
- <title>The <literal>&quot;buddy-typing&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *name,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *name,
+                   gpointer user_data);
+```
+
 Emitted when a buddy starts typing in a conversation window.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account of the user which is typing.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user which is typing.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account of the user which is typing.
+
+**name**
+: The name of the user which is typing.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### buddy-typing-stopped
 
-<refsect2 id="conversations-buddy-typing-stopped" role="signal">
- <title>The <literal>&quot;buddy-typing-stopped&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *name,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *name,
+                   gpointer user_data);
+```
+
 Emitted when a buddy stops typing in a conversation window.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account of the user which stopped typing.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user which stopped typing.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account of the user which stopped typing.
+
+**name**
+: The name of the user which stopped typing.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-user-joining" role="signal">
- <title>The <literal>&quot;chat-user-joining&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleChatConversation *chat,
-                                                        const char *name,
-                                                        PurpleChatUserFlags flags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### chat-user-joining
+
+```c
+gboolean user_function(PurpleChatConversation *chat,
+                       const gchar *name,
+                       PurpleChatUserFlags flags,
+                       gpointer user_data);
+```
+
 Emitted when a buddy is joining a chat, before the list of users in the chat updates to include the new user.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user that is joining the conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>The flags of the user that is joining the conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the join should be hidden, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user that is joining the conversation.
+
+**flags**
+: The flags of the user that is joining the conversation.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-user-joined" role="signal">
- <title>The <literal>&quot;chat-user-joined&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        const char *name,
-                                                        PurpleChatUserFlags flags,
-                                                        gboolean new_arrival,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**Returns:**
+
+`TRUE` if the join should be hidden, or `FALSE` otherwise.
+
+----
+
+#### chat-user-joined
+
+```c
+void user_function(PurpleChatConversation *chat,
+                   const gchar *name,
+                   PurpleChatUserFlags flags,
+                   gboolean new_arrival,
+                   gpointer user_data);
+```
+
 Emitted when a buddy joined a chat, after the users list is updated.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user that has joined the conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>flags</parameter>&#160;:</term>
-    <listitem><simpara>The flags of the user that has joined the conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>new_arrival</parameter>&#160;:</term>
-    <listitem><simpara>If the buddy is a new arrival.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user that has joined the conversation.
+
+**flags**
+: The flags of the user that has joined the conversation.
+
+**new_arrival**
+: If the buddy is a new arrival.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### chat-join-failed
 
-<refsect2 id="conversations-chat-join-failed" role="signal">
- <title>The <literal>&quot;chat-join-failed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        GHashTable *components,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleConnection *gc,
+                   GHashTable *components,
+                   gpointer user_data);
+```
+
 Emitted when an account fails to join a chat room.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The PurpleConnection of the account which failed to join the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>data</parameter>&#160;:</term>
-    <listitem><simpara>The components passed to purple_serv_join_chat() originally. The hash function should be g_str_hash() and the equal function should be g_str_equal().</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**gc**
+: The PurpleConnection of the account which failed to join the chat.
+
+**data**
+: The components passed to purple_serv_join_chat() originally. The hash function should be g_str_hash() and the equal function should be g_str_equal().
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-user-flags" role="signal">
- <title>The <literal>&quot;chat-user-flags&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatUser *chatuser,
-                                                        PurpleChatUserFlags oldflags,
-                                                        PurpleChatUserFlags newflags,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### chat-user-flags
+
+```c
+void user_function(PurpleChatUser *chatuser,
+                   PurpleChatUserFlags oldflags,
+                   PurpleChatUserFlags newflags,
+                   gpointer user_data);
+```
+
 Emitted when a user in a chat changes flags.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chatuser</parameter>&#160;:</term>
-    <listitem><simpara>The chat user whose flags changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>oldflags</parameter>&#160;:</term>
-    <listitem><simpara>The old flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>newflags</parameter>&#160;:</term>
-    <listitem><simpara>The new flags.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chatuser**
+: The chat user whose flags changed.
+
+**oldflags**
+: The old flags.
+
+**newflags**
+: The new flags.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### chat-user-leaving
+
+```c
+gboolean user_function(PurpleChatConversation *chat,
+                       const gchar *name,
+                       const gchar *reason,
+                       gpointer user_data);
+```
+
+Emitted when a user is leaving a chat, before the user list is updated. This
+may include an optional reason why the user is leaving.
+
+**Parameters:**
+
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user that is leaving the chat.
+
+**reason**
+: The optional reason why the user is leaving.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-user-leaving" role="signal">
- <title>The <literal>&quot;chat-user-leaving&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleChatConversation *chat,
-                                                        const char *name,
-                                                        const char *reason,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a user is leaving a chat, before the user list is updated. This may include an optional reason why the user is leaving.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user that is leaving the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>reason</parameter>&#160;:</term>
-    <listitem><simpara>The optional reason why the user is leaving.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara><literal>TRUE</literal> if the leave should be hidden, or <literal>FALSE</literal> otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Returns:**
+
+`TRUE` if the leave should be hidden, or `FALSE` otherwise.
+
+----
+
+#### chat-user-left
+
+
+```c
+void user_function(PurpleChatConversation *chat,
+                   const gchar *name,
+                   const gchar *reason,
+                   gpointer user_data);
+```
+
+Emitted when a user leaves a chat, after the user list is updated. This may include an optional reason why the user is leaving.
+
+**Parameters:**
 
-<refsect2 id="conversations-chat-user-left" role="signal">
- <title>The <literal>&quot;chat-user-left&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        const char *name,
-                                                        const char *reason,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a user leaves a chat, after the user list is updated. This may include an optional reason why the user is leaving.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user that left the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>reason</parameter>&#160;:</term>
-    <listitem><simpara>The optional reason why the user left the chat.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user that left the chat.
+
+**reason**
+: The optional reason why the user left the chat.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-inviting-user" role="signal">
- <title>The <literal>&quot;chat-inviting-user&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        const char *name,
-                                                        char **invite_message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### chat-inviting-user
+
+
+```c
+void user_function(PurpleChatConversation *chat,
+                   const gchar *name,
+                   gchar **invite_message,
+                   gpointer user_data);
+```
+
 Emitted when a user is being invited to the chat. The callback can replace the invite message to the invitee by modifying the pointer to the invite message.
-  </para>
-  <note><para>
-Make sure to free <literal>*invite_message</literal> before you replace it!
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user being invited.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>invite_message</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the reason why a user is being invited.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+> Make sure to free `*invite_message` before you replace it!
+
+**Parameters:**
+
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user being invited.
+
+**invite_message**
+: A pointer to the reason why a user is being invited.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### chat-invited-user
+
+```c
+void user_function(PurpleChatConversation *conv,
+                   const gchar *name,
+                   const gchar *invite_message,
+                   gpointer user_data);
+```
 
-<refsect2 id="conversations-chat-invited-user" role="signal">
- <title>The <literal>&quot;chat-invited-user&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *conv,
-                                                        const char *name,
-                                                        const char *invite_message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
 Emitted when a user invited another user to a chat.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the user that was invited.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>invite_message</parameter>&#160;:</term>
-    <listitem><simpara>The message to be sent to the user when invited.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The chat conversation.
+
+**name**
+: The name of the user that was invited.
+
+**invite_message**
+: The message to be sent to the user when invited.
 
-<refsect2 id="conversations-chat-invited" role="signal">
- <title>The <literal>&quot;chat-invited&quot;</literal> signal</title>
-<programlisting>
-gint                user_function                      (PurpleAccount *account,
-                                                        const char *inviter,
-                                                        const char *chat,
-                                                        const char *invite_messageconst GHashTable *components,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### chat-invited
+
+```c
+gint user_function(PurpleAccount *account,
+                   const gchar *inviter,
+                   const gchar *chat,
+                   const gchar *invite_message,
+                   GHashTable *components,
+                   gpointer user_data);
+```
+
 Emitted when an account was invited to a chat.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account being invited.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>inviter</parameter>&#160;:</term>
-    <listitem><simpara>The username of the person inviting the account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The name of the chat you're being invited to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>invite_message</parameter>&#160;:</term>
-    <listitem><simpara>The optional invite message.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>components</parameter>&#160;:</term>
-    <listitem><simpara>The components necessary if you want to call  purple_serv_join_chat().</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>Less than zero if the invitation should be rejected, greater than zero if the invitation should be accepted. If zero is returned, the default behavior will be maintained: the user will be prompted.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account being invited.
+
+**inviter**
+: The username of the person inviting the account.
+
+**chat**
+: The name of the chat you're being invited to.
+
+**invite_message**
+: The optional invite message.
+
+**components**
+: The components necessary if you want to call  purple_serv_join_chat().
 
-<refsect2 id="conversations-chat-invite-blocked" role="signal">
- <title>The <literal>&quot;chat-invite-blocked&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *inviter,
-                                                        const char *name,
-                                                        const char *message,
-                                                        GHashTable *data)
-</programlisting>
-  <para>
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+Less than zero if the invitation should be rejected, greater than zero if the
+invitation should be accepted. If zero is returned, the default behavior will
+be maintained: the user will be prompted.
+
+----
+
+#### chat-invite-blocked
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *inviter,
+                   const gchar *name,
+                   const gchar *message,
+                   GHashTable *data);
+```
+
 Emitted when an invitation to join a chat is blocked.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account the invitation was sent to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>inviter</parameter>&#160;:</term>
-    <listitem><simpara>The name of the person sending the invitation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>name</parameter>&#160;:</term>
-    <listitem><simpara>The name of the chat invited to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The invitation message sent.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>data</parameter>&#160;:</term>
-    <listitem><simpara>Hashtable containing data about the invited chat.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account the invitation was sent to.
+
+**inviter**
+: The name of the person sending the invitation.
+
+**name**
+: The name of the chat invited to.
+
+**message**
+: The invitation message sent.
+
+**data**
+: Hashtable containing data about the invited chat.
+
+----
+
+#### chat-joined
 
-<refsect2 id="conversations-chat-joined" role="signal">
- <title>The <literal>&quot;chat-joined&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleChatConversation *chat, gpointer user_data);
+```
+
 Emitted when an account joins a chat room.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The conversation that joined the chat room.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The conversation that joined the chat room.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-left" role="signal">
- <title>The <literal>&quot;chat-left&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### chat-left
+
+```c
+void user_function(PurpleChatConversation *chat, gpointer user_data);
+```
+
 Emitted when an account leaves a chat room.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The conversation that left the chat room.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The conversation that left the chat room.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="conversations-chat-topic-changed" role="signal">
- <title>The <literal>&quot;chat-topic-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleChatConversation *chat,
-                                                        const char *who,
-                                                        const char *topic,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### chat-topic-changed
+
+```c
+void user_function(PurpleChatConversation *chat,
+                   const gchar *who,
+                   const gchar *topic,
+                   gpointer user_data);
+```
+
 Emitted when the topic is changed in a chat.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>chat</parameter>&#160;:</term>
-    <listitem><simpara>The chat conversation whose topic changed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the person that changed the topic.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>topic</parameter>&#160;:</term>
-    <listitem><simpara>The new topic.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**chat**
+: The chat conversation whose topic changed.
+
+**who**
+: The name of the person that changed the topic.
+
+**topic**
+: The new topic.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### conversation-extended-menu
 
-<refsect2 id="conversations-conversation-extended-menu" role="signal">
- <title>The <literal>&quot;conversation-extended-menu&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConversation *conv,
-                                                        GList **list,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleConversation *conv,
+                   GList **list,
+                   gpointer user_data);
+```
+
 Emitted when the UI requests a list of plugin actions for a conversation.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>list</parameter>&#160;:</term>
-    <listitem><simpara>A pointer to the list of actions.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**conv**
+: The conversation.
+
+**list**
+: A pointer to the list of actions.
 
-<refsect2 id="conversations-cleared-message-history" role="signal">
- <title>The <literal>&quot;cleared-message-history&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConversation *conv,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### cleared-message-history
+
+```c
+void user_function(PurpleConversation *conv, gpointer user_data);
+```
+
 Emitted when the conversation history is cleared.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**conv**
+: The conversation.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
 
-<refsect2 id="conversations-sent-attention" role="signal">
- <title>The <literal>&quot;sent-attention&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        PurpleConversation *conv,
-                                                        guint type,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+#### sent-attention
+
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *who,
+                   PurpleConversation *conv,
+                   guint type,
+                   gpointer user_data);
+```
+
 Emitted when receiving an attention message (buzz, nudge, etc.).
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the person receiving the attention.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The attention type (an index starting at 0).</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**who**
+: The name of the person receiving the attention.
+
+**conv**
+: The conversation.
+
+**type**
+: The attention type (an index starting at 0).
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### got-attention
 
-<refsect2 id="conversations-got-attention" role="signal">
- <title>The <literal>&quot;got-attention&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        PurpleConversation *conv,
-                                                        guint type,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *who,
+                   PurpleConversation *conv,
+                   guint type,
+                   gpointer user_data);
+```
+
 Emitted when receiving an attention message (buzz, nudge, etc.).
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the person sending the attention.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>conv</parameter>&#160;:</term>
-    <listitem><simpara>The conversation.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The attention type (an index starting at 0).</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**account**
+: The account.
+
+**who**
+: The name of the person sending the attention.
 
-</refsect1>
+**conv**
+: The conversation.
 
-</chapter>
+**type**
+: The attention type (an index starting at 0).
+
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_core.xml b/doc/reference/libpurple/signals_core.md
rename from doc/reference/libpurple/signals_core.xml
rename to doc/reference/libpurple/signals_core.md
--- a/doc/reference/libpurple/signals_core.xml
+++ b/doc/reference/libpurple/signals_core.md
@@ -1,68 +1,51 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-core">
-<title>Core signals</title>
+Title: Core Signals
+Slug: core-signals
+
+## Core Signals
 
-<refsect1 id="core.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="core-quitting">quitting</link>&quot;
-  &quot;<link linkend="core-uri-handler">uri-handler</link>&quot;
-</synopsis>
-</refsect1>
+### Signal List
+
+* [core-quitting](#quitting)
+* [core-uri-handler](#uri-handler)
+
+### Signal Details
 
-<refsect1 id="core.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+#### quitting
+
+```c
+void user_function(gpointer user_data);
+```
 
-<refsect2 id="core-quitting" role="signal">
- <title>The <literal>&quot;quitting&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (gpointer user_data)
-</programlisting>
-  <para>
 Emitted when libpurple is quitting.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**user_data**
+: User data set when the signal handler was connected.
 
-<refsect2 id="core-uri-handler" role="signal">
- <title>The <literal>&quot;uri-handler&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (const gchar *proto,
-                                                        const gchar *cmd,
-                                                        GHashTable *params,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+----
+
+#### uri-handler
+
+```c
+gboolean user_function(const gchar *proto,
+                       const gchar *cmd,
+                       GHashTable *params,
+                       gpointer user_data);
+```
+
 Emitted when handling a registered URI.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>proto</parameter>&#160;:</term>
-    <listitem><simpara>The protocol of the URI.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>cmd</parameter>&#160;:</term>
-    <listitem><simpara>The 'command' of the URI.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>params</parameter>&#160;:</term>
-    <listitem><simpara>Any key/value parameters from the URI.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**proto**
+: The protocol of the URI.
 
-</refsect1>
+**cmd**
+: The 'command' of the URI.
 
-</chapter>
+**params**
+: Any key/value parameters from the URI.
+
+**user_data**
+: User data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_imgstore.xml b/doc/reference/libpurple/signals_imgstore.md
rename from doc/reference/libpurple/signals_imgstore.xml
rename to doc/reference/libpurple/signals_imgstore.md
--- a/doc/reference/libpurple/signals_imgstore.xml
+++ b/doc/reference/libpurple/signals_imgstore.md
@@ -1,44 +1,31 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-imgstore">
-<title>Stored Image signals</title>
+Title: Stored Image Signals
+Slug: stored-image-signals
+
+## Stored Image Signals
 
-<refsect1 id="imgstores.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="imgstores-image-deleting">image-deleting</link>&quot;
-</synopsis>
-</refsect1>
+### Signal List
+
+* [image-deleting](#image-deleting)
 
-<refsect1 id="imgstores.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### image-deleting
 
-<refsect2 id="imgstores-image-deleting" role="signal">
- <title>The <literal>&quot;image-deleting&quot;</literal> signal</title>
-<programlisting>
-char *              user_function                      (const PurpleStoredImage *img,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when a #PurpleStoredImage is about to be destroyed.  This allows for what amounts to weak references.  Code can hold onto a pointer to the PurpleStoredImage without actually "holding" a reference.  They can then use a signal handler to let them know when their img is about to be destroyed.
-  </para>
-  <note><para>
-It's not possible to purple_imgstore_ref() img to save it.
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>img</parameter>&#160;:</term>
-    <listitem><simpara>The image about to be destroyed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+gchar *user_function(const PurpleStoredImage *img, gpointer user_data);
+```
+
+Emitted when a #PurpleStoredImage is about to be destroyed.  This allows for
+what amounts to weak references. Code can hold onto a pointer to the
+PurpleStoredImage without actually "holding" a reference.  They can then use a
+signal handler to let them know when their img is about to be destroyed.
 
-</refsect1>
+> It's not possible to purple_imgstore_ref() img to save it.
+
+**Parameters:**
 
-</chapter>
+**img**
+: The image about to be destroyed.
+
+**user_data**
+: User data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_jabber.xml b/doc/reference/libpurple/signals_jabber.md
rename from doc/reference/libpurple/signals_jabber.xml
rename to doc/reference/libpurple/signals_jabber.md
--- a/doc/reference/libpurple/signals_jabber.xml
+++ b/doc/reference/libpurple/signals_jabber.md
@@ -1,311 +1,277 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-jabber">
-<title>Jabber signals</title>
+Title: Jabber Signals
+Slug: jabber-signals
+
+## Jabber Signals
+
+### Signal List
+
+* [jabber-receiving-iq](#jabber-receiving-iq)
+* [jabber-receiving-message](#jabber-receiving-message)
+* [jabber-receiving-presence](#jabber-receiving-presence)
+* [jabber-watched-iq](#jabber-watched-iq)
+* [jabber-register-namespace-watcher](#jabber-register-namespace-watcher)
+* [jabber-unregister-namespace-watcher](#jabber-unregister-namespace-watcher)
+* [jabber-sending-xmlnode](#jabber-sending-xmlnode)
+* [jabber-receiving-xmlnode](#jabber-receiving-xmlnode)
+
+### Signal Details
+
+#### jabber-receiving-iq
+
+```c
+gboolean user_function(PurpleConnection *gc,
+                       const gchar *type,
+                       const gchar *id,
+                       const gchar *from,
+                       PurpleXmlNode *iq,
+                       gpointer user_data);
+```
 
-<refsect1 id="jabber.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="jabber-jabber-receiving-iq">jabber-receiving-iq</link>&quot;
-  &quot;<link linkend="jabber-jabber-receiving-message">jabber-receiving-message</link>&quot;
-  &quot;<link linkend="jabber-jabber-receiving-presence">jabber-receiving-presence</link>&quot;
-  &quot;<link linkend="jabber-jabber-watched-iq">jabber-watched-iq</link>&quot;
-  &quot;<link linkend="jabber-jabber-register-namespace-watcher">jabber-register-namespace-watcher</link>&quot;
-  &quot;<link linkend="jabber-jabber-unregister-namespace-watcher">jabber-unregister-namespace-watcher</link>&quot;
-  &quot;<link linkend="jabber-jabber-sending-xmlnode">jabber-sending-xmlnode</link>&quot;
-  &quot;<link linkend="jabber-jabber-receiving-xmlnode">jabber-receiving-xmlnode</link>&quot;
-</synopsis>
-</refsect1>
+Emitted when an XMPP IQ stanza is received. Allows a plugin to process IQ
+stanzas.
+
+**Parameters:**
+
+**gc**
+: The connection on which the stanza is received.
+
+**type**
+: The IQ type ('get', 'set', 'result', or 'error').
+
+**id**
+: The ID attribute from the stanza. MUST NOT be NULL.
 
-<refsect1 id="jabber.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+**from**
+: The originator of the stanza. MAY BE NULL if the stanza originated from the
+user's server.
+
+**iq**
+: The full stanza received.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+`TRUE` if the plugin processed this stanza and *nobody else* should process it.
+`FALSE` otherwise.
+
+----
+
+#### jabber-receiving-message
 
-<refsect2 id="jabber-jabber-receiving-iq" role="signal">
- <title>The <literal>&quot;jabber-receiving-iq&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleConnection *gc,
-                                                        const char *type,
-                                                        const char *id,
-                                                        const char *from,
-                                                        PurpleXmlNode *iq,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when an XMPP IQ stanza is received. Allows a plugin to process IQ stanzas.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the stanza is received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The IQ type ('get', 'set', 'result', or 'error').</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>The ID attribute from the stanza. MUST NOT be NULL.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>from</parameter>&#160;:</term>
-    <listitem><simpara>The originator of the stanza. MAY BE NULL if the stanza originated from the user's server.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>iq</parameter>&#160;:</term>
-    <listitem><simpara>The full stanza received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>TRUE if the plugin processed this stanza and *nobody else* should process it. FALSE otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+```c
+gboolean user_function(PurpleConnection *gc,
+                       const gchar *type,
+                       const gchar *id,
+                       const gchar *from,
+                       const gchar *to,
+                       PurpleXmlNode *message,
+                       gpointer user_data);
+```
+
+Emitted when an XMPP message stanza is received. Allows a plugin to process
+message stanzas.
+
+**Parameters:**
+
+**gc**
+: The connection on which the stanza is received.
+
+**type**
+: The message type (see rfc3921 or rfc3921bis).
+
+**id**
+: The ID attribute from the stanza. MAY BE NULL.
+
+**from**
+: The originator of the stanza. MAY BE NULL if the stanza originated from the
+user's server.
+
+**to**
+: The destination of the stanza. This is probably either the full JID of the
+receiver or the receiver's bare JID.
+
+**message**
+: The full stanza received.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="jabber-jabber-receiving-message" role="signal">
- <title>The <literal>&quot;jabber-receiving-message&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleConnection *gc,
-                                                        const char *type,
-                                                        const char *id,
-                                                        const char *from,
-                                                        const char *to,
-                                                        PurpleXmlNode *message,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when an XMPP message stanza is received. Allows a plugin to process message stanzas.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the stanza is received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The message type (see rfc3921 or rfc3921bis).</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>The ID attribute from the stanza. MAY BE NULL.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>from</parameter>&#160;:</term>
-    <listitem><simpara>The originator of the stanza. MAY BE NULL if the stanza originated from the user's server.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>to</parameter>&#160;:</term>
-    <listitem><simpara>The destination of the stanza. This is probably either the full JID of the receiver or the receiver's bare JID.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>message</parameter>&#160;:</term>
-    <listitem><simpara>The full stanza received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>TRUE if the plugin processed this stanza and *nobody else* should process it. FALSE otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Returns:**
+
+`TRUE` if the plugin processed this stanza and *nobody else* should process it.
+`FALSE` otherwise.
+
+----
+
+#### jabber-receiving-presence
+
+```c
+gboolean user_function(PurpleConnection *gc,
+                       const gchar *type,
+                       const gchar *from,
+                       PurpleXmlNode *presence,
+                       gpointer user_data)
+```
+
+Emitted when an XMPP presence stanza is received. Allows a plugin to process
+presence stanzas.
+
+**Parameters:**
+
+**gc**
+: The connection on which the stanza is received.
+
+**type**
+: The presence type (see rfc3921 or rfc3921bis). NULL indicates this is an
+"available" (i.e. online) presence.
+
+**from**
+: The originator of the stanza. MAY BE NULL if the stanza originated from the
+user's server.
+
+**presence**
+: The full stanza received.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="jabber-jabber-receiving-presence" role="signal">
- <title>The <literal>&quot;jabber-receiving-presence&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleConnection *gc,
-                                                        const char *type,
-                                                        const char *from,
-                                                        PurpleXmlNode *presence,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when an XMPP presence stanza is received. Allows a plugin to process presence stanzas.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the stanza is received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The presence type (see rfc3921 or rfc3921bis). NULL indicates this is an "available" (i.e. online) presence.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>from</parameter>&#160;:</term>
-    <listitem><simpara>The originator of the stanza. MAY BE NULL if the stanza originated from the user's server.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>presence</parameter>&#160;:</term>
-    <listitem><simpara>The full stanza received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>TRUE if the plugin processed this stanza and *nobody else* should process it. FALSE otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Returns:**
+
+`TRUE` if the plugin processed this stanza and *nobody else* should process it.
+`FALSE` otherwise.
+
+----
+
+#### jabber-watched-iq
+
+```c
+gboolean user_function(PurpleConnection *gc,
+                       const gchar *type,
+                       const gchar *id,
+                       const gchar *from,
+                       PurpleXmlNode *child,
+                       gpointer user_data);
+```
+
+Emitted when an IQ with a watched (child, namespace) pair is received.  See jabber-register-namespace-watcher and jabber-unregister-namespace-watcher.
+
+**Parameters:**
+
+**gc**
+: The connection on which the stanza is received.
+
+**type**
+: The IQ type ('get', 'set', 'result', or 'error').
+
+**id**
+: The ID attribute from the stanza. MUST NOT be NULL.
+
+**from**
+: The originator of the stanza. MAY BE NULL if the stanza originated from the user's server.
 
-<refsect2 id="jabber-jabber-watched-iq" role="signal">
- <title>The <literal>&quot;jabber-watched-iq&quot;</literal> signal</title>
-<programlisting>
-gboolean            user_function                      (PurpleConnection *gc,
-                                                        const char *type,
-                                                        const char *id,
-                                                        const char *from,
-                                                        PurpleXmlNode *child,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted when an IQ with a watched (child, namespace) pair is received.  See jabber-register-namespace-watcher and jabber-unregister-namespace-watcher.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the stanza is received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>type</parameter>&#160;:</term>
-    <listitem><simpara>The IQ type ('get', 'set', 'result', or 'error').</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>id</parameter>&#160;:</term>
-    <listitem><simpara>The ID attribute from the stanza. MUST NOT be NULL.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>from</parameter>&#160;:</term>
-    <listitem><simpara>The originator of the stanza. MAY BE NULL if the stanza originated from the user's server.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>child</parameter>&#160;:</term>
-    <listitem><simpara>The child node with namespace.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>TRUE if the plugin processed this stanza and *nobody else* should process it. FALSE otherwise.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**child**
+: The child node with namespace.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+**Returns:**
+
+`TRUE` if the plugin processed this stanza and *nobody else* should process it.
+`FALSE` otherwise.
+
+----
+
+#### jabber-register-namespace-watcher
+
+```c
+void user_function(const gchar *node,
+                   const gchar *namespace,
+                   gpointer user_data)
+```
+
+Emit this signal to register your desire to have specific IQ stanzas to be
+emitted via the jabber-watched-iq signal when received.
+
+**Parameters:**
+
+**node**
+: The IQ child name to longer watch.
+
+**namespace**
+: The IQ child namespace to longer watch.
+
+**user_data**
+: user data set when the signal handler was connected.
 
-<refsect2 id="jabber-jabber-register-namespace-watcher" role="signal">
- <title>The <literal>&quot;jabber-register-namespace-watcher&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char *node,
-                                                        const char *namespace,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emit this signal to register your desire to have specific IQ stanzas to be emitted via the jabber-watched-iq signal when received.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>node</parameter>&#160;:</term>
-    <listitem><simpara>The IQ child name to longer watch.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>namespace</parameter>&#160;:</term>
-    <listitem><simpara>The IQ child namespace to longer watch.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+----
+
+#### jabber-unregister-namespace-watcher
+
+```c
+void user_function(const gchar *node,
+                   const gchar *namespace,
+                   gpointer user_data);
+```
+
+Emit this signal to unregister your desire to have specific IQ stanzas to be
+emitted via the jabber-watched-iq signal when received.
+
+**Parameters:**
 
-<refsect2 id="jabber-jabber-unregister-namespace-watcher" role="signal">
- <title>The <literal>&quot;jabber-unregister-namespace-watcher&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char *node,
-                                                        const char *namespace,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emit this signal to unregister your desire to have specific IQ stanzas to be emitted via the jabber-watched-iq signal when received.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>node</parameter>&#160;:</term>
-    <listitem><simpara>The IQ child name to no longer watch.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>namespace</parameter>&#160;:</term>
-    <listitem><simpara>The IQ child namespace to no longer watch.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**node**
+: The IQ child name to no longer watch.
+
+**namespace**
+: The IQ child namespace to no longer watch.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### jabber-sending-xmlnode
+
+```c
+void user_function(PurpleConnection *gc,
+                   PurpleXmlNode **stanza,
+                   gpointer user_data);
+```
 
-<refsect2 id="jabber-jabber-sending-xmlnode" role="signal">
- <title>The <literal>&quot;jabber-sending-xmlnode&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        PurpleXmlNode **stanza,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emit this signal (<literal>purple_signal_emit</literal>) to send a stanza. It is preferred to use this instead of purple_protocol_server_iface_send_raw.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which to send the stanza.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>stanza</parameter>&#160;:</term>
-    <listitem><simpara>The stanza to send. If stanza is not NULL after being sent, the emitter should free it.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+Emit this signal (`purple_signal_emit`) to send a stanza. It is preferred to use this instead of purple_protocol_server_iface_send_raw.
+
+**Parameters:**
+
+**gc**
+: The connection on which to send the stanza.
+
+**stanza**
+: The stanza to send. If stanza is not NULL after being sent, the emitter should free it.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### jabber-receiving-xmlnode
 
-<refsect2 id="jabber-jabber-receiving-xmlnode" role="signal">
- <title>The <literal>&quot;jabber-receiving-xmlnode&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleConnection *gc,
-                                                        PurpleXmlNode **stanza,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleConnection *gc,
+                   PurpleXmlNode **stanza,
+                   gpointer user_data);
+```
+
 Emitted when an XMPP stanza is received. Allows a plugin to process any stanza.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>gc</parameter>&#160;:</term>
-    <listitem><simpara>The connection on which the stanza was received.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>stanza</parameter>&#160;:</term>
-    <listitem><simpara>The received stanza. Set stanza to NULL (and free it) to stop processing the stanza.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**gc**
+: The connection on which the stanza was received.
 
-</refsect1>
+**stanza**
+: The received stanza. Set stanza to NULL (and free it) to stop processing the stanza.
 
-</chapter>
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_log.xml b/doc/reference/libpurple/signals_log.xml
deleted file mode 100644
--- a/doc/reference/libpurple/signals_log.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-log">
-<title>Log signals</title>
-
-<refsect1 id="logs.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="logs-log-timestamp">log-timestamp</link>&quot;
-</synopsis>
-</refsect1>
-
-<refsect1 id="logs.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
-
-<refsect2 id="logs-log-timestamp" role="signal">
- <title>The <literal>&quot;log-timestamp&quot;</literal> signal</title>
-<programlisting>
-char *              user_function                      (PurpleLog *log,
-                                                        time_t when,
-                                                        gboolean show_date,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted to allow plugins to customize the timestamp on a message being logged.
-  </para>
-  <note><para>
-Plugins must be careful of logs with a type of PURPLE_LOG_SYSTEM.
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>log</parameter>&#160;:</term>
-    <listitem><simpara>The log the message belongs to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>when</parameter>&#160;:</term>
-    <listitem><simpara>The time to be converted to a string.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>show_date</parameter>&#160;:</term>
-    <listitem><simpara>Whether the date should be displayed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><emphasis>Returns</emphasis>&#160;:</term>
-    <listitem><simpara>A textual representation of the time, or <literal>NULL</literal> to use a default format.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
-
-</refsect1>
-
-</chapter>
diff --git a/doc/reference/libpurple/signals_notify.xml b/doc/reference/libpurple/signals_notify.md
rename from doc/reference/libpurple/signals_notify.xml
rename to doc/reference/libpurple/signals_notify.md
--- a/doc/reference/libpurple/signals_notify.xml
+++ b/doc/reference/libpurple/signals_notify.md
@@ -1,133 +1,106 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-notify">
-<title>Notify signals</title>
+Title: Notify Signals
+Slug: notify-signals
+
+## Notify Signals
+
+### Signal List
+
+* [displaying-userinfo](#displaying-userinfo)
+* [displaying-email-notification](#displaying-email-notification)
+* [displaying-emails-notification](#displaying-emails-notification)
+
+### Signal Details
 
-<refsect1 id="notify.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="notify-displaying-userinfo">displaying-userinfo</link>&quot;
-  &quot;<link linkend="notify-displaying-email-notification">displaying-email-notification</link>&quot;
-  &quot;<link linkend="notify-displaying-emails-notification">displaying-emails-notification</link>&quot;
-</synopsis>
-</refsect1>
+#### displaying-userinfo
 
-<refsect1 id="notify.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+```c
+void user_function(PurpleAccount *account,
+                   const gchar *who,
+                   PurpleNotifyUserInfo *user_info,
+                   gpointer user_data);
+```
+
+Emitted before userinfo is handed to the UI to display. `user_info` can be manipulated via the PurpleNotifyUserInfo API in notify.c.
+
+> If adding a PurpleNotifyUserInfoEntry, be sure not to free it --
+> PurpleNotifyUserInfo assumes responsibility for its objects.
 
-<refsect2 id="notify-displaying-userinfo" role="signal">
- <title>The <literal>&quot;displaying-userinfo&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleAccount *account,
-                                                        const char *who,
-                                                        PurpleNotifyUserInfo *user_info,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
-Emitted before userinfo is handed to the UI to display. <literal>user_info</literal> can be manipulated via the PurpleNotifyUserInfo API in notify.c.
-  </para>
-  <note><para>
-If adding a PurpleNotifyUserInfoEntry, be sure not to free it -- PurpleNotifyUserInfo assumes responsibility for its objects.
-  </para></note>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>account</parameter>&#160;:</term>
-    <listitem><simpara>The account on which the info was obtained.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>who</parameter>&#160;:</term>
-    <listitem><simpara>The name of the buddy whose info is to be displayed.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_info</parameter>&#160;:</term>
-    <listitem><simpara>The information to be displayed, as PurpleNotifyUserInfoEntry objects.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+**Parameters:**
+
+**account**
+: The account on which the info was obtained.
+
+**who**
+: The name of the buddy whose info is to be displayed.
+
+**user_info**
+: The information to be displayed, as PurpleNotifyUserInfoEntry objects.
 
-<refsect2 id="notify-displaying-email-notification" role="signal">
- <title>The <literal>&quot;displaying-email-notification&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char *subject,
-                                                        const char *from,
-                                                        const char *to,
-                                                        const char *url,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### displaying-email-notification
+
+```c
+void user_function(const gchar *subject,
+                   const gchar *from,
+                   const gchar *to,
+                   const gchar *url,
+                   gpointer user_data);
+```
+
 Emitted before notification of a single email is handed to the UI to display.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>subject</parameter>&#160;:</term>
-    <listitem><simpara>Subject of email being notified of.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>from</parameter>&#160;:</term>
-    <listitem><simpara>Who the email is from.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>to</parameter>&#160;:</term>
-    <listitem><simpara>Who the email is to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>url</parameter>&#160;:</term>
-    <listitem><simpara>A url to view the email.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**subject**
+: Subject of email being notified of.
+
+**from**
+: Who the email is from.
+
+**to**
+: Who the email is to.
+
+**url**
+: A url to view the email.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### displaying-emails-notification
 
-<refsect2 id="notify-displaying-emails-notification" role="signal">
- <title>The <literal>&quot;displaying-emails-notification&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (const char **subjects,
-                                                        const char **froms,
-                                                        const char **tos,
-                                                        const char **urls,
-                                                        guint count,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(const gchar **subjects,
+                   const gchar **froms,
+                   const gchar **tos,
+                   const gchar **urls,
+                   guint count,
+                   gpointer user_data)
+```
+
 Emitted before notification of multiple emails is handed to the UI to display.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>subjects</parameter>&#160;:</term>
-    <listitem><simpara>Subjects of emails being notified of.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>froms</parameter>&#160;:</term>
-    <listitem><simpara>Who the emails are from.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>tos</parameter>&#160;:</term>
-    <listitem><simpara>Who the emails are to.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>urls</parameter>&#160;:</term>
-    <listitem><simpara>The urls to view the emails.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>count</parameter>&#160;:</term>
-    <listitem><simpara>Number of emails being notified of.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**subjects**
+: Subjects of emails being notified of.
+
+**froms**
+: Who the emails are from.
 
-</refsect1>
+**tos**
+: Who the emails are to.
+
+**urls**
+: The urls to view the emails.
 
-</chapter>
+**count**
+: Number of emails being notified of.
+
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_plugin.xml b/doc/reference/libpurple/signals_plugin.md
rename from doc/reference/libpurple/signals_plugin.xml
rename to doc/reference/libpurple/signals_plugin.md
--- a/doc/reference/libpurple/signals_plugin.xml
+++ b/doc/reference/libpurple/signals_plugin.md
@@ -1,63 +1,46 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-plugin">
-<title>Plugin signals</title>
+Title: Plugin Signals
+Slug: plugin-signals
+
+## Plugin Signals
+
+### Signal List
 
-<refsect1 id="plugins.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="plugins-plugin-load">plugin-load</link>&quot;
-  &quot;<link linkend="plugins-plugin-unload">plugin-unload</link>&quot;
-</synopsis>
-</refsect1>
+* [plugin-load](#plugin-load)
+* [plugin-unload](#plugin-unload)
+
+### Signal Details
 
-<refsect1 id="plugins.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+#### plugin-load
 
-<refsect2 id="plugins-plugin-load" role="signal">
- <title>The <literal>&quot;plugin-load&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurplePlugin *plugin,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurplePlugin *plugin, gpointer user_data);
+```
+
 Emitted when a plugin is loaded.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>plugin</parameter>&#160;:</term>
-    <listitem><simpara>The plugin that was loaded.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
+
+**plugin**
+: The plugin that was loaded.
+
+**user_data**
+: user data set when the signal handler was connected.
+
+----
+
+#### plugin-unload
 
-<refsect2 id="plugins-plugin-unload" role="signal">
- <title>The <literal>&quot;plugin-unload&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurplePlugin *plugin,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurplePlugin *plugin, gpointer user_data);
+```
+
 Emitted when a plugin is unloaded.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>plugin</parameter>&#160;:</term>
-    <listitem><simpara>The plugin that was unloaded.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>user_data</parameter>&#160;:</term>
-    <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+
+**Parameters:**
 
-</refsect1>
+**plugin**
+: The plugin that was unloaded.
 
-</chapter>
+**user_data**
+: user data set when the signal handler was connected.
diff --git a/doc/reference/libpurple/signals_savedstatus.xml b/doc/reference/libpurple/signals_savedstatus.md
rename from doc/reference/libpurple/signals_savedstatus.xml
rename to doc/reference/libpurple/signals_savedstatus.md
--- a/doc/reference/libpurple/signals_savedstatus.xml
+++ b/doc/reference/libpurple/signals_savedstatus.md
@@ -1,32 +1,20 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-savedstatus">
-<title>Saved Status signals</title>
+Title: Saved Status Signals
+Slug: saved-status-signals
 
-<refsect1 id="savedstatuses.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="savedstatuses-savedstatus-changed">savedstatus-changed</link>&quot;
-</synopsis>
-</refsect1>
+## Saved Status Signals
+
+### Signal List
+
+* [savedstatus-changed](#savedstatus-changed)
 
-<refsect1 id="savedstatuses.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Details
+
+#### savedstatus-changed
 
-<refsect2 id="savedstatuses-savedstatus-changed" role="signal">
- <title>The <literal>&quot;savedstatus-changed&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleSavedStatus *new,
-                                                        PurpleSavedStatus *old,
-                                                        gpointer user_data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleSavedStatus *new,
+                   PurpleSavedStatus *old,
+                   gpointer user_data);
+```
+
 Emitted when a new saved status is activated.
-  </para>
-</refsect2>
-
-</refsect1>
-
-</chapter>
diff --git a/doc/reference/libpurple/signals_xfer.xml b/doc/reference/libpurple/signals_xfer.md
rename from doc/reference/libpurple/signals_xfer.xml
rename to doc/reference/libpurple/signals_xfer.md
--- a/doc/reference/libpurple/signals_xfer.xml
+++ b/doc/reference/libpurple/signals_xfer.md
@@ -1,41 +1,26 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-signals-xfer">
-<title>File Transfer signals</title>
+Title: File Transfer Signals
+Slug: file-transfer-signals
+
+## File Transfer Signals
 
-<refsect1 id="xfers.signals" role="signal_proto">
-<title role="signal_proto.title">List of signals</title>
-<synopsis>
-  &quot;<link linkend="xfers-file-recv-request">file-recv-request</link>&quot;
-</synopsis>
-</refsect1>
+### Signal List
+
+* [file-recv-request](#file-recv-request)
 
-<refsect1 id="xfers.signal-details" role="signals">
-<title role="signals.title">Signal details</title>
+### Signal Detail
+
+#### file-recv-request
 
-<refsect2 id="xfers-file-recv-request" role="signal">
- <title>The <literal>&quot;file-recv-request&quot;</literal> signal</title>
-<programlisting>
-void                user_function                      (PurpleXfer *xfer,
-                                                        gpointer data)
-</programlisting>
-  <para>
+```c
+void user_function(PurpleXfer *xfer, gpointer data);
+```
+
 Emitted before the user is prompted for an incoming file-transfer. Plugins can intercept the signal to auto-accept/auto-reject the requests. To auto-accept the file transfer, use purple_xfer_request_accepted(). To auto-reject, set the status of the xfer to PURPLE_XFER_STATUS_CANCEL_LOCAL.
-  </para>
-  <variablelist role="params">
-  <varlistentry>
-    <term><parameter>xfer</parameter>&#160;:</term>
-    <listitem><simpara>The file transfer.</simpara></listitem>
-  </varlistentry>
-  <varlistentry>
-    <term><parameter>data</parameter>&#160;:</term>
-    <listitem><simpara>User data.</simpara></listitem>
-  </varlistentry>
-  </variablelist>
-</refsect2>
+
+**Parameters:**
 
-</refsect1>
+**xfer**
+: The file transfer.
 
-</chapter>
+**data**
+: User data.
diff --git a/doc/reference/libpurple/tut_c_plugins.xml b/doc/reference/libpurple/tut_c_plugins.md
rename from doc/reference/libpurple/tut_c_plugins.xml
rename to doc/reference/libpurple/tut_c_plugins.md
--- a/doc/reference/libpurple/tut_c_plugins.xml
+++ b/doc/reference/libpurple/tut_c_plugins.md
@@ -1,46 +1,35 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-tut-c-plugins">
-  <title>C Plugins tutorial</title>
+Title: C Plugin Tutorial
+Slug: c-plugin-tutorial
+
+## C Plugin Tutorial
 
-  <sect2 id="tut-c-plugins-introduction">
-  <title>Introduction</title>
-  <para>
-  C plugins are native plugins.  They have complete access to all of the API,
-  and can do basically whatever they want.  All of the protocol plugins are
-  also written in C.
-  </para>
-  </sect2>
+### Introduction
+
+C plugins are native plugins. They have complete access to all of the API,
+and can do basically whatever they want. All of the protocol plugins are
+also written in C.
+
+### Getting Started
 
-  <sect2 id="tut-c-plugins-getting-started">
-  <title>Getting Started</title>
-  <para>
-  To develop a plugin you need to have the libpurple and (for UI plugins) the
-  Pidgin/Finch source code or development headers.  It is generally a good idea
-  to compile against the same version of Pidgin that you are running.  You may
-  also want to develop against the code in our Mercurial repository if you need
-  to use a new feature.  Please do not abuse our Mercurial repository, however.
-  </para>
-  </sect2>
+To develop a plugin you need to have the libpurple and (for UI plugins) the
+Pidgin/Finch source code or development headers. It is generally a good idea
+to compile against the same version of Pidgin that you are running. You may
+also want to develop against the code in our Mercurial repository if you need
+to use a new feature. Please do not abuse our Mercurial repository, however.
 
-  <sect2 id="tut-c-plugins-hello-world">
-  <title>An Example</title>
-  <para>
-  I know every tutorial has a hello world, so why should libpurple be any
-  different?
+### An Example
 
-<example>
-<title>Hello World!</title>
-<programlisting>
-#include &lt;purple.h&gt;
+I know every tutorial has a hello world, so why should libpurple be any
+different?
+
+```c
+#include <purple.h>
 
 static GPluginPluginInfo *
 hello_world_query(GError **error)
 {
 	const gchar * const authors[] = {
-		"Author Name &lt;e@mail&gt;",
+		"Author Name <e@mail>",
 		NULL
 	};
 
@@ -63,8 +52,8 @@
 hello_world_load(GPluginPlugin *plugin, GError **error)
 {
 	purple_notify_message(plugin, PURPLE_NOTIFY_MSG_INFO, "Hello World!",
-						"This is the Hello World! plugin :)",
-						NULL, NULL, NULL, NULL);
+                        "This is the Hello World! plugin :)",
+                        NULL, NULL, NULL, NULL);
 
 	return TRUE;
 }
@@ -76,62 +65,37 @@
 }
 
 GPLUGIN_NATIVE_PLUGIN_DECLARE(hello_world)
-</programlisting>
-</example>
-  </para>
+```
 
-  <para>
-  Okay, so what does all this mean?  We start off by including purple.h.  This
-  file includes all the libpurple header files.
-  </para>
+Okay, so what does all this mean?  We start off by including purple.h.  This
+file includes all the libpurple header files.
 
-  <para>
-  <literal>hello_world_query</literal>, <literal>hello_world_load</literal> and
-  <literal>hello_world_unload</literal> are functions that must be implemented
-  in every plugin.  These functions are named according to the value passed
-  to <literal>GPLUGIN_NATIVE_PLUGIN_DECLARE</literal> which is described below.
-  </para>
+`hello_world_query`, `hello_world_load` and `hello_world_unload` are functions
+that must be implemented in every plugin.  These functions are named according
+to the value passed to `GPLUGIN_NATIVE_PLUGIN_DECLARE` which is described
+below.
 
-  <para>
-  <literal>hello_world_query</literal> is called when the plugin is queried by
-  the plugin system, and returns various information about the plugin in form
-  of a newly created instance of <literal>GPluginPluginInfo</literal> or a
-  subclass.  For a list of all available properties, see
-  <link linkend="purple-plugin-info-new"><function>purple_plugin_info_new()</function></link>.
-  </para>
-
-  <para>
-  If anything should go wrong during the query you can return an error by using
-  <function>g_set_error()</function> on the <literal>error</literal> argument.
-  </para>
+`hello_world_query` is called when the plugin is queried by the plugin system,
+and returns various information about the plugin in form of a newly created
+instance of `GPluginPluginInfo` or a subclass.  For a list of all available
+properties, see `purple_plugin_info_new()`.
 
-  <para>
-  <literal>hello_world_load</literal> is called when the plugin is loaded. That
-  is the user has enabled the plugin or libpurple is loading a plugin that was
-  previously loaded.  You can initialize any variables, register dynamic types,
-  and so on in this function.  Plugins may also want to add their preferences
-  to the pref tree--more about that later.  In this plugin we'll just use it to
-  display a message.  Just like
-  <literal>hello_world_query</literal> if there are any errors that arise, you
-  can call <function>g_set_error()</function> on the <literal>error</literal>
-  agument and return <literal>FALSE</literal>.
-  </para>
+If anything should go wrong during the query you can return an error by using
+`g_set_error()` on the `error` argument.
 
-  <para>
-  <literal>hello_world_unload</literal> is called when the plugin is unloaded.
-  That is, when the user has manually unloaded the plugin or the program is
-  shutting down.  We can use it to wrap up everything, and free our variables.
-  Again, if there are any errors, you can call
-  <function>g_set_error()</function> on the <literal>error</literal> argument
-  and return <literal>FALSE</literal>.
-  </para>
+`hello_world_load` is called when the plugin is loaded. That is the user has
+enabled the plugin or libpurple is loading a plugin that was previously loaded.
+You can initialize any variables, register dynamic types, and so on in this
+function.  Plugins may also want to add their preferences to the pref
+tree--more about that later. In this plugin we'll just use it to display a
+message. Just like `hello_world_query` if there are any errors that arise, you
+can call `g_set_error()` on the `error` agument and return `FALSE`.
 
-  <para>
-  Finally we have
-  <link linkend="GPLUGIN_NATIVE_PLUGIN_DECLARE:CAPS"><function>GPLUGIN_NATIVE_PLUGIN_DECLARE()</function></link>.
-  It is a helper macro that makes creating plugins easier.  It has a single
-  argument which is the prefix used for the <literal>_query</literal>,
-  <literal>_load</literal>, and <literal>_unload</literal> functions.
-  </para>
- </sect2>
-</chapter>
+`hello_world_unload` is called when the plugin is unloaded. That is, when the
+user has manually unloaded the plugin or the program is shutting down. We can
+use it to wrap up everything, and free our variables. Again, if there are any
+errors, you can call `g_set_error()` on the `error` argument and return `FALSE`.
+
+Finally we have `GPLUGIN_NATIVE_PLUGIN_DECLARE()`. It is a helper macro that
+makes creating plugins easier. It has a single argument which is the prefix
+used for the `_query`, `_load`, and `_unload` functions.
diff --git a/doc/reference/libpurple/tut_signals.xml b/doc/reference/libpurple/tut_signals.xml
deleted file mode 100644
--- a/doc/reference/libpurple/tut_signals.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-tut-signals">
-  <title>Signals tutorial</title>
-
-  <sect2 id="tut-signals-introduction">
-  <title>Introduction</title>
-  <para>
-  The libpurple signals interface is used for general event notification, such
-  as plugins being loaded or unloaded, allowing the GUI frontend to respond
-  appropriately to changing internal data. Unfortunately, its use is not at all
-  obvious from the information in the header files. This document uses code
-  snippets from the Pidgin/libpurple plugin systems to illustrate the proper
-  use of signals.
-  </para>
-  </sect2>
-
-  <sect2 id="tut-signals-overview">
-  <title>Overview of Purple-signals</title>
-  <para>
-  Signals in libpurple are very similar to those in GTK+. When certain events
-  happen, a named signal is "emitted" from a certain object. Emitting the
-  signal triggers a series of callbacks that have been "connected" to that
-  signal for that object. These callbacks take appropriate action in response
-  to the signal.
-  </para>
-  </sect2>
-
-  <sect2 id="tut-signals-registering">
-  <title>Registering a Signal</title>
-  <para>
-  The first step of using a signal is registering it with libpurple so that
-  callbacks may be connected to it. This is done using
-  <link linkend="purple-signal-register"><function>purple_signal_register()</function></link>.
-  Here is a slightly modified example from
-  <link linkend="purple-plugins-init"><function>purple_plugins_init()</function></link>
-  in <literal>plugins.c</literal>:
-
-<programlisting>
-purple_signal_register(purple_plugins_get_handle(), /* Instance */
-                       "plugin-load",               /* Signal name */
-                       purple_marshal_VOID__POINTER,/* Marshal function */
-                       G_TYPE_NONE,                 /* Callback return type */
-                       1,                           /* Number of callback arguments (not including void *data) */
-                       PURPLE_TYPE_PLUGIN           /* Type of first callback argument */
-);
-</programlisting>
-  </para>
-
-  <sect3>
-  <title>Instance</title>
-  <para>
-  A reference to the object from which this signal is emitted, and to which
-  potential callbacks should be connected. In this case, it will be the entire
-  plugin module emitting the signal.
-  </para>
-  </sect3>
-  
-  <sect3>
-  <title>Signal Name</title>
-  <para>
-  Unique identifier for the signal itself.
-  </para>
-  </sect3>
-
-  <sect3>
-  <title>Callback function definition</title>
-  <para>
-  The rest of the arguments specify the form of the callback function.
-
-  <itemizedlist>
-    <listitem><para><emphasis>Marshal function</emphasis></para><para>
-  <literal>purple_marshal_VOID__POINTER</literal> represents the callback
-  function prototype, not including a "data" argument, explained later. The form
-  is  <literal>purple_marshal_RETURNVALUETYPE__ARG1TYPE_ARG2TYPE_ETC</literal>.
-  See <link linkend="libpurple-signals">signals.h</link> for more possible types.
-  </para>
-
-  <para>
-  In this case, the callback will have the form
-<programlisting>
-void cb(void *arg1, void *data)
-</programlisting>
-  </para>
-
-  <para>
-  If <literal>purple_marshal_BOOLEAN__POINTER_POINTER_POINTER</literal> were
-  specified, it would be:
-<programlisting>
-gboolean cb(void *arg1, void *arg2, void *arg3, void *data)
-</programlisting>
-
-  The <literal>void *data</literal> argument at the end of each callback function
-  provides the data argument given to
-  <link linkend="purple-signal-connect"><function>purple_signal_connect()</function></link>.
-    </para></listitem>
-
-    <listitem><para><emphasis>Callback return type</emphasis></para><para>
-  In our case, this is G_TYPE_NONE, meaning "returns void".
-<!-- TODO This could be described better. -->
-    </para></listitem>
-
-    <listitem><para><emphasis>Number of callback arguments</emphasis></para><para>
-  The number of arguments (not including <literal>data</literal>) that the callback function
-  will take.
-    </para></listitem>
-
-    <listitem><para><emphasis>Type of argument</emphasis></para><para>
-  <literal>PURPLE_TYPE_PLUGIN</literal> specifies that the first argument given to the callback
-  will be a <literal>PurplePlugin*</literal>. You will need as many "type of argument"
-  arguments to
-  <link linkend="purple-signal-register"><function>purple_signal_register()</function></link>
-  as you specified in
-  "Number of arguments" above.
-
-<!-- TODO Describe this more. -->
-    </para></listitem>
-  </itemizedlist>
-  </para>
-  </sect3>
-  </sect2>
-
-  <sect2 id="tut-signals-connect">
-  <title>Connecting to the signal</title>
-  <para>
-  Once the signal is registered, you can connect callbacks to it. First, you
-  must define a callback function, such as this one from gtkplugin.c :
-<programlisting>
-static void plugin_load_cb(PurplePlugin *plugin, gpointer data)
-{
-	GtkTreeView *view = (GtkTreeView *)data;
-	plugin_loading_common(plugin, view, TRUE);
-}
-</programlisting>
-  Note that the callback function prototype matches that specified in the call
-  to <link linkend="purple-signal-register"><function>purple_signal_register()</function></link>
-  above.
-  </para>
-
-  <para>
-  Once the callback function is defined, you can connect it to the signal.
-  Again from gtkplugin.c , in <function>pidgin_plugin_dialog_show()</function>:
-<programlisting>
-purple_signal_connect(purple_plugins_get_handle(), "plugin-load", /* What to connect to */
-		plugin_dialog,                   /* Object receiving the signal */
-		PURPLE_CALLBACK(plugin_load_cb), /* Callback function */
-		event_view,                      /* Data to pass to the callback function
-);
-</programlisting>
-  </para>
-
-  <para>
-  The first two arguments ("What to connect to") specify the object emitting
-  the signal (the plugin module) and what signal to listen for ("plugin-load").
-  </para>
-
-  <para>
-  The object receiving the signal is <literal>plugin_dialog</literal> , the Pidgin plugins
-  dialog. When <literal>plugin_dialog</literal> is deleted, then 
-  <literal>purple_signals_disconnect_by_handle(plugin_dialog)</literal> should be called to
-  remove all signal connections it is associated with.
-  </para>
-
-  <para>
-  The callback function is given using a helper macro, and finally the
-  <literal>data</literal> argument to be passed to
-  <literal>plugin_load_cb</literal> is given as <literal>event_view</literal>,
-  a pointer to the GTK widget that <literal>plugin_load_cb</literal> needs to update.
-  </para>
-  </sect2>
-
-  <sect2 id="tut-signals-emit-signal">
-  <title>Emitting a signal</title>
-  <para>
-  Connecting callbacks to signals is all well and good, but how do you "fire"
-  the signal and trigger the callback? At some point, you must "emit" the
-  signal, which immediately calls all connected callbacks.
-  </para>
-
-  <para>
-  As seen in <link linkend="purple-plugin-load"><function>purple_plugin_load()</function></link>
-  in plugin.c:
-<programlisting>
-purple_signal_emit(purple_plugins_get_handle(), "plugin-load", plugin);
-</programlisting>
-  This causes the signal "plugin-load" to be emitted from the plugin module
-  (given by
-  <link linkend="purple-plugins-get-handle"><function>purple_plugins_get_handle()</function></link>),
-  with the newly loaded plugin as
-  the argument to pass to any registered callback functions.
-  </para>
-
-  <para>
-  In our example, <literal>plugin_load_cb</literal> is called immediately as
-<programlisting>
-plugin_load_cb(plugin, event_view);
-</programlisting>
-  and does whatever it does.
-  </para>
- </sect2>
-</chapter>
diff --git a/doc/reference/libpurple/ui_ops.xml b/doc/reference/libpurple/ui_ops.xml
deleted file mode 100644
--- a/doc/reference/libpurple/ui_ops.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version='1.0' encoding="ISO-8859-1"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
-               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
-]>
-<chapter id="chapter-ui-ops">
-  <title>List of <literal>UiOps</literal> Structures</title>
-
-  <para>
-  When implementing a UI for libpurple, you need to fill in various UiOps
-  structures:
-
-  <itemizedlist>
-<listitem><link linkend="PurpleAccountUiOps"><literal>PurpleAccountUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleCommandsUiOps"><literal>PurpleCommandsUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleConnectionUiOps"><literal>PurpleConnectionUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleConversationUiOps"><literal>PurpleConversationUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleCoreUiOps"><literal>PurpleCoreUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleIdleUiOps"><literal>PurpleIdleUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleNotifyUiOps"><literal>PurpleNotifyUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleRequestUiOps"><literal>PurpleRequestUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleRoomlistUiOps"><literal>PurpleRoomlistUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleWhiteboardUiOps"><literal>PurpleWhiteboardUiOps</literal></link></listitem>
-<listitem><link linkend="PurpleXferUiOps"><literal>PurpleXferUiOps</literal></link></listitem>
-  </itemizedlist>
- </para>
-
-</chapter>
diff --git a/doc/reference/libpurple/urlmap.js b/doc/reference/libpurple/urlmap.js
new file mode 100644
--- /dev/null
+++ b/doc/reference/libpurple/urlmap.js
@@ -0,0 +1,9 @@
+// SPDX-FileCopyrightText: 2021 GNOME Foundation
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+// A map between namespaces and base URLs for their online documentation
+baseURLs = [
+    [ 'GLib', 'https://docs.gtk.org/glib/' ],
+    [ 'GObject', 'https://docs.gtk.org/gobject/' ],
+    [ 'GPlugin', 'https://docs.imfreedom.org/gplugin/' ],
+]
diff --git a/doc/reference/libpurple/version.xml.in b/doc/reference/libpurple/version.xml.in
deleted file mode 100644
--- a/doc/reference/libpurple/version.xml.in
+++ /dev/null
@@ -1,1 +0,0 @@
-@PURPLE_VERSION@
diff --git a/libpurple/meson.build b/libpurple/meson.build
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -328,6 +328,7 @@
 	libpurple_gir = gnome.generate_gir(libpurple,
 	    sources : introspection_sources,
 	    includes : ['GLib-2.0', 'Gio-2.0', 'GObject-2.0', 'Gst-1.0', 'GPlugin-1.0'],
+	    header : 'purple.h',
 	    namespace : 'Purple',
 	    symbol_prefix : 'purple',
 	    identifier_prefix : 'Purple',
