diff --git a/src/TNL/Matrices/AdEllpack_impl.h b/src/TNL/Matrices/AdEllpack_impl.h
index a0f293b3df94afcfeda8124f8e1d8173cb4c7718..215dba7a7b9eae949b1d39b60300abcc1958db7f 100644
--- a/src/TNL/Matrices/AdEllpack_impl.h
+++ b/src/TNL/Matrices/AdEllpack_impl.h
@@ -157,6 +157,28 @@ AdEllpack< Real, Device, Index >::AdEllpack()
 warpSize( 32 )
 {}
 
+template< typename Real,
+          typename Device,
+          typename Index >
+String AdEllpack< Real, Device, Index >::getTypeVirtual() const
+{
+    return this->getType();
+}
+
+template< typename Real,
+          typename Device,
+          typename Index >
+String AdEllpack< Real, Device, Index >::getType()
+{
+    return String( "Matrices::AdEllpack< ") +
+           String( TNL::getType< Real >() ) +
+           String( ", " ) +
+           String( Device::getDeviceType() ) +
+           String( ", " ) +
+           String( TNL::getType< Index >() ) +
+           String( " >" );
+}
+
 template< typename Real,
           typename Device,
           typename Index >
diff --git a/src/TNL/Matrices/BiEllpackSymmetric_impl.h b/src/TNL/Matrices/BiEllpackSymmetric_impl.h
index 0af180c0e8c2c54d2c4fdb304fa3e2813d76786c..a27497b3f67b97ae33394a957775c30abd6281d2 100644
--- a/src/TNL/Matrices/BiEllpackSymmetric_impl.h
+++ b/src/TNL/Matrices/BiEllpackSymmetric_impl.h
@@ -45,6 +45,30 @@ BiEllpackSymmetric< Real, Device, Index, StripSize >::BiEllpackSymmetric()
   logWarpSize( 5 )
 {}
 
+template< typename Real,
+          typename Device,
+          typename Index,
+          int StripSize >
+String BiEllpackSymmetric< Real, Device, Index, StripSize >::getType()
+{
+    return String( "Matrices::BiEllpackMatrix< ") +
+           String( TNL::getType< Real >() ) +
+           String( ", " ) +
+           String( Device :: getDeviceType() ) +
+           String( ", " ) +
+           String( TNL::getType< Index >() ) +
+           String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index,
+          int StripSize >
+String BiEllpackSymmetric< Real, Device, Index, StripSize >::getTypeVirtual() const
+{
+    return this->getType();
+}
+
 template< typename Real,
           typename Device,
           typename Index,
diff --git a/src/TNL/Matrices/BiEllpack_impl.h b/src/TNL/Matrices/BiEllpack_impl.h
index 51646152e8e62d8c26fb55a961869b8acef7826e..93a180932f9c2e82b3d4ee1bacac8654741d272b 100644
--- a/src/TNL/Matrices/BiEllpack_impl.h
+++ b/src/TNL/Matrices/BiEllpack_impl.h
@@ -47,6 +47,30 @@ BiEllpack< Real, Device, Index, StripSize >::BiEllpack()
   logWarpSize( 5 )
 {}
 
+template< typename Real,
+	  typename Device,
+	  typename Index,
+	  int StripSize >
+String BiEllpack< Real, Device, Index, StripSize >::getType()
+{
+	return String( "Matrices::BiEllpack< ") +
+	       String( TNL::getType< Real >() ) +
+	       String( ", " ) +
+	       String( Device :: getDeviceType() ) +
+               String( ", " ) +
+               String( TNL::getType< Index >() ) +
+	       String( " >" );
+}
+
+template< typename Real,
+	  typename Device,
+	  typename Index,
+	  int StripSize >
+String BiEllpack< Real, Device, Index, StripSize >::getTypeVirtual() const
+{
+    return this->getType();
+}
+
 template< typename Real,
 	  typename Device,
 	  typename Index,
diff --git a/src/TNL/Matrices/COOMatrix_impl.h b/src/TNL/Matrices/COOMatrix_impl.h
index bbdd36002ee4af0ca59da81815ed2527c0c0c828..2f9b49d30833982122ac62eb20ab65e265f79ce7 100644
--- a/src/TNL/Matrices/COOMatrix_impl.h
+++ b/src/TNL/Matrices/COOMatrix_impl.h
@@ -27,6 +27,28 @@ COOMatrix< Real, Device, Index >::COOMatrix()
 {
 };
 
+template< typename Real,
+	  	  typename Device,
+	  	  typename Index >
+String COOMatrix< Real, Device, Index >::getType()
+{
+	return String( "Matrices::COOMatrix< " ) +
+               String( TNL::getType< Real>() ) +
+               String( ", " ) +
+               String( Device :: getDeviceType() ) +
+               String( ", " ) +
+               String( TNL::getType< Index >() ) +
+               String( " >" );
+}
+
+template< typename Real,
+	  	  typename Device,
+	  	  typename Index >
+String COOMatrix< Real, Device, Index >::getTypeVirtual() const
+{
+	return this->getType();
+}
+
 template< typename Real,
 		  typename Device,
 		  typename Index >
diff --git a/src/TNL/Matrices/CSR_impl.h b/src/TNL/Matrices/CSR_impl.h
index 327d250028acca4349495bd663340f999f55024e..8891f5b935ece70662c2a17d2e7ca67c508af6aa 100644
--- a/src/TNL/Matrices/CSR_impl.h
+++ b/src/TNL/Matrices/CSR_impl.h
@@ -46,7 +46,9 @@ String CSR< Real, Device, Index >::getSerializationType()
    return String( "Matrices::CSR< ") +
           TNL::getType< Real>() +
           String( ", " ) +
-          getType< Devices::Host >() +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
           String( " >" );
 }
 
