make our docs job nitpicky and fix every broken link
diff --git a/docs/conf.py b/docs/conf.py
index f674ebe..5a4c41b 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -58,6 +58,8 @@
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
 
+nitpicky = True
+
 # The suffix of source filenames.
 source_suffix = '.rst'
 
@@ -268,6 +270,6 @@
 # texinfo_show_urls = 'footnote'
 
 # Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {'https://docs.python.org/': None}
+intersphinx_mapping = {'https://docs.python.org/3': None}
 
 epub_theme = 'epub'
diff --git a/docs/hazmat/backends/interfaces.rst b/docs/hazmat/backends/interfaces.rst
index e3dc96c..b828fa7 100644
--- a/docs/hazmat/backends/interfaces.rst
+++ b/docs/hazmat/backends/interfaces.rst
@@ -334,7 +334,7 @@
             restricted to only the 1024-bit keys specified in FIPS 186-2.
 
         :return: A new instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.DSAPrivateKey`
+            :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey`
             provider.
 
         :raises ValueError: This is raised if the key size is not supported
@@ -401,7 +401,7 @@
     .. method:: elliptic_curve_supported(curve)
 
         :param curve: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurve`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurve`
             provider.
 
         :returns: True if the elliptic curve is supported by this backend.
@@ -409,11 +409,11 @@
     .. method:: elliptic_curve_signature_algorithm_supported(signature_algorithm, curve)
 
         :param signature_algorithm: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurveSignatureAlgorithm`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurveSignatureAlgorithm`
             provider.
 
         :param curve: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurve`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurve`
             provider.
 
         :returns: True if the signature algorithm and curve are supported by this backend.
@@ -421,27 +421,27 @@
     .. method:: generate_elliptic_curve_private_key(curve)
 
         :param curve: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurve`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurve`
             provider.
 
     .. method:: load_elliptic_curve_private_numbers(numbers)
 
         :param numbers: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePrivateNumbers`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateNumbers`
             provider.
 
         :returns: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePrivateKey`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey`
             provider.
 
     .. method:: load_elliptic_curve_public_numbers(numbers)
 
         :param numbers: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePublicNumbers`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicNumbers`
             provider.
 
         :returns: An instance of a
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePublicKey`
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey`
             provider.
 
 .. class:: PEMSerializationBackend
diff --git a/docs/hazmat/bindings/commoncrypto.rst b/docs/hazmat/bindings/commoncrypto.rst
index 9484cfa..4f58a6d 100644
--- a/docs/hazmat/bindings/commoncrypto.rst
+++ b/docs/hazmat/bindings/commoncrypto.rst
@@ -17,7 +17,7 @@
 
     .. attribute:: ffi
 
-        This is a :class:`cffi.FFI` instance. It can be used to allocate and
+        This is a ``cffi.FFI`` instance. It can be used to allocate and
         otherwise manipulate CommonCrypto structures.
 
     .. attribute:: lib
diff --git a/docs/hazmat/bindings/index.rst b/docs/hazmat/bindings/index.rst
index ccd36e3..8075be1 100644
--- a/docs/hazmat/bindings/index.rst
+++ b/docs/hazmat/bindings/index.rst
@@ -3,7 +3,7 @@
 Bindings
 ========
 
-.. currentmodule:: cryptography.hazmat.bindings
+.. module:: cryptography.hazmat.bindings
 
 ``cryptography`` aims to provide low-level CFFI based bindings to multiple
 native C libraries. These provide no automatic initialization of the library
diff --git a/docs/hazmat/bindings/openssl.rst b/docs/hazmat/bindings/openssl.rst
index 36255b5..446c450 100644
--- a/docs/hazmat/bindings/openssl.rst
+++ b/docs/hazmat/bindings/openssl.rst
@@ -16,7 +16,7 @@
 
     .. attribute:: ffi
 
-        This is a :class:`cffi.FFI` instance. It can be used to allocate and
+        This is a ``cffi.FFI`` instance. It can be used to allocate and
         otherwise manipulate OpenSSL structures.
 
     .. attribute:: lib
diff --git a/docs/hazmat/primitives/asymmetric/dsa.rst b/docs/hazmat/primitives/asymmetric/dsa.rst
index ff934a6..59c0d97 100644
--- a/docs/hazmat/primitives/asymmetric/dsa.rst
+++ b/docs/hazmat/primitives/asymmetric/dsa.rst
@@ -3,7 +3,7 @@
 DSA
 ===
 
-.. currentmodule:: cryptography.hazmat.primitives.asymmetric.dsa
+.. module:: cryptography.hazmat.primitives.asymmetric.dsa
 
 `DSA`_ is a `public-key`_ algorithm for signing messages.
 
diff --git a/docs/hazmat/primitives/asymmetric/ec.rst b/docs/hazmat/primitives/asymmetric/ec.rst
index 4b8177e..caa3f28 100644
--- a/docs/hazmat/primitives/asymmetric/ec.rst
+++ b/docs/hazmat/primitives/asymmetric/ec.rst
@@ -3,7 +3,7 @@
 Elliptic curve cryptography
 ===========================
 
-.. currentmodule:: cryptography.hazmat.primitives.asymmetric.ec
+.. module:: cryptography.hazmat.primitives.asymmetric.ec
 
 
 .. function:: generate_private_key(curve, backend)
diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst
index c37961e..e516f74 100644
--- a/docs/hazmat/primitives/asymmetric/rsa.rst
+++ b/docs/hazmat/primitives/asymmetric/rsa.rst
@@ -3,7 +3,7 @@
 RSA
 ===
 
-.. currentmodule:: cryptography.hazmat.primitives.asymmetric.rsa
+.. module:: cryptography.hazmat.primitives.asymmetric.rsa
 
 `RSA`_ is a `public-key`_ algorithm for encrypting and signing messages.
 
