diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
index 070d94f6a6921ce395ebc32bb5fc9ef0d17a7ab3..fc12e73a18c3e63b93724fc10bb0828391a1a096 100644
--- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
+++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp
@@ -97,7 +97,8 @@ const real dt = (real)1.0e-3; //0.5e-3;
 const uint nx = 64;
 
 //std::string path("F:/Work/Computations/out/DrivenCavity/"); //LEGOLAS
-std::string path("D:/out/DrivenCavity"); //Mollok
+//std::string path("D:/out/DrivenCavity"); //Mollok
+std::string path("/home/sopeters/Computations/out/DrivenCavity64_unified"); // phoenix
 
 std::string simulationName("DrivenCavityChim");
 
@@ -186,7 +187,7 @@ void multipleLevel(const std::string& configPath)
 
         para->setVelocityRatio(velocity/ velocityLB);
 
-		para->setMainKernel("CumulantK17CompChim");
+		//para->setMainKernel("CumulantK17CompChim");
 
 		para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) {
             rho = (real)0.0;
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
index d36ec956fc033590fb991a852608aecccf27d333..1b96b09eaa07358d35339856d428243b50980286 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernelUnified.cpp
@@ -40,7 +40,9 @@
 #include "BCArray3D.h"
 
 //#include <lbm/CumulantChimera.h>
+#include <lbm/CumulantChimeraParameter.h>
 #include <lbm/CumulantChimeraK17.h>
+#include <lbm/constants/D3Q27.h>
 
 //#define PROOF_CORRECTNESS
 
@@ -244,7 +246,8 @@ void CumulantK17LBMKernelUnified::calculate(int step)
                     distribution.f[vf::lbm::dir::MMM] = mfaaa;
                     distribution.f[vf::lbm::dir::ZZZ] = mfbbb;
 
-                    vf::lbm::cumulantChimeraK17(distribution, omega, forces);
+                    vf::lbm::CumulantChimeraParameter chimeraParameter {distribution, omega, forces};
+                    vf::lbm::cumulantChimeraK17(chimeraParameter);
 
                     mfcbb = distribution.f[vf::lbm::dir::PZZ];
                     mfabb = distribution.f[vf::lbm::dir::MZZ];
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
index f902a7aaec82acd1eb0a55e97f5a4f31f4334575..2795ab94ea78254eaa37d4f9c0962bac4528ab1f 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/KernelImp.h
@@ -5,6 +5,8 @@
 
 #include <memory>
 
+#include "Utilities/CudaGrid.h"
+
 class CheckParameterStrategy;
 class Parameter;
 
@@ -28,5 +30,7 @@ protected:
 	std::vector<PreProcessorType> myPreProcessorTypes;
 	KernelGroup myKernelGroup;
 
+	vf::gpu::CudaGrid cudaGrid;
+
 };
 #endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
index 8011615dd6f8c770c71488a52858bc3b1a8c07f1..7349be5847c2ea936f7d999a4ce91aee02c17973 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cu
@@ -2,44 +2,10 @@
 #include "LBM/D3Q27.h"
 #include <lbm/constants/NumericConstants.h>
 
