diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
index bcca1cdaf50423deb2dde1b07844d8a21a00fc33..77f678ab01ce63f10726780db842923b46690c7b 100644
--- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -386,8 +386,15 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std
    // std::cout << "Process " << comm->getPID() <<": used device memory" << cudaManager->getMemsizeGPU() / 1000000.0 << " MB\n" << std::endl;
    //////////////////////////////////////////////////////////////////////////
 
-   //InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get());
+   InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get());
    //InterfaceDebugWriter::writeInterfaceLinesDebugFC(para.get());
+
+   // writers for Version with communication hiding
+   if(para->getNumprocs() > 1 && para->getUseStreams()){
+   	InterfaceDebugWriter::writeInterfaceFCC_Send(para.get());
+   	InterfaceDebugWriter::writeSendNodesStream(para.get());
+   	InterfaceDebugWriter::writeRecvNodesStream(para.get());
+   }
 }
 
 void Simulation::allocNeighborsOffsetsScalesAndBoundaries(SPtr<GridProvider> &gridProvider)
diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
index ef7e7714feb6d3e00294d5a5f6cce12b79486996..6039991a7791878dc019f21d4fa9702f25ed9ed5 100644
--- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
+++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.hpp
@@ -714,6 +714,180 @@ namespace InterfaceDebugWriter
 			WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec,nodesVec, datanames, nodedata);
 		}
 	}
