diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake
index 2ffe6747b6c8e3a884a4b90ff4fb70007df096bd..920e01efbc3e2ebcb498fe0775247836cb02caef 100644
--- a/apps/cpu/Applications.cmake
+++ b/apps/cpu/Applications.cmake
@@ -12,7 +12,7 @@
 # add_subdirectory(Applications/plate)
 # add_subdirectory(Applications/plate2)
 ##add_subdirectory(Applications/FlowAroundCylinder)
-add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow)
+#add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow)
 # add_subdirectory(Applications/LaminarTubeFlowConv)
 #add_subdirectory(Applications/cylinderSt)
 #add_subdirectory(Applications/mpichTest)
@@ -64,4 +64,4 @@ add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow)
 #add_subdirectory(Applications/bChannelVA)
 #add_subdirectory(Applications/OrganPipe)
 #add_subdirectory(Applications/LidDrivenCavity)
-
+add_subdirectory(${APPS_ROOT_CPU}/poiseuille_example)
diff --git a/apps/cpu/poiseuille_example/CMakeLists.txt b/apps/cpu/poiseuille_example/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..14782a6459a0b8689f7f81dd69055a2a43f9ecb7
--- /dev/null
+++ b/apps/cpu/poiseuille_example/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+PROJECT(poiseuille_example)
+
+vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore muparser basics ${MPI_CXX_LIBRARIES} FILES poiseuille.cpp )
+
+vf_get_library_name (library_name)
+target_include_directories(${library_name} PRIVATE ${APPS_ROOT_CPU})
\ No newline at end of file
diff --git a/apps/cpu/poiseuille_example/poiseuille.cpp b/apps/cpu/poiseuille_example/poiseuille.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..07e5ab8d9f2a5da84f5d1a04f41f9b833016dc72
--- /dev/null
+++ b/apps/cpu/poiseuille_example/poiseuille.cpp
@@ -0,0 +1,126 @@
+#include <memory.h>
+#include <string.h>
+#include <basics/geometry3d/GbCuboid3D.h>
+#include <cpu/VirtualFluids.h>
+
+int main()
+{
+    const std::string outputPath = "./output";
+    const int numberOfThreads = 1;
+    const int timeStepLogInterval = 1000;
+    const int numberOfTimeSteps = 10000;
+
+    const double latticeViscosity = 5e-3;
+    const double bulkViscosityFactor = 1.;
+    const int deltaX = 1;
+    const int nodesInX1 = 2;
+    const int nodesInX2 = 2;
+    const int nodesInX3 = 10;
+
+    const double minX1 = 0, minX2 = 0, minX3 = 0;
+    const double maxX1 = minX1 + nodesInX1 * deltaX;
+    const double maxX2 = minX2 + nodesInX2 * deltaX;
+    const double maxX3 = minX3 + nodesInX3 * deltaX;
+
+    const auto lbmUnitConverter = std::make_shared<LBMUnitConverter>();
+    const auto writer = WbWriterVtkXmlBinary::getInstance();
+
+    const auto communicator = MPICommunicator::getInstance();
+    const auto kernel = std::make_shared<CompressibleCumulant4thOrderViscosityLBMKernel>();
+    kernel->setForcingX1(1e-6 * lbmUnitConverter->getFactorForceWToLb());
+
+    BoundaryConditionsBlockVisitor boundaryConditionsBlockVisitor{};
+
+    auto grid = std::make_shared<Grid3D>();
+    grid->setDeltaX(deltaX);
+    grid->setPeriodicX1(true);
+    grid->setPeriodicX2(true);
+    grid->setPeriodicX3(false);
+    grid->setBlockNX(nodesInX1, nodesInX2, nodesInX3);
+
+    auto gridCube = std::make_shared<GbCuboid3D>(minX1, minX2, minX3, maxX1, maxX2, maxX3);
+    GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", writer);
+
+    GenBlocksGridVisitor genBlocks(gridCube);
+    grid->accept(genBlocks);
+
+    const auto scheduler(std::make_shared<UbScheduler>(1));
+    auto ppblocks = std::make_shared<WriteBlocksCoProcessor>(grid, scheduler, outputPath, writer, communicator);
+    ppblocks->process(0);
+    ppblocks.reset();
+
+    kernel->setBCProcessor(std::make_shared<BCProcessor>());
+
+    const auto metisVisitor(std::make_shared<MetisPartitioningGridVisitor>(communicator,
+                                                                           MetisPartitioningGridVisitor::LevelBased,
+                                                                           D3Q27System::B));
+
+    const double blockLength = 3 * deltaX;
+    const auto topWall = std::make_shared<GbCuboid3D>(minX1 - blockLength, minX2 - blockLength, minX3 - blockLength,
+                                                      maxX1 + blockLength, maxX2 + blockLength, minX3);
+
+    const auto bottomWall = std::make_shared<GbCuboid3D>(minX1 - blockLength, minX2 - blockLength, minX3,
+                                                         maxX1 + blockLength, maxX2 + blockLength, minX3 + blockLength);
+
+    const auto adapter = std::make_shared<NoSlipBCAdapter>();
+    adapter->setBcAlgorithm(std::make_shared<NoSlipBCAlgorithm>());
+
+    const auto topWallInteractor = std::make_shared<D3Q27Interactor>(topWall, grid, adapter, Interactor3D::SOLID);
+    const auto bottomWallInteractor = std::make_shared<D3Q27Interactor>(bottomWall, grid, adapter, Interactor3D::SOLID);
+
+    GbSystem3D::writeGeoObject(topWall, outputPath + "/geo/topWall", writer);
+    GbSystem3D::writeGeoObject(bottomWall, outputPath + "/geo/bottomWall", writer);
+
+
+    InteractorsHelper interactorsHelper(grid, metisVisitor);
+    interactorsHelper.addInteractor(topWallInteractor);
+    interactorsHelper.addInteractor(bottomWallInteractor);
+    interactorsHelper.selectBlocks();
+
+    int numberOfProcesses = communicator->getNumberOfProcesses();
+    SetKernelBlockVisitor kernelVisitor(kernel, latticeViscosity, numberOfProcesses);
+    grid->accept(kernelVisitor);
+    interactorsHelper.setBC();
+
+    const auto interpolationProcessor(std::make_shared<CompressibleOffsetMomentsInterpolationProcessor>());
+    interpolationProcessor->setBulkViscosity(latticeViscosity, latticeViscosity * bulkViscosityFactor);
+
+    SetConnectorsBlockVisitor setConnsVisitor(communicator,
+                                              true,
+                                              D3Q27System::ENDDIR,
+                                              latticeViscosity,
+                                              interpolationProcessor);
+
+
+    InitDistributionsBlockVisitor initVisitor{};
+    grid->accept(initVisitor);
+    grid->accept(setConnsVisitor);
+    grid->accept(boundaryConditionsBlockVisitor);
+
+    const auto geoSch(std::make_shared<UbScheduler>(1));
+    WriteBoundaryConditionsCoProcessor ppgeo(grid, geoSch, outputPath, writer, communicator);
+    ppgeo.process(0);
+
+    const auto visualizationScheduler(std::make_shared<UbScheduler>(timeStepLogInterval));
+    const auto mqCoProcessor(
+            std::make_shared<WriteMacroscopicQuantitiesCoProcessor>(grid, visualizationScheduler, outputPath, writer,
+                                                                    lbmUnitConverter,
+                                                                    communicator));
+    mqCoProcessor->process(0);
+
+    const auto nupsScheduler(std::make_shared<UbScheduler>(100, 100));
+    const auto nupsCoProcessor(
+            std::make_shared<NUPSCounterCoProcessor>(grid, nupsScheduler, numberOfThreads,
+                                                     communicator));
+
+#ifdef _OPENMP
+    omp_set_num_threads(numberOfThreads);
+#endif
+
+    const auto calculator(std::make_shared<BasicCalculator>(grid, visualizationScheduler, numberOfTimeSteps));
+    calculator->addCoProcessor(nupsCoProcessor);
+    calculator->addCoProcessor(mqCoProcessor);
+    calculator->calculate();
+
+    return 0;
+}
\ No newline at end of file