-#include <lbm/CumulantChimeraK15.h>
-
-#include "Kernel/Utilities/DistributionHelper.cuh"
-
 using namespace vf::lbm::constant;
 #include "math.h"
 
 extern "C" __global__ void LB_Kernel_CumulantK15Comp(real omega,
-    unsigned int* typeOfGridNode,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    real* distributions,
-    int size_Mat,
-    int level,
-    real* forces,
-    bool isEvenTimestep)
-{
-    const uint k = vf::gpu::getNodeIndex();
-    const uint nodeType = typeOfGridNode[k];
-
-    if (!vf::gpu::isValidFluidNode(k, size_Mat, nodeType))
-        return;
-
-    vf::gpu::DistributionWrapper distributionWrapper {
-        distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY, neighborZ
-    };
-
-    real level_forces[3];
-    vf::gpu::getLevelForce(forces[0], forces[1], forces[2], level, level_forces);
-
-    vf::lbm::cumulantChimeraK15(distributionWrapper.distribution, omega, level_forces);
-
-    distributionWrapper.write();
-}
-
-
-extern "C" __global__ void LB_Kernel_CumulantK15Comp_(real omega,
 	unsigned int* bcMatD,
 	unsigned int* neighborX,
 	unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
index 6a8eede33bc210eacad184afb42a7011dd684708..1a3d00e3e1b5365b266bb478d15dc94b91f151f8 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp_Device.cuh
@@ -4,7 +4,7 @@
 #include <DataTypes.h>
 #include <curand.h>
 
-extern "C" __global__ void LB_Kernel_CumulantK15Comp(	real omega,
+__global__ void LB_Kernel_CumulantK15Comp(	real omega,
 														unsigned int* bcMatD,
 														unsigned int* neighborX,
 														unsigned int* neighborY,
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
new file mode 100644
index 0000000000000000000000000000000000000000..c40b6d8371b3c39747001455f844907665a5a76a
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.cu
@@ -0,0 +1,52 @@
+#include "CumulantK15Unified.h"
+
+#include "../CumulantKernel.cuh"
+
+#include "Parameter/Parameter.h"
+
+#include <lbm/CumulantChimeraK15.h>
+#include <lbm/Distribution27.h>
+
+std::shared_ptr<CumulantK15Unified> CumulantK15Unified::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+    return std::make_shared<CumulantK15Unified>(para, level);
+}
+
+void CumulantK15Unified::run()
+{
+    vf::gpu::LBMKernelParameter kernelParameter{ para->getParD(level)->omega,
+                                                 para->getParD(level)->geoSP,
+                                                 para->getParD(level)->neighborX_SP,
+                                                 para->getParD(level)->neighborY_SP,
+                                                 para->getParD(level)->neighborZ_SP,
+                                                 para->getParD(level)->d0SP.f[0],
+                                                 (int)para->getParD(level)->size_Mat_SP,
+                                                 level,
+                                                 para->getForcesDev(),
+                                                 para->getParD(level)->evenOrOdd };
+
+    auto lambda = [] __device__(vf::lbm::CumulantChimeraParameter parameter) {
+        return vf::lbm::cumulantChimeraK15(parameter);
+    };
+
+    vf::gpu::cumulantKernel<<<cudaGrid.grid, cudaGrid.threads>>>(lambda, kernelParameter);
+
+    getLastCudaError("LB_Kernel_CumulantK15Comp execution failed");
+}
+
+CumulantK15Unified::CumulantK15Unified(std::shared_ptr<Parameter> para, int level)
+{
+#ifndef BUILD_CUDA_LTO
+    throw std::invalid_argument(
+        "To use the CumulantK15Unified kernel, pass -DBUILD_CUDA_LTO=ON to cmake. Requires: CUDA 11.2 & cc 5.0");
+#endif
+
+    this->para  = para;
+    this->level = level;
+
+    myPreProcessorTypes.push_back(InitCompSP27);
+
+    myKernelGroup = BasicKernel;
+
+    this->cudaGrid = vf::gpu::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->size_Mat_SP);
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
new file mode 100644
index 0000000000000000000000000000000000000000..666a605c40cef3d359238280f7c0578b056dbe05
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h
@@ -0,0 +1,14 @@
+#ifndef CUMULANT_K15_UNIFIED_COMP_H
+#define CUMULANT_K15_UNIFIED_COMP_H
+
+#include "Kernel/KernelImp.h"
+
+class CumulantK15Unified : public KernelImp
+{
+public:
+    static std::shared_ptr<CumulantK15Unified> getNewInstance(std::shared_ptr<Parameter> para, int level);
+    void run();
+
+    CumulantK15Unified(std::shared_ptr<Parameter> para, int level);
+};
+#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
index dae9436bf1350f0ddced35ea4f7a6c63a563b922..acff5a6ddc557bb935e3324ff9ba00371b64cc60 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.cu
@@ -1,43 +1,37 @@
 #include "CumulantK17Unified.h"
 
-#include "CumulantK17Unified_Device.cuh"
 #include "Parameter/Parameter.h"
-
+#include "../CumulantKernel.cuh"
+#include "Kernel/Utilities/CudaGrid.h"
 #include <stdexcept>
 
+#include <lbm/CumulantChimeraK17.h>
+
 std::shared_ptr<CumulantK17Unified> CumulantK17Unified::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-    return std::shared_ptr<CumulantK17Unified>(new CumulantK17Unified(para, level));
+    return std::make_shared<CumulantK17Unified>(para, level);
 }
 
 void CumulantK17Unified::run()
 {
-    int numberOfThreads = para->getParD(level)->numberofthreads;
-    int size_Mat        = para->getParD(level)->size_Mat_SP;
-
-    int Grid = (size_Mat / numberOfThreads) + 1;
-    int Grid1, Grid2;
-    if (Grid > 512) {
-        Grid1 = 512;
-        Grid2 = (Grid / Grid1) + 1;
-    } else {
-        Grid1 = 1;
-        Grid2 = Grid;
-    }
-    dim3 grid(Grid1, Grid2);
-    dim3 threads(numberOfThreads, 1, 1);
-
-    vf::gpu::LB_Kernel_CumulantK17Unified<<<grid, threads>>>(
-        para->getParD(level)->omega,
-        para->getParD(level)->geoSP,
-        para->getParD(level)->neighborX_SP,
-        para->getParD(level)->neighborY_SP,
-        para->getParD(level)->neighborZ_SP,
-        para->getParD(level)->d0SP.f[0],
-        para->getParD(level)->size_Mat_SP,
-        level,
-        para->getForcesDev(),
-        para->getParD(level)->evenOrOdd);
+    vf::gpu::LBMKernelParameter kernelParameter
+	{	para->getParD(level)->omega,
+		para->getParD(level)->geoSP,
+		para->getParD(level)->neighborX_SP,
+		para->getParD(level)->neighborY_SP,
+		para->getParD(level)->neighborZ_SP,
+		para->getParD(level)->d0SP.f[0],
+		(int)para->getParD(level)->size_Mat_SP,
+		level,
+		para->getForcesDev(),
+		para->getParD(level)->evenOrOdd
+	};
+
+	auto lambda = [] __device__(vf::lbm::CumulantChimeraParameter parameter) {
+		return vf::lbm::cumulantChimeraK17(parameter);
+	};
+
+	vf::gpu::cumulantKernel<<< cudaGrid.grid, cudaGrid.threads >>>(lambda, kernelParameter);
 
     getLastCudaError("LB_Kernel_CumulantK17Unified execution failed");
 }
@@ -54,4 +48,6 @@ CumulantK17Unified::CumulantK17Unified(std::shared_ptr<Parameter> para, int leve
     myPreProcessorTypes.push_back(InitCompSP27);
 
     myKernelGroup = BasicKernel;
-}
\ No newline at end of file
+
+    this->cudaGrid = vf::gpu::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->size_Mat_SP);
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
index ece7c66ec3c048777cd36ef11435910fb9c45df3..d466b7696a72976e7b17ab43601189d4f75eaf94 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified.h
@@ -9,8 +9,6 @@ public:
     static std::shared_ptr<CumulantK17Unified> getNewInstance(std::shared_ptr<Parameter> para, int level);
     void run();
 
