diff --git a/CHANGELOG.md b/CHANGELOG.md
index 496998179e0b5d9158c0c2f058abaddba41273ab..0e91d76c92abe09f34ee163c1e4ed5c0c3b2f955 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@ be evaluated with the function values provided in the same order as the names wh
 ### Immediate interface changes not allowing/requiring a deprecation period:
 
 - __Newton__: The Newton solver no longer supports linear solvers without a `norm` interface when computing the resisual norm is required. The linear solvers available in Dumux all have such an interface.
+- __MultiDomain__: The MDTraits are now required to state the LocalResidual type in the Subdomain policy (see multidomain/traits.hh). This only affects users that created their own MDTraits and don't use the default MDTraits.
 
 ### Deprecated properties/classes/functions/files, to be removed after 3.8:
 
diff --git a/dumux/assembly/cvfelocalassembler.hh b/dumux/assembly/cvfelocalassembler.hh
index e6bcf1fbe82e10e7e41b918431a5f1641633cdc2..a057f660c233821e51004631582e23f99f760954 100644
--- a/dumux/assembly/cvfelocalassembler.hh
+++ b/dumux/assembly/cvfelocalassembler.hh
@@ -326,7 +326,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/t
 
 public:
 
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -475,7 +475,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/f
 
 public:
 
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -584,7 +584,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*implicit=*/
 
 public:
 
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -704,7 +704,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*implicit=*/
 
 public:
 
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
diff --git a/dumux/assembly/fclocalassembler.hh b/dumux/assembly/fclocalassembler.hh
index 54c0ec0bef130818c309720cce3c2dfe9c9606f2..10a9ce1408b5f0437e99082dfdf96fc87ec2cc8a 100644
--- a/dumux/assembly/fclocalassembler.hh
+++ b/dumux/assembly/fclocalassembler.hh
@@ -313,7 +313,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*impl
 
 public:
 
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -521,7 +521,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*impl
     enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() };
 
 public:
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -633,7 +633,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*imp
     enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() };
 
 public:
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
@@ -756,7 +756,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*imp
     enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() };
 
 public:
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
     using ParentType::ParentType;
 
diff --git a/dumux/assembly/fvlocalassemblerbase.hh b/dumux/assembly/fvlocalassemblerbase.hh
index c26cec659124d9742dea2d8c631b5d6deb0933d8..51790248bc09fdd65cac3558228c79dd5a5167f3 100644
--- a/dumux/assembly/fvlocalassemblerbase.hh
+++ b/dumux/assembly/fvlocalassemblerbase.hh
@@ -52,7 +52,7 @@ class FVLocalAssemblerBase
     static constexpr auto numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq();
 
 public:
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = std::decay_t<decltype(std::declval<Assembler>().localResidual())>;
     using ElementResidualVector = typename LocalResidual::ElementResidualVector;
 
     /*!
diff --git a/dumux/geomechanics/poroelastic/couplingmanager.hh b/dumux/geomechanics/poroelastic/couplingmanager.hh
index bfcf73137d7fa48dd5fa5a2feab397c87758c0ac..4d1da76a8d8ada5536a5e0515f03b413b114c394 100644
--- a/dumux/geomechanics/poroelastic/couplingmanager.hh
+++ b/dumux/geomechanics/poroelastic/couplingmanager.hh
@@ -47,7 +47,6 @@ class PoroMechanicsCouplingManager : public virtual CouplingManager< MDTraits >
     // further types specific to the sub-problems
     template<std::size_t id> using Scalar = GetPropType<SubDomainTypeTag<id>, Properties::Scalar>;
     template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
-    template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
     template<std::size_t id> using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>;
     template<std::size_t id> using PrimaryVariables = typename GridVariables<id>::PrimaryVariables;
     template<std::size_t id> using GridVolumeVariables = typename GridVariables<id>::GridVolumeVariables;
@@ -293,11 +292,10 @@ public:
      *        and the storage term here.
      */
     template< class PMFlowLocalAssembler >
