diff --git a/.travis.yml b/.travis.yml
index 97d373312de63499a48db0c7911a88ef8e305a81..f46784cac49e84b8d12cb9ef700bf927810ece9c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,15 @@
+sudo: required
+dist: trusty
 language: node_js
 git:
   depth: 10
 node_js:
-  - "0.12"
+  - "4"
+  - "5.6"
 before_install:
   - travis_retry sudo pip install -r test-infra/requirements.txt
-  - rvm install 2.0.0
-  - rvm use 2.0.0 --fuzzy
+  - rvm install 2.2
+  - rvm use 2.2 --fuzzy
   - export GEMDIR=$(rvm gemdir)
   - if [ "$TWBS_TEST" = validate-html ]; then echo "ruby=$(basename $GEMDIR) jekyll=$JEKYLL_VERSION rouge=$ROUGE_VERSION" > pseudo_Gemfile.lock; fi
   - "export TRAVIS_COMMIT_MSG=\"$(git log --format=%B --no-merges -n 1)\""
@@ -22,7 +25,7 @@ after_script:
   - if [ "$TRAVIS_REPO_SLUG" != twbs-savage/bootstrap ] && [ "$TWBS_TEST" = validate-html ] && [ $TWBS_DO_VALIDATOR -ne 0 ]; then ./test-infra/s3_cache.py upload rubygems; fi
 env:
   global:
-    - JEKYLL_VERSION="3.0.0"
+    - JEKYLL_VERSION="3.1.2
     - ROUGE_VERSION="1.10.1"
     - SAUCE_USERNAME="bootstrap"
     - secure: "pJkBwnuae9dKU5tEcCqccfS1QQw7/meEcfz63fM7ba7QJNjoA6BaXj08L5Z3Vb5vBmVPwBawxo5Hp0jC0r/Z/O0hGnAmz/Cz09L+cy7dSAZ9x4hvZePSja/UAusaB5ogMoO8l2b773MzgQeSmrLbExr9BWLeqEfjC2hFgdgHLaQ="
@@ -40,6 +43,11 @@ env:
     - TWBS_TEST=sauce-js-unit
 matrix:
   fast_finish: true
+  exclude:
+    - node_js: "4"
+      env: TWBS_TEST=validate-html
+    - node_js: "4"
+      env: TWBS_TEST=sauce-js-unit
 notifications:
   slack: heybb:iz4wwosL0N0EdaX1gvgkU0NH
   webhooks:
diff --git a/package.json b/package.json
index 061368e6c6e3fa0fc2474f0fef9ab9fc500f54e1..149594968f73ab9eba63acd15ec7fbfd03ccf5aa 100644
--- a/package.json
+++ b/package.json
@@ -30,33 +30,33 @@
   "license": "MIT",
   "devDependencies": {
     "btoa": "~1.1.2",
-    "glob": "~6.0.1",
+    "glob": "~7.0.0",
     "grunt": "~0.4.5",
     "grunt-autoprefixer": "~3.0.3",
-    "grunt-contrib-clean": "~0.7.0",
-    "grunt-contrib-compress": "~0.14.0",
-    "grunt-contrib-concat": "~0.5.1",
+    "grunt-contrib-clean": "~1.0.0",
+    "grunt-contrib-compress": "~1.0.0",
+    "grunt-contrib-concat": "~1.0.0",
     "grunt-contrib-connect": "~0.11.2",
     "grunt-contrib-copy": "~0.8.0",
     "grunt-contrib-csslint": "~0.5.0",
     "grunt-contrib-cssmin": "~0.14.0",
     "grunt-contrib-htmlmin": "~0.6.0",
     "grunt-contrib-jade": "~0.15.0",
-    "grunt-contrib-jshint": "~0.11.2",
-    "grunt-contrib-less": "~1.1.0",
-    "grunt-contrib-qunit": "~0.7.0",
+    "grunt-contrib-jshint": "~1.0.0",
+    "grunt-contrib-less": "~1.2.0",
+    "grunt-contrib-qunit": "~1.0.1",
     "grunt-contrib-uglify": "~0.11.0",
     "grunt-contrib-watch": "~0.6.1",
     "grunt-csscomb": "~3.1.0",
     "grunt-exec": "~0.4.6",
-    "grunt-html": "~5.0.1",
+    "grunt-html": "~6.0.0",
     "grunt-jekyll": "~0.4.2",
-    "grunt-jscs": "~2.5.0",
+    "grunt-jscs": "~2.7.0",
     "grunt-saucelabs": "~8.6.1",
     "load-grunt-tasks": "~3.4.0",
-    "markdown-it": "^5.0.0",
+    "markdown-it": "^6.0.0",
     "npm-shrinkwrap": "^200.4.0",
-    "shelljs": "^0.5.3",
+    "shelljs": "^0.6.0",
     "time-grunt": "^1.2.1"
   },
   "engines": {