diff --git a/.github/workflows/ci_ubuntu20_04_foxy_ros2.yml b/.github/workflows/ci_ubuntu20_04_foxy_ros2.yml
index f3fad5ac3d2c8888c50359c494629371ae27b70b..0a138d11630685c7638c6d0ef6253c144a6fbe75 100644
--- a/.github/workflows/ci_ubuntu20_04_foxy_ros2.yml
+++ b/.github/workflows/ci_ubuntu20_04_foxy_ros2.yml
@@ -53,7 +53,7 @@ jobs:
           cd $ROS_WORKSPACE/src
           ln -s /home/runner/work/dynamic_graph_bridge/dynamic_graph_bridge .
           git clone -b devel --single-branch --recursive https://github.com/stack-of-tasks/dynamic_graph_bridge_msgs.git
-      
+
       #
       # Build dep and checkout from source.
       #
diff --git a/.gitignore b/.gitignore
index 6100d281dc41e0d2bbbbc199db5020f30dd27beb..164534a683e53137693b6ad4184cec290f4024db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,4 @@ bin/
 build/
 srv_gen/
 *~
-*/__pycache__/*
\ No newline at end of file
+*/__pycache__/*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fd16ba2dc38fc89c8ac5a4561a63179d147c8366
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,10 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v3.2.0
+    hooks:
+    -   id: trailing-whitespace
+    -   id: end-of-file-fixer
+    -   id: check-yaml
+    -   id: check-added-large-files
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fd447b886dbc97258a43d5a15c2b2de0a70b8226..989035cd3469b2f6120e8e97b4c23a25515873d3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -84,4 +84,4 @@ install(DIRECTORY include/ DESTINATION include)
 install(FILES package.xml DESTINATION share/${PROJECT_NAME})
 
 #ROS 2 packaging
-ament_package()
\ No newline at end of file
+ament_package()
diff --git a/doc/Doxyfile.extra.in b/doc/Doxyfile.extra.in
index 707e217c78663d2961058b00721d3e5fadf35c7a..f90759040df5d7a53160a16d3312dd559cdeb1b4 100644
--- a/doc/Doxyfile.extra.in
+++ b/doc/Doxyfile.extra.in
@@ -1,3 +1,2 @@
 INPUT                  = @PROJECT_SOURCE_DIR@/include \
 			 @PROJECT_SOURCE_DIR@/doc
-
diff --git a/include/dynamic_graph_bridge/ros_python_interpreter_client.hpp b/include/dynamic_graph_bridge/ros_python_interpreter_client.hpp
index aa0598605efd60885be10ba2a9abcac33e1ec3a2..a5b5459e12cda2f064d5c8071fc882abb66a0b9e 100644
--- a/include/dynamic_graph_bridge/ros_python_interpreter_client.hpp
+++ b/include/dynamic_graph_bridge/ros_python_interpreter_client.hpp
@@ -149,4 +149,4 @@ private:
     DurationSec timeout_connection_s_;
 };
 
-}  // namespace dynamic_graph_bridge
\ No newline at end of file
+}  // namespace dynamic_graph_bridge
diff --git a/include/dynamic_graph_bridge/sot_loader.hh b/include/dynamic_graph_bridge/sot_loader.hh
index 5b4b3203b06bd96ab3ed2926863d40d4f143763c..c3054764a0a276443ebd999c7d2481f9aafef69b 100644
--- a/include/dynamic_graph_bridge/sot_loader.hh
+++ b/include/dynamic_graph_bridge/sot_loader.hh
@@ -102,7 +102,7 @@ class SotLoader : public SotLoaderBasic {
 
   // \brief Method for the thread implementing the starting and stopping part of dynamic_graph
   void workThreadLoader();
-  
+
   // \brief Join the thread.
   void lthread_join();
   typedef std::shared_ptr<SotLoader> SharedPtr;
diff --git a/include/dynamic_graph_bridge/sot_loader_basic.hh b/include/dynamic_graph_bridge/sot_loader_basic.hh
index fd38405e703a24ba04214850d0aab6be337a4306..a1f187170f93f33f646cc077e51c69c30ea08422 100644
--- a/include/dynamic_graph_bridge/sot_loader_basic.hh
+++ b/include/dynamic_graph_bridge/sot_loader_basic.hh
@@ -73,7 +73,7 @@ class SotLoaderBasic {
 
   // Node reference
   rclcpp::Node::SharedPtr nh_;
-  
+
   // Joint state to be published.
   sensor_msgs::msg::JointState joint_state_;
 
@@ -100,7 +100,7 @@ class SotLoaderBasic {
 
   // Returns nodeHandle
   rclcpp::Node::SharedPtr returnsNodeHandle();
-  
+
   /// \brief Unload the library which handles the robot device.
   void CleanUp();
 
diff --git a/src/ros.cpp b/src/ros.cpp
index 8255cf4afca3f95ce21bb805cb5af451a8fd3774..ae62cedfd9e1ab9917b911bf0ef06886936523af 100644
--- a/src/ros.cpp
+++ b/src/ros.cpp
@@ -286,7 +286,7 @@ RosNodePtr get_ros_node(std::string node_name)
         GLOBAL_LIST_OF_ROS_NODE[node_name] =
             std::make_shared<RosNode>(
                 node_name, "dynamic_graph_bridge");
-        
+
     }
     /** Return a reference to the node handle so any function can use it */
     return GLOBAL_LIST_OF_ROS_NODE[node_name];
