diff --git a/.travis.yml b/.travis.yml
index 76765d98d..9b8c6c922 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,7 +10,7 @@ addons:
 
 cache:
   directories:
-  - downloads
+  - travis_cache
 
 install: ./scripts/travis-install.sh
 
diff --git a/scripts/travis-build.sh b/scripts/travis-build.sh
index 866fb8dcf..1244cb2af 100755
--- a/scripts/travis-build.sh
+++ b/scripts/travis-build.sh
@@ -5,8 +5,10 @@
 set -eux
 
 # Paths to tools installed by travis-install.sh
-export PATH=${PWD}/gcc-arm-none-eabi-7-2017-q4-major/bin:${PATH}
-PYTHON=${PWD}/python-env/bin/python
+MAIN_DIR=${PWD}
+BUILD_DIR=${PWD}/travis_build
+export PATH=${BUILD_DIR}/gcc-arm-none-eabi-7-2017-q4-major/bin:${PATH}
+PYTHON=${BUILD_DIR}/python-env/bin/python
 
 
 ######################################################################
@@ -28,7 +30,7 @@ echo "travis_fold:end:check_whitespace"
 # Run compile tests for several different MCU types
 ######################################################################
 
-DICTDIR=${PWD}/dict
+DICTDIR=${BUILD_DIR}/dict
 mkdir -p ${DICTDIR}
 
 for TARGET in test/configs/*.config ; do
@@ -49,7 +51,7 @@ done
 # Verify klippy host software
 ######################################################################
 
-HOSTDIR=${PWD}/hosttest
+HOSTDIR=${BUILD_DIR}/hosttest
 mkdir -p ${HOSTDIR}
 
 echo "travis_fold:start:klippy"
diff --git a/scripts/travis-install.sh b/scripts/travis-install.sh
index ce1f7f9a1..fa3bb50d5 100755
--- a/scripts/travis-install.sh
+++ b/scripts/travis-install.sh
@@ -5,7 +5,10 @@
 # Stop script early on any error; check variables; be verbose
 set -eux
 
-DOWNLOAD_DIR=${PWD}/downloads
+MAIN_DIR=${PWD}
+BUILD_DIR=${PWD}/travis_build
+DOWNLOAD_DIR=${PWD}/travis_cache
+mkdir -p ${BUILD_DIR} ${DOWNLOAD_DIR}
 
 
 ######################################################################
@@ -17,9 +20,7 @@ GCC_ARM_URL="https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/g
 GCC_ARM_SHA="96a029e2ae130a1210eaa69e309ea40463028eab18ba19c1086e4c2dafe69a6a  gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"
 GCC_ARM_FILE="$(basename ${GCC_ARM_URL})"
 
-mkdir -p ${DOWNLOAD_DIR}
 cd ${DOWNLOAD_DIR}
-
 if [ ! -f ${GCC_ARM_FILE} ]; then
     wget "$GCC_ARM_URL"
 fi
@@ -28,7 +29,7 @@ if [ "$FOUND_SHA" != "$GCC_ARM_SHA" ]; then
     echo "ERROR: Mismatch on gcc arm sha256"
     exit -1
 fi
-cd ..
+cd ${BUILD_DIR}
 tar xf "${DOWNLOAD_DIR}/${GCC_ARM_FILE}"
 
 
@@ -37,5 +38,6 @@ tar xf "${DOWNLOAD_DIR}/${GCC_ARM_FILE}"
 ######################################################################
 
 echo "=============== Install python virtualenv"
-virtualenv python-env
-./python-env/bin/pip install cffi==1.6.0 pyserial==3.2.1 greenlet==0.4.10
+cd ${MAIN_DIR}
+virtualenv ${BUILD_DIR}/python-env
+${BUILD_DIR}/python-env/bin/pip install cffi==1.6.0 pyserial==3.2.1 greenlet==0.4.10