diff --git a/src/TNL/Matrices/ChunkedEllpack_impl.h b/src/TNL/Matrices/ChunkedEllpack_impl.h
index 878c7c2734b5bac80dd1db6b304906e7cd88c5d5..bf2e347aa1d8458b8ecf84fd174aa0038f8a8bc0 100644
--- a/src/TNL/Matrices/ChunkedEllpack_impl.h
+++ b/src/TNL/Matrices/ChunkedEllpack_impl.h
@@ -44,7 +44,9 @@ String ChunkedEllpack< Real, Device, Index >::getSerializationType()
    return String( "Matrices::ChunkedEllpack< ") +
           getType< Real >() +
           String( ", " ) +
-          getType< Device >() +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
           String( " >" );
 }
 
diff --git a/src/TNL/Matrices/Dense_impl.h b/src/TNL/Matrices/Dense_impl.h
index 246bd09edb459e6df9749af9d1589f508c2c5806..f690946e8857f8b70065173257049eb1731563db 100644
--- a/src/TNL/Matrices/Dense_impl.h
+++ b/src/TNL/Matrices/Dense_impl.h
@@ -24,6 +24,28 @@ Dense< Real, Device, Index >::Dense()
 {
 }
 
+template< typename Real,
+          typename Device,
+          typename Index >
+String Dense< Real, Device, Index >::getType()
+{
+   return String( "Matrices::Dense< " ) +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index >
+String Dense< Real, Device, Index >::getTypeVirtual() const
+{
+   return this->getType();
+}
+
 template< typename Real,
           typename Device,
           typename Index >
diff --git a/src/TNL/Matrices/EllpackSymmetricGraph_impl.h b/src/TNL/Matrices/EllpackSymmetricGraph_impl.h
index b949292c5f1664562525a4ead8ca17b2ad9f343b..1abb1e98bc2538d144ea03ad4ec363c3f21c6cde 100644
--- a/src/TNL/Matrices/EllpackSymmetricGraph_impl.h
+++ b/src/TNL/Matrices/EllpackSymmetricGraph_impl.h
@@ -42,6 +42,28 @@ Index EllpackSymmetricGraph< Real, Device, Index >::getAlignedRows() const
     return this->alignedRows;
 }
 