diff --git a/src/ros_parameter.cpp b/src/ros_parameter.cpp
index 57dcfd180a1741bcb866552d99aabecae19ff54a..485fd1063b24a80e7d2adf2de84dd0feef25de8b 100644
--- a/src/ros_parameter.cpp
+++ b/src/ros_parameter.cpp
@@ -19,7 +19,7 @@ namespace dynamicgraph {
       {
         nh->declare_parameter("robot_description",std::string(""));
       }
-    
+
     std::string robot_description;
     std::string parameter_name("robot_description");
     nh->get_parameter(parameter_name,robot_description);
@@ -29,9 +29,9 @@ namespace dynamicgraph {
                      "Parameter robot_description is empty");
         return false;
       }
-    
+
     std::string model_name("robot");
-    
+
     // Search for the robot util related to robot_name.
     sot::RobotUtilShrPtr aRobotUtil = sot::getRobotUtil(model_name);
     // If does not exist then it is created.
diff --git a/src/sot_loader.cpp b/src/sot_loader.cpp
index 66511e42f1275d0be2e6475c788a5e2e1559f317..81e57bada1d3a35320cc07243dceb95964d226c3 100644
--- a/src/sot_loader.cpp
+++ b/src/sot_loader.cpp
@@ -277,5 +277,5 @@ void SotLoader::workThreadLoader() {
   std::cerr << "End of this thread: "
             << std::this_thread::get_id()
             << std::endl;
-    
+
 }
diff --git a/tests/impl_test_sot_external_interface.hh b/tests/impl_test_sot_external_interface.hh
index bfca53bc2b6d12f042ea340445a98fc7ca95087d..9b6a86b14d84082fc033652a1f31bb269350a75b 100644
--- a/tests/impl_test_sot_external_interface.hh
+++ b/tests/impl_test_sot_external_interface.hh
@@ -21,9 +21,9 @@ public:
                                  dynamicgraph::sot::SensorValues> &) final;
   virtual void getControl(std::map<std::string,
                           dynamicgraph::sot::ControlValues> &) final;
-  
+
   virtual void setSecondOrderIntegration(void);
-  
+
   virtual void setNoIntegration(void);
 
 protected:
