diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
index 5eceb4beb3d896cd37cecec5d505b8f522f29d6e..2f2e57bf4f97600012d1dad835956e89c5722b91 100644
--- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
+++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp
@@ -252,7 +252,7 @@ void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator *comm, CudaMe
     if (para->getUseStreams() && para->getNumberOfProcessNeighborsX(level, "recv") > 0 && para->getParH(level)->sendProcessNeighborY.size() != 0) {
         if(  para->getParH(level)->sendProcessNeighborY[0].numberOfNodes == (*sendProcessNeighborHost)[0].numberOfNodes){
             // check if in communication of all nodes (as opposed to reduced communication after fine to coarse)
-           copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborX, *sendProcessNeighborHost);
+            copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborX, *sendProcessNeighborHost);
         } else{
             copyEdgeNodes(para->getParH(level)->edgeNodesXtoY, para->getParH(level)->recvProcessNeighborsAfterFtoCX, *sendProcessNeighborHost);
         }
diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp
index 0da86e64d4a477155e8897ca180018f1326604e7..72b96effb0fc142c9e231fa4d1ec16078f358e78 100644
--- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp
+++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp
@@ -15,7 +15,7 @@ auto RealEq = [](auto value) {
 };
 
 
-SPtr<Parameter> initParameterClass(std::shared_ptr<Parameter> &para)
+SPtr<Parameter> initParameterClass()
 {
     std::filesystem::path filePath = __FILE__; //  assuming that the config file is stored parallel to this file.
     filePath.replace_filename("ExchangeData27Test.cfg");
@@ -24,36 +24,45 @@ SPtr<Parameter> initParameterClass(std::shared_ptr<Parameter> &para)
     return std::make_shared<Parameter>(config, 1, 0);
 }
 
-TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC)
-{
-    int level = 0;
-    SPtr<Parameter> para = initParameterClass(para);
-    para->setMaxLevel(level + 1); // setMaxLevel resizes parH
-    para->initLBMSimulationParameter(); // init parH
+class ExchangeData27Test_CopyEdgeNodesXZTest: public testing::Test{
+    protected:
+        SPtr<Parameter> para;
+        int level = 0;
+        int numNodes = 10;
 
-    // indexInSend < 5 --> in AfterFToC
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,1,0,1);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,2,0,3);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8);
 
-    int numNodes = 10;
-    int numNodesAfterFtoC = 5;
-    
-    
+    void SetUp() override {
+        para = initParameterClass();
+        para->setMaxLevel(level + 1); // setMaxLevel resizes parH
+        para->initLBMSimulationParameter(); // init parH
+
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,1,0,1);
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6);
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,2,0,3);
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8);    
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8);
+        para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8);    
+    }
+};
+
+
+TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAfterFtoC_recvVectorFullSize)
+{ 
+    int numNodesAfterFtoC = 5; // indexInSend < 5 --> in AfterFToC
+
+    // recvProcessNeighborHost
     std::vector<ProcessNeighbor27> recvProcessNeighborHost(1);
-    std::vector<real> recvFs(numNodes, 0.5);
+    std::vector<real> recvFs(numNodes, 0.5);    
     for (LBMSimulationParameter::EdgeNodePositions edgeNode : para->getParH(level)->edgeNodesXtoZ){
         recvFs[edgeNode.indexInRecvBuffer] = 0.1;        
     }
-    for (uint direction = 0; direction <= dirEND; direction ++){
-        recvFs.insert(recvFs.end(), recvFs.begin(), recvFs.begin()+10);
+    for (uint direction = 0; direction < dirEND; direction ++){
+        recvFs.insert(recvFs.end(), recvFs.begin(), recvFs.begin()+numNodes);
     }
     recvProcessNeighborHost[0].f[0] = recvFs.data();
     recvProcessNeighborHost[0].numberOfNodes = numNodes;
 
-
-    
+    // sendProcessNeighborHost
     std::vector<ProcessNeighbor27> sendProcessNeighborHost(1);
     std::vector<real> sendFs(27*numNodesAfterFtoC, 0.0);
     sendProcessNeighborHost[0].f[0] = sendFs.data();
@@ -63,9 +72,9 @@ TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC)
     std::vector<real> expectedFs(numNodesAfterFtoC, 0.0);
     expectedFs[1] = 0.1;
     expectedFs[3] = 0.1;
-    std::vector<real> expectedFsAllDirections;
-    for (uint direction = 0; direction <= dirEND; direction ++){
-        expectedFsAllDirections.insert(expectedFsAllDirections.end(), expectedFs.begin(), expectedFs.end());
+    // std::vector<real> expectedFs;
+    for (uint direction = 0; direction < dirEND; direction ++){
+        expectedFs.insert(expectedFs.end(), expectedFs.begin(), expectedFs.begin()+numNodesAfterFtoC);
     }
     
     // act
@@ -75,28 +84,20 @@ TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC)
     std::vector<real> result;
     result.assign(sendProcessNeighborHost[0].f[0],  sendProcessNeighborHost[0].f[0] + 27*numNodesAfterFtoC);
 
-    EXPECT_THAT(result, testing::Eq(expectedFsAllDirections));
+    EXPECT_THAT(result, testing::Eq(expectedFs));
 }
 
-TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicateAll)
+TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicateAll)
 {
-    int level = 0;
-    SPtr<Parameter> para = initParameterClass(para);
-    para->setMaxLevel(level + 1); // setMaxLevel resizes parH
-    para->initLBMSimulationParameter(); // init parH
-
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,1,0,1);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,6,0,6);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,2,0,3);
-    para->getParH(level)->edgeNodesXtoZ.emplace_back(0,7,0,8);
-
     int numNodes = 10;
 
+    // recvProcessNeighborHost
     std::vector<ProcessNeighbor27> recvProcessNeighborHost(1);
     std::vector<real> recvFs(27*numNodes, 0.1);
     recvProcessNeighborHost[0].f[0] = recvFs.data();
     recvProcessNeighborHost[0].numberOfNodes = numNodes;
     
+    // sendProcessNeighborHost
     std::vector<ProcessNeighbor27> sendProcessNeighborHost(1);
     std::vector<real> sendFs(27*numNodes, 0.0);
     sendProcessNeighborHost[0].f[0] = sendFs.data();