diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 6a7ddb386bae00214ac1f644f877ba1ffd76aae4..0000000000000000000000000000000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,256 +0,0 @@
-language: rust
-rust: nightly
-sudo: required
-dist: xenial
-services: docker
-
-stages:
-  - tools-and-build-and-tier1
-  - tier2
-
-matrix:
-  include:
-    # TOOLS
-    - name: "Documentation"
-      env: TARGET=x86_64-unknown-linux-gnu
-      script: sh ci/dox.sh
-      install:
-        - travis_retry rustup component add rust-src
-        - travis_retry cargo install xargo
-      stage: tools-and-build-and-tier1
-    - name: "Shellcheck"
-      install: true
-      script:
-        - shellcheck --version
-        # FIXME: https://github.com/koalaman/shellcheck/issues/1591
-        - shellcheck -e SC2103 ci/*.sh
-      stage: tools-and-build-and-tier1
-    - name: "Style"
-      install: true
-      script:
-        - rustc ci/style.rs && ./style src
-        # Disabled due to rust-lang/rustfmt#3341
-        #- |
-        #  if rustup component add rustfmt-preview ; then
-        #      cargo fmt --all -- --check
-        #  fi
-      stage: tools-and-build-and-tier1
-    - name: "Semver Linux"
-      install: travis_retry cargo +nightly install semverver
-      script: sh ci/semver.sh
-      stage: tools-and-build-and-tier1
-    - name: "Semver MacOSX"
-      install: travis_retry cargo +nightly install semverver
-      script: sh ci/semver.sh
-      os: osx
-      osx_image: xcode10
-      stage: tools-and-build-and-tier1
-
-    # BUILD stable, beta, nightly
-    - name: "Build Stable Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: stable
-      install: true
-    - name: "Build Beta Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: beta
-      install: true
-    - name: "Build Nightly Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: nightly
-      install:
-        - travis_retry rustup component add rust-src
-        - travis_retry cargo install xargo
-    - name: "Build Stable Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: stable
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Beta Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: beta
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Nightly Rust"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: nightly
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Stable Rust 1.13.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.13.0
-      install: true
-    - name: "Build Stable Rust 1.19.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.19.0
-      install: true
-    - name: "Build Stable Rust 1.24.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.24.0
-      install: true
-    - name: "Build Stable Rust 1.25.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.25.0
-      install: true
-    - name: "Build Stable Rust 1.30.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.30.0
-      install: true
-    - name: "Build Stable Rust 1.13.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.13.0
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Stable Rust 1.19.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.19.0
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Stable Rust 1.24.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.24.0
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Stable Rust 1.25.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.25.0
-      os: osx
-      osx_image: xcode10
-      install: true
-    - name: "Build Stable Rust 1.30.0"
-      script: sh ci/build.sh
-      stage: tools-and-build-and-tier1
-      rust: 1.30.0
-      os: osx
-      osx_image: xcode10
-      install: true
-    - env: TARGET=i686-apple-darwin
-      os: osx
-      osx_image: xcode10
-      stage: tools-and-build-and-tier1
-    - env: TARGET=i686-unknown-linux-gnu
-      stage: tools-and-build-and-tier1
-    - env: TARGET=x86_64-apple-darwin
-      os: osx
-      osx_image: xcode10
-      install: true
-      stage: tools-and-build-and-tier1
-    - env: TARGET=x86_64-unknown-linux-gnu
-      stage: tools-and-build-and-tier1
-      install: true
-
-    # Tier 2 targets
-    - env: TARGET=aarch64-linux-android
-      stage: tier2
-    - env: TARGET=aarch64-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=aarch64-unknown-linux-musl
-      stage: tier2
-    - env: TARGET=arm-linux-androideabi
-      stage: tier2
-    - env: TARGET=arm-unknown-linux-gnueabihf
-      stage: tier2
-    - env: TARGET=arm-unknown-linux-musleabihf
-      stage: tier2
-    - env: TARGET=asmjs-unknown-emscripten
-      stage: tier2
-    - env: TARGET=i686-linux-android
-      stage: tier2
-    - env: TARGET=i686-unknown-linux-musl
-      stage: tier2
-    - env: TARGET=mips-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=mips-unknown-linux-musl
-      stage: tier2
-    - env: TARGET=mips64-unknown-linux-gnuabi64
-      stage: tier2
-    - env: TARGET=mips64el-unknown-linux-gnuabi64
-      stage: tier2
-    - env: TARGET=mipsel-unknown-linux-musl
-      stage: tier2
-    - env: TARGET=powerpc-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=powerpc64-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=powerpc64le-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=s390x-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=sparc64-unknown-linux-gnu
-      stage: tier2
-    - env: TARGET=wasm32-unknown-emscripten
-      stage: tier2
-    - env: TARGET=x86_64-linux-android
-      stage: tier2
-    - env: TARGET=x86_64-unknown-linux-gnux32 OPT="--release"
-      stage: tier2
-    - env: TARGET=x86_64-unknown-linux-musl
-      stage: tier2
-    - env: TARGET=wasm32-wasi
-      rust: nightly
-      stage: tier2
-    - name: "Nintendo Switch - build libcore only"
-      rust: nightly
-      stage: tier2
-      install:
-        - rustup component add rust-src
-        - (test -x $HOME/.cargo/bin/cargo-xbuild || cargo install cargo-xbuild)
-      script:
-        - mkdir -p target
-        - cd target
-        - wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb
-        - sudo dpkg -i devkitpro-pacman.deb
-        - sudo dkp-pacman -Sy
-        - sudo dkp-pacman -Syu
-        - sudo dkp-pacman -S -v --noconfirm switch-dev devkitA64
-        - export PATH="$PATH:/opt/devkitpro/devkitA64/bin"
-        - export PATH="$PATH:/opt/devkitpro/tools/bin"
-        - cd ..
-        # Pull the target spec up into the current directory and then build
-        - mv ci/switch.json switch.json
-        - cargo xbuild --target switch.json
-
-  allow_failures:
-      - name: "Semver Linux"
-      - name: "Semver MacOSX"
-      - env: TARGET=wasm32-wasi
-      - env: TARGET=powerpc-unknown-linux-gnu
-      - env: TARGET=s390x-unknown-linux-gnu
-
-install: travis_retry rustup target add $TARGET
-
-script:
-  - cargo generate-lockfile --manifest-path libc-test/Cargo.toml
-  - if [[ $TRAVIS_OS_NAME = "linux" ]] && [[ $BUILD_ONLY != "1" ]]; then
-      sh ci/run-docker.sh $TARGET;
-    else
-      sh ci/run.sh $TARGET;
-    fi
-env:
-  global:
-    secure: "e2/3QjgRN9atOuSHp22TrYG7QVKcYUWY48Hi9b60w+r1+BhPkTseIJLte7WefRhdXtqpjjUJTooKDhnurFOeHaCT+nmBgiv+FPU893sBl4bhesY4m0vgUJVbNZcs6lTImYekWVb+aqjGdgV/XAgCw7c3kPmrZV0MzGDWL64Xaps="
-
-notifications:
-  email:
-    on_success: never
diff --git a/Cargo.toml b/Cargo.toml
index bf6ff2c0f9e81907f826046603ea52ad09243391..0b054a8442f8a60d0f91e0c5c455ca3459033cb0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,7 +10,7 @@ documentation = "http://doc.rust-lang.org/libc"
 keywords = ["libc", "ffi", "bindings", "operating", "system" ]
 categories = ["external-ffi-bindings", "no-std", "os"]
 build = "build.rs"
-exclude = ["/ci/*", "/.travis.yml", "/appveyor.yml"]
+exclude = ["/ci/*", "/azure-pipelines.yml"]
 description = """
 Raw FFI bindings to platform libraries like libc.
 """
diff --git a/README.md b/README.md
index dc5ff04fccff7f987d0adb19ab19d1ce17c98a92..86d2fe2abe453b079f81a691bfad7139fcc6ad86 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Travis-CI Status]][Travis-CI] [![Appveyor Status]][Appveyor] [![Cirrus-CI Status]][Cirrus-CI] [![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License]
+[![Azure Status]][Azure] [![Cirrus-CI Status]][Cirrus-CI] [![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License]
 
 libc - Raw FFI bindings to platforms' system libraries
 ====
@@ -91,10 +91,8 @@ Unless you explicitly state otherwise, any contribution intentionally submitted
 for inclusion in `libc` by you, as defined in the Apache-2.0 license, shall be
 dual licensed as above, without any additional terms or conditions.
 
-[Travis-CI]: https://travis-ci.com/rust-lang/libc
-[Travis-CI Status]: https://travis-ci.com/rust-lang/libc.svg?branch=master
-[Appveyor]: https://ci.appveyor.com/project/rust-lang-libs/libc
-[Appveyor Status]: https://ci.appveyor.com/api/projects/status/github/rust-lang/libc?svg=true
+[Azure Status]: https://dev.azure.com/rust-lang/libc/_apis/build/status/rust-lang.libc?branchName=master
+[Azure]: https://dev.azure.com/rust-lang/libc/_build/latest?definitionId=11&branchName=master
 [Cirrus-CI]: https://cirrus-ci.com/github/rust-lang/libc
 [Cirrus-CI Status]: https://api.cirrus-ci.com/github/rust-lang/libc.svg
 [crates.io]: https://crates.io/crates/libc
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 2885bb1e600258516c45484c60a968f327783915..0000000000000000000000000000000000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-gnu
-    MSYS_BITS: 64
-    ARCH: x86_64
-  - TARGET: i686-pc-windows-gnu
-    MSYS_BITS: 32
-    ARCH: i686
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-install:
-  - if NOT defined APPVEYOR_PULL_REQUEST_NUMBER if "%APPVEYOR_REPO_BRANCH%" == "master" appveyor exit
-  - if defined MSYS_BITS set PATH=C:\msys64\mingw%MSYS_BITS%\bin;C:\msys64\usr\bin;%PATH%;
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
-  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - set PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - if defined MSYS_BITS for %%I in (crt2.o dllcrt2.o libmsvcrt.a) do xcopy /Y "C:\msys64\mingw%MSYS_BITS%\%ARCH%-w64-mingw32\lib\%%I" "C:\Program Files (x86)\Rust\lib\rustlib\%TARGET%\lib"
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo -vv test --target %TARGET%
-  - cargo -vv test --no-default-features --target %TARGET%
-  - cargo -vv test --manifest-path libc-test/Cargo.toml --target %TARGET%
diff --git a/ci/README.md b/ci/README.md
index 28152e5d00b9972f83f772717ae803af31fcf0e7..31235538071f84d2f15c6252f2d10ee3998917e2 100644
--- a/ci/README.md
+++ b/ci/README.md
@@ -8,19 +8,12 @@ this project.
 
 First up, let's talk about the files in this directory:
 
-* `run-travis.sh` - a shell script run by all Travis builders, this is
-  responsible for setting up the rest of the environment such as installing new
-  packages, downloading Rust target libraries, etc.
+* `run-docker.sh` - a shell script run by most builders, it will execute
+  `run.sh` inside a Docker container configured for the target.
 
 * `run.sh` - the actual script which runs tests for a particular architecture.
-  Called from the `run-travis.sh` script this will run all tests for the target
-  specified.
 
-* `cargo-config` - Cargo configuration of linkers to use copied into place by
-  the `run-travis.sh` script before builds are run.
-
-* `dox.sh` - script called from `run-travis.sh` on only the linux 64-bit nightly
-  Travis bots to build documentation for this crate.
+* `dox.sh` - build the documentation of the crate and publish it to gh-pages.
 
 * `landing-page-*.html` - used by `dox.sh` to generate a landing page for all
   architectures' documentation.
diff --git a/ci/azure-install-rust.yml b/ci/azure-install-rust.yml
new file mode 100644
index 0000000000000000000000000000000000000000..eba066923f2665aa2f43db8c79434e46b4fe6fac
--- /dev/null
+++ b/ci/azure-install-rust.yml
@@ -0,0 +1,78 @@
+steps:
+  - bash: |
+      set -ex
+      toolchain=$TOOLCHAIN
+      if [ "$toolchain" = "" ]; then
+        toolchain=nightly
+      fi
+      if command -v rustup; then
+        rustup update $toolchain
+        rustup default $toolchain
+      else
+        curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $toolchain
+        echo "##vso[task.prependpath]$HOME/.cargo/bin"
+      fi
+    displayName: Install rust (unix)
+    condition: ne( variables['Agent.OS'], 'Windows_NT' )
+  - script: |
+      @echo on
+      if not defined TOOLCHAIN set TOOLCHAIN=nightly
+      rustup update %TOOLCHAIN%-%TARGET%
+      rustup default %TOOLCHAIN%-%TARGET%
+    displayName: Install rust (windows)
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )
+  - script: |
+      set -ex
+      if [ -n "${TARGET}" ]; then
+        rustup target add $TARGET
+      fi
+    condition: ne( variables['Agent.OS'], 'Windows_NT' )
+    displayName: Install target (unix)
+  - script: |
+      @echo on
+      if defined TARGET rustup target add %TARGET%
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )
+    displayName: Install target (windows)
+  - script: |
+      @echo on
+      if "%ARCH%" == "i686" choco install mingw --x86 --force
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )
+    displayName: Install MinGW32 (windows)
+  - bash: |
+      set -ex
+      gcc -print-search-dirs
+      find "C:\ProgramData\Chocolatey" -name "crt2*"
+      find "C:\ProgramData\Chocolatey" -name "dllcrt2*"
+      find "C:\ProgramData\Chocolatey" -name "libmsvcrt*"
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )	
+    displayName: Find GCC libraries (windows)
+  - bash: |
+      set -ex
+      if [[ -n ${ARCH_BITS} ]]; then
+        for i in crt2.o dllcrt2.o libmingwex.a libmsvcrt.a ; do
+          cp -f "/C/ProgramData/Chocolatey/lib/mingw/tools/install/mingw${ARCH_BITS}/${ARCH}-w64-mingw32/lib/$i" "`rustc --print sysroot`/lib/rustlib/${TARGET}/lib"
+        done
+      fi
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )	
+    displayName: Fix MinGW (windows)
+  - bash: |
+        set -ex
+        rustc -Vv
+        cargo -V
+        rustup -Vv
+        rustup show
+        which rustc
+        which cargo
+        which rustup
+    displayName: Query rust and cargo versions
+  - script: |
+      @echo on
+      where gcc
+    condition: eq( variables['Agent.OS'], 'Windows_NT' )
+    displayName: Query gcc path
+  - bash: |
+      set -ex
+      cargo generate-lockfile
+      cargo generate-lockfile --manifest-path libc-test/Cargo.toml
+    displayName: Generate lockfiles
+
diff --git a/ci/azure.yml b/ci/azure.yml
new file mode 100644
index 0000000000000000000000000000000000000000..04d12dae8f316461a98ed70d8e6b41fe3656f791
--- /dev/null
+++ b/ci/azure.yml
@@ -0,0 +1,222 @@
+variables:
+  - group: secrets
+resources:
+  repositories:
+    - repository: rustinfra
+      type: github
+      name: rust-lang/simpleinfra
+      endpoint: gnzlbg
+trigger: ["auto-libc","try"]
+pr: ["master"]
+
+jobs:
+  - job: DockerLinuxTier1
+    pool:
+      vmImage: ubuntu-16.04
+    steps:
+      - template: azure-install-rust.yml
+      - bash: sh ./ci/run-docker.sh $TARGET
+        displayName: Execute run-docker.sh
+    strategy:
+      matrix:
+        i686-unknown-linux-gnu:
+          TARGET: i686-unknown-linux-gnu
+        x86_64-unknown-linux-gnu:
+          TARGET: x86_64-unknown-linux-gnu
+
+  - job: DockerLinuxTier2
+    dependsOn: DockerLinuxTier1
+    pool:
+      vmImage: ubuntu-16.04
+    steps:
+      - template: azure-install-rust.yml
+      - bash: sh ./ci/run-docker.sh $TARGET
+        displayName: Execute run-docker.sh
+    strategy:
+      matrix:
+        aarch64-unknown-linux-android:
+          TARGET: aarch64-linux-android
+        aarch64-unknown-linux-gnu:
+          TARGET: aarch64-unknown-linux-gnu
+        aarch64-unknown-linux-musl:
+          TARGET: aarch64-unknown-linux-musl
+        arm-linux-androideabi:
+          TARGET: arm-linux-androideabi
+        arm-unknown-linux-gnueabihf:
+          TARGET: arm-unknown-linux-gnueabihf
+        arm-unknown-linux-musleabihf:
+          TARGET: arm-unknown-linux-musleabihf
+        asmjs-unknown-emscripten:
+          TARGET: asmjs-unknown-emscripten
+        i686-linux-android:
+          TARGET: i686-linux-android
+        i686-unknown-linux-musl:
+          TARGET: i686-unknown-linux-musl
+        mips-unknown-linux-gnu:
+          TARGET: mips-unknown-linux-gnu
+        mips-unknown-linux-musl:
+          TARGET: mips-unknown-linux-musl
+        mips64-unknown-linux-gnuabi64:
+          TARGET: mips64-unknown-linux-gnuabi64
+        mips64el-unknown-linux-gnuabi64:
+          TARGET: mips64el-unknown-linux-gnuabi64
+        mipsel-unknown-linux-musl:
+          TARGET: mipsel-unknown-linux-musl
+        #powerpc-unknown-linux-gnu:
+        #  TARGET: powerpc-unknown-linux-gnu
+        powerpc64-unknown-linux-gnu:
+          TARGET: powerpc64-unknown-linux-gnu
+        powerpc64le-unknown-linux-gnu:
+          TARGET: powerpc64le-unknown-linux-gnu
+        #s390x-unknown-linux-gnu:
+        #  TARGET: s390x-unknown-linux-gnu
+        #wasm32-wasi
+        #  TARGET: wasm32-wasi
+        sparc64-unknown-linux-gnu:
+          TARGET: sparc64-unknown-linux-gnu
+        wasm32-unknown-emscripten:
+          TARGET: wasm32-unknown-emscripten
+        x86_64-linux-android:
+          TARGET: x86_64-linux-android
+        x86_64-unknown-linux-gnux32:
+          TARGET: x86_64-unknown-linux-gnux32
+        x86_64-unknown-linux-musl:
+          TARGET: x86_64-unknown-linux-musl
+
+  - job: DockerOSX64
+    pool:
+      vmImage: macos-10.14
+    steps:
+      - template: azure-install-rust.yml
+      - bash: sh ./ci/run.sh $TARGET
+        displayName: Execute run.sh
+    strategy:
+      matrix:
+        x86_64-apple-darwin:
+          TARGET: x86_64-apple-darwin
+
+  - job: DockerOSX32
+    pool:
+      vmImage: macos-10.13
+    steps:
+      - template: azure-install-rust.yml
+      - bash: sh ./ci/run.sh $TARGET
+        displayName: Execute run.sh
+    strategy:
+      matrix:
+        i686-apple-darwin:
+          TARGET: i686-apple-darwin
+
+  - job: Windows
+    pool:
+      vmImage: vs2017-win2016
+    steps:
+      - template: azure-install-rust.yml
+      - bash: sh ./ci/run.sh $TARGET
+        displayName: Execute run.sh
+    strategy:
+      matrix:
+        x86_64-pc-windows-gnu:
+          TARGET: x86_64-pc-windows-gnu
+          ARCH_BITS: 64
+          ARCH: x86_64
+        x86_64-pc-windows-msvc:
+          TARGET: x86_64-pc-windows-msvc
+        i686-pc-windows-gnu:
+          TARGET: i686-pc-windows-gnu
+          ARCH_BITS: 32
+          ARCH: i686
+        i686-pc-windows-msvc:
+          TARGET: i686-pc-windows-msvc
+
+  - job: StyleAndDocs
+    pool:
+      vmImage: ubuntu-16.04
+    steps:
+      - template: azure-install-rust.yml
+      - script: sh ci/style.sh
+        displayName: Check style
+      - script: sh ci/dox.sh
+        displayName: Generate documentation
+      - template: azure-configs/static-websites.yml@rustinfra
+        parameters:
+          deploy_dir: target/doc
+
+  # FIXME: re-enable these after the next release
+  #- job: SemverLinux
+  #  dependsOn: BuildChannelsLinux
+  #  continueOnError: true
+  #  pool:
+  #    vmImage: ubuntu-16.04
+  #  steps:
+  #    - template: azure-install-rust.yml
+  #    - script: sh ci/semver.sh linux
+  #      displayName: Check breaking changes
+
+  #- job: SemverOSX
+  #  dependsOn: BuildChannelsOSX
+  #  continueOnError: true
+  #  pool:
+  #    vmImage: macos-10.14
+  #  steps:
+  #    - template: azure-install-rust.yml
+  #    - script: sh ci/semver.sh osx
+  #      displayName: Check breaking changes
+
+  - job: BuildChannelsLinux
+    dependsOn: StyleAndDocs
+    pool:
+      vmImage: ubuntu-16.04
+    steps:
+      - template: azure-install-rust.yml
+      - script: sh ./ci/build.sh
+        displayName: Execute build.sh
+    strategy:
+      matrix:
+        stable:
+          TOOLCHAIN: stable
+        beta:
+          TOOLCHAIN: beta
+        nightly:
+          TOOLCHAIN: nightly
+        1.13.0:
+          TOOLCHAIN: 1.13.0
+        1.19.0:
+          TOOLCHAIN: 1.19.0
+        1.24.0:
+          TOOLCHAIN: 1.24.0
+        1.25.0:
+          TOOLCHAIN: 1.25.0
+        1.30.0:
+          TOOLCHAIN: 1.30.0
+    variables:
+      OS: linux
+
+  - job: BuildChannelsOSX
+    dependsOn: StyleAndDocs
+    pool:
+      vmImage: macos-10.13
+    steps:
+      - template: azure-install-rust.yml
+      - script: sh ./ci/build.sh
+        displayName: Execute build.sh
+    strategy:
+      matrix:
+        stable:
+          TOOLCHAIN: stable
+        beta:
+          TOOLCHAIN: beta
+        nightly:
+          TOOLCHAIN: nightly
+        1.13.0:
+          TOOLCHAIN: 1.13.0
+        1.19.0:
+          TOOLCHAIN: 1.19.0
+        1.24.0:
+          TOOLCHAIN: 1.24.0
+        1.25.0:
+          TOOLCHAIN: 1.25.0
+        1.30.0:
+          TOOLCHAIN: 1.30.0
+    variables:
+      OS: osx
diff --git a/ci/build.sh b/ci/build.sh
index b4ad364aea8baef5b7b1bddec12998d55603cb95..bb056033e8cf21bf61991d71df2db26f34dafc12 100644
--- a/ci/build.sh
+++ b/ci/build.sh
@@ -5,13 +5,20 @@
 
 set -ex
 
-RUST=${TRAVIS_RUST_VERSION}
-OS=${TRAVIS_OS_NAME}
+: "${TOOLCHAIN?The TOOLCHAIN environment variable must be set.}"
+: "${OS?The OS environment variable must be set.}"
+
+RUST=${TOOLCHAIN}
 
 echo "Testing Rust ${RUST} on ${OS}"
 
+if [ "${TOOLCHAIN}" = "nightly" ] ; then
+    cargo +nightly install cargo-xbuild -Z install-upgrade
+    rustup component add rust-src
+fi
+
 test_target() {
-    CARGO="${1}"
+    BUILD_CMD="${1}"
     TARGET="${2}"
     NO_STD="${3}"
 
@@ -46,21 +53,21 @@ test_target() {
     fi
 
     # Test that libc builds without any default features (no libstd)
-    "$CARGO" "+${RUST}" build -vv $opt --no-default-features --target "${TARGET}"
+    cargo "+${RUST}" "${BUILD_CMD}" -vv $opt --no-default-features --target "${TARGET}"
 
     # Test that libc builds with default features (e.g. libstd)
     # if the target supports libstd
     if [ "$NO_STD" != "1" ]; then
-        "$CARGO" "+${RUST}" build -vv $opt --target "${TARGET}"
+        cargo "+${RUST}" "${BUILD_CMD}" -vv $opt --target "${TARGET}"
     fi
 
     # Test that libc builds with the `extra_traits` feature
-    "$CARGO" "+${RUST}" build -vv $opt --no-default-features --target "${TARGET}" \
+    cargo "+${RUST}" "${BUILD_CMD}" -vv $opt --no-default-features --target "${TARGET}" \
           --features extra_traits
 
     # Also test that it builds with `extra_traits` and default features:
     if [ "$NO_STD" != "1" ]; then
-        "$CARGO" "+${RUST}" build -vv $opt --target "${TARGET}" \
+        cargo "+${RUST}" "${BUILD_CMD}" -vv $opt --target "${TARGET}" \
               --features extra_traits
     fi
 }
@@ -115,6 +122,9 @@ i586-unknown-linux-musl \
 x86_64-unknown-cloudabi \
 "
 
+# FIXME: temporarirly disable the redox target
+# https://github.com/rust-lang/libc/issues/1457
+# x86_64-unknown-redox
 RUST_NIGHTLY_LINUX_TARGETS="\
 aarch64-fuchsia \
 armv5te-unknown-linux-gnueabi \
@@ -125,7 +135,6 @@ x86_64-fortanix-unknown-sgx \
 x86_64-fuchsia \
 x86_64-pc-windows-gnu \
 x86_64-unknown-linux-gnux32 \
-x86_64-unknown-redox \
 "
 
 RUST_OSX_TARGETS="\
@@ -167,7 +176,7 @@ case "${OS}" in
 esac
 
 for TARGET in $TARGETS; do
-    test_target cargo "$TARGET"
+    test_target build "$TARGET"
 done
 
 # FIXME: https://github.com/rust-lang/rust/issues/58564
@@ -219,6 +228,23 @@ x86_64-unknown-openbsd \
 
 if [ "${RUST}" = "nightly" ] && [ "${OS}" = "linux" ]; then
     for TARGET in $RUST_LINUX_NO_CORE_TARGETS; do
-        test_target xargo "$TARGET" 1
+        test_target xbuild "$TARGET" 1
     done
+
+    # Nintendo switch
+    cargo clean
+    mkdir -p target
+    (
+        cd target
+        wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb
+        sudo dpkg -i devkitpro-pacman.deb
+        sudo dkp-pacman -Sy
+        sudo dkp-pacman -Syu
+        sudo dkp-pacman -S -v --noconfirm switch-dev devkitA64
+    )
+    cp ci/switch.json switch.json
+    PATH="$PATH:/opt/devkitpro/devkitA64/bin"
+    PATH="$PATH:/opt/devkitpro/tools/bin"
+    cargo xbuild --target switch.json
 fi
+
diff --git a/ci/dox.sh b/ci/dox.sh
index ce5508147647cdae5e590a06d35233ddba0ebb60..49abd546001c8906834bf29829e971419be4df97 100644
--- a/ci/dox.sh
+++ b/ci/dox.sh
@@ -13,6 +13,14 @@ PLATFORM_SUPPORT=platform-support.md
 rm -rf $TARGET_DOC_DIR
 mkdir -p $TARGET_DOC_DIR
 
+if ! rustc --version | grep -E "nightly" ; then
+    echo "Building the documentation requires a nightly Rust toolchain"
+    exit 1
+fi
+
+rustup component add rust-src
+cargo +nightly install cargo-xbuild -Z install-upgrade
+
 # List all targets that do currently build successfully:
 # shellcheck disable=SC1003
 grep '[\d|\w|-]* \\' ci/build.sh > targets
@@ -42,7 +50,7 @@ while read -r target; do
     # If cargo doc fails, then try xargo:
     if ! cargo doc --target "${target}" \
              --no-default-features  --features extra_traits ; then
-        xargo doc --target "${target}" \
+        cargo xdoc --target "${target}" \
               --no-default-features  --features extra_traits
     fi
 
@@ -61,10 +69,3 @@ set -x
 
 # Copy the licenses
 cp LICENSE-* $TARGET_DOC_DIR/
-
-# If we're on travis, not a PR, and on the right branch, publish!
-if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then
-  pip install ghp_import --install-option="--prefix=$HOME/.local"
-  "${HOME}/.local/bin/ghp-import" $TARGET_DOC_DIR
-  git push -qf "https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git" gh-pages
-fi
diff --git a/ci/run-docker.sh b/ci/run-docker.sh
index c656f5904d684d4c269cf11687da24fbbbf00925..5fd00614462dcf26372c807d2b1e53cb4299bcc7 100755
--- a/ci/run-docker.sh
+++ b/ci/run-docker.sh
@@ -5,6 +5,9 @@
 
 set -ex
 
+echo "${HOME}"
+pwd
+
 run() {
     echo "Building docker container for target ${1}"
 
@@ -18,19 +21,19 @@ run() {
     fi
 
     docker run \
-      --user "$(id -u)":"$(id -g)" \
       --rm \
-      --init \
-      --volume "${HOME}/.cargo":/cargo \
-      $kvm \
+      --user "$(id -u)":"$(id -g)" \
       --env CARGO_HOME=/cargo \
+      --env CARGO_TARGET_DIR=/checkout/target \
+      --volume "$(dirname "$(dirname "$(command -v cargo)")")":/cargo \
       --volume "$(rustc --print sysroot)":/rust:ro \
       --volume "$(pwd)":/checkout:ro \
       --volume "$(pwd)"/target:/checkout/target \
-      --env CARGO_TARGET_DIR=/checkout/target \
+      $kvm \
+      --init \
       --workdir /checkout \
       libc \
-      ci/run.sh "${1}"
+      sh -c "HOME=/tmp PATH=\$PATH:/rust/bin exec ci/run.sh ${1}"
 }
 
 if [ -z "${1}" ]; then
diff --git a/ci/semver.sh b/ci/semver.sh
index ac6be36f3f18e46fec078bef94e539dafd2daa29..3412501a7215b20b33d66b339781fa82a9cd2a16 100644
--- a/ci/semver.sh
+++ b/ci/semver.sh
@@ -4,10 +4,17 @@
 
 set -ex
 
-OS=${TRAVIS_OS_NAME}
+OS=${1}
 
 echo "Testing Semver on ${OS}"
 
+if ! rustc --version | grep -E "nightly" ; then
+    echo "Building semverver requires a nightly Rust toolchain"
+    exit 1
+fi
+
+cargo +nightly install semverver -Z install-upgrade
+
 TARGETS=
 case "${OS}" in
     *linux*)
diff --git a/ci/style.sh b/ci/style.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a6a00171019e4db82407f1ec128ebb584294a08a
--- /dev/null
+++ b/ci/style.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env sh
+
+set -ex
+
+rustc ci/style.rs && ./style src
+
+if rustup component add rustfmt-preview ; then
+    which rustfmt
+    rustfmt -V
+    cargo fmt --all -- --check
+fi
+
+if shellcheck --version ; then
+    shellcheck -e SC2103 ci/*.sh
+else
+    echo "shellcheck not found"
+    exit 1
+fi
+
diff --git a/libc-test/build.rs b/libc-test/build.rs
index 6edbd0f2ff5061e28cf5056a1bad6fbfb1a86be9..d4ad4a9a4e099e563b3460b1d4a70bd1ffa97ade 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -1595,8 +1595,7 @@ fn test_freebsd(target: &str) {
             // These constants were removed in FreeBSD 11 (svn r262489),
             // and they've never had any legitimate use outside of the
             // base system anyway.
-            "CTL_MAXID" | "KERN_MAXID" | "HW_MAXID"
-            | "USER_MAXID" => true,
+            "CTL_MAXID" | "KERN_MAXID" | "HW_MAXID" | "USER_MAXID" => true,
 
             _ => false,
         }
diff --git a/libc-test/test/cmsg.rs b/libc-test/test/cmsg.rs
index 8304163338608dca5911498debe0b212a65d0569..38a8ce15089011dd7748af93dc9bc56f64632f43 100644
--- a/libc-test/test/cmsg.rs
+++ b/libc-test/test/cmsg.rs
@@ -97,5 +97,4 @@ mod t {
             }
         }
     }
-
 }
diff --git a/src/unix/bsd/apple/b32.rs b/src/unix/bsd/apple/b32.rs
index 859809dc863a1bea699b9a50ff790a4d4a037f40..c05de30327d19d086e413fd3cb1aabb9e5c40c58 100644
--- a/src/unix/bsd/apple/b32.rs
+++ b/src/unix/bsd/apple/b32.rs
@@ -81,6 +81,10 @@ cfg_if! {
     }
 }
 
+#[doc(hidden)]
+#[deprecated(since = "0.2.55")]
+pub const NET_RT_MAXID: ::c_int = 10;
+
 pub const __PTHREAD_MUTEX_SIZE__: usize = 40;
 pub const __PTHREAD_COND_SIZE__: usize = 24;
 pub const __PTHREAD_CONDATTR_SIZE__: usize = 4;
diff --git a/src/unix/bsd/apple/b64.rs b/src/unix/bsd/apple/b64.rs
index 7b89fc6ab534b745b40768deff68184f8c7f84ea..2749260b04ec200b62a2499210bbda4e92491f02 100644
--- a/src/unix/bsd/apple/b64.rs
+++ b/src/unix/bsd/apple/b64.rs
@@ -86,6 +86,10 @@ cfg_if! {
     }
 }
 
+#[doc(hidden)]
+#[deprecated(since = "0.2.55")]
+pub const NET_RT_MAXID: ::c_int = 11;
+
 pub const __PTHREAD_MUTEX_SIZE__: usize = 56;
 pub const __PTHREAD_COND_SIZE__: usize = 40;
 pub const __PTHREAD_CONDATTR_SIZE__: usize = 8;
diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs
index 2bc18fb2160f319192e75bd3ab019d5a88e6b786..24ad12bee52077706dac024faf7144142501410c 100644
--- a/src/unix/bsd/apple/mod.rs
+++ b/src/unix/bsd/apple/mod.rs
@@ -2178,9 +2178,6 @@ pub const PF_PPP: ::c_int =  AF_PPP;
 pub const NET_RT_DUMP: ::c_int = 1;
 pub const NET_RT_FLAGS: ::c_int = 2;
 pub const NET_RT_IFLIST: ::c_int = 3;
-#[doc(hidden)]
-#[deprecated(since = "0.2.55")]
-pub const NET_RT_MAXID: ::c_int = 10;
 
 pub const SOMAXCONN: ::c_int = 128;