diff --git a/core/src/dynamic_spatial_organizer.hh b/core/src/dynamic_spatial_organizer.hh
index 455389667c1fd725595dad3276d308a4c7a55ffb..59398d7957a62ed922484ce6c84d9877dcb9b58a 100644
--- a/core/src/dynamic_spatial_organizer.hh
+++ b/core/src/dynamic_spatial_organizer.hh
@@ -3,9 +3,6 @@
 
 #include <vector>
 #include <map>
-#include <cmath>
-#include <limits>
-#include <stdint.h>
 
 #include <ost/geom/geom.hh>
 
@@ -19,91 +16,43 @@ class SpatialOrganizerCell{
 
 public:
 
-  SpatialOrganizerCell(): num_items_(0),
-          capacity_(32) {
-    x_ = new Real[capacity_];
-    y_ = new Real[capacity_];
-    z_ = new Real[capacity_];
-    pointers_ = new ITEM*[capacity_];
-    distance_buffer_ = new Real[capacity_];
-  }
-
-  ~SpatialOrganizerCell() {
-    delete [] x_;
-    delete [] y_;
-    delete [] z_;
-    delete [] pointers_;
-    delete [] distance_buffer_;
+  SpatialOrganizerCell() {
+    x_.reserve(32);
+    y_.reserve(32);
+    z_.reserve(32);
+    pointers_.reserve(32);
+    distance_buffer_.reserve(32);
   }
 
   void AddItem(ITEM* item, Real x, Real y, Real z) {
-
-    int idx = this->GetIdx(item);   
-    if(idx != -1) {
-      throw promod3::Error("Item is already in spatial organizer cell!");
-    }
-
-    if(num_items_ == capacity_) {
-      capacity_ *= 2;
-
-      Real* new_x = new Real[capacity_];
-      Real* new_y = new Real[capacity_];
-      Real* new_z = new Real[capacity_];
-      ITEM** new_pointers = new ITEM*[capacity_];
-      Real* new_distance_buffer_ = new Real[capacity_];
-
-      memcpy(new_x, x_, num_items_ * sizeof(Real));
-      memcpy(new_y, y_, num_items_ * sizeof(Real));
-      memcpy(new_z, z_, num_items_ * sizeof(Real));
-      memcpy(new_pointers, pointers_, num_items_ * sizeof(ITEM*));
-
-      delete [] x_;
-      delete [] y_;
-      delete [] z_;
-      delete [] pointers_;
-      delete [] distance_buffer_;
-
-      x_ = new_x;
-      y_ = new_y;
-      z_ = new_z;
-      pointers_ = new_pointers;
-      distance_buffer_ = new_distance_buffer_;
-    }
-
-    x_[num_items_] = x;
-    y_[num_items_] = y;
-    z_[num_items_] = z;
-    pointers_[num_items_] = item;
-    ++num_items_;
+    x_.push_back(x);
+    y_.push_back(y);
+    z_.push_back(z);
+    pointers_.push_back(item);
+    distance_buffer_.push_back(0.0);
   }
 
   void RemoveItem(ITEM* item) {
-
-    if(num_items_ == 0) {
-      throw promod3::Error("Cannot remove item from empty spatial organizer cell!");
-    }
-
-    int idx = this->GetIdx(item);
-   
-    if(idx == -1) {
+    typename std::vector<ITEM*>::iterator it = 
+    std::find(pointers_.begin(), pointers_.end(), item);
+    if(it == pointers_.end()) {
       throw promod3::Error("Cannot Remove inexistent item from spatial organizer cell!");
     }
-
-    if(idx < (num_items_-1)) {
-      int num_bytes = (num_items_-(idx+1))*sizeof(Real);
-      memmove(&x_[idx],&x_[idx+1],num_bytes);
-      memmove(&y_[idx],&y_[idx+1],num_bytes);
-      memmove(&z_[idx],&z_[idx+1],num_bytes);
-      memmove(&pointers_[idx],&pointers_[idx+1], (num_items_-(idx+1))*sizeof(ITEM*));
-    }
-    --num_items_;
+    int idx = std::distance(pointers_.begin(), it);
+    x_.erase(x_.begin() + idx);
+    y_.erase(y_.begin() + idx);
+    z_.erase(z_.begin() + idx);
+    pointers_.erase(pointers_.begin() + idx);
+    distance_buffer_.pop_back();
   }
 
   void ResetPos(ITEM* item, Real x, Real y, Real z) {
-    int idx = this->GetIdx(item);
-    if(idx == -1) {
-      throw promod3::Error("Cannot reset pos of inexistent item from spatial organizer cell!");      
+    typename std::vector<ITEM*>::iterator it = 
+    std::find(pointers_.begin(), pointers_.end(), item);
+    if(it == pointers_.end()) {
+      throw promod3::Error("Cannot Remove inexistent item from spatial organizer cell!");
     }
+    int idx = std::distance(pointers_.begin(), it);
     x_[idx] = x;
     y_[idx] = y;
     z_[idx] = z;
@@ -114,15 +63,16 @@ public:
 
     Real dx, dy, dz;
     Real squared_cutoff = dist*dist;
+    int num_items = x_.size();
 
-    for(int i = 0; i < num_items_; ++i) {
+    for(int i = 0; i < num_items; ++i) {
       dx = x_[i] - x;
       dy = y_[i] - y;
       dz = z_[i] - z; 
       distance_buffer_[i] = dx*dx + dy*dy + dz*dz;
     }
 
-    for(int i = 0; i < num_items_; ++i) {
+    for(int i = 0; i < num_items; ++i) {
       if(distance_buffer_[i] <= squared_cutoff) {
         result_vec.push_back(std::make_pair(pointers_[i],std::sqrt(distance_buffer_[i])));
       }
@@ -130,22 +80,11 @@ public:
   }
 
 private:
-
-
-  int GetIdx(ITEM* ptr) {
-    for(int i = 0; i < num_items_; ++i) {
-      if(pointers_[i] == ptr) return i;
-    }
-    return -1;
-  }
-
-  int num_items_;
-  int capacity_;
-  Real* x_;
-  Real* y_;
-  Real* z_;
-  ITEM** pointers_;
-  Real* distance_buffer_;
+  std::vector<Real> x_;
+  std::vector<Real> y_;
+  std::vector<Real> z_;
+  std::vector<ITEM*> pointers_;
+  mutable std::vector<Real> distance_buffer_;
 };
 
 //! spatial organizer
@@ -332,7 +271,6 @@ public:
     return return_vec;
   }
 
-
   void Clear() {
     for(typename ItemMap::iterator i = map_.begin(); i != map_.end(); ++i) {
       delete i->second;
@@ -348,9 +286,9 @@ private:
   mutable WithinList result_buffer_;
 
   Index gen_index(const geom::Vec3& pos) const {
-    Index nrvo(static_cast<int>(round(pos[0]/delta_)),
-               static_cast<int>(round(pos[1]/delta_)),
-               static_cast<int>(round(pos[2]/delta_)));
+    Index nrvo(static_cast<int>(std::floor(pos[0]/delta_ + Real(0.5))),
+               static_cast<int>(std::floor(pos[1]/delta_ + Real(0.5))),
+               static_cast<int>(std::floor(pos[2]/delta_ + Real(0.5))));
     return nrvo;
   }
 };