* update BVH to explicitely use aligned_allocator
* fix warning in StdVector
diff --git a/Eigen/StdVector b/Eigen/StdVector
index 6d62906..6c62f51 100644
--- a/Eigen/StdVector
+++ b/Eigen/StdVector
@@ -26,7 +26,7 @@
   };
 
   aligned_allocator_indirection() throw() {}
-  aligned_allocator_indirection(const aligned_allocator_indirection& ) throw() {}
+  aligned_allocator_indirection(const aligned_allocator_indirection& ) throw() : aligned_allocator<T>() {}
   aligned_allocator_indirection(const aligned_allocator<T>& ) throw() {}
   template<class U>
   aligned_allocator_indirection(const aligned_allocator_indirection<U>& ) throw() {}
diff --git a/unsupported/Eigen/src/BVH/KdBVH.h b/unsupported/Eigen/src/BVH/KdBVH.h
index 4b68192..124ad66 100644
--- a/unsupported/Eigen/src/BVH/KdBVH.h
+++ b/unsupported/Eigen/src/BVH/KdBVH.h
@@ -40,18 +40,18 @@
 
 //these templates help the tree initializer get the bounding boxes either from a provided
 //iterator range or using ei_bounding_box in a unified way
-template<typename Object, typename Volume, typename BoxIter>
+template<typename ObjectList, typename VolumeList, typename BoxIter>
 struct ei_get_boxes_helper {
-  void operator()(const std::vector<Object> &objects, BoxIter boxBegin, BoxIter boxEnd, std::vector<Volume> &outBoxes)
+  void operator()(const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes)
   {
     outBoxes.insert(outBoxes.end(), boxBegin, boxEnd);
     ei_assert(outBoxes.size() == objects.size());
   }
 };
 
