diff --git a/dune/subgrid/subgrid/subgridgeometry.hh b/dune/subgrid/subgrid/subgridgeometry.hh
index c8ff55b65204410574f12b9a5c6c8c610f96f76d..423001afd7865960d3abab55ba63b7292b264f2b 100644
--- a/dune/subgrid/subgrid/subgridgeometry.hh
+++ b/dune/subgrid/subgrid/subgridgeometry.hh
@@ -5,7 +5,13 @@
 * \brief The SubGridGeometry class and its specializations
 */
 #include <type_traits>
+
+#include <dune/common/version.hh>
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
 #include <dune/common/std/variant.hh>
+#else
+#include <variant>
+#endif
 
 #include <dune/common/fmatrix.hh>
 #include <dune/common/typetraits.hh>
@@ -147,7 +153,11 @@ class SubGridLocalGeometry
         using MultiLinGeometry = MultiLinearGeometry<ctype, mydim, coorddim>;
 
         // use a variant to store either a HostGridLocalGeometry or a MultiLinearGeometry
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
         using GeometryContainer = Std::variant<HostGridLocalGeometry, MultiLinGeometry>;
+#else
+        using GeometryContainer = std::variant<HostGridLocalGeometry, MultiLinGeometry>;
+#endif
 
     public:
 
@@ -177,45 +187,77 @@ class SubGridLocalGeometry
         /** \brief Return the element type identifier
         */
         GeometryType type () const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.type();}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.type();}, localGeometry_);
+#endif
         }
 
         /** \brief Return true if the geometry mapping is affine and false otherwise */
         bool affine() const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.affine();}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.affine();}, localGeometry_);
+#endif
         }
 
         //! return the number of corners of this element. Corners are numbered 0...n-1
         int corners () const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.corners();}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.corners();}, localGeometry_);
+#endif
         }
 
         //! access to coordinates of corners. Index is the number of the corner
         FieldVector<ctype, coorddim> corner (int i) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.corner(i);}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.corner(i);}, localGeometry_);
+#endif
         }
 
         /** \brief Maps a local coordinate within reference element to
         * global coordinate in element  */
-        FieldVector<ctype, coorddim> global (const FieldVector<ctype, mydim>& local) const{
+        FieldVector<ctype, coorddim> global (const FieldVector<ctype, mydim>& local) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.global(local);}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.global(local);}, localGeometry_);
+#endif
         }
 
         /** \brief Maps a global coordinate within the element to a
         * local coordinate in its reference element */
         FieldVector<ctype, mydim> local (const FieldVector<ctype, coorddim>& global) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.local(global);}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.local(global);}, localGeometry_);
+#endif
         }
 
         /**
         */
         ctype integrationElement (const FieldVector<ctype, mydim>& local) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.integrationElement(local);}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.integrationElement(local);}, localGeometry_);
+#endif
         }
 
         /** \brief return volume of geometry */
         ctype volume () const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.volume();}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.volume();}, localGeometry_);
+#endif
         }
 
         /** \brief return center of geometry
@@ -228,17 +270,29 @@ class SubGridLocalGeometry
         *  find reasonably efficient ways to implement it properly.
         */
         FieldVector<ctype, coorddim> center () const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return geom.center();}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return geom.center();}, localGeometry_);
+#endif
         }
 
         //! The Jacobian matrix of the mapping from the reference element to this element
         const JacobianTransposed jacobianTransposed (const FieldVector<ctype, mydim>& local) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return static_cast<JacobianTransposed>(geom.jacobianTransposed(local));}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return static_cast<JacobianTransposed>(geom.jacobianTransposed(local));}, localGeometry_);
+#endif
         }
 
         //! The inverse of the Jacobian matrix of the mapping from the reference element to this element
         const JacobianInverseTransposed jacobianInverseTransposed (const FieldVector<ctype, mydim>& local) const {
+#if DUNE_VERSION_LT(DUNE_COMMON,2,8)
             return Std::visit([&](auto&& geom) {return static_cast<JacobianInverseTransposed>(geom.jacobianInverseTransposed(local));}, localGeometry_);
+#else
+            return std::visit([&](auto&& geom) {return static_cast<JacobianInverseTransposed>(geom.jacobianInverseTransposed(local));}, localGeometry_);
+#endif
         }
 
     private: