diff --git a/src/amdis/common/StaticSize.hpp b/src/amdis/common/StaticSize.hpp
index ec346a0ec753bceebb3f4c2fef67f239ff74a0b0..187880c2b8f11d5a32a6101e3b2335e4941992de 100644
--- a/src/amdis/common/StaticSize.hpp
+++ b/src/amdis/common/StaticSize.hpp
@@ -25,6 +25,12 @@ namespace Dune
   class MultiTypeBlockVector;
 }
 
+namespace Eigen
+{
+  template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+  class Matrix;
+}
+
 namespace AMDiS
 {
   namespace Impl
@@ -60,6 +66,14 @@ namespace AMDiS
     struct SizeImpl<Dune::MultiTypeBlockVector<Ts...>>
         : std::integral_constant<std::size_t, sizeof...(Ts)> {};
 
+    template <class T, int N, int... opts>
+    struct SizeImpl<Eigen::Matrix<T,N,1,opts...>>
+        : std::integral_constant<std::size_t, (N >= 0 ? std::size_t(N) : 0u)> {};
+
+    template <class T, int N, int... opts>
+    struct SizeImpl<Eigen::Matrix<T,1,N,opts...>>
+        : std::integral_constant<std::size_t, (N >= 0 ? std::size_t(N) : 0u)> {};
+
     // Specialization for arithmetic types
     template <class T>
     struct SizeImpl<T, std::enable_if_t<std::is_arithmetic<T>::value> >
@@ -93,6 +107,10 @@ namespace AMDiS
     struct RowsImpl<T, std::enable_if_t<std::is_arithmetic<T>::value> >
         : std::integral_constant<std::size_t, 1> {};
 
+    template <class T, int N, int M, int... opts>
+    struct RowsImpl<Eigen::Matrix<T,N,M,opts...>>
+        : std::integral_constant<std::size_t, (N >= 0 ? std::size_t(N) : 0u)> {};
+
   } // end namespace Impl
 
   /// Get the number of rows in a fixed-size matrix
@@ -121,6 +139,10 @@ namespace AMDiS
     struct ColsImpl<T, std::enable_if_t<std::is_arithmetic<T>::value> >
         : std::integral_constant<std::size_t, 1> {};
 
+    template <class T, int N, int M, int... opts>
+    struct ColsImpl<Eigen::Matrix<T,N,M,opts...>>
+        : std::integral_constant<std::size_t, (M >= 0 ? std::size_t(M) : 0u)> {};
+
   } // end namespace Impl
 
   /// Get the number of columns in a fixed-size matrix
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index a92e8dd03e32a54fe2412da8debb5d5650661571..b57c08786e19419d3a6ca7285226198cf9480e6f 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -67,12 +67,15 @@ dune_add_test(SOURCES RangeTypeTest.cpp
 dune_add_test(SOURCES ResizeTest.cpp
   LINK_LIBRARIES amdis)
 
-dune_add_test(SOURCES SwitchCasesTest.cpp
+dune_add_test(SOURCES StaticSizeTest.cpp
   LINK_LIBRARIES amdis)
 
 dune_add_test(SOURCES StringTest.cpp
   LINK_LIBRARIES amdis)
 
+dune_add_test(SOURCES SwitchCasesTest.cpp
+  LINK_LIBRARIES amdis)
+
 dune_add_test(SOURCES TreeDataTest.cpp
   LINK_LIBRARIES amdis)
 
diff --git a/test/StaticSizeTest.cpp b/test/StaticSizeTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0931fda73c51cba87fdb76c85879d8ffd678daa7
--- /dev/null
+++ b/test/StaticSizeTest.cpp
@@ -0,0 +1,67 @@
+#include <amdis/AMDiS.hpp>
+#include <amdis/common/StaticSize.hpp>
+
+#include <dune/common/fvector.hh>
+#include <dune/common/fmatrix.hh>
+#include <dune/istl/multitypeblockvector.hh>
+#include <dune/istl/multitypeblockmatrix.hh>
+
+#if HAVE_EIGEN
+#include <Eigen/Dense>
+#endif
+
+#include "Tests.hpp"
+
+using namespace AMDiS;
+
+struct Null {};
+
+int main(int argc, char** argv)
+{
+  Environment env(argc, argv);
+
+  static_assert(Size_v<double> == 1, "");
+  static_assert(Rows_v<double> == 1, "");
+  static_assert(Cols_v<double> == 1, "");
+  static_assert(Size_v<Null> == 0, "");
+  static_assert(Rows_v<Null> == 0, "");
+  static_assert(Cols_v<Null> == 0, "");
+
+  using Vec1 = Dune::FieldVector<double,2>;
+  using Vec2 = Dune::MultiTypeBlockVector<double,double>;
+  using Vec3 = std::array<double,2>;
+  using Vec4 = std::tuple<double,double>;
+  using Vec5 = Dune::TupleVector<double,double>;
+
+  static_assert(Size_v<Vec1> == 2, "");
+  static_assert(Size_v<Vec2> == 2, "");
+  static_assert(Size_v<Vec3> == 2, "");
+  static_assert(Size_v<Vec4> == 2, "");
+  static_assert(Size_v<Vec5> == 2, "");
+
+  using Mat1 = Dune::FieldMatrix<double,2,2>;
+  using Mat2 = Dune::MultiTypeBlockMatrix<Vec2,Vec2>;
+
+  static_assert(Rows_v<Mat1> == 2, "");
+  static_assert(Cols_v<Mat1> == 2, "");
+  static_assert(Rows_v<Mat2> == 2, "");
+  static_assert(Cols_v<Mat2> == 2, "");
+
+#if HAVE_EIGEN
+  using Vec6 = Eigen::Vector2d;
+  using Vec7 = Eigen::Matrix<double,2,1>;
+  using Vec8 = Eigen::Matrix<double,1,2>;
+  static_assert(Size_v<Vec6> == 2, "");
+  static_assert(Size_v<Vec7> == 2, "");
+  static_assert(Size_v<Vec8> == 2, "");
+
+  using Mat3 = Eigen::Matrix2d;
+  using Mat4 = Eigen::Matrix<double,2,2>;
+  static_assert(Rows_v<Mat3> == 2, "");
+  static_assert(Cols_v<Mat3> == 2, "");
+  static_assert(Rows_v<Mat4> == 2, "");
+  static_assert(Cols_v<Mat4> == 2, "");
+#endif
+
+  return 0;
+}