diff --git a/.gitignore b/.gitignore
index 52d47ac9553afd5b3b8aeac640b2cd92399b3f1f..2c96eb1b6517f2617f9ddeae9f07f5fd7bd7ddef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
-/doc/
 target/
 Cargo.lock
diff --git a/.travis.yml b/.travis.yml
index fe30a5f208a40e81122055801e03a77dc8829922..d63215525047b228042c9be06ffdbd3f25a350ae 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,17 @@
 language: rust
 env:
   matrix:
-    - FEATURES=""
-    - FEATURES="tlsv1_1 tlsv1_2 aes_xts"
+  - FEATURES=""
+  - FEATURES="tlsv1_1 tlsv1_2 aes_xts"
+  global:
+    secure: J4i75AV4KMrU/UQrLIzzIh35Xix40Ki0uWjm8j05oxlXVl5aPU2zB30AemDne2QXYzkN4kRG/iRnNORE/8D0lF7YipQNSNxgfiBVoOEfj/NSogvI2BftYX9vlLZJUvt+s/nbE3xa/Pyge1IPv7itDYGO7SMe8RTSqitgqyfE2Eg=
 os:
-  - osx
-  - linux
+- osx
+- linux
 before_script:
-  - openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem >/dev/null 2>&1 &
+- openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem >/dev/null 2>&1 &
 script:
-  - cargo test --features "$FEATURES"
+- (cd openssl && cargo test --features "$FEATURES")
+- ./.travis/build_docs.sh
+after_success:
+- test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && ./.travis/update_docs.sh
diff --git a/.travis/build_docs.sh b/.travis/build_docs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4264051a7fd0781e6fcc0aeeff9135893afb3fbb
--- /dev/null
+++ b/.travis/build_docs.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+
+mkdir doc
+
+for crate in $(echo openssl-sys openssl); do
+    mkdir -p $crate/target
+    ln -s -t $crate/target ../../doc
+    (cd $crate && cargo doc --no-deps)
+done
diff --git a/.travis/update_docs.sh b/.travis/update_docs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..355f75f840e8282ba2c97a7dce690b29f317a5f4
--- /dev/null
+++ b/.travis/update_docs.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+git clone --branch gh-pages "https://$GH_TOKEN@github.com/${TRAVIS_REPO_SLUG}.git" deploy_docs
+cd deploy_docs
+
+git config user.name "Steven Fackler"
+git config user.email "sfackler@gmail.com"
+
+rm -rf doc
+mv ../doc .
+
+git add -A .
+git commit -m "rebuild pages at ${TRAVIS_COMMIT}"
+git push
diff --git a/README.md b/README.md
index 58a2285be156def0cab51dc320e24bdf4915d491..cecf2c9dfbff4f5ac34ddf2fbc2fe0fac38dc2cc 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
 rust-openssl [![Build Status](https://travis-ci.org/sfackler/rust-openssl.svg?branch=master)](https://travis-ci.org/sfackler/rust-openssl)
 ============
 
-See the [rustdoc output](https://sfackler.github.io/doc/openssl).
+See the [rustdoc output](https://sfackler.github.io/rust-openssl/doc/openssl).
 
 Building
 --------
 
-rust-openssl needs to link against the OpenSSL devleopment libraries on your system. It's very easy to get them on Linux.  
+rust-openssl needs to link against the OpenSSL devleopment libraries on your system. It's very easy to get them on Linux.
 For some reason, the OpenSSL distribution for Windows is structured differently, so it's a little more involved, but it *is* possible to build rust-openssl successfully on Windows.
 
 ###Linux
diff --git a/openssl-sys/Cargo.toml b/openssl-sys/Cargo.toml
index 5e7d587ec3e445aff4df820d9522f2c5e2054d62..8f7e2bce4871a5b8543f130cceb6ac2b945b0f4d 100644
--- a/openssl-sys/Cargo.toml
+++ b/openssl-sys/Cargo.toml
@@ -6,6 +6,7 @@ authors = ["Alex Crichton <alex@alexcrichton.com>",
 license = "MIT"
 description = "FFI bindings to OpenSSL"
 repository = "https://github.com/sfackler/rust-openssl"
+documentation = "https://sfackler.github.io/rust-openssl/doc/openssl-sys"
 
 links = "openssl"
 build = "build.rs"
diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs
index fd16792b838da8df21b93723499e533be0edbfb4..70526fd5da82eb66078c1614d917654ff07fc8b4 100644
--- a/openssl-sys/src/lib.rs
+++ b/openssl-sys/src/lib.rs
@@ -1,6 +1,7 @@
 #![allow(non_camel_case_types, non_upper_case_globals, non_snake_case)]
 #![allow(dead_code)]
 #![feature(core, io, libc, path, std_misc, env)]
+#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/openssl-sys")]
 
 extern crate libc;
 
diff --git a/Cargo.toml b/openssl/Cargo.toml
similarity index 84%
rename from Cargo.toml
rename to openssl/Cargo.toml
index 75f8ba59e2a59d37c1c432a7c3d7a6187bc5dcb6..f0b7a39baef1c24fb3ca65a5fcd15c4fdbdda901 100644
--- a/Cargo.toml
+++ b/openssl/Cargo.toml
@@ -5,7 +5,7 @@ authors = ["Steven Fackler <sfackler@gmail.com>"]
 license = "Apache-2.0"
 description = "OpenSSL bindings"
 repository = "https://github.com/sfackler/rust-openssl"
-documentation = "https://sfackler.github.io/doc/openssl"
+documentation = "https://sfackler.github.io/rust-openssl/doc/openssl"
 readme = "README.md"
 keywords = ["crypto", "tls", "ssl"]
 
@@ -16,7 +16,7 @@ sslv2 = ["openssl-sys/sslv2"]
 aes_xts = ["openssl-sys/aes_xts"]
 
 [dependencies.openssl-sys]
-path = "openssl-sys"
+path = "../openssl-sys"
 version = "0.3.1"
 
 [dev-dependencies]
diff --git a/src/asn1/mod.rs b/openssl/src/asn1/mod.rs
similarity index 100%
rename from src/asn1/mod.rs
rename to openssl/src/asn1/mod.rs
diff --git a/src/bio/mod.rs b/openssl/src/bio/mod.rs
similarity index 100%
rename from src/bio/mod.rs
rename to openssl/src/bio/mod.rs
diff --git a/src/bn/mod.rs b/openssl/src/bn/mod.rs
similarity index 100%
rename from src/bn/mod.rs
rename to openssl/src/bn/mod.rs
diff --git a/src/crypto/hash.rs b/openssl/src/crypto/hash.rs
similarity index 100%
rename from src/crypto/hash.rs
rename to openssl/src/crypto/hash.rs
diff --git a/src/crypto/hmac.rs b/openssl/src/crypto/hmac.rs
similarity index 100%
rename from src/crypto/hmac.rs
rename to openssl/src/crypto/hmac.rs
diff --git a/src/crypto/memcmp.rs b/openssl/src/crypto/memcmp.rs
similarity index 100%
rename from src/crypto/memcmp.rs
rename to openssl/src/crypto/memcmp.rs
diff --git a/src/crypto/mod.rs b/openssl/src/crypto/mod.rs
similarity index 100%
rename from src/crypto/mod.rs
rename to openssl/src/crypto/mod.rs
diff --git a/src/crypto/pkcs5.rs b/openssl/src/crypto/pkcs5.rs
similarity index 100%
rename from src/crypto/pkcs5.rs
rename to openssl/src/crypto/pkcs5.rs
diff --git a/src/crypto/pkey.rs b/openssl/src/crypto/pkey.rs
similarity index 100%
rename from src/crypto/pkey.rs
rename to openssl/src/crypto/pkey.rs
diff --git a/src/crypto/rand.rs b/openssl/src/crypto/rand.rs
similarity index 100%
rename from src/crypto/rand.rs
rename to openssl/src/crypto/rand.rs
diff --git a/src/crypto/symm.rs b/openssl/src/crypto/symm.rs
similarity index 100%
rename from src/crypto/symm.rs
rename to openssl/src/crypto/symm.rs
diff --git a/src/lib.rs b/openssl/src/lib.rs
similarity index 81%
rename from src/lib.rs
rename to openssl/src/lib.rs
index 58f3d2f07f3d91cf4e8d8cafd107fc802690acb6..11234c2f706342bb4209399c048700873645a9d5 100644
--- a/src/lib.rs
+++ b/openssl/src/lib.rs
@@ -2,7 +2,7 @@
 #![crate_name="openssl"]
 #![crate_type="rlib"]
 #![crate_type="dylib"]
-#![doc(html_root_url="https://sfackler.github.io/doc/openssl")]
+#![doc(html_root_url="https://sfackler.github.io/rust-openssl/doc/openssl")]
 
 extern crate libc;
 #[cfg(test)]
diff --git a/src/macros.rs b/openssl/src/macros.rs
similarity index 100%
rename from src/macros.rs
rename to openssl/src/macros.rs
diff --git a/src/ssl/error.rs b/openssl/src/ssl/error.rs
similarity index 100%
rename from src/ssl/error.rs
rename to openssl/src/ssl/error.rs
diff --git a/src/ssl/mod.rs b/openssl/src/ssl/mod.rs
similarity index 100%
rename from src/ssl/mod.rs
rename to openssl/src/ssl/mod.rs
diff --git a/src/ssl/tests.rs b/openssl/src/ssl/tests.rs
similarity index 100%
rename from src/ssl/tests.rs
rename to openssl/src/ssl/tests.rs
diff --git a/src/x509/mod.rs b/openssl/src/x509/mod.rs
similarity index 100%
rename from src/x509/mod.rs
rename to openssl/src/x509/mod.rs
diff --git a/src/x509/tests.rs b/openssl/src/x509/tests.rs
similarity index 100%
rename from src/x509/tests.rs
rename to openssl/src/x509/tests.rs
diff --git a/test/cert.pem b/openssl/test/cert.pem
similarity index 100%
rename from test/cert.pem
rename to openssl/test/cert.pem
diff --git a/test/key.pem b/openssl/test/key.pem
similarity index 100%
rename from test/key.pem
rename to openssl/test/key.pem