diff --git a/src/gpu/VirtualFluids_GPU/Visitor/Probe.cu b/src/gpu/VirtualFluids_GPU/Visitor/Probe.cu
new file mode 100644
index 0000000000000000000000000000000000000000..c774c216dd55f506494f6cd0a427d966b6186806
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Visitor/Probe.cu
@@ -0,0 +1,76 @@
+#include "Probe.h"
+
+#include <cuda.h>
+#include <cuda_runtime.h>
+#include <helper_cuda.h>
+
+
+void Probe::init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaManager)
+{
+
+    probeParams.resize(para->getMaxLevel()+1);
+
+    for(int level=0; level<=para->getMaxLevel(); level++)
+    {
+        std::vector<int> probeIndices_level;
+        std::vector<real> distX_level;
+        std::vector<real> distY_level;
+        std::vector<real> distZ_level;
+        real dx = abs(para->getParH(level)->coordX_SP[1]-para->getParH(level)->coordX_SP[para->getParH(level)->neighborX_SP[1]]);
+        for(uint j=0; j<para->getParH(level)->size_Mat_SP; j++ )
+        {    
+            for(uint point=0; point<this->nProbePoints; point++)
+            {
+                real distX = this->pointCoordsX[point]-para->getParH(level)->coordX_SP[j];
+                real distY = this->pointCoordsY[point]-para->getParH(level)->coordY_SP[j];
+                real distZ = this->pointCoordsZ[point]-para->getParH(level)->coordZ_SP[j];
+                if( distX <=dx && distY <=dx && distZ <=dx &&
+                    distX >0.f && distY >0.f && distZ >0.f)
+                {
+                    probeIndices_level.push_back(j);
+                    distX_level.push_back( distX/dx );
+                    distY_level.push_back( distY/dx );
+                    distZ_level.push_back( distZ/dx );
+                    // printf("Found Point %i, x: %f, y: %f, z: %f, \n For %f %f %f, \n distx: %f, disty: %f, distz: %f \n", j, para->getParH(level)->coordX_SP[j],para->getParH(level)->coordY_SP[j],para->getParH(level)->coordZ_SP[j],
+                    // this->pointCoordsX[point], this->pointCoordsY[point], this->pointCoordsZ[point], 
+                    // distX, distY, distZ);
+                }
+            }
+        }
+
+        probeParams[level] = new ProbeStruct;
+        probeParams[level]->nPoints = probeIndices_level.size();
+        // Might have to catch nPoints=0 ?!?!
+        checkCudaErrors( cudaMallocHost((void**) &probeParams[level]->distXH,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMallocHost((void**) &probeParams[level]->distYH,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMallocHost((void**) &probeParams[level]->distZH,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMallocHost((void**) &probeParams[level]->pointIndicesH, sizeof(int)*probeParams[level]->nPoints) );
+
+        checkCudaErrors( cudaMalloc    ((void**) &probeParams[level]->distXD,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMalloc    ((void**) &probeParams[level]->distYD,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMalloc    ((void**) &probeParams[level]->distZD,        sizeof(real)*probeParams[level]->nPoints) );
+        checkCudaErrors( cudaMalloc    ((void**) &probeParams[level]->pointIndicesD, sizeof(int)*probeParams[level]->nPoints) );
+
+        std::copy(distX_level.begin(), distX_level.end(), probeParams[level]->distXH);
+        std::copy(distY_level.begin(), distY_level.end(), probeParams[level]->distYH);
+        std::copy(distZ_level.begin(), distZ_level.end(), probeParams[level]->distZH);
+        std::copy(probeIndices_level.begin(), probeIndices_level.end(), probeParams[level]->pointIndicesH);
+    }
+}
+
+
+void Probe::visit(Parameter* para, int level, unsigned int t)
+{
+
+}
+
+void Probe::setProbePointsFromList(std::vector<real> &_pointCoordsX, std::vector<real> &_pointCoordsY, std::vector<real> &_pointCoordsZ)
+{
+    bool isSameLength = ( (_pointCoordsX.size()==_pointCoordsY.size()) && (_pointCoordsY.size()==_pointCoordsZ.size()));
+    assert("Probe: point lists have different lengths" && isSameLength);
+    this->pointCoordsX = _pointCoordsX;
+    this->pointCoordsY = _pointCoordsY;
+    this->pointCoordsZ = _pointCoordsZ;
+    this->nProbePoints = _pointCoordsX.size();
+    printf("Adde list of %u  points", this->nProbePoints );
+}
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Visitor/Probe.h b/src/gpu/VirtualFluids_GPU/Visitor/Probe.h
new file mode 100644
index 0000000000000000000000000000000000000000..69f553b1471956ca1d37b50c4563a527722d765a
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Visitor/Probe.h
@@ -0,0 +1,49 @@
+#ifndef Probe_H
+#define Probe_H
+
+#include "Visitor.h"
+#include "Parameter/Parameter.h"
+#include "PointerDefinitions.h"
+#include "GridGenerator/grid/GridBuilder/GridBuilder.h"
+
+struct ProbeStruct{
+    int nPoints;
+    int *pointIndicesH, *pointIndicesD;
+    real *distXH, *distYH, *distZH, *distXD, *distYD, *distZD;
+};
+
+class Probe : public Visitor 
+{
+public:
+    Probe(
+        const std::string _probeName
+
+    ):  probeName(_probeName)
+
+    {
+        
+    }
+
+    void visit(Parameter* para, int level, unsigned int t);
+    void init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaManager);
+
+    void setProbePointsFromList(std::vector<real> &_pointCoordsX, std::vector<real> &_pointCoordsY, std::vector<real> &_pointCoordsZ);
+
+    
+private:
+    const std::string probeName;
+    std::vector<real> pointCoordsX, pointCoordsY, pointCoordsZ; 
+    uint nProbePoints;
+
+    std::vector<ProbeStruct*> probeParams;
+
+    // int* pointIndicesH, *pointIndicesD;
+    // std::vector< std::vector<int> > probeIndices;
+    // std::vector< std::vector<real> > distX, distY, distZ;
+};
+
+
+
+
+
+#endif
\ No newline at end of file