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..ed4470e79e913502bf219e649b4cc08ad6734113 100644
--- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp
+++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27Test.cpp
@@ -3,19 +3,11 @@
 #include <filesystem>
 
 #include "ExchangeData27.h"
+#include "gpu/VirtualFluids_GPU/LBM/LB.h"
 
 #include <basics/config/ConfigurationFile.h>
 
-auto RealEq = [](auto value) { 
-#ifdef VF_DOUBLE_ACCURACY
-    return testing::DoubleEq(value); 
-#else 
-    return testing::FloatEq(value);
-#endif
-};
-
-
-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,84 +16,116 @@ SPtr<Parameter> initParameterClass(std::shared_ptr<Parameter> &para)
     return std::make_shared<Parameter>(config, 1, 0);
 }
 
-TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicationAfterFtoC)
+void setUpFsByCopyingF0(std::vector<real> &distributionVector, int numberOfNodes)
 {
-    int level = 0;
-    SPtr<Parameter> para = initParameterClass(para);
-    para->setMaxLevel(level + 1); // setMaxLevel resizes parH
-    para->initLBMSimulationParameter(); // init parH
-
-    // 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);
+    for (uint direction = 0; direction < dirEND; direction++) {
+        distributionVector.insert(distributionVector.end(), distributionVector.begin(),
+                                  distributionVector.begin() + numberOfNodes);
+    }
+}
 
+class ExchangeData27Test_CopyEdgeNodesXZTest : public testing::Test
+{
+protected:
+    SPtr<Parameter> para;
+    int level    = 0;
     int numNodes = 10;
-    int numNodesAfterFtoC = 5;
-    
-    
-    std::vector<ProcessNeighbor27> recvProcessNeighborHost(1);
-    std::vector<real> recvFs(numNodes, 0.5);
-    for (LBMSimulationParameter::EdgeNodePositions edgeNode : para->getParH(level)->edgeNodesXtoZ){
-        recvFs[edgeNode.indexInRecvBuffer] = 0.1;        
+    std::vector<real> recvFs;
+    std::vector<real> sendFs;    
+    std::vector<ProcessNeighbor27> sendProcessNeighborHost;
+    std::vector<ProcessNeighbor27> recvProcessNeighborHost;
+
+    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);
+
     }
-    for (uint direction = 0; direction <= dirEND; direction ++){
-        recvFs.insert(recvFs.end(), recvFs.begin(), recvFs.begin()+10);
+
+   void setUpRecvProcessNeighbors(int numberOfNodesInRecv)
+    {
+        recvFs.resize(numberOfNodesInRecv);
+        std::fill(recvFs.begin(), recvFs.end(), 0.5); // 0.5s should not be copied
+        for (LBMSimulationParameter::EdgeNodePositions edgeNode : para->getParH(level)->edgeNodesXtoZ) {
+            if(edgeNode.indexInRecvBuffer>numberOfNodesInRecv){
+                continue;
+            }
+            recvFs[edgeNode.indexInRecvBuffer] = 0.1; // 0.1s should be copied
+        }
+        setUpFsByCopyingF0(recvFs, numberOfNodesInRecv);
+
+        recvProcessNeighborHost.resize(1);
+        recvProcessNeighborHost[0].f[0]          = recvFs.data();
+        recvProcessNeighborHost[0].numberOfNodes = numberOfNodesInRecv;
     }
-    recvProcessNeighborHost[0].f[0] = recvFs.data();
-    recvProcessNeighborHost[0].numberOfNodes = numNodes;
 
+    void setUpSendProcessNeighbors(int numberOfNodesInSend)
+    {
+        sendFs.resize(27 * numberOfNodesInSend);
+        std::fill(sendFs.begin(), sendFs.end(), 0.0);
 
-    
-    std::vector<ProcessNeighbor27> sendProcessNeighborHost(1);
-    std::vector<real> sendFs(27*numNodesAfterFtoC, 0.0);
-    sendProcessNeighborHost[0].f[0] = sendFs.data();
-    sendProcessNeighborHost[0].numberOfNodes = numNodesAfterFtoC;
+        sendProcessNeighborHost.resize(1);
+        sendProcessNeighborHost[0].f[0]          = sendFs.data();
+        sendProcessNeighborHost[0].numberOfNodes = numberOfNodesInSend;
+    }
+};
+
+TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicationAfterFtoC_recvVectorFullSize)
+{
+    int numNodesAfterFtoC = 5; // indexInSend < 5 --> mode is in AfterFToC
+    setUpRecvProcessNeighbors(numNodes);
+    setUpSendProcessNeighbors(numNodesAfterFtoC);
 
     // expected
     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());