+template< typename Real,
+          typename Device,
+          typename Index >
+String EllpackSymmetricGraph< Real, Device, Index > :: getType()
+{
+   return String( "Matrices::EllpackSymmetricGraph< ") +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device::getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index >
+String EllpackSymmetricGraph< Real, Device, Index >::getTypeVirtual() const
+{
+   return this->getType();
+}
+
 template< typename Real,
           typename Device,
           typename Index >
diff --git a/src/TNL/Matrices/EllpackSymmetric_impl.h b/src/TNL/Matrices/EllpackSymmetric_impl.h
index 90369f77af0f0085b140934c27fe3fe5a2d8f015..5b83341d0e05416305d3490ee59f96c4a42fbbe2 100644
--- a/src/TNL/Matrices/EllpackSymmetric_impl.h
+++ b/src/TNL/Matrices/EllpackSymmetric_impl.h
@@ -26,6 +26,28 @@ EllpackSymmetric< Real, Device, Index > :: EllpackSymmetric()
 {
 };
 
+template< typename Real,
+          typename Device,
+          typename Index >
+String EllpackSymmetric< Real, Device, Index > :: getType()
+{
+   return String( "Matrices::EllpackSymmetric< ") +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device::getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index >
+String EllpackSymmetric< Real, Device, Index >::getTypeVirtual() const
+{
+   return this->getType();
+}
+
 template< typename Real,
           typename Device,
           typename Index >
diff --git a/src/TNL/Matrices/Ellpack_impl.h b/src/TNL/Matrices/Ellpack_impl.h
index 5ac812cf2101e7f13bafbfd871ac168429be49cd..833513bd41f5ac3c222c956c23f91231c008f5a0 100644
--- a/src/TNL/Matrices/Ellpack_impl.h
+++ b/src/TNL/Matrices/Ellpack_impl.h
@@ -31,10 +31,10 @@ template< typename Real,
           typename Index >
 String Ellpack< Real, Device, Index >::getSerializationType()
 {
-   return String( "Matrices::Ellpack< ") +
-          getType< Real >() +
+   return String( "Matrices::Ellpack< " ) +
+          String( TNL::getType< Real >() ) +
           String( ", " ) +
-          getType< Device >() +
+          String( Device :: getDeviceType() ) +
           String( ", " ) +
           getType< Index >() +
           String( " >" );
diff --git a/src/TNL/Matrices/Multidiagonal_impl.h b/src/TNL/Matrices/Multidiagonal_impl.h
index ff1ac384a3a1a95a170f491de8a56dae09651b3c..76f54f748c0744d810518cd9dde5872a894099ad 100644
--- a/src/TNL/Matrices/Multidiagonal_impl.h
+++ b/src/TNL/Matrices/Multidiagonal_impl.h
@@ -36,7 +36,9 @@ String Multidiagonal< Real, Device, Index >::getSerializationType()
    return String( "Matrices::Multidiagonal< ") +
           getType< Real >() +
           String( ", " ) +
-          getType< Device >() +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
           String( " >" );
 }
 
diff --git a/src/TNL/Matrices/SlicedEllpackSymmetricGraph_impl.h b/src/TNL/Matrices/SlicedEllpackSymmetricGraph_impl.h
index bfe73f231092a0e4ea90c3011b823c6ab8c17d95..39cb81c6839efe21c90bcba58aff87ad96a5e447 100644
--- a/src/TNL/Matrices/SlicedEllpackSymmetricGraph_impl.h
+++ b/src/TNL/Matrices/SlicedEllpackSymmetricGraph_impl.h
@@ -25,6 +25,30 @@ template< typename Real,
 SlicedEllpackSymmetricGraph< Real, Device, Index, SliceSize >::SlicedEllpackSymmetricGraph()
 : rearranged( false )
 {
+};
+
+template< typename Real,
+          typename Device,
+          typename Index,
+          int SliceSize >
+String SlicedEllpackSymmetricGraph< Real, Device, Index, SliceSize >::getType()
+{
+   return String( "Matrices::SlicedEllpackSymmetricGraph< ") +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device::getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index,
+          int SliceSize >
+String SlicedEllpackSymmetricGraph< Real, Device, Index, SliceSize >::getTypeVirtual() const
+{
+   return this->getType();
 }
 
 template< typename Real,
diff --git a/src/TNL/Matrices/SlicedEllpackSymmetric_impl.h b/src/TNL/Matrices/SlicedEllpackSymmetric_impl.h
index c403fd4c84f09a59883f14f2fc5c23e79c1c65cb..324cc74bc056efcd489e2ac2ba88ee2113ccea0d 100644
--- a/src/TNL/Matrices/SlicedEllpackSymmetric_impl.h
+++ b/src/TNL/Matrices/SlicedEllpackSymmetric_impl.h
@@ -24,6 +24,30 @@ template< typename Real,
           int SliceSize >
 SlicedEllpackSymmetric< Real, Device, Index, SliceSize >::SlicedEllpackSymmetric()
 {
+};
+
+template< typename Real,
+          typename Device,
+          typename Index,
+          int SliceSize >
+String SlicedEllpackSymmetric< Real, Device, Index, SliceSize >::getType()
+{
+   return String( "Matrices::SlicedEllpackSymmetric< ") +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) + 
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index,
+          int SliceSize >
+String SlicedEllpackSymmetric< Real, Device, Index, SliceSize >::getTypeVirtual() const
+{
+   return this->getType();
 }
 
 template< typename Real,
diff --git a/src/TNL/Matrices/SlicedEllpack_impl.h b/src/TNL/Matrices/SlicedEllpack_impl.h
index 45e8cdee77fbda670d2e3b23a3844ad0bb53d071..772360c8c0797304741849515f6c39d3c69c6af1 100644
--- a/src/TNL/Matrices/SlicedEllpack_impl.h
+++ b/src/TNL/Matrices/SlicedEllpack_impl.h
@@ -35,7 +35,9 @@ String SlicedEllpack< Real, Device, Index, SliceSize >::getSerializationType()
    return String( "Matrices::SlicedEllpack< ") +
           TNL::getType< Real >() +
           String( ", " ) +
-          getType< Device >() +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
           String( " >" );
 }
 
diff --git a/src/TNL/Matrices/Tridiagonal_impl.h b/src/TNL/Matrices/Tridiagonal_impl.h
index 62575f1776144e374b560a65e213248a1177de80..2752f6850320035dca48169c5e1ae2806aa47ff5 100644
--- a/src/TNL/Matrices/Tridiagonal_impl.h
+++ b/src/TNL/Matrices/Tridiagonal_impl.h
@@ -27,6 +27,28 @@ Tridiagonal< Real, Device, Index >::Tridiagonal()
 {
 }
 
+template< typename Real,
+          typename Device,
+          typename Index >
+String Tridiagonal< Real, Device, Index >::getType()
+{
+   return String( "Matrices::Tridiagonal< " ) +
+          String( TNL::getType< Real >() ) +
+          String( ", " ) +
+          String( Device :: getDeviceType() ) +
+          String( ", " ) +
+          String( TNL::getType< Index >() ) +
+          String( " >" );
+}
+
+template< typename Real,
+          typename Device,
+          typename Index >
+String Tridiagonal< Real, Device, Index >::getTypeVirtual() const
+{
+   return this->getType();
+}
+
 template< typename Real,
           typename Device,
           typename Index >