diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.cu
index 0980050dcb43f84b5a7da42dd2c9e4cef1796833..a9d518d14a286ae3f6b565176969162994afa269 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.cu
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.cu
@@ -1,49 +1,46 @@
 #include "TurbulentViscosityCumulantK17CompChim.h"
 #include "cuda/CudaGrid.h"
+#include <logger/Logger.h>
 #include "Parameter/Parameter.h"
 #include "TurbulentViscosityCumulantK17CompChim_Device.cuh"
 
-std::shared_ptr<TurbulentViscosityCumulantK17CompChim> TurbulentViscosityCumulantK17CompChim::getNewInstance(std::shared_ptr<Parameter> para, int level)
+template<TurbulenceModel turbulenceModel> 
+std::shared_ptr< TurbulentViscosityCumulantK17CompChim<turbulenceModel> > TurbulentViscosityCumulantK17CompChim<turbulenceModel>::getNewInstance(std::shared_ptr<Parameter> para, int level)
 {
-	return std::shared_ptr<TurbulentViscosityCumulantK17CompChim>(new TurbulentViscosityCumulantK17CompChim(para,level));
+	return std::shared_ptr<TurbulentViscosityCumulantK17CompChim<turbulenceModel> >(new TurbulentViscosityCumulantK17CompChim<turbulenceModel>(para,level));
 }
 
-void TurbulentViscosityCumulantK17CompChim::run()
+template<TurbulenceModel turbulenceModel>
+void TurbulentViscosityCumulantK17CompChim<turbulenceModel>::run()
 {
 	vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, para->getParH(level)->numberOfNodes);
 
-	TurbulenceModel turbulenceModel = para->getTurbulenceModel();
-	switch(para->getTurbulenceModel())
-	{
-		case TurbulenceModel::AMD: 		
-			LB_Kernel_TurbulentViscosityCumulantK17CompChim < TurbulenceModel::AMD  > <<< grid.grid, grid.threads >>>(  para->getParD(level)->omega, 	para->getParD(level)->typeOfGridNode, 	para->getParD(level)->neighborX,	para->getParD(level)->neighborY,	para->getParD(level)->neighborZ,	para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		para->getParD(level)->velocityX,		para->getParD(level)->velocityY,	para->getParD(level)->velocityZ,	para->getParD(level)->turbViscosity,para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	level,				para->getIsBodyForce(),				para->getForcesDev(),				para->getParD(level)->forceX_SP,	para->getParD(level)->forceY_SP,
-																														para->getParD(level)->forceZ_SP,para->getQuadricLimitersDev(),			para->getParD(level)->isEvenTimestep);
-			break;						
-		case TurbulenceModel::Smagorinsky: 	
-			LB_Kernel_TurbulentViscosityCumulantK17CompChim < TurbulenceModel::AMD  > <<< grid.grid, grid.threads >>>(  para->getParD(level)->omega, 	para->getParD(level)->typeOfGridNode, 	para->getParD(level)->neighborX,	para->getParD(level)->neighborY,	para->getParD(level)->neighborZ,	para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		para->getParD(level)->velocityX,		para->getParD(level)->velocityY,	para->getParD(level)->velocityZ,	para->getParD(level)->turbViscosity,para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	level,				para->getIsBodyForce(),				para->getForcesDev(),				para->getParD(level)->forceX_SP,	para->getParD(level)->forceY_SP,
-																														para->getParD(level)->forceZ_SP,para->getQuadricLimitersDev(),			para->getParD(level)->isEvenTimestep);
-			break;
-		case TurbulenceModel::QR: 	
-			LB_Kernel_TurbulentViscosityCumulantK17CompChim < TurbulenceModel::QR  > <<< grid.grid, grid.threads >>>(  para->getParD(level)->omega, 	para->getParD(level)->typeOfGridNode, 	para->getParD(level)->neighborX,	para->getParD(level)->neighborY,	para->getParD(level)->neighborZ,	para->getParD(level)->distributions.f[0],	
-																														para->getParD(level)->rho,		para->getParD(level)->velocityX,		para->getParD(level)->velocityY,	para->getParD(level)->velocityZ,	para->getParD(level)->turbViscosity,para->getSGSConstant(),
-																														(unsigned long)para->getParD(level)->numberOfNodes,	level,				para->getIsBodyForce(),				para->getForcesDev(),				para->getParD(level)->forceX_SP,	para->getParD(level)->forceY_SP,
-																														para->getParD(level)->forceZ_SP,para->getQuadricLimitersDev(),			para->getParD(level)->isEvenTimestep);
-			break;
-		case TurbulenceModel::None: 		
-			throw std::runtime_error("TurbulentViscosityCumulantK17CompChim cannot be use without turbulence Model (TurbulenceModel::None)!");
-			break;
-		default:
-			throw std::runtime_error("TurbulentViscosityCumulantK17CompChim: Invalid turbulence model!");
-			break;
-	}
+	LB_Kernel_TurbulentViscosityCumulantK17CompChim < turbulenceModel  > <<< grid.grid, grid.threads >>>(   para->getParD(level)->omega, 	
+																											para->getParD(level)->typeOfGridNode, 										para->getParD(level)->neighborX,	
+																											para->getParD(level)->neighborY,	
+																											para->getParD(level)->neighborZ,	
+																											para->getParD(level)->distributions.f[0],	
+																											para->getParD(level)->rho,		
+																											para->getParD(level)->velocityX,		
+																											para->getParD(level)->velocityY,	
+																											para->getParD(level)->velocityZ,	
+																											para->getParD(level)->turbViscosity,
+																											para->getSGSConstant(),
+																											(unsigned long)para->getParD(level)->numberOfNodes,	
+																											level,				
+																											para->getIsBodyForce(),				
+																											para->getForcesDev(),				
+																											para->getParD(level)->forceX_SP,	
+																											para->getParD(level)->forceY_SP,
+																											para->getParD(level)->forceZ_SP,
+																											para->getQuadricLimitersDev(),			
+																											para->getParD(level)->isEvenTimestep);
+
 	getLastCudaError("LB_Kernel_TurbulentViscosityCumulantK17CompChim execution failed");
 }
 
