diff --git a/dumux/porousmediumflow/2p/sequential/impes/gridadaptionindicator.hh b/dumux/porousmediumflow/2p/sequential/impes/gridadaptionindicator.hh
index 60fa0c7054df3a45cfe2fda3725b7c340ebfe520..b960ae7c9ea5bdb81d9e1a7ca5d548e1180dd127 100644
--- a/dumux/porousmediumflow/2p/sequential/impes/gridadaptionindicator.hh
+++ b/dumux/porousmediumflow/2p/sequential/impes/gridadaptionindicator.hh
@@ -26,7 +26,7 @@
 
 #include <dumux/porousmediumflow/sequential/impetproperties.hh>
 #include <dumux/porousmediumflow/2p/sequential/properties.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 namespace Dumux {
 
@@ -144,7 +144,7 @@ public:
 
 #if HAVE_MPI
     // communicate updated values
-    using DataHandle = VectorExchange<ElementMapper, ScalarSolutionType>;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, ScalarSolutionType, 0/*elementCodim*/>;
     DataHandle dataHandle(problem_.elementMapper(), indicatorVector_);
     problem_.gridView().template communicate<DataHandle>(dataHandle,
                                                          Dune::InteriorBorder_All_Interface,
diff --git a/dumux/porousmediumflow/2p2c/sequential/fv2dtransportadaptive.hh b/dumux/porousmediumflow/2p2c/sequential/fv2dtransportadaptive.hh
index fd19773d8485fcc29cf802b697eb321763dbab20..b7937fb722fbd09beeeb9492edf157af861b8c27 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fv2dtransportadaptive.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fv2dtransportadaptive.hh
@@ -28,7 +28,7 @@
 #include <dune/common/float_cmp.hh>
 
 #include <dumux/common/math.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 #include "adaptiveproperties.hh"
 #include "fvtransport.hh"
@@ -305,7 +305,7 @@ void FV2dTransport2P2CAdaptive<TypeTag>::update(const Scalar t, Scalar& dt, Tran
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> > >;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> >, 0/*elementCodim*/>;
     for (int i = 0; i < updateVec.size(); i++)
     {
         DataHandle dataHandle(problem_.variables().elementMapper(), updateVec[i]);
diff --git a/dumux/porousmediumflow/2p2c/sequential/fv3dpressureadaptive.hh b/dumux/porousmediumflow/2p2c/sequential/fv3dpressureadaptive.hh
index 98ec017f9f5849d35840028a47999283e8176a92..e4972f7d469ae735358e2df1f315b33eac2e28cb 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fv3dpressureadaptive.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fv3dpressureadaptive.hh
@@ -35,6 +35,7 @@
 #include <dumux/common/math.hh>
 #include <dumux/io/vtkmultiwriter.hh>
 #include <dumux/porousmediumflow/2p2c/sequential/adaptiveproperties.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 // include pressure model from Markus
 #include <dumux/porousmediumflow/sequential/cellcentered/mpfa/properties.hh>
@@ -233,7 +234,7 @@ public:
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
     using PressureSolution = GetPropType<TypeTag, Properties::PressureSolutionVector>;
-    using DataHandle = VectorExchange<ElementMapper, PressureSolution>;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, PressureSolution, 0/*elementCodim*/>;
 
         DataHandle dataHandle(problem().variables().elementMapper(), this->pressure());
         problem().gridView().template communicate<DataHandle>(dataHandle,
diff --git a/dumux/porousmediumflow/2p2c/sequential/fv3dtransportadaptive.hh b/dumux/porousmediumflow/2p2c/sequential/fv3dtransportadaptive.hh
index 0a711471e1e0dfea29edadbd9a282bcfeb7047f2..0d62ab64aca023f87abc96ae093bc0733657da86 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fv3dtransportadaptive.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fv3dtransportadaptive.hh
@@ -28,7 +28,7 @@
 #include <dune/common/float_cmp.hh>
 
 #include <dumux/common/math.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 #include "adaptiveproperties.hh"
 #include "fvtransport.hh"
@@ -303,7 +303,7 @@ void FV3dTransport2P2CAdaptive<TypeTag>::update(const Scalar t, Scalar& dt,
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> > >;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> >, 0/*elementCodim*/>;
     for (int i = 0; i < updateVec.size(); i++)
     {
         DataHandle dataHandle(problem().variables().elementMapper(), updateVec[i]);
diff --git a/dumux/porousmediumflow/2p2c/sequential/fvmpfal3dinteractionvolumecontaineradaptive.hh b/dumux/porousmediumflow/2p2c/sequential/fvmpfal3dinteractionvolumecontaineradaptive.hh
index f5c1c2a69cf3b4a528e506074fd847b9384907be..c6cccc8f62cd89b2a3e9f388390a66203f1b4ae1 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fvmpfal3dinteractionvolumecontaineradaptive.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fvmpfal3dinteractionvolumecontaineradaptive.hh
@@ -26,7 +26,6 @@
 
 // dumux environment
 #include <dumux/porousmediumflow/2p/sequential/diffusion/mpfa/lmethod/3dinteractionvolumecontaineradaptive.hh>
-#include <dumux/linear/vectorexchange.hh>
 
 namespace Dumux {
 
diff --git a/dumux/porousmediumflow/2p2c/sequential/fvpressuremultiphysics.hh b/dumux/porousmediumflow/2p2c/sequential/fvpressuremultiphysics.hh
index 0d95a94d092e057a362737f850a730f3873f1214..8c49192fafe84ed0cd84f44fda469e9d1af663c9 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fvpressuremultiphysics.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fvpressuremultiphysics.hh
@@ -28,7 +28,7 @@
 
 // dumux environment
 #include <dumux/porousmediumflow/2p2c/sequential/fvpressure.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 #include <dumux/material/constraintsolvers/compositionalflash.hh>
 
 namespace Dumux {
@@ -223,7 +223,7 @@ public:
 protected:
     #if HAVE_MPI
         using ElementMapper = typename SolutionTypes::ElementMapper;
-        using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<int, 1> > >;
+        using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<int, 1> >, 0/*elementCodim*/>;
     #endif
 
     // subdomain map
diff --git a/dumux/porousmediumflow/2p2c/sequential/fvtransport.hh b/dumux/porousmediumflow/2p2c/sequential/fvtransport.hh
index ca31d807015f5509b91d1ad7f55a6e2f64569621..96df1dd835846ab62811639b6b8eacfb2fed6f4d 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fvtransport.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fvtransport.hh
@@ -33,7 +33,7 @@
 #include <dumux/porousmediumflow/2p2c/sequential/properties.hh>
 #include <dumux/material/constraintsolvers/compositionalflash.hh>
 #include <dumux/common/math.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 namespace Dumux {
 /*!
@@ -479,7 +479,7 @@ void FVTransport2P2C<TypeTag>::update(const Scalar t, Scalar& dt,
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> > >;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> >, 0/*elementCodim*/>;
     for (int i = 0; i < updateVec.size(); i++)
     {
         DataHandle dataHandle(problem_.variables().elementMapper(), updateVec[i]);
@@ -490,7 +490,7 @@ void FVTransport2P2C<TypeTag>::update(const Scalar t, Scalar& dt,
 
     if (localTimeStepping_)
     {
-        using TimeDataHandle = VectorExchange<ElementMapper, std::vector<LocalTimesteppingData> >;
+        using TimeDataHandle = VectorCommDataHandleEqual<ElementMapper, std::vector<LocalTimesteppingData>, 0/*elementCodim*/>;
 
         TimeDataHandle timeDataHandle(problem_.elementMapper(), timeStepData_);
         problem_.gridView().template communicate<TimeDataHandle>(timeDataHandle,
@@ -1318,7 +1318,7 @@ void FVTransport2P2C<TypeTag>::updatedTargetDt_(Scalar &dt)
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using TimeDataHandle = VectorExchange<ElementMapper, std::vector<LocalTimesteppingData> >;
+    using TimeDataHandle = VectorCommDataHandleEqual<ElementMapper, std::vector<LocalTimesteppingData>, 0/*elementCodim*/>;
 
     TimeDataHandle timeDataHandle(problem_.elementMapper(), timeStepData_);
     problem_.gridView().template communicate<TimeDataHandle>(timeDataHandle,
diff --git a/dumux/porousmediumflow/2p2c/sequential/fvtransportmultiphysics.hh b/dumux/porousmediumflow/2p2c/sequential/fvtransportmultiphysics.hh
index fb93249722be324bf74c43b9c76dea1c24f41a2a..4b962db5905f3d7fc7b70c739f488b334d82826b 100644
--- a/dumux/porousmediumflow/2p2c/sequential/fvtransportmultiphysics.hh
+++ b/dumux/porousmediumflow/2p2c/sequential/fvtransportmultiphysics.hh
@@ -25,7 +25,7 @@
 #define DUMUX_FVTRANSPORT2P2C_MULTIPHYSICS_HH
 
 #include <dumux/porousmediumflow/2p2c/sequential/fvtransport.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 
 namespace Dumux {
 /*!
@@ -236,7 +236,7 @@ void FVTransport2P2CMultiPhysics<TypeTag>::update(const Scalar t, Scalar& dt, Tr
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> > >;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> >, 0/*elementCodim*/>;
     for (int i = 0; i < updateVec.size(); i++)
     {
         DataHandle dataHandle(problem().variables().elementMapper(), updateVec[i]);
diff --git a/dumux/porousmediumflow/sequential/cellcentered/transport.hh b/dumux/porousmediumflow/sequential/cellcentered/transport.hh
index ec0e35e7576c9e0e1920ef06733c4f9e38fcc1da..fe564c699c737614b938cb0f535a799c26e6708c 100644
--- a/dumux/porousmediumflow/sequential/cellcentered/transport.hh
+++ b/dumux/porousmediumflow/sequential/cellcentered/transport.hh
@@ -22,7 +22,7 @@
 #include <dune/grid/common/gridenums.hh>
 #include <dumux/porousmediumflow/sequential/transportproperties.hh>
 #include <dumux/porousmediumflow/sequential/properties.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 #include <unordered_map>
 
 /**
@@ -416,7 +416,7 @@ void FVTransport<TypeTag>::update(const Scalar t, Scalar& dt, TransportSolutionT
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using DataHandle = VectorExchange<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> > >;
+    using DataHandle = VectorCommDataHandleEqual<ElementMapper, Dune::BlockVector<Dune::FieldVector<Scalar, 1> >, 0/*elementCodim*/>;
     DataHandle dataHandle(problem_.elementMapper(), updateVec);
     problem_.gridView().template communicate<DataHandle>(dataHandle,
                                                          Dune::InteriorBorder_All_Interface,
@@ -424,7 +424,7 @@ void FVTransport<TypeTag>::update(const Scalar t, Scalar& dt, TransportSolutionT
 
     if (localTimeStepping_)
     {
-    using TimeDataHandle = VectorExchange<ElementMapper, std::vector<LocalTimesteppingData> >;
+    using TimeDataHandle = VectorCommDataHandleEqual<ElementMapper, std::vector<LocalTimesteppingData>, 0/*elementCodim*/>;
 
     TimeDataHandle timeDataHandle(problem_.elementMapper(), timeStepData_);
     problem_.gridView().template communicate<TimeDataHandle>(timeDataHandle,
@@ -549,7 +549,7 @@ void FVTransport<TypeTag>::updatedTargetDt_(Scalar &dt)
     // communicate updated values
     using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
     using ElementMapper = typename SolutionTypes::ElementMapper;
-    using TimeDataHandle = VectorExchange<ElementMapper, std::vector<LocalTimesteppingData> >;
+    using TimeDataHandle = VectorCommDataHandleEqual<ElementMapper, std::vector<LocalTimesteppingData>, 0/*elementCodim*/>;
 
     TimeDataHandle timeDataHandle(problem_.elementMapper(), timeStepData_);
     problem_.gridView().template communicate<TimeDataHandle>(timeDataHandle,
diff --git a/dumux/porousmediumflow/sequential/variableclassadaptive.hh b/dumux/porousmediumflow/sequential/variableclassadaptive.hh
index 43bf606420d5b14df6282b7753b19803333bf368..cc0f65aa9af8b698cd86b22b5b7ef712726bd0e2 100644
--- a/dumux/porousmediumflow/sequential/variableclassadaptive.hh
+++ b/dumux/porousmediumflow/sequential/variableclassadaptive.hh
@@ -21,7 +21,7 @@
 
 #include <dune/grid/common/partitionset.hh>
 #include <dune/grid/utility/persistentcontainer.hh>
-#include <dumux/linear/vectorexchange.hh>
+#include <dumux/parallel/vectorcommdatahandle.hh>
 #include "variableclass.hh"
 
 /**
@@ -200,7 +200,7 @@ public:
         // communicate ghost data
         using SolutionTypes = GetProp<TypeTag, Properties::SolutionTypes>;
         using ElementMapper = typename SolutionTypes::ElementMapper;
-        using DataHandle = VectorExchange<ElementMapper, std::vector<CellData> >;
+        using DataHandle = VectorCommDataHandleEqual<ElementMapper, std::vector<CellData>, 0/*elementCodim*/>;
         DataHandle dataHandle(problem.elementMapper(), this->cellDataGlobal());
         problem.gridView().template communicate<DataHandle>(dataHandle,
                                                             Dune::InteriorBorder_All_Interface,