-    typename LocalResidual<PMFlowId>::ElementResidualVector
-    evalCouplingResidual(Dune::index_constant<PMFlowId> pmFlowDomainId,
-                         const PMFlowLocalAssembler& pmFlowLocalAssembler,
-                         Dune::index_constant<PoroMechId> poroMechDomainId,
-                         GridIndexType<PoroMechId> dofIdxGlobalJ)
+    auto evalCouplingResidual(Dune::index_constant<PMFlowId> pmFlowDomainId,
+                              const PMFlowLocalAssembler& pmFlowLocalAssembler,
+                              Dune::index_constant<PoroMechId> poroMechDomainId,
+                              GridIndexType<PoroMechId> dofIdxGlobalJ)
     {
         auto res = pmFlowLocalAssembler.localResidual().evalFluxAndSource(pmFlowLocalAssembler.element(),
                                                                           pmFlowLocalAssembler.fvGeometry(),
@@ -322,11 +320,10 @@ public:
      *        the fluxes as well as the source term here.
      */
     template< class PoroMechLocalAssembler >
-    typename LocalResidual<PoroMechId>::ElementResidualVector
-    evalCouplingResidual(Dune::index_constant<PoroMechId> poroMechDomainId,
-                         const PoroMechLocalAssembler& poroMechLocalAssembler,
-                         Dune::index_constant<PMFlowId> pmFlowDomainId,
-                         GridIndexType<PMFlowId> dofIdxGlobalJ)
+    auto evalCouplingResidual(Dune::index_constant<PoroMechId> poroMechDomainId,
+                              const PoroMechLocalAssembler& poroMechLocalAssembler,
+                              Dune::index_constant<PMFlowId> pmFlowDomainId,
+                              GridIndexType<PMFlowId> dofIdxGlobalJ)
     {
         return poroMechLocalAssembler.localResidual().evalFluxAndSource(poroMechLocalAssembler.element(),
                                                                         poroMechLocalAssembler.fvGeometry(),
diff --git a/dumux/multidomain/assemblerview.hh b/dumux/multidomain/assemblerview.hh
new file mode 100644
index 0000000000000000000000000000000000000000..c6ff03bbdaad90c2b3a30986111009ee4cacefc4
--- /dev/null
+++ b/dumux/multidomain/assemblerview.hh
@@ -0,0 +1,66 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+//
+// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+/*!
+ * \file
+ * \ingroup MultiDomain
+ * \ingroup Assembly
+ * \brief Subdomain-specific views on multidomain assemblers.
+ */
+#ifndef DUMUX_MULTIDOMAIN_ASSEMBLER_VIEW_HH
+#define DUMUX_MULTIDOMAIN_ASSEMBLER_VIEW_HH
+
+namespace Dumux {
+
+/*!
+ * \ingroup MultiDomain
+ * \ingroup Assembly
+ * \brief Subdomain-specific view on a multidomain assembler.
+ *        Allows retrieval of sub-domain specific objects w/o passing a domain id.
+ * \todo This is not necessarily fv-specifiv (could be in other header).
+ * \todo Can we get rid of some of the interfaces?
+ */
+template<typename MDAssembler, std::size_t domainId>
+class MultiDomainAssemblerSubDomainView
+{
+    static constexpr Dune::index_constant<domainId> myId{};
+
+public:
+    using CouplingManager = typename MDAssembler::CouplingManager;
+    using SolutionVector = typename MDAssembler::SolutionVector;
+
+    MultiDomainAssemblerSubDomainView(MDAssembler& assembler, Dune::index_constant<domainId>)
+    : assembler_{assembler}
+    {}
+
+    template<std::size_t i>
+    auto localResidual(Dune::index_constant<i> id) const { return assembler_.localResidual(id); }
+    auto localResidual() const { return assembler_.localResidual(myId); }
+
+    template<std::size_t i>
+    const auto& problem(Dune::index_constant<i> id) const { return assembler_.problem(id); }
+    const auto& problem() const { return assembler_.problem(myId); }
+
+    template<std::size_t i>
+    const auto& gridGeometry(Dune::index_constant<i> id) const { return assembler_.gridGeometry(id); }
+    const auto& gridGeometry() const { return assembler_.gridGeometry(myId); }
+
+    template<std::size_t i>
+    const auto& gridVariables(Dune::index_constant<i> id) const { return assembler_.gridVariables(id); }
+    const auto& gridVariables() const { return assembler_.gridVariables(myId); }
+
+    const auto& prevSol() const { return assembler_.prevSol(); }
+    bool isStationaryProblem() const { return assembler_.isStationaryProblem(); }
+
+    static constexpr bool isImplicit() { return MDAssembler::isImplicit(); }
+
+private:
+    MDAssembler& assembler_;
+};
+
+} // end namespace Dumux
+
+#endif
diff --git a/dumux/multidomain/facet/box/couplingmanager.hh b/dumux/multidomain/facet/box/couplingmanager.hh
index 2e79e1f8b8161a436910f29037f9cd5fb3861bdf..dbfe8ab4d49885239991fe0d65b2fe73b24b44b1 100644
--- a/dumux/multidomain/facet/box/couplingmanager.hh
+++ b/dumux/multidomain/facet/box/couplingmanager.hh
@@ -55,7 +55,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI
     template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
     template<std::size_t id> using NumEqVector = Dumux::NumEqVector<PrimaryVariables<id>>;
     template<std::size_t id> using ElementBoundaryTypes = GetPropType<SubDomainTypeTag<id>, Properties::ElementBoundaryTypes>;
-    template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
+    template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual;
 
     template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>;
     template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView;
diff --git a/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh b/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh
index 056e342116a4b4d28358c2533f3edac61fe56e51..4421089b69198fe753561a490dcb1c2e6c7690fa 100644
--- a/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh
+++ b/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh
@@ -65,7 +65,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI
     template<std::size_t id> using GridView = typename GridGeometry<id>::GridView;
     template<std::size_t id> using GridIndexType = typename IndexTraits< GridView<id> >::GridIndex;
     template<std::size_t id> using Element = typename GridView<id>::template Codim<0>::Entity;
-    template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
+    template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual;
 
     template<std::size_t id> using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>;
     template<std::size_t id> using GridVolumeVariables = typename GridVariables<id>::GridVolumeVariables;
diff --git a/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh b/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh
index 362d5156c853d4c60d096e37f60b98512df6779c..fc9a2f2fe5c948d4a1133b2a251267b9f356c3fe 100644
--- a/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh
+++ b/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh
@@ -55,7 +55,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI
     template<std::size_t id> using PrimaryVariables = GetPropType<SubDomainTypeTag<id>, Properties::PrimaryVariables>;
     template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
     template<std::size_t id> using NumEqVector = Dumux::NumEqVector<PrimaryVariables<id>>;
-    template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
+    template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual;
 
     template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>;
     template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView;
diff --git a/dumux/multidomain/facet/couplingmanager.hh b/dumux/multidomain/facet/couplingmanager.hh
index 8bfbc9a0298e6368eff8cd21176c22cc37813d55..da7122e8981caa33df4f93ff149aa42ee4c78adf 100644
--- a/dumux/multidomain/facet/couplingmanager.hh
+++ b/dumux/multidomain/facet/couplingmanager.hh
@@ -118,7 +118,6 @@ class FacetCouplingThreeDomainManager
     template<std::size_t id> using SubDomainTypeTag = typename MDTraits::template SubDomain<id>::TypeTag;
 
     // further types specific to the sub-problems
-    template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
     template<std::size_t id> using PrimaryVariables = GetPropType<SubDomainTypeTag<id>, Properties::PrimaryVariables>;
     template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
 
@@ -257,13 +256,13 @@ public:
              std::size_t j,
              class LocalAssembler,
              std::enable_if_t<((i==bulkId && j==edgeId) || ((i==edgeId && j==bulkId))), int> = 0>
-    typename LocalResidual<i>::ElementResidualVector
+    typename LocalAssembler::LocalResidual::ElementResidualVector
     evalCouplingResidual(Dune::index_constant<i> domainI,
                          const LocalAssembler& localAssembler,
                          Dune::index_constant<j> domainJ,
                          GridIndexType<j> dofIdxGlobalJ)
     {
-        typename LocalResidual<i>::ElementResidualVector res(1);
+        typename LocalAssembler::LocalResidual::ElementResidualVector res(1);
         res = 0.0;
         return res;
     }
diff --git a/dumux/multidomain/fvassembler.hh b/dumux/multidomain/fvassembler.hh
index 95b0800280a61677c51a508fb26a23ca33f0e294..d619eba11fb582f843cf271c32a461b85de1afb7 100644
--- a/dumux/multidomain/fvassembler.hh
+++ b/dumux/multidomain/fvassembler.hh
@@ -36,6 +36,7 @@
 #include "subdomaincvfelocalassembler.hh"
 #include "subdomainstaggeredlocalassembler.hh"
 #include "subdomainfclocalassembler.hh"
+#include "assemblerview.hh"
 
 #include <dumux/discretization/method.hh>
 
@@ -124,37 +125,40 @@ private:
     using TimeLoop = TimeLoopBase<Scalar>;
     using ThisType = MultiDomainFVAssembler<MDTraits, CouplingManager, diffMethod, isImplicit()>;
 
+    template<std::size_t id>
+    using SubDomainAssemblerView = MultiDomainAssemblerSubDomainView<ThisType, id>;
+
     template<class DiscretizationMethod, std::size_t id>
     struct SubDomainAssemblerType;
 
     template<std::size_t id>
     struct SubDomainAssemblerType<DiscretizationMethods::CCTpfa, id>
     {
-        using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>;
+        using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>;
     };
 
     template<std::size_t id>
     struct SubDomainAssemblerType<DiscretizationMethods::CCMpfa, id>
     {
-        using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>;
+        using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>;
     };
 
     template<std::size_t id, class DM>
     struct SubDomainAssemblerType<DiscretizationMethods::CVFE<DM>, id>
     {
-        using type = SubDomainCVFELocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>;
+        using type = SubDomainCVFELocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>;
     };
 
     template<std::size_t id>
     struct SubDomainAssemblerType<DiscretizationMethods::Staggered, id>
     {
-        using type = SubDomainStaggeredLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>;
+        using type = SubDomainStaggeredLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>;
     };
 
     template<std::size_t id>
     struct SubDomainAssemblerType<DiscretizationMethods::FCStaggered, id>
     {
-        using type = SubDomainFaceCenteredLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>;
+        using type = SubDomainFaceCenteredLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>;
     };
 
     template<std::size_t id>
@@ -501,7 +505,8 @@ private:
     {
         assemble_(domainId, [&](const auto& element)
         {
-            SubDomainAssembler<i> subDomainAssembler(*this, element, curSol, *couplingManager_);
+            MultiDomainAssemblerSubDomainView view{*this, domainId};
+            SubDomainAssembler<i> subDomainAssembler(view, element, curSol, *couplingManager_);
             subDomainAssembler.assembleJacobianAndResidual(jacRow, subRes, gridVariablesTuple_);
         });
     }
@@ -512,7 +517,8 @@ private:
     {
         assemble_(domainId, [&](const auto& element)
         {
-            SubDomainAssembler<i> subDomainAssembler(*this, element, curSol, *couplingManager_);
+            MultiDomainAssemblerSubDomainView view{*this, domainId};
+            SubDomainAssembler<i> subDomainAssembler(view, element, curSol, *couplingManager_);
             subDomainAssembler.assembleResidual(subRes);
         });
     }
diff --git a/dumux/multidomain/staggeredtraits.hh b/dumux/multidomain/staggeredtraits.hh
index 3272c30c5126117e369ddcc8b5480878d186ae26..7645a47ae8b13d3f89990a7423490c7d4a8c237d 100644
--- a/dumux/multidomain/staggeredtraits.hh
+++ b/dumux/multidomain/staggeredtraits.hh
@@ -190,6 +190,7 @@ public:
         using Index = Dune::index_constant<id>;
         using TypeTag = SubDomainTypeTag<id>;
         using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
+        using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
         using GridGeometry = typename Detail::Staggered::SubDomainFVGridGeometryImpl<SubDomainTypeTag, id>::type;
         using GridVariables = typename Detail::Staggered::SubDomainGridVariablesImpl<SubDomainTypeTag, id>::type;
         using SolutionVector = typename Detail::Staggered::SubDomainSolutionVectorImpl<SubDomainTypeTag, id>::type;
diff --git a/dumux/multidomain/subdomaincclocalassembler.hh b/dumux/multidomain/subdomaincclocalassembler.hh
index 4cbba1046346530e25651a0c5de3d4a450714cb9..c03e85604e66c05b7974cde4412c578f312db9f9 100644
--- a/dumux/multidomain/subdomaincclocalassembler.hh
+++ b/dumux/multidomain/subdomaincclocalassembler.hh
@@ -76,7 +76,7 @@ public:
     //! export the domain id of this sub-domain
     static constexpr auto domainId = typename Dune::index_constant<id>();
     //! the local residual type of this domain
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
+    using LocalResidual = typename ParentType::LocalResidual;
     //! pull up constructor of parent class
     using ParentType::ParentType;
 
diff --git a/dumux/multidomain/subdomainstaggeredlocalassembler.hh b/dumux/multidomain/subdomainstaggeredlocalassembler.hh
index aab6fdf4e96127b3f4311cb92ca03b05cc47b8f8..2618653cd06254c8c3b2745835eb8abe696232fc 100644
--- a/dumux/multidomain/subdomainstaggeredlocalassembler.hh
+++ b/dumux/multidomain/subdomainstaggeredlocalassembler.hh
@@ -47,7 +47,6 @@ class SubDomainStaggeredLocalAssemblerBase : public FVLocalAssemblerBase<TypeTag
     using ParentType = FVLocalAssemblerBase<TypeTag, Assembler,Implementation, isImplicit>;
 
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
     using SolutionVector = typename Assembler::SolutionVector;
 
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
@@ -56,8 +55,8 @@ class SubDomainStaggeredLocalAssemblerBase : public FVLocalAssemblerBase<TypeTag
     using Scalar = typename GridVariables::Scalar;
 
     using ElementFaceVariables = typename GetPropType<TypeTag, Properties::GridFaceVariables>::LocalView;
-    using CellCenterResidualValue = typename LocalResidual::CellCenterResidualValue;
-    using FaceResidualValue = typename LocalResidual::FaceResidualValue;
+    using CellCenterResidualValue = typename ParentType::LocalResidual::CellCenterResidualValue;
+    using FaceResidualValue = typename ParentType::LocalResidual::FaceResidualValue;
 
     using GridGeometry = typename GridVariables::GridGeometry;
     using FVElementGeometry = typename GridGeometry::LocalView;
@@ -471,9 +470,8 @@ class SubDomainStaggeredLocalAssembler<id, TypeTag, Assembler, DiffMethod::numer
     using ThisType = SubDomainStaggeredLocalAssembler<id, TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/true>;
     using ParentType = SubDomainStaggeredLocalAssemblerImplicitBase<id, TypeTag, Assembler, ThisType>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
-    using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
-    using CellCenterResidualValue = typename LocalResidual::CellCenterResidualValue;
-    using FaceResidualValue = typename LocalResidual::FaceResidualValue;
+    using CellCenterResidualValue = typename ParentType::LocalResidual::CellCenterResidualValue;
+    using FaceResidualValue = typename ParentType::LocalResidual::FaceResidualValue;
     using Element = typename GetPropType<TypeTag, Properties::GridGeometry>::GridView::template Codim<0>::Entity;
     using GridFaceVariables = GetPropType<TypeTag, Properties::GridFaceVariables>;
     using ElementFaceVariables = typename GetPropType<TypeTag, Properties::GridFaceVariables>::LocalView;
diff --git a/dumux/multidomain/traits.hh b/dumux/multidomain/traits.hh
index a29dc0bbec15646f33cb019132570c1159c52483..4980f209bbf491d08aff189fa81f6daa1188879c 100644
--- a/dumux/multidomain/traits.hh
+++ b/dumux/multidomain/traits.hh
@@ -175,7 +175,8 @@ public:
         using Grid = GetPropType<SubDomainTypeTag<id>, Properties::Grid>;
         using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>;
         using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>;
-        using GridVariables =GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>;
+        using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>;
+        using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>;
         using IOFields = GetPropType<SubDomainTypeTag<id>, Properties::IOFields>;
         using SolutionVector = GetPropType<SubDomainTypeTag<id>, Properties::SolutionVector>;
         using ResidualVector = typename Detail::NativeDuneVectorType<SolutionVector>::type;