diff --git a/tests/test_sot_loader.cpp b/tests/test_sot_loader.cpp
index b914ee251e34b4255c59dd8c98240ed7325e7ad3..e4b189764a21ef38603f0d752c914cb6ff069bac 100644
--- a/tests/test_sot_loader.cpp
+++ b/tests/test_sot_loader.cpp
@@ -4,7 +4,7 @@
 #include "dynamic_graph_bridge/sot_loader.hh"
 
 class MockSotLoaderTest: public ::testing::Test {
-  
+
 public:
 
   class MockSotLoader : public SotLoader {
@@ -20,7 +20,7 @@ public:
       std::cerr << "Stop Dynamic Graph " << std::endl;
       dynamic_graph_stopped_ = true;
     }
-    
+
     void testLoadController() {
       // Set input  call
       int argc=2;
@@ -33,14 +33,14 @@ public:
 
       std::string finalname("libimpl_test_sot_external_interface.so");
       EXPECT_TRUE(finalname == dynamicLibraryName_);
-      
+
       // Performs initialization of libimpl_test_sot_external_interface.so
       loadController();
       EXPECT_TRUE(sotRobotControllerLibrary_ != 0);
       EXPECT_TRUE(sotController_ != nullptr);
       // initialize start/stop and runCommand services
       initializeServices();
-      
+
       // Constructor should default freeFlyerPose
       EXPECT_TRUE( freeFlyerPose_.header.frame_id == std::string("odom"));
       EXPECT_TRUE( freeFlyerPose_.child_frame_id == std::string("base_link"));
@@ -51,22 +51,22 @@ public:
 
       // Start the control loop thread.
       startControlLoop();
-      
+
       // Start the thread generating events.
       std::thread local_events(&MockSotLoader::generateEvents,this);
 
       // Wait for each threads.
       SotLoader::lthread_join(); // Wait 100 ms
-      local_events.join();      
+      local_events.join();
     }
   };
-  
+
 public:
   MockSotLoader* mockSotLoader_ptr_;
-  
+
   void SetUp() {
     mockSotLoader_ptr_ = new MockSotLoader();
-    mockSotLoader_ptr_->initialize(); 
+    mockSotLoader_ptr_->initialize();
   }
 
   void TearDown() {
@@ -81,11 +81,11 @@ TEST_F(MockSotLoaderTest,TestLoadController)
   mockSotLoader_ptr_->testLoadController();
 }
 
-  
+
 int main(int argc, char **argv) {
   ::testing::InitGoogleTest(&argc, argv);
   rclcpp::init(argc, argv);
-  
+
   int r=RUN_ALL_TESTS();
 
   rclcpp::shutdown();
diff --git a/travis_custom/Dockerfile b/travis_custom/Dockerfile
index 4be6b247cded0284b94ad6768a421f572595436b..8d0bd72cf0911a6d5d0b7ce38c463263a9755eb3 100644
--- a/travis_custom/Dockerfile
+++ b/travis_custom/Dockerfile
@@ -28,12 +28,9 @@ RUN more /etc/apt/sources.list
 #
 RUN sudo apt-get install -y g++ python2.7 python2.7-dev
 RUN sudo apt-get install -y cppcheck doxygen libboost-system-dev libboost-test-dev libboost-filesystem-dev libboost-program-options-dev libeigen3-dev libtinyxml-dev
-RUN sudo apt-get install -y ros-indigo-tf ros-indigo-tf2-bullet ros-indigo-realtime-tools 
-RUN sudo apt-get install -y robotpkg-pinocchio 
+RUN sudo apt-get install -y ros-indigo-tf ros-indigo-tf2-bullet ros-indigo-realtime-tools
+RUN sudo apt-get install -y robotpkg-pinocchio
 RUN sudo apt-get install -y robotpkg-dynamic-graph-v3 robotpkg-py27-dynamic-graph-v3 robotpkg-dynamic-graph-bridge-msgs
 RUN sudo apt-get install -y robotpkg-sot-core-v3 robotpkg-py27-sot-tools-v3 robotpkg-sot-dynamic-pinocchio-v3
 RUN sudo apt-get install -y libboost-python-dev robotpkg-py27-eigenpy python2.7-dev python-numpy python-sphinx
 RUN env
-
-
-