+
+    void addToNodesVector(const int level, const int pos, std::vector< UbTupleFloat3 >& nodesVec, Parameter* para){
+        double x1 = para->getParH(level)->coordX_SP[pos];
+		double x2 = para->getParH(level)->coordY_SP[pos];
+		double x3 = para->getParH(level)->coordZ_SP[pos];
+		nodesVec.push_back( makeUbTuple( (float)(x1),(float)(x2),(float)(x3) ) );
+    }
+
+    void writeSendNodesStream(Parameter* para){
+		std::vector< UbTupleFloat3 > nodesVec;
+
+		// nodedata
+		std::vector< std::string > datanames = {"sparse index", "sendDirection", "sendDirectionInCommAfterFtoC", "inICcellFCC"};
+		// sendDirection: x = 2, y = 4, z = 8
+		std::vector< std::vector<double>> nodedata;
+        nodedata.resize(datanames.size());
+
+        int pos;
+        int sendDirectionInCommAfterFtoC;
+		for (int level = 0; level < para->getMaxLevel(); level++)
+		{
+            // X
+            for (int pn = 0; pn <(int)para->getParH(level)->sendProcessNeighborX.size(); pn++){
+                for (int i = 0; i < para->getParH(level)->sendProcessNeighborX[pn].numberOfNodes; i++){                    
+                    pos = para->getParH(level)->sendProcessNeighborX[pn].index[i];    
+                    nodedata[0].push_back(pos);
+                    addToNodesVector(level, pos, nodesVec, para);
+
+                    nodedata[1].push_back(2.0);
+					sendDirectionInCommAfterFtoC = (i < para->getParH(level)->sendProcessNeighborsAfterFtoCX[pn].numberOfNodes) ? 2.0: 0.0;
+                    nodedata[2].push_back(sendDirectionInCommAfterFtoC);                
+                }
+            }
+
+            // Y 
+            for (int pn = 0; pn <(int)para->getParH(level)->sendProcessNeighborY.size(); pn++){              
+                for (int i = 0; i < para->getParH(level)->sendProcessNeighborY[pn].numberOfNodes; i++){
+                    pos = para->getParH(level)->sendProcessNeighborY[pn].index[i];
+                    
+					sendDirectionInCommAfterFtoC=(i < para->getParH(level)->sendProcessNeighborsAfterFtoCY[pn].numberOfNodes) ? 4.0 : 0.0;
+
+                    auto it = std::find(nodedata[0].begin(), nodedata[0].end(), pos);
+                    if(it == nodedata[0].end()){
+                        nodedata[0].push_back(pos);                        
+                        addToNodesVector(level, pos, nodesVec, para);
+                        nodedata[1].push_back(4.0);
+                        nodedata[2].push_back(sendDirectionInCommAfterFtoC);    
+                    }else{
+                        int posInVectors = it - nodedata[0].begin();
+                        nodedata[1][posInVectors] += 4.0;
+                        nodedata[2][posInVectors] += sendDirectionInCommAfterFtoC;
+                    }
+                }
+            }
+
+            // Z 
+            for (int pn = 0; pn <(int)para->getParH(level)->sendProcessNeighborZ.size(); pn++){ 
+                for (int i = 0; i < para->getParH(level)->sendProcessNeighborZ[pn].numberOfNodes; i++){
+                    pos = para->getParH(level)->sendProcessNeighborZ[pn].index[i];
+
+					sendDirectionInCommAfterFtoC=(i < para->getParH(level)->sendProcessNeighborsAfterFtoCZ[pn].numberOfNodes) ? 8.0 : 0.0;
+
+                    auto it = std::find(nodedata[0].begin(), nodedata[0].end(), pos);
+                    if(it == nodedata[0].end()){
+                        nodedata[0].push_back(pos);
+                        addToNodesVector(level, pos, nodesVec, para);                        
+                        nodedata[1].push_back(8.0);
+                        nodedata[2].push_back(sendDirectionInCommAfterFtoC);    
+                    }else{
+                        int posInVectors = it - nodedata[0].begin();
+                        nodedata[1][posInVectors] += 8.0;
+                        nodedata[2][posInVectors] += sendDirectionInCommAfterFtoC;
+                    }
+                }
+			}
+
+            // check if node is in iCellFCC
+            nodedata[3].resize(nodedata[0].size());
+            for(int i = 0; i < (int)nodedata[0].size(); i++){
+                pos = nodedata[0][i];
+                for(unsigned int u=0;u<para->getParH(level)->intFC.kFC;u++)
+			    {
+				    if(para->getParH(level)->intFC.ICellFCC[u]==(uint)pos)
+                    {
+                        nodedata[3][i] = 1.0;
+                        break;
+                    }
+                    nodedata[3][i] = 0.0;
+                }
+            }
+	        std::string filenameVec = para->getFName()+"_writeSendNodesStreams_PID_" + std::to_string(vf::gpu::Communicator::getInstanz()->getPID()) + "_" +StringUtil::toString<int>(level);
+			
+		    WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
+        }
+	}
+
+    void writeRecvNodesStream(Parameter* para){
+		std::vector< UbTupleFloat3 > nodesVec;
+
+		// nodedata
+		std::vector< std::string > datanames = {"sparse index", "recvDirection", "recvDirectionInCommAfterFtoC"};
+		// sendDirection: x = 2, y = 4, z = 8
+		std::vector< std::vector<double>> nodedata;
+        nodedata.resize(datanames.size());
+
+        int pos;
+        int recvDirectionInCommAfterFtoC;
+		for (int level = 0; level < para->getMaxLevel(); level++)
+		{
+            // X
+            for (int pn = 0; pn <(int)para->getParH(level)->recvProcessNeighborX.size(); pn++){
+                for (int i = 0; i < para->getParH(level)->recvProcessNeighborX[pn].numberOfNodes; i++){                    
+                    pos = para->getParH(level)->recvProcessNeighborX[pn].index[i];    
+                    nodedata[0].push_back(pos);
+                    addToNodesVector(level, pos, nodesVec, para);
+
+                    nodedata[1].push_back(2.0);
+					recvDirectionInCommAfterFtoC = (i < para->getParH(level)->recvProcessNeighborsAfterFtoCX[pn].numberOfNodes) ? 2.0: 0.0;
+                    nodedata[2].push_back(recvDirectionInCommAfterFtoC);                
+                }
+            }
+
+            // Y 
+            for (int pn = 0; pn <(int)para->getParH(level)->recvProcessNeighborY.size(); pn++){              
+                for (int i = 0; i < para->getParH(level)->recvProcessNeighborY[pn].numberOfNodes; i++){
+                    pos = para->getParH(level)->recvProcessNeighborY[pn].index[i];
+                    
+					recvDirectionInCommAfterFtoC=(i < para->getParH(level)->recvProcessNeighborsAfterFtoCY[pn].numberOfNodes) ? 4.0 : 0.0;
+
+                    auto it = std::find(nodedata[0].begin(), nodedata[0].end(), pos);
+                    if(it == nodedata[0].end()){
+                        nodedata[0].push_back(pos);                        
+                        addToNodesVector(level, pos, nodesVec, para);
+                        nodedata[1].push_back(4.0);
+                        nodedata[2].push_back(recvDirectionInCommAfterFtoC);    
+                    }else{
+                        int posInVectors = it - nodedata[0].begin();
+                        nodedata[1][posInVectors] += 4.0;
+                        nodedata[2][posInVectors] += recvDirectionInCommAfterFtoC;
+                    }
+                }
+            }
+
+            // Z 
+            for (int pn = 0; pn <(int)para->getParH(level)->recvProcessNeighborZ.size(); pn++){ 
+                for (int i = 0; i < para->getParH(level)->recvProcessNeighborZ[pn].numberOfNodes; i++){
+                    pos = para->getParH(level)->recvProcessNeighborZ[pn].index[i];
+
+					recvDirectionInCommAfterFtoC=(i < para->getParH(level)->recvProcessNeighborsAfterFtoCZ[pn].numberOfNodes) ? 8.0 : 0.0;
+
+                    auto it = std::find(nodedata[0].begin(), nodedata[0].end(), pos);
+                    if(it == nodedata[0].end()){
+                        nodedata[0].push_back(pos);
+                        addToNodesVector(level, pos, nodesVec, para);                        
+                        nodedata[1].push_back(8.0);
+                        nodedata[2].push_back(recvDirectionInCommAfterFtoC);    
+                    }else{
+                        int posInVectors = it - nodedata[0].begin();
+                        nodedata[1][posInVectors] += 8.0;
+                        nodedata[2][posInVectors] += recvDirectionInCommAfterFtoC;
+                    }
+                }
+			}
+
+            // recv nodes are not in iCellFCC, because they are ghost nodes
+
+	        std::string filenameVec = para->getFName()+"_writeRecvNodesStreams_PID_" + std::to_string(vf::gpu::Communicator::getInstanz()->getPID()) + "_" +StringUtil::toString<int>(level);
+			
+		    WbWriterVtkXmlBinary::getInstance()->writeNodesWithNodeData(filenameVec, nodesVec, datanames, nodedata);
+        }
+	}
+
+	
+
 }
 
 #endif