diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 733ae9a3c56060fb942eb9c06377a4f00d9f2fcb..d8aa740acd8b9fbc3f1e0e87e40af15e0c60f26a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -69,6 +69,12 @@ else(OpenCV_FOUND)
     message("[WARN] OpenCV not found. Related sources will NOT be built.")
 endif(OpenCV_FOUND)
 
+# Cereal
+FIND_PACKAGE(cereal QUIET)
+IF(cereal_FOUND)
+    MESSAGE("cereal Library FOUND: cereal related sources will be built.")
+ENDIF(cereal_FOUND)
+
 # YAML with yaml-cpp
 INCLUDE (${PROJECT_SOURCE_DIR}/cmake_modules/FindYamlCpp.cmake)
 IF(YAMLCPP_FOUND)
@@ -161,6 +167,11 @@ IF(OpenCV_FOUND)
     INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
 ENDIF(OpenCV_FOUND)
 
+# cereal
+IF(cereal_FOUND)
+    INCLUDE_DIRECTORIES(${cereal_INCLUDE_DIRS})
+ENDIF(cereal_FOUND)
+
 IF(Suitesparse_FOUND)
     INCLUDE_DIRECTORIES(${Suitesparse_INCLUDE_DIRS})
 ENDIF(Suitesparse_FOUND)
@@ -413,6 +424,10 @@ IF (OpenCV_FOUND)
         )
 ENDIF(OpenCV_FOUND)
 
+IF (cereal_FOUND)
+  ADD_SUBDIRECTORY(serialization/cereal)
+ENDIF(cereal_FOUND)
+
 IF (Suitesparse_FOUND)
     ADD_SUBDIRECTORY(solver)
 ENDIF(Suitesparse_FOUND)
@@ -502,6 +517,8 @@ INSTALL(FILES ${HDRS_WRAPPER}
     DESTINATION include/iri-algorithms/wolf/ceres_wrapper)
 INSTALL(FILES ${HDRS_SOLVER}
     DESTINATION include/iri-algorithms/wolf/solver)
+INSTALL(FILES ${HDRS_SERIALIZATION}
+    DESTINATION include/iri-algorithms/wolf/serialization)
 
 INSTALL(FILES "${CMAKE_SOURCE_DIR}/cmake_modules/Findwolf.cmake"
     DESTINATION "lib/cmake/${PROJECT_NAME}")