-template<typename Object, typename Volume>
-struct ei_get_boxes_helper<Object, Volume, int> {
-  void operator()(const std::vector<Object> &objects, int, int, std::vector<Volume> &outBoxes)
+template<typename ObjectList, typename VolumeList>
+struct ei_get_boxes_helper<ObjectList, VolumeList, int> {
+  void operator()(const ObjectList &objects, int, int, VolumeList &outBoxes)
   {
     outBoxes.reserve(objects.size());
     for(int i = 0; i < (int)objects.size(); ++i)
@@ -78,8 +78,10 @@
 public:
   enum { Dim = _Dim };
   typedef _Object Object;
+  typedef std::vector<Object, aligned_allocator<Object> > ObjectList;
   typedef _Scalar Scalar;
   typedef AlignedBox<Scalar, Dim> Volume;
+  typedef std::vector<Volume, aligned_allocator<Volume> > VolumeList;
   typedef int Index;
   typedef const int *VolumeIterator; //the iterators are just pointers into the tree's vectors
   typedef const Object *ObjectIterator;
@@ -110,10 +112,11 @@
     if(n < 2)
       return; //if we have at most one object, we don't need any internal nodes
 
-    std::vector<Volume> objBoxes;
-    std::vector<VIPair> objCenters;
+    VolumeList objBoxes;
+    VIPairList objCenters;
 
-    ei_get_boxes_helper<Object, Volume, BIter>()(objects, boxBegin, boxEnd, objBoxes); //compute the bounding boxes depending on BIter type
+    //compute the bounding boxes depending on BIter type
+    ei_get_boxes_helper<ObjectList, VolumeList, BIter>()(objects, boxBegin, boxEnd, objBoxes);
 
     objCenters.reserve(n);
     boxes.reserve(n - 1);
@@ -124,7 +127,7 @@
 
     build(objCenters, 0, n, objBoxes, 0); //the recursive part of the algorithm
 
-    std::vector<Object> tmp(n);
+    ObjectList tmp(n);
     tmp.swap(objects);
     for(int i = 0; i < n; ++i)
       objects[i] = tmp[objCenters[i].second];
@@ -174,6 +177,7 @@
 
 private:
   typedef ei_vector_int_pair<Scalar, Dim> VIPair;
+  typedef std::vector<VIPair, aligned_allocator<VIPair> > VIPairList;
   typedef Matrix<Scalar, Dim, 1> VectorType;
   struct VectorComparator //compares vectors, or, more specificall, VIPairs along a particular dimension
   {
@@ -185,7 +189,7 @@
   //Build the part of the tree between objects[from] and objects[to] (not including objects[to]).
   //This routine partitions the objCenters in [from, to) along the dimension dim, recursively constructs
   //the two halves, and adds their parent node.  TODO: a cache-friendlier layout
-  void build(std::vector<VIPair> &objCenters, int from, int to, const std::vector<Volume> &objBoxes, int dim)
+  void build(VIPairList &objCenters, int from, int to, const VolumeList &objBoxes, int dim)
   {
     ei_assert(to - from > 1);
     if(to - from == 2) {
@@ -218,8 +222,8 @@
   }
 
   std::vector<int> children; //children of x are children[2x] and children[2x+1], indices bigger than boxes.size() index into objects.
-  std::vector<Volume> boxes;
-  std::vector<Object> objects;
+  VolumeList boxes;
+  ObjectList objects;
 };
 
 #endif //KDBVH_H_INCLUDED
diff --git a/unsupported/test/BVH.cpp b/unsupported/test/BVH.cpp
index 445489e..879daac 100644
--- a/unsupported/test/BVH.cpp
+++ b/unsupported/test/BVH.cpp
@@ -42,10 +42,12 @@
   double radius;
 };
 
+
 template<int Dim> AlignedBox<double, Dim> ei_bounding_box(const Matrix<double, Dim, 1> &v) { return AlignedBox<double, Dim>(v); }
 template<int Dim> AlignedBox<double, Dim> ei_bounding_box(const Ball<Dim> &b)
 { return AlignedBox<double, Dim>(b.center.cwise() - b.radius, b.center.cwise() + b.radius); }
 
+
 template<int Dim>
 struct BallPointStuff //this class provides functions to be both an intersector and a minimizer, both for a ball and a point and for two trees
 {
@@ -97,16 +99,19 @@
   int count;
 };
 
+
 template<int Dim>
 struct TreeTest
 {
   typedef Matrix<double, Dim, 1> VectorType;
+  typedef std::vector<VectorType, aligned_allocator<VectorType> > VectorTypeList;
   typedef Ball<Dim> BallType;
+  typedef std::vector<BallType, aligned_allocator<BallType> > BallTypeList;
   typedef AlignedBox<double, Dim> BoxType;
 
   void testIntersect1()
   {
-    std::vector<BallType> b;
+    BallTypeList b;
     for(int i = 0; i < 500; ++i) {
         b.push_back(BallType(VectorType::Random(), 0.5 * ei_random(0., 1.)));
     }
@@ -125,7 +130,7 @@
 
   void testMinimize1()
   {
-    std::vector<BallType> b;
+    BallTypeList b;
     for(int i = 0; i < 500; ++i) {
         b.push_back(BallType(VectorType::Random(), 0.01 * ei_random(0., 1.)));
     }
@@ -146,8 +151,8 @@
 
   void testIntersect2()
   {
-    std::vector<BallType> b;
-    std::vector<VectorType> v;
+    BallTypeList b;
+    VectorTypeList v;
 
     for(int i = 0; i < 50; ++i) {
         b.push_back(BallType(VectorType::Random(), 0.5 * ei_random(0., 1.)));
@@ -171,8 +176,8 @@
 
   void testMinimize2()
   {
-    std::vector<BallType> b;
-    std::vector<VectorType> v;
+    BallTypeList b;
+    VectorTypeList v;
 
     for(int i = 0; i < 50; ++i) {
         b.push_back(BallType(VectorType::Random(), 1e-7 + 1e-6 * ei_random(0., 1.)));
@@ -197,6 +202,7 @@
   }
 };
 
+
 void test_BVH()
 {
   for(int i = 0; i < g_repeat; i++) {