diff --git a/include/eigenpy/alignment.hpp b/include/eigenpy/alignment.hpp
index b04a7d63a00fb90f43f192b0c1a86a13d1160814..4bca14d36954ab744cde25a23ba4cb55f3ea95da 100644
--- a/include/eigenpy/alignment.hpp
+++ b/include/eigenpy/alignment.hpp
@@ -9,6 +9,7 @@
 #include <boost/python/converter/arg_from_python.hpp>
 #include <boost/python/converter/rvalue_from_python_data.hpp>
 #include <boost/type_traits/aligned_storage.hpp>
+#include <eigenpy/utils/is-aligned.hpp>
 
 namespace eigenpy {
 
@@ -29,6 +30,19 @@ struct aligned_instance {
   typename aligned_storage<sizeof(Data)>::type storage;
 };
 
+inline void *aligned_malloc(
+    std::size_t size, std::size_t alignment = EIGENPY_DEFAULT_ALIGN_BYTES) {
+  void *original = std::malloc(size + alignment);
+  if (original == 0) return 0;
+  if (is_aligned(original, alignment)) return original;
+  void *aligned =
+      reinterpret_cast<void *>((reinterpret_cast<std::size_t>(original) &
+                                ~(std::size_t(alignment - 1))) +
+                               alignment);
+  *(reinterpret_cast<void **>(aligned) - 1) = original;
+  return aligned;
+}
+
 }  // namespace eigenpy
 
 namespace boost {
diff --git a/include/eigenpy/fwd.hpp b/include/eigenpy/fwd.hpp
index 7db101c7a1545d7efccba8753dab0809d4216c47..5794f5233ba449b70c64c60005e9c06b485688cb 100644
--- a/include/eigenpy/fwd.hpp
+++ b/include/eigenpy/fwd.hpp
@@ -13,6 +13,18 @@
 #define EIGENPY_MSVC_COMPILER
 #endif
 
+#if (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703))
+#define EIGENPY_WITH_CXX17_SUPPORT
+#endif
+
+#if (__cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201403))
+#define EIGENPY_WITH_CXX14_SUPPORT
+#endif
+
+#if (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600))
+#define EIGENPY_WITH_CXX11_SUPPORT
+#endif
+
 #define EIGENPY_STRING_LITERAL(string) #string
 #define EIGENPY_STRINGIZE(string) EIGENPY_STRING_LITERAL(string)
 #define _EIGENPY_PPCAT(A, B) A##B
@@ -81,6 +93,14 @@
 
 #include "eigenpy/expose.hpp"
 
+#ifdef EIGENPY_WITH_CXX11_SUPPORT
+#include <memory>
+#define EIGENPY_SHARED_PTR_HOLDER_TYPE(T) ::std::shared_ptr<T>
+#else
+#include <boost/shared_ptr.hpp>
+#define EIGENPY_SHARED_PTR_HOLDER_TYPE(T) ::boost::shared_ptr<T>
+#endif
+
 namespace eigenpy {
 template <typename MatType,
           typename Scalar =
diff --git a/include/eigenpy/quaternion.hpp b/include/eigenpy/quaternion.hpp
index 241eefec9e8021022ade16512525af9562539eb0..a1210137ab31fb706cbe1f0fc1d5838f330568d0 100644
--- a/include/eigenpy/quaternion.hpp
+++ b/include/eigenpy/quaternion.hpp
@@ -218,7 +218,6 @@ class QuaternionVisitor
         .def("__ne__", &QuaternionVisitor::__ne__)
         .def("__abs__", &Quaternion::norm)
         .def("__len__", &QuaternionVisitor::__len__)
-        .staticmethod("__len__")
         .def("__setitem__", &QuaternionVisitor::__setitem__)
         .def("__getitem__", &QuaternionVisitor::__getitem__)
         .def("assign", &assign<Quaternion>, bp::args("self", "quat"),
@@ -351,15 +350,22 @@ class QuaternionVisitor
 
  public:
   static void expose() {
-    bp::class_<Quaternion>("Quaternion",
-                           "Quaternion representing rotation.\n\n"
-                           "Supported operations "
-                           "('q is a Quaternion, 'v' is a Vector3): "
-                           "'q*q' (rotation composition), "
-                           "'q*=q', "
-                           "'q*v' (rotating 'v' by 'q'), "
-                           "'q==q', 'q!=q', 'q[0..3]'.",
-                           bp::no_init)
+#if BOOST_VERSION / 100 % 1000 < 71
+    typedef EIGENPY_SHARED_PTR_HOLDER_TYPE(Quaternion) HolderType;
+#else
+    typedef ::boost::python::detail::not_specified HolderType;
+#endif
+
+    bp::class_<Quaternion, HolderType>(
+        "Quaternion",
+        "Quaternion representing rotation.\n\n"
+        "Supported operations "
+        "('q is a Quaternion, 'v' is a Vector3): "
+        "'q*q' (rotation composition), "
+        "'q*=q', "
+        "'q*v' (rotating 'v' by 'q'), "
+        "'q==q', 'q!=q', 'q[0..3]'.",
+        bp::no_init)
         .def(QuaternionVisitor<Quaternion>());
 
     // Cast to Eigen::QuaternionBase and vice-versa
diff --git a/include/eigenpy/utils/is-aligned.hpp b/include/eigenpy/utils/is-aligned.hpp
index 2f2e892b294cfd98aca4c01501020adc8ec442e3..cfc057f732f658a1a63dc183e123e3202687caeb 100644
--- a/include/eigenpy/utils/is-aligned.hpp
+++ b/include/eigenpy/utils/is-aligned.hpp
@@ -1,12 +1,12 @@
 //
-// Copyright (c) 2020 INRIA
+// Copyright (c) 2020-2023 INRIA
 //
 
 #ifndef __eigenpy_utils_is_aligned_hpp__
 #define __eigenpy_utils_is_aligned_hpp__
 
 namespace eigenpy {
-inline bool is_aligned(void* ptr, std::size_t alignment) {
+inline bool is_aligned(const void* ptr, std::size_t alignment) {
   return (reinterpret_cast<std::size_t>(ptr) & (alignment - 1)) == 0;
 }
 }  // namespace eigenpy