diff --git a/src/serialization/CMakeLists.txt b/src/serialization/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a853ba8ec5158727fcd4bfd9752d6de398c5aefa
--- /dev/null
+++ b/src/serialization/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(cereal)
diff --git a/src/serialization/cereal/CMakeLists.txt b/src/serialization/cereal/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c526b9f2171f61cf1dbb5d06af48865c3863d814
--- /dev/null
+++ b/src/serialization/cereal/CMakeLists.txt
@@ -0,0 +1,20 @@
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+
+SET(HDRS_SERIALIZATION ${HDRS_SERIALIZATION}
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_base.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_homogeneous.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_local_parametrization_quaternion.h
+
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_node_base.h
+
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_sensor_intrinsic_base.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_sensor_odom2d_intrinsic.h
+
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_params_base.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_odom2d_params.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/serialization_processor_odom3d_params.h
+
+    ${CMAKE_CURRENT_SOURCE_DIR}/archives.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/io.h
+
+    PARENT_SCOPE)
diff --git a/src/serialization/cereal/archives.h b/src/serialization/cereal/archives.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8c16fd180ef04049ceedaf268fa33782790d27a
--- /dev/null
+++ b/src/serialization/cereal/archives.h
@@ -0,0 +1,9 @@
+#ifndef _WOLF_IO_CEREAL_ARCHIVE_H_
+#define _WOLF_IO_CEREAL_ARCHIVE_H_
+
+#include <cereal/archives/binary.hpp>
+#include <cereal/archives/json.hpp>
+#include <cereal/archives/portable_binary.hpp>
+#include <cereal/archives/xml.hpp>
+
+#endif /* _WOLF_IO_CEREAL_ARCHIVE_H_ */
diff --git a/src/serialization/cereal/io.h b/src/serialization/cereal/io.h
new file mode 100644
index 0000000000000000000000000000000000000000..afd32843878e43a66674970a69df37dbf6429fe2
--- /dev/null
+++ b/src/serialization/cereal/io.h
@@ -0,0 +1,216 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_IO_H_
+#define _WOLF_SERIALIZATION_CEREAL_IO_H_
+
+#include <stdexcept>
+#include "archives.h"
+
+//#include <cereal/types/tuple.hpp>
+
+namespace wolf {
+namespace serialization {
+
+inline std::string extension(const std::string& file)
+{
+  const std::size_t p = file.find_last_of(".");
+  return (p != std::string::npos) ? file.substr(p) : "";
+}
+
+//struct Extensions
+//{
+//  constexpr static const char* bin  = ".bin";
+//  constexpr static const char* json = ".json";
+//  constexpr static const char* xml  = ".xml";
+
+//  constexpr static const char* fall_back = json;
+//};
+
+//enum class Extensions2 : std::size_t
+//{
+//  BIN = 0,
+////  CBIN,
+//  JSON,
+////  TEXT,
+//  XML,
+//};
+
+//template <char... Chars>
+//struct constexp_str
+//{
+//  using type = constexp_str<Chars...>;
+
+//  virtual ~constexp_str() = default;
+
+//  constexpr static const char value[sizeof...(Chars)+1] = {Chars..., '\0'};
+
+//  constexpr static std::size_t size() { return sizeof...(Chars); }
+
+//  constexpr static const char* c_str() { return &value[0]; }
+
+////  constexpr static bool comp(const std::string& s) { return s == value; }
+
+//  /*constexpr*/ bool operator == (const std::string& s) { return s == value; }
+
+//  constexpr /*static*/ operator const char* ()  { return c_str(); }
+//  constexpr /*static*/ operator std::string& () { return c_str(); }
+//};
+
+struct Extensions
+{
+//  template <char... Chars>
+//  struct EXT : constexp_str<Chars...>
+//  {
+//    //
+//  };
+
+//  struct BIN  : EXT<'.','b','i','n'> { };
+//  struct XML  : EXT<'.','x','m','l'> { };
+//  struct JSON : EXT<'.','j','s','o','n'> { };
+
+  struct EXT { virtual ~EXT() = default; };
+
+  struct BIN : EXT
+  {
+    constexpr static const char* value  = ".bin";
+    bool operator == (const std::string& s) { return value == s; }
+  };
+
+  struct XML : EXT
+  {
+    constexpr static const char* value  = ".xml";
+    bool operator == (const std::string& s) { return value == s; }
+  };
+
+  struct JSON : EXT
+  {
+    constexpr static const char* value  = ".json";
+    bool operator == (const std::string& s) { return value == s; }
+  };
+};
+
+template <typename Ar, typename S, typename T, typename... Args>
+void serialize(S& stream, T&& object, Args&&... args)
+{
+  Ar archive(stream);
+
+  archive( cereal::make_nvp("object", std::forward<T>(object)) );
+  archive( cereal::make_nvp("object", std::forward<Args>(args))... );
+}
+
+template <typename Ar, typename S, typename T>
+void serialize(S& stream, T&& object)
+{
+  Ar archive(stream);
+  archive( cereal::make_nvp("object", std::forward<T>(object)) );
+}
+
+template <typename EXT, typename InAr, typename OutAr>
+struct Serializer
+{
+  template <typename S, typename... T>
+  static void serialize_in(S& stream, T&... object)
+  {
+    serialize<InAr>(stream, object...);
+  }
+
+  template <typename S, typename... T>
+  static void serialize_out(S& stream, T&&... object)
+  {
+    serialize<OutAr>(stream, std::forward<T>(object)...);
+  }
+
+  template <typename... T>
+  static void save(std::string filename, T&&... o)
+  {
+    const std::string ext = serialization::extension(filename);
+
+    if (ext != EXT::value) filename += EXT::value;
+
+    std::ofstream os(filename);
+    serialize_out(os, std::forward<T>(o)...);
+  }
+
+  template <typename... T>
+  static void load(std::string filename, T&... o)
+  {
+    const std::string ext = serialization::extension(filename);
+
+    if (ext != EXT::value) filename += EXT::value;
+
+    std::ifstream is(filename);
+    serialize_in(is, o...);
+  }
+};
+
+using SerializerBin = Serializer<Extensions::BIN,
+                                 cereal::BinaryInputArchive,
+                                 cereal::BinaryOutputArchive>;
+
+using SerializerXML = Serializer<Extensions::XML,
+                                 cereal::XMLInputArchive,
+                                 cereal::XMLOutputArchive>;
+
+using SerializerJSON = Serializer<Extensions::JSON,
+                                  cereal::JSONInputArchive,
+                                  cereal::JSONOutputArchive>;
+
+
+} /* namespace serialization */
+
+template <typename... T>
+void save(const std::string& filename, T&&... o)
+throw(std::runtime_error)
+{
+  const std::string ext = serialization::extension(filename);
+
+  if (ext == serialization::Extensions::BIN::value)
+  {
+    serialization::SerializerBin::save(filename, std::forward<T>(o)...);
+  }
+  else if (ext == serialization::Extensions::JSON::value)
+  {
+    serialization::SerializerJSON::save(filename, std::forward<T>(o)...);
+  }
+  else if (ext == serialization::Extensions::XML::value)
+  {
+    serialization::SerializerXML::save(filename, std::forward<T>(o)...);
+  }
+  else if (ext == "") // falback is json
+  {
+    serialization::SerializerJSON::save(filename, std::forward<T>(o)...);
+  }
+  else
+  {
+    throw std::runtime_error("Unknown file extension : " + filename);
+  }
+}
+
+template <typename... T>
+void load(const std::string& filename, T&... o)
+{
+  const std::string ext = serialization::extension(filename);
+
+  if (ext == serialization::Extensions::BIN::value)
+  {
+    serialization::SerializerBin::load(filename, o...);
+  }
+  else if (ext == serialization::Extensions::XML::value)
+  {
+    serialization::SerializerXML::load(filename, o...);
+  }
+  else if (ext == serialization::Extensions::JSON::value)
+  {
+    serialization::SerializerJSON::load(filename, o...);
+  }
+  else if (ext == "") // falback is json
+  {
+    serialization::SerializerJSON::load(filename, o...);
+  }
+  else
+  {
+    throw std::runtime_error("Unknown file extension : " + filename);
+  }
+}
+
+} /* namespace wolf */
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_IO_H_ */
diff --git a/src/serialization/cereal/serialization_local_parametrization_base.h b/src/serialization/cereal/serialization_local_parametrization_base.h
new file mode 100644
index 0000000000000000000000000000000000000000..b57b9f5649556cf89684810aa162d1495e1258d0
--- /dev/null
+++ b/src/serialization/cereal/serialization_local_parametrization_base.h
@@ -0,0 +1,27 @@
+#ifndef _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_
+#define _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_
+
+#include "../../local_parametrization_base.h"
+
+#include <cereal/cereal.hpp>
+#include <cereal/types/polymorphic.hpp>
+
+namespace cereal {
+
+// Since classes deriving from LocalParametrizationBase
+// have default constructor calling the non-default
+// LocalParametrizationBase constructor with pre-defined
+// arguments, there is nothing to save here.
+template<class Archive>
+inline void serialize(
+    Archive& /*ar*/,
+    wolf::LocalParametrizationBase& /*lpb*/,
+    std::uint32_t const /*file_version*/)
+{
+  //
+}
+
+
+} //namespace cereal
+
+#endif /* _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_H_ */
diff --git a/src/serialization/cereal/serialization_local_parametrization_homogeneous.h b/src/serialization/cereal/serialization_local_parametrization_homogeneous.h
new file mode 100644
index 0000000000000000000000000000000000000000..aa04a9904eafc13e70d5a68515cf1ae356a18d58
--- /dev/null
+++ b/src/serialization/cereal/serialization_local_parametrization_homogeneous.h
@@ -0,0 +1,27 @@
+#ifndef _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_
+#define _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_
+
+#include "../../local_parametrization_homogeneous.h"
+
+#include "serialization_local_parametrization_base.h"
+
+#include <cereal/cereal.hpp>
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationHomogeneous,
+                               "LocalParametrizationHomogeneous");
+
+namespace cereal {
+
+template<class Archive>
+inline void serialize(
+    Archive& ar,
+    wolf::LocalParametrizationHomogeneous& lp,
+    std::uint32_t const /*file_version*/)
+{
+  ar( cereal::make_nvp("LocalParametrizationBase",
+                       cereal::base_class<wolf::LocalParametrizationBase>(&lp)) );
+}
+
+} //namespace cereal
+
+#endif /* _WOLF_IO_CEREAL_LOCAL_PARAMETRIZATION_BASE_HOMOGENEOUS_H_ */
diff --git a/src/serialization/cereal/serialization_local_parametrization_quaternion.h b/src/serialization/cereal/serialization_local_parametrization_quaternion.h
new file mode 100644
index 0000000000000000000000000000000000000000..10b04f67cd9de48610f5fc40c0711413d37410a6
--- /dev/null
+++ b/src/serialization/cereal/serialization_local_parametrization_quaternion.h
@@ -0,0 +1,30 @@
+#ifndef WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_
+#define WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_
+
+#include "../../local_parametrization_quaternion.h"
+
+#include "serialization_local_parametrization_base.h"
+
+#include <cereal/cereal.hpp>
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationQuaternion<wolf::DQ_LOCAL>,
+                               "wolf_LocalParametrizationQuaternion_DQ_LOCAL")
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::LocalParametrizationQuaternion<wolf::DQ_GLOBAL>,
+                               "wolf_LocalParametrizationQuaternion_DQ_GLOBAL")
+
+namespace cereal {
+
+template<class Archive, unsigned int DeltaReference>
+inline void serialize(
+    Archive &ar,
+    wolf::LocalParametrizationQuaternion<DeltaReference> &lp,
+    const unsigned int /*file_version*/)
+{
+  ar( cereal::make_nvp("LocalParametrizationBase",
+                       cereal::base_class<wolf::LocalParametrizationBase>(&lp)) );
+}
+
+} //namespace boost
+
+#endif /* WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ */
diff --git a/src/serialization/cereal/serialization_processor_odom2d_params.h b/src/serialization/cereal/serialization_processor_odom2d_params.h
new file mode 100644
index 0000000000000000000000000000000000000000..109fa6c54f8ab5a4f583fb3c3e360124a967dc40
--- /dev/null
+++ b/src/serialization/cereal/serialization_processor_odom2d_params.h
@@ -0,0 +1,29 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM2D_PARAMS_H_
+#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM2D_PARAMS_H_
+
+// Wolf includes
+#include "../../processor_odom_2D.h"
+#include "serialization_processor_params_base.h"
+
+namespace cereal {
+
+template <class Archive>
+void serialize(Archive& ar, wolf::ProcessorParamsOdom2D& o,
+               std::uint32_t const /*version*/)
+{
+  ar( cereal::make_nvp("ProcessorParamsBase",
+        cereal::base_class<wolf::ProcessorParamsBase>(&o)) );
+
+  ar( cereal::make_nvp("cov_det_th_",        o.cov_det_th_)        );
+  ar( cereal::make_nvp("dist_traveled_th_",  o.dist_traveled_th_)  );
+  ar( cereal::make_nvp("elapsed_time_th_",   o.elapsed_time_th_)   );
+  ar( cereal::make_nvp("theta_traveled_th_", o.theta_traveled_th_) );
+  ar( cereal::make_nvp("unmeasured_perturbation_std_",
+                       o.unmeasured_perturbation_std_)   );
+}
+
+} // namespace cereal
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::ProcessorParamsOdom2D, "ProcessorParamsOdom2D")
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ */
diff --git a/src/serialization/cereal/serialization_processor_odom3d_params.h b/src/serialization/cereal/serialization_processor_odom3d_params.h
new file mode 100644
index 0000000000000000000000000000000000000000..06770f759cbcf96ca77faf3d83a2a16f0822db04
--- /dev/null
+++ b/src/serialization/cereal/serialization_processor_odom3d_params.h
@@ -0,0 +1,27 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_
+#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_
+
+// Wolf includes
+#include "../../processor_odom_3D.h"
+#include "serialization_processor_params_base.h"
+
+namespace cereal {
+
+template <class Archive>
+void serialize(Archive& ar, wolf::ProcessorOdom3DParams& o,
+               std::uint32_t const /*version*/)
+{
+  ar( cereal::make_nvp("ProcessorParamsBase",
+        cereal::base_class<wolf::ProcessorParamsBase>(&o)) );
+
+  ar( cereal::make_nvp("angle_turned",    o.angle_turned)    );
+  ar( cereal::make_nvp("dist_traveled",   o.dist_traveled)   );
+  ar( cereal::make_nvp("max_buff_length", o.max_buff_length) );
+  ar( cereal::make_nvp("max_time_span",   o.max_time_span)   );
+}
+
+} // namespace cereal
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::ProcessorOdom3DParams, "ProcessorOdom3DParams")
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_PROCESSOR_ODOM3D_PARAMS_H_ */
diff --git a/src/serialization/cereal/serialization_processor_params_base.h b/src/serialization/cereal/serialization_processor_params_base.h
new file mode 100644
index 0000000000000000000000000000000000000000..03cbce7825047da46621a4f3bdf9bb5f8bcb2148
--- /dev/null
+++ b/src/serialization/cereal/serialization_processor_params_base.h
@@ -0,0 +1,22 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_PROCESSOR_PARAM_BASE_H_
+#define _WOLF_SERIALIZATION_CEREAL_PROCESSOR_PARAM_BASE_H_
+
+// Wolf includes
+#include "../../processor_base.h"
+
+#include <cereal/cereal.hpp>
+#include <cereal/types/polymorphic.hpp>
+
+namespace cereal {
+
+template <class Archive>
+void serialize(Archive& ar, wolf::ProcessorParamsBase& o,
+               std::uint32_t const /*version*/)
+{
+  ar( cereal::make_nvp("type", o.type) );
+  ar( cereal::make_nvp("name", o.name) );
+}
+
+} // namespace cereal
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ */
diff --git a/src/serialization/cereal/serialization_sensor_intrinsic_base.h b/src/serialization/cereal/serialization_sensor_intrinsic_base.h
new file mode 100644
index 0000000000000000000000000000000000000000..2398fbad04a33b4934638c0e37d9a9c72588f905
--- /dev/null
+++ b/src/serialization/cereal/serialization_sensor_intrinsic_base.h
@@ -0,0 +1,25 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_
+#define _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_
+
+// Wolf includes
+#include "../../sensor_base.h"
+
+#include <cereal/cereal.hpp>
+#include <cereal/types/polymorphic.hpp>
+
+namespace cereal {
+
+template <class Archive>
+void serialize(Archive& ar, wolf::IntrinsicsBase& o,
+               std::uint32_t const /*version*/)
+{
+  ar( cereal::make_nvp("type", o.type) );
+  ar( cereal::make_nvp("name", o.name) );
+}
+
+} // namespace cereal
+
+// No need to register base
+//CEREAL_REGISTER_TYPE_WITH_NAME(wolf::IntrinsicsBase, "IntrinsicsBase");
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_INTRINSIC_BASE_H_ */
diff --git a/src/serialization/cereal/serialization_sensor_odom2d_intrinsic.h b/src/serialization/cereal/serialization_sensor_odom2d_intrinsic.h
new file mode 100644
index 0000000000000000000000000000000000000000..d4bf370448af5d4b72ef5d7132b51d5e891647f3
--- /dev/null
+++ b/src/serialization/cereal/serialization_sensor_odom2d_intrinsic.h
@@ -0,0 +1,26 @@
+#ifndef _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_
+#define _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_
+
+// Wolf includes
+#include "../../sensor_odom_2D.h"
+
+#include "serialization_sensor_intrinsic_base.h"
+
+namespace cereal {
+
+template <class Archive>
+void serialize(Archive& ar, wolf::IntrinsicsOdom2D& o,
+               std::uint32_t const /*version*/)
+{
+  ar( cereal::make_nvp("IntrinsicsBase",
+        cereal::base_class<wolf::IntrinsicsBase>(&o)) );
+
+  ar( cereal::make_nvp("k_disp_to_disp", o.k_disp_to_disp) );
+  ar( cereal::make_nvp("k_rot_to_rot",   o.k_rot_to_rot)   );
+}
+
+} // namespace cereal
+
+CEREAL_REGISTER_TYPE_WITH_NAME(wolf::IntrinsicsOdom2D, "IntrinsicsOdom2D")
+
+#endif /* _WOLF_SERIALIZATION_CEREAL_SENSOR_ODOM2D_INTRINSIC_H_ */
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
index 3763631a09f9297e2c7758383fe92d93ef9aaf33..3213b42b5bd6fb94f8d2a141748f1006b7cdbbd8 100644
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -146,4 +146,8 @@ IF(OpenCV_FOUND)
 
   wolf_add_gtest(gtest_roi_ORB gtest_roi_ORB.cpp)
   target_link_libraries(gtest_roi_ORB ${PROJECT_NAME})