@@ -307,7 +307,7 @@
 
     .. attribute:: public_numbers
 
-        :type: :class:`~cryptography.hazmat.primitives.rsa.RSAPublicNumbers`
+        :type: :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicNumbers`
 
         The :class:`RSAPublicNumbers` which makes up the RSA public key
         associated with this RSA private key.
@@ -316,19 +316,19 @@
 
         :type: int
 
-        ``p``, one of the two primes composing the :attr:`modulus`.
+        ``p``, one of the two primes composing ``n``.
 
     .. attribute:: q
 
         :type: int
 
-        ``q``, one of the two primes composing the :attr:`modulus`.
+        ``q``, one of the two primes composing ``n``.
 
     .. attribute:: d
 
         :type: int
 
-        The private exponent. Alias for :attr:`private_exponent`.
+        The private exponent.
 
     .. attribute:: dmp1
 
diff --git a/docs/hazmat/primitives/asymmetric/serialization.rst b/docs/hazmat/primitives/asymmetric/serialization.rst
index 7ff4ce3..8155e6f 100644
--- a/docs/hazmat/primitives/asymmetric/serialization.rst
+++ b/docs/hazmat/primitives/asymmetric/serialization.rst
@@ -104,9 +104,9 @@
         not encrypted. Or if the key was encrypted but no
         password was supplied.
 
-    :raises UnsupportedAlgorithm: If the serialized key is of a type that
-        is not supported by the backend or if the key is encrypted with a
-        symmetric cipher that is not supported by the backend.
+    :raises cryptography.exceptions.UnsupportedAlgorithm: If the serialized key
+        is of a type that is not supported by the backend or if the key is
+        encrypted with a symmetric cipher that is not supported by the backend.
 
 .. function:: load_pem_public_key(data, backend)
 
@@ -133,8 +133,8 @@
     :raises ValueError: If the PEM data's structure could not be decoded
         successfully.
 
-    :raises UnsupportedAlgorithm: If the serialized key is of a type that
-        is not supported by the backend.
+    :raises cryptography.exceptions.UnsupportedAlgorithm: If the serialized key
+        is of a type that is not supported by the backend.
 
 
 OpenSSH Public Key
@@ -181,5 +181,5 @@
     :raises ValueError: If the OpenSSH data could not be properly decoded or
         if the key is not in the proper format.
 
-    :raises UnsupportedAlgorithm: If the serialized key is of a type that is
-        not supported.
+    :raises cryptography.exceptions.UnsupportedAlgorithm: If the serialized
+        key is of a type that is not supported.
diff --git a/docs/hazmat/primitives/cryptographic-hashes.rst b/docs/hazmat/primitives/cryptographic-hashes.rst
index 7e5295c..c8b56eb 100644
--- a/docs/hazmat/primitives/cryptographic-hashes.rst
+++ b/docs/hazmat/primitives/cryptographic-hashes.rst
@@ -3,7 +3,7 @@
 Message digests
 ===============
 
-.. currentmodule:: cryptography.hazmat.primitives.hashes
+.. module:: cryptography.hazmat.primitives.hashes
 
 .. class:: Hash(algorithm, backend)
 
diff --git a/docs/hazmat/primitives/interfaces.rst b/docs/hazmat/primitives/interfaces.rst
index 0995489..cd21ea1 100644
--- a/docs/hazmat/primitives/interfaces.rst
+++ b/docs/hazmat/primitives/interfaces.rst
@@ -1,5 +1,7 @@
 .. hazmat::
 
+.. module:: cryptography.hazmat.primitives.interfaces
+
 Interfaces
 ==========
 
@@ -15,9 +17,6 @@
 Symmetric ciphers
 -----------------
 
-.. currentmodule:: cryptography.hazmat.primitives.interfaces
-
-
 .. class:: CipherAlgorithm
 
     A named symmetric encryption algorithm.
@@ -75,9 +74,10 @@
         meets any necessary invariants. This should raise an exception if they
         are not met.
 
-        For example, the :class:`~cryptography.hazmat.primitives.modes.CBC`
-        mode uses this method to check that the provided initialization
-        vector's length matches the block size of the algorithm.
+        For example, the
+        :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode uses
+        this method to check that the provided initialization vector's length
+        matches the block size of the algorithm.
 
 
 .. class:: ModeWithInitializationVector
diff --git a/docs/hazmat/primitives/symmetric-encryption.rst b/docs/hazmat/primitives/symmetric-encryption.rst
index d532ad1..b2ce376 100644
--- a/docs/hazmat/primitives/symmetric-encryption.rst
+++ b/docs/hazmat/primitives/symmetric-encryption.rst
@@ -422,6 +422,7 @@
 
 Interfaces
 ----------
+.. currentmodule:: cryptography.hazmat.primitives.interfaces
 
 .. class:: CipherContext
 
@@ -438,8 +439,8 @@
     recommended padding is
     :class:`~cryptography.hazmat.primitives.padding.PKCS7`. If you are using a
     stream cipher mode (such as
-    :class:`~cryptography.hazmat.primitives.modes.CTR`) you don't have to worry
-    about this.
+    :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`) you don't have
+    to worry about this.
 
     .. method:: update(data)
 
diff --git a/docs/x509.rst b/docs/x509.rst
index 26dd2a0..9bd9bd5 100644
--- a/docs/x509.rst
+++ b/docs/x509.rst
@@ -130,8 +130,8 @@
 
         :type:
             :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` or
-            :class:`~cryptography.hazmat.primitives.interfaces.DSAPublicKey` or
-            :class:`~cryptography.hazmat.primitives.interfaces.EllipticCurvePublicKey`
+            :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicKey` or
+            :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey`
 
         The public key associated with the certificate.