diff --git a/index.js b/index.js
index 91ec857..59b06bb 100644
--- a/index.js
+++ b/index.js
@@ -32,7 +32,7 @@ function concaveman(points, concavity, lengthThreshold) {
     }
 
     // index the segments with an R-tree (for intersection checks)
-    var segTree = rbush(16, ['.minX', '.minY', '.maxX', '.maxY']);
+    var segTree = rbush(16);
     for (i = 0; i < queue.length; i++) segTree.insert(updateBBox(queue[i]));
 
     var sqConcavity = concavity * concavity;
@@ -90,7 +90,7 @@ function findCandidate(tree, a, b, c, d, maxDist, segTree) {
         for (var i = 0; i < node.children.length; i++) {
             var child = node.children[i];
 
-            var dist = node.leaf ? sqSegDist(child, b, c) : sqSegBoxDist(b, c, child.bbox);
+            var dist = node.leaf ? sqSegDist(child, b, c) : sqSegBoxDist(b, c, child);
             if (dist > maxDist) continue; // skip the node if it's farther than we ever need
 
             queue.push({
@@ -126,22 +126,22 @@ function compareDist(a, b) {
 // square distance from a segment bounding box to the given one
 function sqSegBoxDist(a, b, bbox) {
     if (inside(a, bbox) || inside(b, bbox)) return 0;
-    var d1 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox[0], bbox[1], bbox[2], bbox[1]);
+    var d1 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.minY, bbox.maxX, bbox.minY);
     if (d1 === 0) return 0;
-    var d2 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox[0], bbox[1], bbox[0], bbox[3]);
+    var d2 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.minY, bbox.minX, bbox.maxY);
     if (d2 === 0) return 0;
-    var d3 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox[2], bbox[1], bbox[2], bbox[3]);
+    var d3 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.maxX, bbox.minY, bbox.maxX, bbox.maxY);
     if (d3 === 0) return 0;
-    var d4 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox[0], bbox[3], bbox[2], bbox[3]);
+    var d4 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.maxY, bbox.maxX, bbox.maxY);
     if (d4 === 0) return 0;
     return Math.min(d1, d2, d3, d4);
 }
 
 function inside(a, bbox) {
-    return a[0] >= bbox[0] &&
-           a[0] <= bbox[2] &&
-           a[1] >= bbox[1] &&
-           a[1] <= bbox[3];
+    return a[0] >= bbox.minX &&
+           a[0] <= bbox.maxX &&
+           a[1] >= bbox.minY &&
+           a[1] <= bbox.maxY;
 }
 
 // check if the edge (a,b) doesn't intersect any other edges
@@ -151,7 +151,7 @@ function noIntersections(a, b, segTree) {
     var maxX = Math.max(a[0], b[0]);
     var maxY = Math.max(a[1], b[1]);
 
-    var edges = segTree.search([minX, minY, maxX, maxY]);
+    var edges = segTree.search({minX: minX, minY: minY, maxX: maxX, maxY: maxY});
     for (var i = 0; i < edges.length; i++) {
         if (intersects(edges[i].p, edges[i].next.p, a, b)) return false;
     }
diff --git a/package.json b/package.json
index 1d1c687..5d91d93 100644
--- a/package.json
+++ b/package.json
@@ -5,15 +5,15 @@
   "main": "index.js",
   "dependencies": {
     "monotone-convex-hull-2d": "^1.0.1",
-    "point-in-polygon": "^1.0.0",
-    "rbush": "^1.4.2",
+    "point-in-polygon": "^1.0.1",
+    "rbush": "^2.0.1",
     "robust-orientation": "^1.1.3",
-    "tinyqueue": "^1.0.1"
+    "tinyqueue": "^1.1.0"
   },
   "devDependencies": {
-    "eslint": "^2.1.0",
-    "eslint-config-mourner": "^2.0.0",
-    "tap": "^5.4.3"
+    "eslint": "^3.6.0",
+    "eslint-config-mourner": "^2.0.1",
+    "tap": "^7.1.2"
   },
   "scripts": {
     "pretest": "eslint index.js test/*.js",