-ENDIF(OpenCV_FOUND)
\ No newline at end of file
+ENDIF(OpenCV_FOUND)
+
+# ------- Now Core classes Serialization ----------
+
+add_subdirectory(serialization)
diff --git a/src/test/serialization/CMakeLists.txt b/src/test/serialization/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6902132bd458245e2e45012662fdcf0b348b7d4a
--- /dev/null
+++ b/src/test/serialization/CMakeLists.txt
@@ -0,0 +1,4 @@
+# cereal
+IF(cereal_FOUND)
+  add_subdirectory(cereal)
+ENDIF(cereal_FOUND)
diff --git a/src/test/serialization/cereal/CMakeLists.txt b/src/test/serialization/cereal/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb9055fa5c85a252adc5eaef80f1894fb885b09d
--- /dev/null
+++ b/src/test/serialization/cereal/CMakeLists.txt
@@ -0,0 +1,27 @@
+# NodeBase serialization class test
+wolf_add_gtest(gtest_cereal_serialization_node_base gtest_serialization_node_base.cpp)
+target_link_libraries(gtest_cereal_serialization_node_base ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_local_parametrization
+  gtest_serialization_local_parametrization.cpp)
+target_link_libraries(gtest_cereal_serialization_local_parametrization ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_sensor_intrinsic_base
+  gtest_serialization_sensor_intrinsic_base.cpp)
+target_link_libraries(gtest_cereal_serialization_sensor_intrinsic_base ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_sensor_odom2d_intrinsic
+  gtest_serialization_sensor_odom2d_intrinsic.cpp)
+target_link_libraries(gtest_cereal_serialization_sensor_odom2d_intrinsic ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_save_load
+  gtest_serialization_save_load.cpp)
+target_link_libraries(gtest_cereal_serialization_save_load ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_processor_odom3d_params
+  gtest_serialization_processor_odom3d_params.cpp)
+target_link_libraries(gtest_cereal_serialization_processor_odom3d_params ${PROJECT_NAME})
+
+wolf_add_gtest(gtest_cereal_serialization_processor_odom2d_params
+  gtest_serialization_processor_odom2d_params.cpp)
+target_link_libraries(gtest_cereal_serialization_processor_odom2d_params ${PROJECT_NAME})
diff --git a/src/test/serialization/cereal/gtest_serialization_local_parametrization.cpp b/src/test/serialization/cereal/gtest_serialization_local_parametrization.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..667c5d8443ec7ff0e7ecdf9d0ada0f04200db6b8
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_local_parametrization.cpp
@@ -0,0 +1,572 @@
+/*
+ * gtest_node_base_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/serialization_local_parametrization_quaternion.h"
+#include "../../../serialization/cereal/serialization_local_parametrization_homogeneous.h"
+
+#include "../../../serialization/cereal/archives.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+///////////////////////////////////////
+/// LocalParametrizationHomogeneous ///
+///////////////////////////////////////
+
+const std::string path_to_io = "/tmp/";
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousXML)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrXML)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationHomogeneous>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousJSON)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrJSON)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationHomogeneous>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousBIN)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    wolf::LocalParametrizationHomogeneous local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousBIN !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationHomogeneousPtrBIN)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_ptr_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationHomogeneous>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_ptr_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationHomogeneous>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationHomogeneousPtrBIN !\n");
+}
+
+
+//////////////////////////////////////
+/// LocalParametrizationQuaternion ///
+//////////////////////////////////////
+
+//////////////////////////////////////
+///           LOCAL                ///
+//////////////////////////////////////
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionXML)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrXML)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionLocal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionJSON)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrJSON)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionLocal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionBIN)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionLocal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionBIN !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionPtrBIN)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quat_ptr_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionLocal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quat_ptr_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionLocal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionPtrBIN !\n");
+}
+
+//////////////////////////////////////
+///           GLOBAL               ///
+//////////////////////////////////////
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalXML)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrXML)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.xml");
+    cereal::XMLOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionGlobal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.xml");
+    cereal::XMLInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrXML !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalJSON)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrJSON)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.json");
+    cereal::JSONOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionGlobal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.json");
+    cereal::JSONInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrJSON !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalBIN)
+{
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    wolf::LocalParametrizationQuaternionGlobal local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h.getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h.getLocalSize(),  3);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalBIN !\n");
+}
+
+TEST(TestSerialization, SerializationLocalParametrizationQuaternionGlobalPtrBIN)
+{
+  using LocalParametrizationPtr = std::shared_ptr<wolf::LocalParametrizationBase> ;
+
+  {
+    std::ofstream os(path_to_io + "local_parametrization_quatg_ptr_serialization.bin");
+    cereal::BinaryOutputArchive archive(os);
+
+    LocalParametrizationPtr local_param_h =
+        std::make_shared<wolf::LocalParametrizationQuaternionGlobal>();
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "local_parametrization_quatg_ptr_serialization.bin");
+    cereal::BinaryInputArchive archive(is);
+
+    LocalParametrizationPtr local_param_h;
+
+    ASSERT_NO_THROW( archive( local_param_h ) );
+
+    ASSERT_EQ(local_param_h->getGlobalSize(), 4);
+    ASSERT_EQ(local_param_h->getLocalSize(),  3);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::LocalParametrizationQuaternionGlobal>(local_param_h) != nullptr);
+  }
+
+  PRINTF("All good at TestSerialization::SerializationLocalParametrizationQuaternionGlobalPtrBIN !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp b/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ca83b3d32366ac7b84b048a2c5d80aa1a474564
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp
@@ -0,0 +1,108 @@
+/*
+ * gtest_intrinsics_odom2d_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/serialization_processor_odom2d_params.h"
+
+#include "../../../serialization/cereal/io.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+class WolfTestCerealSerializationProcessorParamsOdom2D : public testing::Test
+{
+public:
+
+  WolfTestCerealSerializationProcessorParamsOdom2D()
+  {
+    nb_.name = "NAME";
+    nb_.type = "ODOM 2D";
+
+    nb_.dist_traveled_th_            = 0.17;
+    nb_.theta_traveled_th_           = 0.3;
+    nb_.cov_det_th_                  = 0.4;
+    nb_.elapsed_time_th_             = 1.5;
+    nb_.unmeasured_perturbation_std_ = 1e-5;
+  }
+
+  const std::string path_to_io = "/tmp/";
+  const std::string filename   = "serialization_processor_odom2d_params";
+  const std::string ptr_ext    = "_ptr";
+
+  const std::vector<std::string> exts = {".bin", ".xml", ".json"};
+
+  wolf::ProcessorParamsOdom2D nb_;
+};
+
+TEST_F(WolfTestCerealSerializationProcessorParamsOdom2D,
+       CerealSerializationProcessorParamsOdom2D)
+{
+  for (const auto ext : exts)
+  {
+    const std::string full_path = path_to_io + filename + ext;
+
+    ASSERT_NO_THROW( wolf::save( full_path, nb_ ) )
+        << "Failed on saving " << full_path;
+
+    wolf::ProcessorParamsOdom2D nb_load;
+
+    ASSERT_NO_THROW( wolf::load( full_path, nb_load ) )
+        << "Failed on loading " << full_path;
+
+    ASSERT_EQ(nb_load.type,               nb_.type)               << full_path;
+    ASSERT_EQ(nb_load.name,               nb_.name)               << full_path;
+    ASSERT_EQ(nb_load.dist_traveled_th_,  nb_.dist_traveled_th_)  << full_path;
+    ASSERT_EQ(nb_load.theta_traveled_th_, nb_.theta_traveled_th_) << full_path;
+    ASSERT_EQ(nb_load.cov_det_th_,        nb_.cov_det_th_)        << full_path;
+    ASSERT_EQ(nb_load.unmeasured_perturbation_std_,
+              nb_.unmeasured_perturbation_std_)                   << full_path;
+
+    /// Testing BasePtr
+
+    const std::string ptr_full_path = path_to_io + filename + ptr_ext + ext;
+
+    {
+      wolf::ProcessorParamsBasePtr nb =
+          std::make_shared<wolf::ProcessorParamsOdom2D>(nb_);
+
+      ASSERT_NO_THROW( wolf::save( ptr_full_path, nb ) )
+          << "Failed on saving " << ptr_full_path;
+    }
+
+    {
+      wolf::ProcessorParamsBasePtr nb;
+
+      ASSERT_NO_THROW( wolf::load( ptr_full_path, nb ) )
+          << "Failed on loading " << ptr_full_path;
+
+      wolf::ProcessorParamsOdom2DPtr nb_cast =
+          std::dynamic_pointer_cast<wolf::ProcessorParamsOdom2D>(nb);
+
+      ASSERT_TRUE(nb_cast != nullptr)
+          << "Failed on casting " << ptr_full_path;
+
+      ASSERT_EQ(nb_cast->type,               nb_.type)               << full_path;
+      ASSERT_EQ(nb_cast->name,               nb_.name)               << full_path;
+      ASSERT_EQ(nb_cast->dist_traveled_th_,  nb_.dist_traveled_th_)  << full_path;
+      ASSERT_EQ(nb_cast->theta_traveled_th_, nb_.theta_traveled_th_) << full_path;
+      ASSERT_EQ(nb_cast->cov_det_th_,        nb_.cov_det_th_)        << full_path;
+      ASSERT_EQ(nb_cast->unmeasured_perturbation_std_,
+                nb_.unmeasured_perturbation_std_)                    << full_path;
+    }
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorParamsOdom2D::"
+         "CerealSerializationProcessorParamsOdom2D !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/src/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp b/src/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ed2aaab3b9b257a708b680db2e38d7b6eb51d592
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_processor_odom3d_params.cpp
@@ -0,0 +1,246 @@
+/*
+ * gtest_intrinsics_odom2d_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/serialization_processor_odom3d_params.h"
+
+#include "../../../serialization/cereal/io.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+class WolfTestCerealSerializationProcessorOdom3DParams : public testing::Test
+{
+public:
+
+  WolfTestCerealSerializationProcessorOdom3DParams()
+  {
+    nb_.name = "NAME";
+    //nb_.type = "ODOM 3D";
+
+    nb_.max_time_span   = 1.5;
+    nb_.max_buff_length = 55.;
+    nb_.dist_traveled   = .25;
+    nb_.angle_turned    = .17;
+  }
+
+  const std::string path_to_io = "/tmp/";
+
+  wolf::ProcessorOdom3DParams nb_;
+};
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsXML)
+{
+  const std::string filename(path_to_io + "params_odom3d_serialization.xml");
+
+  wolf::ProcessorOdom3DParams nb_save;
+  nb_save.name = "NAME2";
+  //nb_.type = "ODOM 3D";
+
+  nb_save.max_time_span   = 2.5;
+  nb_save.max_buff_length = 52.;
+  nb_save.dist_traveled   = .24;
+  nb_save.angle_turned    = .18;
+
+  ASSERT_NO_THROW( wolf::save( filename, nb_, nb_save, 10 ) );
+
+  {
+    wolf::ProcessorOdom3DParams nb_load;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb_load ) );
+
+    ASSERT_EQ(nb_load.type, nb_.type);
+    ASSERT_EQ(nb_load.name, nb_.name);
+    ASSERT_EQ(nb_load.max_time_span,   nb_.max_time_span);
+    ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length);
+    ASSERT_EQ(nb_load.dist_traveled,   nb_.dist_traveled);
+    ASSERT_EQ(nb_load.angle_turned,    nb_.angle_turned);
+
+    wolf::ProcessorOdom3DParams nb_load0, nb_load1;
+    int myint;
+    ASSERT_NO_THROW( wolf::load( filename, nb_load0, nb_load1, myint ) );
+
+    ASSERT_EQ(nb_load0.type, nb_.type);
+    ASSERT_EQ(nb_load0.name, nb_.name);
+    ASSERT_EQ(nb_load0.max_time_span,   nb_.max_time_span);
+    ASSERT_EQ(nb_load0.max_buff_length, nb_.max_buff_length);
+    ASSERT_EQ(nb_load0.dist_traveled,   nb_.dist_traveled);
+    ASSERT_EQ(nb_load0.angle_turned,    nb_.angle_turned);
+
+    ASSERT_EQ(nb_load1.type, nb_save.type);
+    ASSERT_EQ(nb_load1.name, nb_save.name);
+    ASSERT_EQ(nb_load1.max_time_span,   nb_save.max_time_span);
+    ASSERT_EQ(nb_load1.max_buff_length, nb_save.max_buff_length);
+    ASSERT_EQ(nb_load1.dist_traveled,   nb_save.dist_traveled);
+    ASSERT_EQ(nb_load1.angle_turned,    nb_save.angle_turned);
+
+    ASSERT_EQ(myint, 10);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsPtrXML)
+{
+  const std::string filename(path_to_io + "params_odom3d_ptr_serialization.xml");
+
+  {
+    wolf::ProcessorParamsBasePtr nb =
+        std::make_shared<wolf::ProcessorOdom3DParams>(nb_);
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::ProcessorParamsBasePtr nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    wolf::ProcessorOdom3DParamsPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::ProcessorOdom3DParams>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->max_time_span,   nb_.max_time_span);
+    ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length);
+    ASSERT_EQ(nb_cast->dist_traveled,   nb_.dist_traveled);
+    ASSERT_EQ(nb_cast->angle_turned,    nb_.angle_turned);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsPtrXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsJSON)
+{
+  const std::string filename(path_to_io + "params_odom3d_serialization.json");
+
+  ASSERT_NO_THROW( wolf::save( filename, nb_ ) );
+
+  wolf::ProcessorOdom3DParams nb_load;
+
+  ASSERT_NO_THROW( wolf::load( filename, nb_load ) );
+
+  ASSERT_EQ(nb_load.type, nb_.type);
+  ASSERT_EQ(nb_load.name, nb_.name);
+  ASSERT_EQ(nb_load.max_time_span,   nb_.max_time_span);
+  ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length);
+  ASSERT_EQ(nb_load.dist_traveled,   nb_.dist_traveled);
+  ASSERT_EQ(nb_load.angle_turned,    nb_.angle_turned);
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsPtrJSON)
+{
+  const std::string filename(path_to_io + "params_odom3d_ptr_serialization.json");
+
+  {
+    wolf::ProcessorParamsBasePtr nb =
+        std::make_shared<wolf::ProcessorOdom3DParams>(nb_);
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::ProcessorParamsBasePtr nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    wolf::ProcessorOdom3DParamsPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::ProcessorOdom3DParams>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->max_time_span,   nb_.max_time_span);
+    ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length);
+    ASSERT_EQ(nb_cast->dist_traveled,   nb_.dist_traveled);
+    ASSERT_EQ(nb_cast->angle_turned,    nb_.angle_turned);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsPtrJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsBinary)
+{
+  const std::string filename(path_to_io + "params_odom3d_serialization.bin");
+
+  ASSERT_NO_THROW( wolf::save( filename, nb_ ) );
+
+  wolf::ProcessorOdom3DParams nb_load;
+
+  ASSERT_NO_THROW( wolf::load( filename, nb_load ) );
+
+  ASSERT_EQ(nb_load.type, nb_.type);
+  ASSERT_EQ(nb_load.name, nb_.name);
+  ASSERT_EQ(nb_load.max_time_span,   nb_.max_time_span);
+  ASSERT_EQ(nb_load.max_buff_length, nb_.max_buff_length);
+  ASSERT_EQ(nb_load.dist_traveled,   nb_.dist_traveled);
+  ASSERT_EQ(nb_load.angle_turned,    nb_.angle_turned);
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsBinary !\n");
+}
+
+TEST_F(WolfTestCerealSerializationProcessorOdom3DParams,
+       CerealSerializationProcessorOdom3DParamsPtrBinary)
+{
+  const std::string filename(path_to_io + "params_odom3d_ptr_serialization.bin");
+
+  {
+    wolf::ProcessorParamsBasePtr nb =
+        std::make_shared<wolf::ProcessorOdom3DParams>(nb_);
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::ProcessorParamsBasePtr nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    wolf::ProcessorOdom3DParamsPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::ProcessorOdom3DParams>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->max_time_span,   nb_.max_time_span);
+    ASSERT_EQ(nb_cast->max_buff_length, nb_.max_buff_length);
+    ASSERT_EQ(nb_cast->dist_traveled,   nb_.dist_traveled);
+    ASSERT_EQ(nb_cast->angle_turned,    nb_.angle_turned);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationProcessorOdom3DParams::"
+         "CerealSerializationProcessorOdom3DParamsPtrBinary !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/src/test/serialization/cereal/gtest_serialization_save_load.cpp b/src/test/serialization/cereal/gtest_serialization_save_load.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..23241af4887a43db6d48f027b30481e3408ade49
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_save_load.cpp
@@ -0,0 +1,202 @@
+/*
+ * gtest_intrinsics_odom2d_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/io.h"
+#include "../../../serialization/cereal/serialization_sensor_odom2d_intrinsic.h"
+
+#include "../../../serialization/cereal/archives.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+namespace wolf {
+
+using IntrinsicsOdom2DPtr = std::shared_ptr<IntrinsicsOdom2D>;
+
+}
+
+class WolfTestCerealSerializationSaveLoad : public testing::Test
+{
+public:
+
+  WolfTestCerealSerializationSaveLoad()
+  {
+    //
+  }
+
+  const std::string path_to_io = "/tmp/";
+
+  decltype(std::declval<wolf::IntrinsicsOdom2D>().type) nb_type = "TYPE";
+  decltype(std::declval<wolf::IntrinsicsOdom2D>().name) nb_name = "NAME";
+  decltype(std::declval<wolf::IntrinsicsOdom2D>().k_disp_to_disp) nb_k_disp_to_disp = 0.54;
+  decltype(std::declval<wolf::IntrinsicsOdom2D>().k_rot_to_rot) nb_k_rot_to_rot   = 0.18;
+};
+
+TEST_F(WolfTestCerealSerializationSaveLoad, CerealSerializationSaveLoadExtension)
+{
+  const std::string xml  = "/test/filename.xml";
+  const std::string bin  = "/test/filename.bin";
+  const std::string json = "/test/filename.json";
+
+  ASSERT_EQ(wolf::serialization::extension(xml),  ".xml");
+  ASSERT_EQ(wolf::serialization::extension(bin),  ".bin");
+  ASSERT_EQ(wolf::serialization::extension(json), ".json");
+}
+
+TEST_F(WolfTestCerealSerializationSaveLoad,
+       CerealSerializationSaveLoadXML)
+{
+  const std::string filename = path_to_io + "save_load_serialization.xml";
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+    nb.k_disp_to_disp = nb_k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_k_rot_to_rot;
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationSaveLoad::"
+         "CerealSerializationSaveLoadXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationSaveLoad,
+       CerealSerializationSaveLoadJSON)
+{
+  const std::string filename = path_to_io + "save_load_serialization.json";
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+    nb.k_disp_to_disp = nb_k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_k_rot_to_rot;
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationSaveLoad::"
+         "CerealSerializationSaveLoadJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationSaveLoad,
+       CerealSerializationSaveLoadBinary)
+{
+  const std::string filename = path_to_io + "save_load_serialization.bin";
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+    nb.k_disp_to_disp = nb_k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_k_rot_to_rot;
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationSaveLoad::"
+         "CerealSerializationSaveLoadBinary !\n");
+}
+
+TEST_F(WolfTestCerealSerializationSaveLoad,
+       CerealSerializationSaveLoadNoExt)
+{
+  const std::string filename = path_to_io + "save_load_serialization_no_ext";
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+    nb.k_disp_to_disp = nb_k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_k_rot_to_rot;
+
+    ASSERT_NO_THROW( wolf::save( filename, nb ) );
+  }
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( wolf::load( filename, nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationSaveLoad::"
+         "CerealSerializationSaveLoadNoExt !\n");
+}
+
+TEST_F(WolfTestCerealSerializationSaveLoad,
+       CerealSerializationSaveLoadUnknownExt)
+{
+  const std::string filename = path_to_io + "save_load_serialization.foo";
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_THROW( wolf::save( filename, nb ), std::runtime_error );
+  }
+
+  {
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_THROW( wolf::load( filename, nb ), std::runtime_error );
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationSaveLoad::"
+         "CerealSerializationSaveLoadUnknownExt !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/src/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp b/src/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a8a67dc1977d184a91a26cae2420f1a04ef5a0ee
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_sensor_intrinsic_base.cpp
@@ -0,0 +1,233 @@
+/*
+ * gtest_intrinsics_base_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/serialization_sensor_intrinsic_base.h"
+
+#include "../../../serialization/cereal/archives.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+class WolfTestCerealSerializationIntrinsicsBase : public testing::Test
+{
+public:
+
+  WolfTestCerealSerializationIntrinsicsBase()
+  {
+    //
+  }
+
+  const std::string path_to_io = "/tmp/";
+
+  decltype(std::declval<wolf::IntrinsicsBase>().type) nb_type = "TYPE";
+  decltype(std::declval<wolf::IntrinsicsBase>().name) nb_name = "NAME";
+};
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase,
+       CerealSerializationIntrinsicsBaseXML)
+{
+  {
+    wolf::IntrinsicsBase nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+
+    std::ofstream os(path_to_io + "intrinsics_base_serialization.xml");
+    cereal::XMLOutputArchive xml_archive(os);
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_serialization.xml");
+    cereal::XMLInputArchive xml_archive(is);
+
+    wolf::IntrinsicsBase nb;
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBaseXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase,
+       CerealSerializationIntrinsicsBasePtrXML)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>();
+    nb->name = nb_name;
+    nb->type = nb_type;
+
+    std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.xml");
+    cereal::XMLOutputArchive xml_archive(os);
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.xml");
+    cereal::XMLInputArchive xml_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+
+    ASSERT_EQ(nb->type, nb_type);
+    ASSERT_EQ(nb->name, nb_name);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::IntrinsicsBase>(nb) != nullptr);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBasePtrXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase,
+       CerealSerializationIntrinsicsBaseJSON)
+{
+  {
+    wolf::IntrinsicsBase nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+
+    std::ofstream os(path_to_io + "intrinsics_base_serialization.json");
+    cereal::JSONOutputArchive json_archive(os);
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_serialization.json");
+    cereal::JSONInputArchive json_archive(is);
+
+    wolf::IntrinsicsBase nb;
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBaseJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase,
+       CerealSerializationIntrinsicsBasePtrJSON)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>();
+    nb->name = nb_name;
+    nb->type = nb_type;
+
+    std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.json");
+    cereal::JSONOutputArchive json_archive(os);
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.json");
+    cereal::JSONInputArchive json_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+
+    ASSERT_EQ(nb->type, nb_type);
+    ASSERT_EQ(nb->name, nb_name);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::IntrinsicsBase>(nb) != nullptr);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBasePtrJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase,
+       CerealSerializationIntrinsicsBaseBinary)
+{
+  {
+    wolf::IntrinsicsBase nb;
+    nb.type = nb_type;
+    nb.name = nb_name;
+
+    std::ofstream os(path_to_io + "intrinsics_base_serialization.bin");
+    cereal::BinaryOutputArchive bin_archive(os);
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_serialization.bin");
+    cereal::BinaryInputArchive bin_archive(is);
+
+    wolf::IntrinsicsBase nb;
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_type);
+    ASSERT_EQ(nb.name, nb_name);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBaseBinary !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsBase, CerealSerializationIntrinsicsBasePtrBinary)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsBase>();
+    nb->name = nb_name;
+    nb->type = nb_type;
+
+    std::ofstream os(path_to_io + "intrinsics_base_ptr_serialization.bin");
+    cereal::BinaryOutputArchive bin_archive(os);
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_base_ptr_serialization.bin");
+    cereal::BinaryInputArchive bin_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+
+    ASSERT_EQ(nb->type, nb_type);
+    ASSERT_EQ(nb->name, nb_name);
+
+    ASSERT_TRUE(
+          std::dynamic_pointer_cast<
+          wolf::IntrinsicsBase>(nb) != nullptr);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsBase::"
+         "CerealSerializationIntrinsicsBasePtrBinary !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/src/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp b/src/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c5891c3d91d020293937236e582535ddd2e2beaf
--- /dev/null
+++ b/src/test/serialization/cereal/gtest_serialization_sensor_odom2d_intrinsic.cpp
@@ -0,0 +1,256 @@
+/*
+ * gtest_intrinsics_odom2d_serialization.cpp
+ *
+ *  Created on: Jul 16, 2017
+ *      Author: Jeremie Deray
+ */
+
+#include "../../utils_gtest.h"
+
+#include "../../../serialization/cereal/serialization_sensor_odom2d_intrinsic.h"
+
+#include "../../../serialization/cereal/archives.h"
+
+#include <cereal/types/memory.hpp>
+#include <fstream>
+
+namespace wolf {
+
+using IntrinsicsOdom2DPtr = std::shared_ptr<IntrinsicsOdom2D>;
+
+}
+
+class WolfTestCerealSerializationIntrinsicsOdom2D : public testing::Test
+{
+public:
+
+  WolfTestCerealSerializationIntrinsicsOdom2D()
+  {
+    nb_.k_disp_to_disp = 0.54;
+    nb_.k_rot_to_rot = 0.18;
+    nb_.name = "NAME";
+    nb_.type = "TYPE";
+  }
+
+  const std::string path_to_io = "/tmp/";
+
+  wolf::IntrinsicsOdom2D nb_;
+};
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D,
+       CerealSerializationIntrinsicsOdom2DXML)
+{
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_.type;
+    nb.name = nb_.name;
+    nb.k_disp_to_disp = nb_.k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_.k_rot_to_rot;
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.xml");
+    cereal::XMLOutputArchive xml_archive(os);
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.xml");
+    cereal::XMLInputArchive xml_archive(is);
+
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_.type);
+    ASSERT_EQ(nb.name, nb_.name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D,
+       CerealSerializationIntrinsicsOdom2DPtrXML)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_);
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.xml");
+    cereal::XMLOutputArchive xml_archive(os);
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.xml");
+    cereal::XMLInputArchive xml_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( xml_archive( nb ) );
+
+    wolf::IntrinsicsOdom2DPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb_cast->k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DPtrXML !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D,
+       CerealSerializationIntrinsicsOdom2DJSON)
+{
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_.type;
+    nb.name = nb_.name;
+    nb.k_disp_to_disp = nb_.k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_.k_rot_to_rot;
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.json");
+    cereal::JSONOutputArchive json_archive(os);
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.json");
+    cereal::JSONInputArchive json_archive(is);
+
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_.type);
+    ASSERT_EQ(nb.name, nb_.name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D,
+       CerealSerializationIntrinsicsOdom2DPtrJSON)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_);
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.json");
+    cereal::JSONOutputArchive json_archive(os);
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.json");
+    cereal::JSONInputArchive json_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( json_archive( nb ) );
+
+    wolf::IntrinsicsOdom2DPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb_cast->k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DPtrJSON !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D,
+       CerealSerializationIntrinsicsOdom2DBinary)
+{
+  {
+    wolf::IntrinsicsOdom2D nb;
+    nb.type = nb_.type;
+    nb.name = nb_.name;
+    nb.k_disp_to_disp = nb_.k_disp_to_disp;
+    nb.k_rot_to_rot   = nb_.k_rot_to_rot;
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_serialization.bin");
+    cereal::BinaryOutputArchive bin_archive(os);
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_serialization.bin");
+    cereal::BinaryInputArchive bin_archive(is);
+
+    wolf::IntrinsicsOdom2D nb;
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+
+    ASSERT_EQ(nb.type, nb_.type);
+    ASSERT_EQ(nb.name, nb_.name);
+    ASSERT_EQ(nb.k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb.k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DBinary !\n");
+}
+
+TEST_F(WolfTestCerealSerializationIntrinsicsOdom2D, CerealSerializationIntrinsicsOdom2DPtrBinary)
+{
+  {
+    wolf::IntrinsicsBasePtr nb = std::make_shared<wolf::IntrinsicsOdom2D>(nb_);
+
+    std::ofstream os(path_to_io + "intrinsics_odom2d_ptr_serialization.bin");
+    cereal::BinaryOutputArchive bin_archive(os);
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+  }
+
+  {
+    std::ifstream is(path_to_io + "intrinsics_odom2d_ptr_serialization.bin");
+    cereal::BinaryInputArchive bin_archive(is);
+
+    wolf::IntrinsicsBasePtr nb;
+
+    ASSERT_NO_THROW( bin_archive( nb ) );
+
+    wolf::IntrinsicsOdom2DPtr nb_cast =
+        std::dynamic_pointer_cast<wolf::IntrinsicsOdom2D>(nb);
+
+    ASSERT_TRUE(nb_cast != nullptr);
+
+    ASSERT_EQ(nb_cast->type, nb_.type);
+    ASSERT_EQ(nb_cast->name, nb_.name);
+    ASSERT_EQ(nb_cast->k_disp_to_disp, nb_.k_disp_to_disp);
+    ASSERT_EQ(nb_cast->k_rot_to_rot,   nb_.k_rot_to_rot);
+  }
+
+  PRINTF("All good at "
+         "WolfTestCerealSerializationIntrinsicsOdom2D::"
+         "CerealSerializationIntrinsicsOdom2DPtrBinary !\n");
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}