diff --git a/src/collision_func_matrix.cpp b/src/collision_func_matrix.cpp
index 73d6a9317c6378689858446c79178f35e2d0e60c..11c100eeb12cf832736301a1d5c0611d89f18683 100644
--- a/src/collision_func_matrix.cpp
+++ b/src/collision_func_matrix.cpp
@@ -42,6 +42,7 @@
 #include <../src/collision_node.h>
 #include <hpp/fcl/narrowphase/narrowphase.h>
 #include "distance_func_matrix.h"
+#include "traits_traversal.h"
 
 namespace hpp
 {
@@ -57,7 +58,7 @@ std::size_t Collide(const CollisionGeometry* o1, const Transform3f& tf1, const C
 {
   if(request.isSatisfied(result)) return result.numContacts();
 
-  typename TraversalTraits<TypeA, TypeB>::CollisionTraversal_t node (request);
+  typename TraversalTraitsCollision<TypeA, TypeB>::CollisionTraversal_t node (request);
   const TypeA* obj1 = static_cast<const TypeA*>(o1);
   const TypeB* obj2 = static_cast<const TypeB*>(o2);
   OcTreeSolver otsolver(nsolver);
@@ -67,7 +68,6 @@ std::size_t Collide(const CollisionGeometry* o1, const Transform3f& tf1, const C
 
   return result.numContacts();
 
-
 #endif
 
 template<typename T_SH1, typename T_SH2>
diff --git a/src/distance_func_matrix.cpp b/src/distance_func_matrix.cpp
index c4b4e33c67dad5a0e66322ca369365f09d44d26b..3d0220d2fd1428562793ead4119dc480c46b6538 100644
--- a/src/distance_func_matrix.cpp
+++ b/src/distance_func_matrix.cpp
@@ -39,6 +39,7 @@
 
 #include <../src/collision_node.h>
 #include "traversal/traversal_node_setup.h"
+#include "traits_traversal.h"
 
 namespace hpp
 {
@@ -46,30 +47,15 @@ namespace fcl
 {
 
 #ifdef HPP_FCL_HAVE_OCTOMAP
-template<typename T_SH>
-FCL_REAL ShapeOcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
-                             const DistanceRequest& request, DistanceResult& result)
-{
-  if(request.isSatisfied(result)) return result.min_distance;
-  ShapeOcTreeDistanceTraversalNode<T_SH> node;
-  const T_SH* obj1 = static_cast<const T_SH*>(o1);
-  const OcTree* obj2 = static_cast<const OcTree*>(o2);
-  OcTreeSolver otsolver(nsolver);
-
-  initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  distance(&node);
-  
-  return result.min_distance;
-}
 
-template<typename T_SH>
-FCL_REAL OcTreeShapeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
+template<typename TypeA, typename TypeB>
+FCL_REAL Distance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
                              const DistanceRequest& request, DistanceResult& result)
 {
   if(request.isSatisfied(result)) return result.min_distance;
-  OcTreeShapeDistanceTraversalNode<T_SH> node;
-  const OcTree* obj1 = static_cast<const OcTree*>(o1);
-  const T_SH* obj2 = static_cast<const T_SH*>(o2);
+  typename TraversalTraitsDistance<TypeA, TypeB>::CollisionTraversal_t node;
+  const TypeA* obj1 = static_cast<const TypeA*>(o1);
+  const TypeB* obj2 = static_cast<const TypeB*>(o2);
   OcTreeSolver otsolver(nsolver);
 
   initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
@@ -78,53 +64,6 @@ FCL_REAL OcTreeShapeDistance(const CollisionGeometry* o1, const Transform3f& tf1
   return result.min_distance;
 }
 
-FCL_REAL OcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
-                        const DistanceRequest& request, DistanceResult& result)
-{
-  if(request.isSatisfied(result)) return result.min_distance;
-  OcTreeDistanceTraversalNode node;
-  const OcTree* obj1 = static_cast<const OcTree*>(o1);
-  const OcTree* obj2 = static_cast<const OcTree*>(o2);
-  OcTreeSolver otsolver(nsolver);
-
-  initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  distance(&node);
-
-  return result.min_distance;
-}
-
-template<typename T_BVH>
-FCL_REAL BVHOcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
-                           const DistanceRequest& request, DistanceResult& result)
-{
-  if(request.isSatisfied(result)) return result.min_distance;
-  MeshOcTreeDistanceTraversalNode<T_BVH> node;
-  const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
-  const OcTree* obj2 = static_cast<const OcTree*>(o2);
-  OcTreeSolver otsolver(nsolver);
-
-  initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  distance(&node);
-
-  return result.min_distance;
-}
-
-template<typename T_BVH>
-FCL_REAL OcTreeBVHDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver,
-                       const DistanceRequest& request, DistanceResult& result)
-{
-  if(request.isSatisfied(result)) return result.min_distance;
-  OcTreeMeshDistanceTraversalNode<T_BVH> node;
-  const OcTree* obj1 = static_cast<const OcTree*>(o1);
-  const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2);
-  OcTreeSolver otsolver(nsolver);
-
-  initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
-  distance(&node);
-
-  return result.min_distance;
-}
-
 #endif
 
 template<typename T_SH1, typename T_SH2>
@@ -451,43 +390,43 @@ DistanceFunctionMatrix::DistanceFunctionMatrix()
   distance_matrix[BV_OBBRSS][BV_OBBRSS] = &BVHDistance<OBBRSS>;
 
 #ifdef HPP_FCL_HAVE_OCTOMAP
-  distance_matrix[GEOM_OCTREE][GEOM_BOX] = &OcTreeShapeDistance<Box>;
-  distance_matrix[GEOM_OCTREE][GEOM_SPHERE] = &OcTreeShapeDistance<Sphere>;
-  distance_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &OcTreeShapeDistance<Capsule>;
-  distance_matrix[GEOM_OCTREE][GEOM_CONE] = &OcTreeShapeDistance<Cone>;
-  distance_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &OcTreeShapeDistance<Cylinder>;
-  distance_matrix[GEOM_OCTREE][GEOM_CONVEX] = &OcTreeShapeDistance<ConvexBase>;
-  distance_matrix[GEOM_OCTREE][GEOM_PLANE] = &OcTreeShapeDistance<Plane>;
-  distance_matrix[GEOM_OCTREE][GEOM_HALFSPACE] = &OcTreeShapeDistance<Halfspace>;
-
-  distance_matrix[GEOM_BOX][GEOM_OCTREE] = &ShapeOcTreeDistance<Box>;
-  distance_matrix[GEOM_SPHERE][GEOM_OCTREE] = &ShapeOcTreeDistance<Sphere>;
-  distance_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &ShapeOcTreeDistance<Capsule>;
-  distance_matrix[GEOM_CONE][GEOM_OCTREE] = &ShapeOcTreeDistance<Cone>;
-  distance_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &ShapeOcTreeDistance<Cylinder>;
-  distance_matrix[GEOM_CONVEX][GEOM_OCTREE] = &ShapeOcTreeDistance<ConvexBase>;
-  distance_matrix[GEOM_PLANE][GEOM_OCTREE] = &ShapeOcTreeDistance<Plane>;
-  distance_matrix[GEOM_HALFSPACE][GEOM_OCTREE] = &ShapeOcTreeDistance<Halfspace>;
-
-  distance_matrix[GEOM_OCTREE][GEOM_OCTREE] = &OcTreeDistance;
-
-  distance_matrix[GEOM_OCTREE][BV_AABB] = &OcTreeBVHDistance<AABB>;
-  distance_matrix[GEOM_OCTREE][BV_OBB] = &OcTreeBVHDistance<OBB>;
-  distance_matrix[GEOM_OCTREE][BV_RSS] = &OcTreeBVHDistance<RSS>;
-  distance_matrix[GEOM_OCTREE][BV_OBBRSS] = &OcTreeBVHDistance<OBBRSS>;
-  distance_matrix[GEOM_OCTREE][BV_kIOS] = &OcTreeBVHDistance<kIOS>;
-  distance_matrix[GEOM_OCTREE][BV_KDOP16] = &OcTreeBVHDistance<KDOP<16> >;
-  distance_matrix[GEOM_OCTREE][BV_KDOP18] = &OcTreeBVHDistance<KDOP<18> >;
-  distance_matrix[GEOM_OCTREE][BV_KDOP24] = &OcTreeBVHDistance<KDOP<24> >;
-
-  distance_matrix[BV_AABB][GEOM_OCTREE] = &BVHOcTreeDistance<AABB>;
-  distance_matrix[BV_OBB][GEOM_OCTREE] = &BVHOcTreeDistance<OBB>;
-  distance_matrix[BV_RSS][GEOM_OCTREE] = &BVHOcTreeDistance<RSS>;
-  distance_matrix[BV_OBBRSS][GEOM_OCTREE] = &BVHOcTreeDistance<OBBRSS>;
-  distance_matrix[BV_kIOS][GEOM_OCTREE] = &BVHOcTreeDistance<kIOS>;
-  distance_matrix[BV_KDOP16][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<16> >;
-  distance_matrix[BV_KDOP18][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<18> >;
-  distance_matrix[BV_KDOP24][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<24> >;
+  distance_matrix[GEOM_OCTREE][GEOM_BOX] = &Distance<Box>;
+  distance_matrix[GEOM_OCTREE][GEOM_SPHERE] = &Distance<Sphere>;
+  distance_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &Distance<Capsule>;
+  distance_matrix[GEOM_OCTREE][GEOM_CONE] = &Distance<Cone>;
+  distance_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &Distance<Cylinder>;
+  distance_matrix[GEOM_OCTREE][GEOM_CONVEX] = &Distance<ConvexBase>;
+  distance_matrix[GEOM_OCTREE][GEOM_PLANE] = &Distance<Plane>;
+  distance_matrix[GEOM_OCTREE][GEOM_HALFSPACE] = &Distance<Halfspace>;
+
+  distance_matrix[GEOM_BOX][GEOM_OCTREE] = &Distance<Box>;
+  distance_matrix[GEOM_SPHERE][GEOM_OCTREE] = &Distance<Sphere>;
+  distance_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &Distance<Capsule>;
+  distance_matrix[GEOM_CONE][GEOM_OCTREE] = &Distance<Cone>;
+  distance_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &Distance<Cylinder>;
+  distance_matrix[GEOM_CONVEX][GEOM_OCTREE] = &Distance<ConvexBase>;
+  distance_matrix[GEOM_PLANE][GEOM_OCTREE] = &Distance<Plane>;
+  distance_matrix[GEOM_HALFSPACE][GEOM_OCTREE] = &Distance<Halfspace>;
+
+  distance_matrix[GEOM_OCTREE][GEOM_OCTREE] = &Distance;
+
+  distance_matrix[GEOM_OCTREE][BV_AABB] = &Distance<AABB>;
+  distance_matrix[GEOM_OCTREE][BV_OBB] = &Distance<OBB>;
+  distance_matrix[GEOM_OCTREE][BV_RSS] = &Distance<RSS>;
+  distance_matrix[GEOM_OCTREE][BV_OBBRSS] = &Distance<OBBRSS>;
+  distance_matrix[GEOM_OCTREE][BV_kIOS] = &Distance<kIOS>;
+  distance_matrix[GEOM_OCTREE][BV_KDOP16] = &Distance<KDOP<16> >;
+  distance_matrix[GEOM_OCTREE][BV_KDOP18] = &Distance<KDOP<18> >;
+  distance_matrix[GEOM_OCTREE][BV_KDOP24] = &Distance<KDOP<24> >;
+
+  distance_matrix[BV_AABB][GEOM_OCTREE] = &Distance<AABB>;
+  distance_matrix[BV_OBB][GEOM_OCTREE] = &Distance<OBB>;
+  distance_matrix[BV_RSS][GEOM_OCTREE] = &Distance<RSS>;
+  distance_matrix[BV_OBBRSS][GEOM_OCTREE] = &Distance<OBBRSS>;
+  distance_matrix[BV_kIOS][GEOM_OCTREE] = &Distance<kIOS>;
+  distance_matrix[BV_KDOP16][GEOM_OCTREE] = &Distance<KDOP<16> >;
+  distance_matrix[BV_KDOP18][GEOM_OCTREE] = &Distance<KDOP<18> >;
+  distance_matrix[BV_KDOP24][GEOM_OCTREE] = &Distance<KDOP<24> >;
 #endif
 
 
diff --git a/src/traits_traversal.h b/src/traits_traversal.h
index f67db3642d0312251096ba47004b9a24b2327f49..c11834295de7e8aa1bcb39eb04a3d7b6c9889cda 100644
--- a/src/traits_traversal.h
+++ b/src/traits_traversal.h
@@ -1,109 +1,92 @@
-/*
- * Software License Agreement (BSD License)
- *
- *  Copyright (c) 2014, CNRS-LAAS
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *
- *   * Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   * Redistributions in binary form must reproduce the above
- *     copyright notice, this list of conditions and the following
- *     disclaimer in the documentation and/or other materials provided
- *     with the distribution.
- *   * Neither the name of Willow Garage, Inc. nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- *  POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** \author Florent Lamiraux */
-
-
 #include <hpp/fcl/collision_func_matrix.h>
-
-#include "traversal/traversal_node_setup.h"
-#include <../src/collision_node.h>
 #include <hpp/fcl/narrowphase/narrowphase.h>
+#include <../src/collision_node.h>
+#include "traversal/traversal_node_setup.h"
 #include "distance_func_matrix.h"
 
+
 namespace hpp
 {
 namespace fcl
 {
 
+#ifdef HPP_FCL_HAVE_OCTOMAP
+
+// TraversalTraitsCollision for collision_func_matrix.cpp
+
 template <typename TypeA, typename TypeB>
-struct TraversalTraits
+struct TraversalTraitsCollision
 {
 };
 
 template <typename T_SH>
-struct TraversalTraits <T_SH, OcTree>
+struct TraversalTraitsCollision <T_SH, OcTree>
 {
   typedef ShapeOcTreeCollisionTraversalNode<T_SH> CollisionTraversal_t;
 };
 
 template <typename T_SH>
-struct TraversalTraits <OcTree, T_SH>
+struct TraversalTraitsCollision <OcTree, T_SH>
 {
   typedef OcTreeShapeCollisionTraversalNode<T_SH> CollisionTraversal_t;
 };
 
 template <>
-struct TraversalTraits <OcTree, OcTree>
+struct TraversalTraitsCollision <OcTree, OcTree>
 {
   typedef OcTreeCollisionTraversalNode<> CollisionTraversal_t;
 };
 
 template <typename T_BVH>
-struct TraversalTraits <OcTree, BVHModel<T_BVH>>
+struct TraversalTraitsCollision <OcTree, BVHModel<T_BVH>>
 {
   typedef OcTreeMeshCollisionTraversalNode<T_BVH> CollisionTraversal_t;
 };
 
 template <typename T_BVH>
-struct TraversalTraits <BVHModel<T_BVH>, OcTree>
+struct TraversalTraitsCollision <BVHModel<T_BVH>, OcTree>
 {
   typedef MeshOcTreeCollisionTraversalNode<T_BVH> CollisionTraversal_t;
 };
 
-template <typename OrientedMeshCollisionTraversalNode, typename T_BVH, typename T_SH>
-struct TraversalTraits <BVHModel<T_BVH>, T_SH>
+// TraversalTraitsDistance for distance_func_matrix.cpp
+
+template <typename TypeA, typename TypeB>
+struct TraversalTraitsDistance
 {
-  typedef OrientMeshShapeCollisionTraveralNode<> CollisionTraversal_t;
 };
 
-template <typename OrientedMeshCollisionTraversalNode, typename T_BVH>
-struct TraversalTraits <BVHModel<T_BVH>, BVHModel<T_BVH>>
+template <typename T_SH>
+struct TraversalTraitsDistance <T_SH, OcTree>
 {
-  typedef OrientedMeshCollisionTraversalNode<> CollisionTraversal_t;
+  typedef ShapeOcTreeDistanceTraversalNode<T_SH> CollisionTraversal_t;
 };
 
+template <typename T_SH>
+struct TraversalTraitsDistance <OcTree, T_SH>
+{
+  typedef OcTreeShapeDistanceTraversalNode<T_SH> CollisionTraversal_t;
+};
 
+template <>
+struct TraversalTraitsDistance <OcTree, OcTree>
+{
+  typedef OcTreeDistanceTraversalNode CollisionTraversal_t;
+};
 
+template <typename T_BVH>
+struct TraversalTraitsDistance <OcTree, BVHModel<T_BVH>>
+{
+  typedef OcTreeMeshDistanceTraversalNode<T_BVH> CollisionTraversal_t;
+};
 
+template <typename T_BVH>
+struct TraversalTraitsDistance <BVHModel<T_BVH>, OcTree>
+{
+  typedef MeshOcTreeDistanceTraversalNode<T_BVH> CollisionTraversal_t;
+};
 
-
-
-
-
-
-
+#endif
 
 }