-    }
-    
+    setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC);
+
     // act
     copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost);
 
     // convert result to std::vector
     std::vector<real> result;
-    result.assign(sendProcessNeighborHost[0].f[0],  sendProcessNeighborHost[0].f[0] + 27*numNodesAfterFtoC);
+    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_CommunicationAfterFtoC_recvVectorShort)
 {
-    int level = 0;
-    SPtr<Parameter> para = initParameterClass(para);
-    para->setMaxLevel(level + 1); // setMaxLevel resizes parH
-    para->initLBMSimulationParameter(); // init parH
+    int numNodesAfterFtoC = 5; // indexInSend < 5 --> mode is in AfterFToC
+    setUpRecvProcessNeighbors(numNodesAfterFtoC);
+    setUpSendProcessNeighbors(numNodesAfterFtoC);
 
-    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);
+    // expected
+    std::vector<real> expectedFs(numNodesAfterFtoC, 0.0);
+    expectedFs[1] = 0.1;
+    expectedFs[3] = 0.1;
+    setUpFsByCopyingF0(expectedFs, numNodesAfterFtoC);
 
-    int numNodes = 10;
+    // act
+    copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost);
 
-    std::vector<ProcessNeighbor27> recvProcessNeighborHost(1);
-    std::vector<real> recvFs(27*numNodes, 0.1);
-    recvProcessNeighborHost[0].f[0] = recvFs.data();
-    recvProcessNeighborHost[0].numberOfNodes = numNodes;
-    
-    std::vector<ProcessNeighbor27> sendProcessNeighborHost(1);
-    std::vector<real> sendFs(27*numNodes, 0.0);
-    sendProcessNeighborHost[0].f[0] = sendFs.data();
-    sendProcessNeighborHost[0].numberOfNodes = numNodes;
+    // convert result to std::vector
+    std::vector<real> result;
+    result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27 * numNodesAfterFtoC);
 
+    EXPECT_THAT(result, testing::Eq(expectedFs));
+}
+
+TEST_F(ExchangeData27Test_CopyEdgeNodesXZTest, copyEdgeNodes_XZ_CommunicateAll)
+{
+    setUpRecvProcessNeighbors(numNodes);
+    setUpSendProcessNeighbors(numNodes);
 
     // expected
     std::vector<real> expectedFs(numNodes, 0.0);
@@ -109,17 +133,14 @@ TEST(ExchangeData27Test, copyEdgeNodes_XZ_CommunicateAll)
     expectedFs[3] = 0.1;
     expectedFs[6] = 0.1;
     expectedFs[8] = 0.1;
-    std::vector<real> expectedFsAllDirections;
-    for (uint direction = 0; direction <= dirEND; direction ++){
-        expectedFsAllDirections.insert(expectedFsAllDirections.end(), expectedFs.begin(), expectedFs.end());
-    }
-    
+    setUpFsByCopyingF0(expectedFs, numNodes);
+
     // act
     copyEdgeNodes(para->getParH(level)->edgeNodesXtoZ, recvProcessNeighborHost, sendProcessNeighborHost);
 
     // convert result to std::vector
     std::vector<real> result;
-    result.assign(sendProcessNeighborHost[0].f[0],  sendProcessNeighborHost[0].f[0] + 27*numNodes);
+    result.assign(sendProcessNeighborHost[0].f[0], sendProcessNeighborHost[0].f[0] + 27 * numNodes);
 
-    EXPECT_THAT(result, testing::Eq(expectedFsAllDirections));
+    EXPECT_THAT(result, testing::Eq(expectedFs));
 }
\ No newline at end of file