diff --git a/src/amdis/common/CMakeLists.txt b/src/amdis/common/CMakeLists.txt
index 89f2d370f56993ad5dc3eb2d6d9541797220dd09..f7759eb963cbf4032255e5e409d4e1073d9e7bb5 100644
--- a/src/amdis/common/CMakeLists.txt
+++ b/src/amdis/common/CMakeLists.txt
@@ -25,6 +25,7 @@ install(FILES
     Resize.hpp
     StaticSize.hpp
     String.hpp
+    SwitchCases.hpp
     Tags.hpp
     Transposed.hpp
     TupleUtility.hpp
diff --git a/src/amdis/common/SwitchCases.hpp b/src/amdis/common/SwitchCases.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..f17d31b82542532a4182e4747d2ebe6f539c1d1c
--- /dev/null
+++ b/src/amdis/common/SwitchCases.hpp
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <cassert>
+
+#include <dune/common/hybridutilities.hh>
+#include <dune/common/rangeutilities.hh>
+
+namespace AMDiS
+{
+  template <class T, T to, T from, class Value, class Then, class Else>
+  constexpr decltype(auto) switchCases(const Dune::StaticIntegralRange<T,to,from>& cases, const Value& value,
+                                       Then&& thenBranch, Else&& elseBranch)
+  {
+    using integer_sequence = typename Dune::StaticIntegralRange<T,to,from>::integer_sequence;
+    return Dune::Hybrid::switchCases(integer_sequence{}, value, FWD(thenBranch), FWD(elseBranch));
+  }
+
+  template <class T, class Value, class Then, class Else>
+  constexpr decltype(auto) switchCases(const Dune::IntegralRange<T>& cases, const Value& value,
+                                       Then&& thenBranch, Else&& elseBranch)
+  {
+    if (value >= cases[0] && value <= cases[cases.size()-1])
+      return thenBranch(value);
+    else
+      return elseBranch(value);
+  }
+
+  template<class T, T to, T from, class Value, class Then>
+  constexpr void switchCases(const Dune::StaticIntegralRange<T,to,from>& cases, const Value& value, Then&& thenBranch)
+  {
+    using integer_sequence = typename Dune::StaticIntegralRange<T,to,from>::integer_sequence;
+    Dune::Hybrid::switchCases(integer_sequence{}, value, FWD(thenBranch));
+  }
+
+  template<class T, class Value, class Then>
+  constexpr void switchCases(const Dune::IntegralRange<T>& cases, const Value& value, Then&& thenBranch)
+  {
+    assert(value >= cases[0] && value <= cases[cases.size()-1]);
+    thenBranch(value);
+  }
+
+} // end namespace AMDiS