diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0d281a56b706f3702b9dd723995fb62d5b57b0d1..771ee5bf787dc6b4c0fae3d1f256d101266d6246 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -53,6 +53,14 @@ set(BOOST_COMPONENTS
 search_for_boost()
 # Optional dependencies
 add_optional_dependency("octomap >= 1.6")
+if (OCTOMAP_INCLUDE_DIRS AND OCTOMAP_LIBRARY_DIRS)
+	include_directories(${OCTOMAP_INCLUDE_DIRS})
+	link_directories(${OCTOMAP_LIBRARY_DIRS})
+	set(FCL_HAVE_OCTOMAP 1)
+	message(STATUS "FCL uses Octomap")
+else()
+	message(STATUS "FCL does not use Octomap")
+endif()
 # flann package ill defined: comment.
 # add_optional_dependency("flann >= 1.7")
 # if (${FLANN_FOUND})
diff --git a/include/hpp/fcl/traversal/traversal_node_octree.h b/include/hpp/fcl/traversal/traversal_node_octree.h
index 331dc89fa2129bd8f4e669ce66c8ef8424f6929e..6daa1b6757b2a540e9a6892079bd63a7e7f29762 100644
--- a/include/hpp/fcl/traversal/traversal_node_octree.h
+++ b/include/hpp/fcl/traversal/traversal_node_octree.h
@@ -1041,6 +1041,11 @@ public:
     return false;
   }
 
+  bool BVTesting(int, int, FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int, FCL_REAL&) const
   {
     otsolver->OcTreeIntersect(model1, model2, tf1, tf2, request, *result);
@@ -1073,6 +1078,11 @@ public:
     return -1;
   }
 
+  bool BVTesting(int, int, FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int) const
   {
     otsolver->OcTreeDistance(model1, model2, tf1, tf2, request, *result);
@@ -1102,6 +1112,11 @@ public:
     return false;
   }
 
+  bool BVTesting(int, int, FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int, FCL_REAL&) const
   {
     otsolver->OcTreeShapeIntersect(model2, *model1, tf2, tf1, request, *result);
@@ -1133,6 +1148,11 @@ public:
     return false;
   }
 
+  bool BVTesting(int, int, fcl::FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int, FCL_REAL&) const
   {
     otsolver->OcTreeShapeIntersect(model1, *model2, tf1, tf2, request, *result);
@@ -1222,6 +1242,11 @@ public:
     return false;
   }
 
+  bool BVTesting(int, int, FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int, FCL_REAL&) const
   {
     otsolver->OcTreeMeshIntersect(model2, model1, tf2, tf1, request, *result);
@@ -1253,6 +1278,11 @@ public:
     return false;
   }
 
+  bool BVTesting(int, int, FCL_REAL&) const
+  {
+    return false;
+  }
+
   void leafTesting(int, int, FCL_REAL&) const
   {
     otsolver->OcTreeMeshIntersect(model1, model2, tf1, tf2, request, *result);
diff --git a/src/collision_func_matrix.cpp b/src/collision_func_matrix.cpp
index 7e8dea63f6c4ae99bfea18dbd9b432b82b276188..c5e1e645568efc9ca89bfb39a0b5df5902e27f88 100644
--- a/src/collision_func_matrix.cpp
+++ b/src/collision_func_matrix.cpp
@@ -60,7 +60,8 @@ std::size_t ShapeOcTreeCollide(const CollisionGeometry* o1, const Transform3f& t
   OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
   initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  collide(&node);
+  FCL_REAL sqrDistance = 0;
+  collide(&node, sqrDistance);
 
   return result.numContacts();
 }
@@ -78,12 +79,13 @@ std::size_t OcTreeShapeCollide(const CollisionGeometry* o1, const Transform3f& t
   OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
   initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  collide(&node);
+  FCL_REAL sqrDistance = 0;
+  collide(&node, sqrDistance);
 
   return result.numContacts();
 }
 
-etemplate<typename NarrowPhaseSolver>
+template<typename NarrowPhaseSolver>
 std::size_t OcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
                           const NarrowPhaseSolver* nsolver,
                           const CollisionRequest& request, CollisionResult& result)
@@ -96,7 +98,8 @@ std::size_t OcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, c
   OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
   initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  collide(&node);
+  FCL_REAL sqrDistance = 0;
+  collide(&node, sqrDistance);
 
   return result.numContacts();
 }
@@ -119,7 +122,8 @@ std::size_t OcTreeBVHCollide(const CollisionGeometry* o1, const Transform3f& tf1
     OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
     initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, no_cost_request, result);
-    collide(&node);
+    FCL_REAL sqrDistance = 0;
+    collide(&node, sqrDistance);
 
     Box box;
     Transform3f box_tf;
@@ -140,7 +144,8 @@ std::size_t OcTreeBVHCollide(const CollisionGeometry* o1, const Transform3f& tf1
     OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
     initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-    collide(&node);
+    FCL_REAL sqrDistance = 0;
+    collide(&node, sqrDistance);
   }
   
   return result.numContacts();
@@ -164,7 +169,8 @@ std::size_t BVHOcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1
     OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
     initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, no_cost_request, result);
-    collide(&node);
+    FCL_REAL sqrDistance = 0;
+    collide(&node, sqrDistance);
 
     Box box;
     Transform3f box_tf;
@@ -185,7 +191,8 @@ std::size_t BVHOcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1
     OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
 
     initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-    collide(&node);
+    FCL_REAL sqrDistance = 0;
+    collide(&node, sqrDistance);
   }
   
   return result.numContacts();