-private:
-    CumulantK17Unified();
     CumulantK17Unified(std::shared_ptr<Parameter> para, int level);
 };
 
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_Device.cuh
deleted file mode 100644
index ed8cc6e66343b4367e0addbc05f4763f4c2a957d..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_Device.cuh
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef LB_Kernel_CUMULANT_K17_UNIFIED_H
-#define LB_Kernel_CUMULANT_K17_UNIFIED_H
-
-#include <DataTypes.h>
-#include <cuda_runtime.h>
-
-
-namespace vf
-{
-namespace gpu 
-{
-__global__ void LB_Kernel_CumulantK17Unified(real omega, unsigned int *bcMatD, unsigned int *neighborX,
-                                                        unsigned int *neighborY, unsigned int *neighborZ, real *DDStart,
-                                                        int size_Mat, int level, real *forces,
-                                                        bool EvenOrOdd);
-
-}
-}
-
-#endif
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_device.cu
deleted file mode 100644
index ec15a2a76919026e79d24a1fa7044259280ae2e1..0000000000000000000000000000000000000000
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Unified/CumulantK17Unified_device.cu
+++ /dev/null
@@ -1,76 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __         
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
-//      \    \  |    |   ________________________________________________________________    
-//       \    \ |    |  |  ______________________________________________________________|   
-//        \    \|    |  |  |         __          __     __     __     ______      _______    
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can 
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of 
-//  the License, or (at your option) any later version.
-//  
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT 
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
-//  for more details.
-//  
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file Cumulant27chim.cu
-//! \ingroup GPU
-//! \author Martin Schoenherr, Soeren Peters
-//=======================================================================================
-/* Device code */
-#include <lbm/CumulantChimeraK17.h>
-
-#include "Kernel/Utilities/DistributionHelper.cuh"
-
-
-namespace vf
-{
-namespace gpu 
-{
-
-__global__ void LB_Kernel_CumulantK17Unified(
-    real omega,
-    uint* typeOfGridNode,
-    uint* neighborX,
-    uint* neighborY,
-    uint* neighborZ,
-    real* distributions,
-    int size_Mat,
-    int level,
-    real* forces,
-    bool isEvenTimestep)
-{
-    const uint k = getNodeIndex();
-    const uint nodeType = typeOfGridNode[k];
-
-    if (!isValidFluidNode(k, size_Mat, nodeType))
-        return;
-
-    DistributionWrapper distributionWrapper {
-        distributions, size_Mat, isEvenTimestep, k, neighborX, neighborY, neighborZ
-    };
-
-    real level_forces[3];
-    getLevelForce(forces[0], forces[1], forces[2], level, level_forces);
-
-    vf::lbm::cumulantChimeraK17(distributionWrapper.distribution, omega, level_forces);
-
-    distributionWrapper.write();
-}
-
-
-}
-}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cu
new file mode 100644
index 0000000000000000000000000000000000000000..945ab247400e5733e2f662d684f483af6e90e981
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cu
@@ -0,0 +1,14 @@
+#include "CumulantKernel.cuh"
+
+
+#include "Kernel/Utilities/DistributionHelper.cuh"
+
+
+namespace vf
+{
+namespace gpu
+{
+
+
+}
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..53104c5bd287b21c3a5b2ab9f0447dd3be22eda1
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantKernel.cuh
@@ -0,0 +1,65 @@
+#ifndef GPU_CUMULANT_KERNEL_H
+#define GPU_CUMULANT_KERNEL_H
+
+
+#include <DataTypes.h>
+#include <cuda_runtime.h>
+
+#include <lbm/Distribution27.h>
+#include <lbm/CumulantChimeraParameter.h>
+
+#include "Kernel/Utilities/DistributionHelper.cuh"
+
+namespace vf
+{
+namespace gpu
+{
+
+
+struct LBMKernelParameter
+{
+    real omega;
+    unsigned int* typeOfGridNode;
+    unsigned int* neighborX;
+    unsigned int* neighborY;
+    unsigned int* neighborZ;
+    real* distributions;
+    int size_Mat;
+    int level;
+    real* forces;
+    bool isEvenTimestep;
+};
+
+template<typename KernelFunctor>
+__global__ void cumulantKernel(KernelFunctor kernel, LBMKernelParameter kernelParameter)
+{
+    const uint k = vf::gpu::getNodeIndex();
+    const uint nodeType = kernelParameter.typeOfGridNode[k];
+
+    if (!vf::gpu::isValidFluidNode(k, kernelParameter.size_Mat, nodeType))
+        return;
+
+    vf::gpu::DistributionWrapper distributionWrapper {
+        kernelParameter.distributions,
+        kernelParameter.size_Mat,
+        kernelParameter.isEvenTimestep,
+        k,
+        kernelParameter.neighborX,
+        kernelParameter.neighborY,
+        kernelParameter.neighborZ
+    };
+
+
+    real level_forces[3];
+    vf::gpu::getLevelForce(kernelParameter.forces[0], kernelParameter.forces[1], kernelParameter.forces[2], kernelParameter.level, level_forces);
+
+    lbm::CumulantChimeraParameter chimeraParameter {distributionWrapper.distribution, kernelParameter.omega, level_forces};
+    kernel(chimeraParameter);
+
+    distributionWrapper.write();
+}
+
+}
+}
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fa17bf449915eba509dbabbe71f556c19fa43bcf
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.cpp
@@ -0,0 +1,27 @@
+#include "CudaGrid.h"
+
+
+
+namespace vf
+{
+namespace gpu
+{
+
+CudaGrid::CudaGrid(unsigned int numberOfThreads, unsigned int size_matrix)
+{
+    int Grid = (size_matrix / numberOfThreads) + 1;
+    int Grid1, Grid2;
+    if (Grid > 512) {
+        Grid1 = 512;
+        Grid2 = (Grid / Grid1) + 1;
+    } else {
+        Grid1 = 1;
+        Grid2 = Grid;
+    }
+    
+    grid = dim3(Grid1, Grid2);
+    threads = dim3(numberOfThreads, 1, 1);
+}
+
+}
+}
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h
new file mode 100644
index 0000000000000000000000000000000000000000..27a18a58843b0de064009ab0f837518e3bb44b9d
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/CudaGrid.h
@@ -0,0 +1,25 @@
+#ifndef GPU_CUDA_GRID_H
+#define GPU_CUDA_GRID_H
+
+
+#include <cuda_runtime.h>
+
+namespace vf
+{
+namespace gpu
+{
+
+
+struct CudaGrid 
+{
+    dim3 threads;
+    dim3 grid;
+
+    CudaGrid(unsigned int numberOfEntities, unsigned int threadsPerBlock);
+    CudaGrid() = default;
+};
+
+}
+}
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
index b99d44a85fa0de5d35402691f6b4848c7917e946..e56462a0702a5e1c31121c9c9fe73827e5c93554 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
@@ -15,6 +15,7 @@
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK18/CumulantK18Comp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK20/CumulantK20Comp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15/CumulantK15Comp.h"
+#include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Unified/CumulantK15Unified.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Bulk/CumulantK15BulkComp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK15Sponge/CumulantK15SpongeComp.h"
 #include "Kernel/Kernels/BasicKernels/FluidFlow/Compressible/MRT/MRTCompSP27.h"
@@ -119,6 +120,9 @@ std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter>
     } else if (kernel == "CumulantK17Comp") {
         newKernel     = CumulantK17Comp::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
+    } else if (kernel == "CumulantK15Unified") {
+        newKernel     = CumulantK15Unified::getNewInstance(para, level);
+        checkStrategy = FluidFlowCompStrategy::getInstance();
     } else if (kernel == "CumulantK17Unified") {
         newKernel     = CumulantK17Unified::getNewInstance(para, level);
         checkStrategy = FluidFlowCompStrategy::getInstance();
diff --git a/src/lbm/CumulantChimeraK15.cpp b/src/lbm/CumulantChimeraK15.cpp
index 66ccf8733175f8584072cd8601c95869ba9ba7ac..994f239cde5e532374154d15a023a208dde88a29 100644
--- a/src/lbm/CumulantChimeraK15.cpp
+++ b/src/lbm/CumulantChimeraK15.cpp
@@ -25,8 +25,12 @@ using namespace constant;
 //! and \ref
 //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a>
 //////////////////////////////////////////////////////////////////////////
-__host__ __device__ void cumulantChimeraK15(Distribution27& distribution, real omega, real* forces)
+__host__ __device__ void cumulantChimeraK15(CumulantChimeraParameter parameter)
 {
+    auto& distribution = parameter.distribution;
+    const auto omega = parameter.omega;
+    const auto* forces = parameter.forces;
+
     ////////////////////////////////////////////////////////////////////////////////////
     //! - Read distributions: style of reading and writing the distributions from/to 
     //! stored arrays dependent on timestep is based on the esoteric twist algorithm
diff --git a/src/lbm/CumulantChimeraK15.h b/src/lbm/CumulantChimeraK15.h
index e32470c645fd01e46b41c34f7b7d9b2ad73c8adf..8c1ffa95709a3a79253293cdd8eaba984f9c0aec 100644
--- a/src/lbm/CumulantChimeraK15.h
+++ b/src/lbm/CumulantChimeraK15.h
@@ -8,9 +8,7 @@
 #define __device__
 #endif
 
-#include <basics/Core/DataTypes.h>
-
-#include "Distribution27.h"
+#include "CumulantChimeraParameter.h"
 
 namespace vf
 {
@@ -23,7 +21,8 @@ namespace lbm
 //! and \ref
 //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a>
 //////////////////////////////////////////////////////////////////////////
-__host__ __device__ void cumulantChimeraK15(Distribution27& distribution, real omega, real* forces);
+__host__ __device__ void cumulantChimeraK15(CumulantChimeraParameter parameter);
+
 
 }
 }
diff --git a/src/lbm/CumulantChimeraK17.cpp b/src/lbm/CumulantChimeraK17.cpp
index 17a30eaa54fd33a4017cdc84016c26d30eef98b1..ecd2f4540827af1b669c09adaef155e925d2f540 100644
--- a/src/lbm/CumulantChimeraK17.cpp
+++ b/src/lbm/CumulantChimeraK17.cpp
@@ -25,8 +25,12 @@ using namespace constant;
 //! and \ref
 //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a>
 //////////////////////////////////////////////////////////////////////////
-__host__ __device__ void cumulantChimeraK17(Distribution27& distribution, real omega, real* forces)
+__host__ __device__ void cumulantChimeraK17(CumulantChimeraParameter parameter)
 {
+    auto& distribution = parameter.distribution;
+    const auto omega = parameter.omega;
+    const auto* forces = parameter.forces;
+
     ////////////////////////////////////////////////////////////////////////////////////
     //! - Read distributions: style of reading and writing the distributions from/to 
     //! stored arrays dependent on timestep is based on the esoteric twist algorithm
diff --git a/src/lbm/CumulantChimeraK17.h b/src/lbm/CumulantChimeraK17.h
index 3feca5d67525b897712d5f8029727d17546701df..94e5f8bfa93e671c2649092e66f94813b03d2392 100644
--- a/src/lbm/CumulantChimeraK17.h
+++ b/src/lbm/CumulantChimeraK17.h
@@ -8,9 +8,7 @@
 #define __device__
 #endif
 
-#include <basics/Core/DataTypes.h>
-
-#include "Distribution27.h"
+#include "CumulantChimeraParameter.h"
 
 namespace vf
 {
@@ -23,7 +21,7 @@ namespace lbm
 //! and \ref
 //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a>
 //////////////////////////////////////////////////////////////////////////
-__host__ __device__ void cumulantChimeraK17(Distribution27& distribution, real omega, real* forces);
+__host__ __device__ void cumulantChimeraK17(CumulantChimeraParameter parameter);
 
 }
 }
diff --git a/src/lbm/CumulantChimeraParameter.h b/src/lbm/CumulantChimeraParameter.h
new file mode 100644
index 0000000000000000000000000000000000000000..6cb820c57ce4a857eaec9c49560936fb80ec3b24
--- /dev/null
+++ b/src/lbm/CumulantChimeraParameter.h
@@ -0,0 +1,33 @@
+#ifndef LBM_CUMULANT_CHIMERA_PARAMETER_H
+#define LBM_CUMULANT_CHIMERA_PARAMETER_H
+
+#ifndef __host__
+#define __host__
+#endif
+#ifndef __device__
+#define __device__
+#endif
+
+#include <basics/Core/DataTypes.h>
+
+#include "Distribution27.h"
+
+namespace vf
+{
+namespace lbm
+{
+
+
+struct CumulantChimeraParameter
+{
+    Distribution27& distribution;
+    real omega;
+    real* forces;
+};
+
+
+
+}
+}
+
+#endif