diff --git a/include/laser/utils/laser3d_tools.h b/include/laser/utils/laser3d_tools.h
index c73525a69c0bbb0fe6c70ec715e627528fa57206..61452b28ea3a92673318ffbf2a8f273c82cce24d 100644
--- a/include/laser/utils/laser3d_tools.h
+++ b/include/laser/utils/laser3d_tools.h
@@ -23,19 +23,29 @@
 #ifndef LASER3D_TOOLS_H
 #define LASER3D_TOOLS_H
 
+/**************************
+ *      WOLF includes     *
+ **************************/
+#include "laser/capture/capture_laser_3d.h"
+#include "laser/sensor/sensor_laser_3d.h"
+
 #include <core/utils/logging.h>
 
+/**************************
+ *      PCL includes      *
+ **************************/
 #include <pcl/point_types.h>
 #include <pcl/point_cloud.h>
 #include <pcl/common/transforms.h>
 #include <pcl/io/pcd_io.h>
-
 #include <pcl/filters/voxel_grid.h>
-
 #include <pcl/registration/icp.h>
 #include <pcl/registration/icp_nl.h>
 #include <pcl/registration/transforms.h>
 
+/**************************
+ *    Standard includes   *
+ **************************/
 #include <iostream>
 #include <fstream>
 
@@ -43,21 +53,19 @@ typedef pcl::Registration<pcl::PointXYZ, pcl::PointXYZ>::Ptr RegistrationPtr;
 
 namespace wolf
 {
-void loadData(std::string fname, pcl::PointCloud<pcl::PointXYZ> &cloud)
+void loadData(std::string _fname, pcl::PointCloud<pcl::PointXYZ> &_cloud)
 {
-    //std::string s_pcd = ".pcd", s_bin = ".bin";
-    if (fname.compare(fname.size() - 4, 4, ".pcd") == 0)
+    if (_fname.compare(_fname.size() - 4, 4, ".pcd") == 0)
     {
-        pcl::io::loadPCDFile(fname, cloud);
-
+        pcl::io::loadPCDFile(_fname, _cloud);
     }
-    else if (fname.compare(fname.size() - 4, 4, ".bin") == 0)
+    else if (_fname.compare(_fname.size() - 4, 4, ".bin") == 0)
     {  // file is binary
-        //pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ptr = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
+        // pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ptr = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
 
         std::ifstream stream_input;
-    
-        stream_input.open(fname, std::ios::in);
+
+        stream_input.open(_fname, std::ios::in);
         for (int i = 0; stream_input.good() && !stream_input.eof(); i++)
         {
             pcl::PointXYZI point_raw;
@@ -70,16 +78,32 @@ void loadData(std::string fname, pcl::PointCloud<pcl::PointXYZ> &cloud)
             tPoint.y = point_raw.y;
             tPoint.z = point_raw.z;
 
-            cloud.push_back(tPoint);
+            _cloud.push_back(tPoint);
         }
         stream_input.close();
-        
+
         // remove NAN points from the cloud
         pcl::Indices indices;
-        pcl::removeNaNFromPointCloud(cloud, cloud, indices);
+        pcl::removeNaNFromPointCloud(_cloud, _cloud, indices);
     }
 };
+void PCLdownsample(CaptureLaser3dPtr _capture_laser, bool _pcl_downsample = true, double _pcl_voxel_size = 0.05)
+{
+    if (_pcl_downsample)
+    {
+        pcl::VoxelGrid<pcl::PointXYZ> grid;
+        grid.setLeafSize(_pcl_voxel_size, _pcl_voxel_size, _pcl_voxel_size);
+        grid.setInputCloud(_capture_laser->getPCLRaw());
 
+        pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ptr = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
+        grid.filter(*pcl_ptr);
+        _capture_laser->setPCLDownsampled(pcl_ptr);
+    }
+    else
+    {
+        _capture_laser->setPCLDownsampled(_capture_laser->getPCLRaw());
+    }
+}
 // _cloud_ref: first PointCloud
 // _cloud_other: second PointCloud
 inline void pairAlign(const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_ref,
diff --git a/src/processor/processor_odom_icp_3d.cpp b/src/processor/processor_odom_icp_3d.cpp
index 8b10b650c7744de29524afbd8b45c0ab263223ad..52f970d7677fe9c69ab02f14465c71409788ca55 100644
--- a/src/processor/processor_odom_icp_3d.cpp
+++ b/src/processor/processor_odom_icp_3d.cpp
@@ -89,31 +89,9 @@ void ProcessorOdomIcp3d::configure(SensorBasePtr _sensor)
 void ProcessorOdomIcp3d::preProcess()
 {
     incoming_laser_ = std::static_pointer_cast<CaptureLaser3d>(incoming_ptr_);
-    if (params_odom_icp_->pcl_downsample)
-    {
-        // DURATION --------------------------------------------------------
-        auto start = std::chrono::high_resolution_clock::now();
-        // DURATION --------------------------------------------------------
-
-        double                        pcl_voxel_size = params_odom_icp_->pcl_downsample_voxel_size;
-        pcl::VoxelGrid<pcl::PointXYZ> grid;
-        grid.setLeafSize(pcl_voxel_size, pcl_voxel_size, pcl_voxel_size);
-        grid.setInputCloud(incoming_laser_->getPCLRaw());
-
-        pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ptr = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
-        grid.filter(*pcl_ptr);
-        incoming_laser_->setPCLDownsampled(pcl_ptr);
-
-        // DURATION --------------------------------------------------------
-        auto duration =
-            std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start);
-        WOLF_INFO("ProcessorOdomIcp3d.h: downsample: duration: ", 1e-3 * (duration).count(), " ms");
-        // DURATION --------------------------------------------------------
-    }
-    else
-    {
-        incoming_laser_->setPCLDownsampled(incoming_laser_->getPCLRaw());
-    }
+    double   pcl_voxel_size = params_odom_icp_->pcl_downsample_voxel_size;
+    bool     pcl_downsample = params_odom_icp_->pcl_downsample;
+    PCLdownsample(incoming_laser_, pcl_downsample, pcl_voxel_size);
 }
 
 /** \brief Tracker function