-TurbulentViscosityCumulantK17CompChim::TurbulentViscosityCumulantK17CompChim(std::shared_ptr<Parameter> para, int level)
+template<TurbulenceModel turbulenceModel>
+TurbulentViscosityCumulantK17CompChim<turbulenceModel>::TurbulentViscosityCumulantK17CompChim(std::shared_ptr<Parameter> para, int level)
 {
 	this->para = para;
 	this->level = level;
@@ -51,4 +48,10 @@ TurbulentViscosityCumulantK17CompChim::TurbulentViscosityCumulantK17CompChim(std
 	myPreProcessorTypes.push_back(InitCompSP27);
 
 	myKernelGroup = BasicKernel;
-}
\ No newline at end of file
+
+	VF_LOG_INFO("Using turbulence model: {}", turbulenceModel);
+}
+
+template class TurbulentViscosityCumulantK17CompChim<TurbulenceModel::AMD>;
+template class TurbulentViscosityCumulantK17CompChim<TurbulenceModel::Smagorinsky>;
+template class TurbulentViscosityCumulantK17CompChim<TurbulenceModel::QR>;
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.h
index d107700e59d657dc6da656037638a407ed0499a3..0d35b68c916e54c6ec6eeeacd7189fe4d9a33c10 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.h
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/TurbulentViscosityKernels/FluidFlow/Compressible/CumulantK17chim/TurbulentViscosityCumulantK17CompChim.h
@@ -2,11 +2,13 @@
 #define TurbulentViscosityCUMULANT_K17_COMP_CHIM_H
 
 #include "Kernel/KernelImp.h"
+#include "Parameter/Parameter.h"
 
+template<TurbulenceModel turbulenceModel> 
 class TurbulentViscosityCumulantK17CompChim : public KernelImp
 {
 public:
-	static std::shared_ptr<TurbulentViscosityCumulantK17CompChim> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	static std::shared_ptr< TurbulentViscosityCumulantK17CompChim<turbulenceModel> > getNewInstance(std::shared_ptr< Parameter> para, int level);
 	void run();
 
 private:
diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
index 808bd005e8daa7850e10136f7b5d46147078857f..53ec240f096080097416e640fdd095c3812fb34c 100644
--- a/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
+++ b/src/gpu/VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.cpp
@@ -195,11 +195,32 @@ std::shared_ptr<Kernel> KernelFactoryImp::makeKernel(std::shared_ptr<Parameter>
         checkStrategy = WaleFluidFlowCompStrategy::getInstance();
     } else if (kernel == "WaleBySoniMalavCumulantK15Comp") {                    //     /\      //
         newKernel     = WaleBySoniMalavCumulantK15Comp::getNewInstance(para, level);// ||
-        checkStrategy = WaleFluidFlowCompStrategy::getInstance();                    // wale model
-    }                                                                           //===============
-    else if (kernel == "TurbulentViscosityCumulantK17CompChim"){                               // AMD model
-        newKernel     = TurbulentViscosityCumulantK17CompChim::getNewInstance(para, level);    //      ||
-        checkStrategy = TurbulentViscosityFluidFlowCompStrategy::getInstance();                //      \/
+        checkStrategy = WaleFluidFlowCompStrategy::getInstance();               // wale model
+    }                                                                          //===============
+    else if (kernel == "TurbulentViscosityCumulantK17CompChim"){               // compressible with turbulent viscosity
+        switch(para->getTurbulenceModel())                                     //       ||          
+        {                                                                      //       \/      //
+            case TurbulenceModel::AMD:
+                newKernel = TurbulentViscosityCumulantK17CompChim<TurbulenceModel::AMD>::getNewInstance(para, level);   
+                break;
+            case TurbulenceModel::Smagorinsky:
+                newKernel = TurbulentViscosityCumulantK17CompChim<TurbulenceModel::Smagorinsky>::getNewInstance(para, level);  
+                break;
+            case TurbulenceModel::QR:
+                newKernel = TurbulentViscosityCumulantK17CompChim<TurbulenceModel::QR>::getNewInstance(para, level);  
+                break;
+            case TurbulenceModel::None:
+                throw std::runtime_error("TurbulentViscosityCumulantK17CompChim currently not implemented for TurbulenceModel::None!");
+                break;
+            default:
+                throw std::runtime_error("Unknown turbulence model!");
+            break;                                                              
+        }                                                                       
+        checkStrategy = TurbulentViscosityFluidFlowCompStrategy::getInstance(); 
+                                                                                //     /\      //
+                                                                                //     ||    
+                                                                                // compressible with turbulent viscosity  
+                                                                                //===============         
     }
     else {
         throw std::runtime_error("KernelFactory does not know the KernelType.");