diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp
index dfaef06f1b45a4fe0b407f34039fd3ea62203ebf..2d77adef9df360baaa78fa4ea1f582fd78df4e0e 100644
--- a/include/eigenpy/details.hpp
+++ b/include/eigenpy/details.hpp
@@ -183,13 +183,6 @@ namespace eigenpy
   template<typename MatType>
   struct EigenFromPy
   {
-    EigenFromPy()
-    {
-      bp::converter::registry::push_back
-      (reinterpret_cast<void *(*)(_object *)>(&convertible),
-       &construct,bp::type_id<MatType>());
-    }
-    
     // Determine if obj_ptr can be converted in a Eigenvec
     static void* convertible(PyArrayObject* obj_ptr)
     {
@@ -330,6 +323,34 @@ namespace eigenpy
     enableEigenPySpecific<MatType>();
   }
   
+  template<typename MatType>
+  struct EigenFromPyConverter
+  {
+    static void registration()
+    {
+      bp::converter::registry::push_back
+      (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
+       &EigenFromPy<MatType>::construct,bp::type_id<MatType>());
+      
+      // Add also conversion to Eigen::MatrixBase<MatType>
+      bp::converter::registry::push_back
+      (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
+       &EigenFromPy<MatType>::construct,bp::type_id< Eigen::MatrixBase<MatType> >());
+    }
+  };
+  
+  template<typename MatType>
+  struct EigenFromPyConverter< eigenpy::Ref<MatType> >
+  {
+    static void registration()
+    {
+      bp::converter::registry::push_back
+      (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
+       &EigenFromPy<MatType>::construct,bp::type_id<MatType>());
+    }
+  };
+  
+  
   template<typename MatType>
   void enableEigenPySpecific()
   {
@@ -337,7 +358,8 @@ namespace eigenpy
     if(check_registration<MatType>()) return;
     
     bp::to_python_converter<MatType,EigenToPy<MatType> >();
-    EigenFromPy<MatType>();
+    EigenFromPyConverter<MatType>::registration();
+   
   }
 
 } // namespace eigenpy