diff --git a/doc/notebooks/05_tutorial_nondimensionalization_and_scaling.ipynb b/doc/notebooks/05_tutorial_nondimensionalization_and_scaling.ipynb
index d40de1bd7cb3f16764b1cd23a9b880726d0f23cf..07066795ad8dc8311e9ce9d3dba438b25d3734bc 100644
--- a/doc/notebooks/05_tutorial_nondimensionalization_and_scaling.ipynb
+++ b/doc/notebooks/05_tutorial_nondimensionalization_and_scaling.ipynb
@@ -52,7 +52,7 @@
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "8013073325cc4f7da83800d88fc944bf",
+       "model_id": "267d2750d0114490bce98ee465856b8b",
        "version_major": 2,
        "version_minor": 0
       },
@@ -385,7 +385,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   },
@@ -399,7 +399,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.2"
+   "version": "3.9.9"
   }
  },
  "nbformat": 4,
diff --git a/lbmpy/methods/momentbased/recursiveregularisedmethod.py b/lbmpy/methods/momentbased/recursiveregularisedmethod.py
index b48715b0ca8c4c0aea6f9b914d7fe5186c6cd1c1..08d56557ed663f90a69c8525359e2208e3aa9d50 100644
--- a/lbmpy/methods/momentbased/recursiveregularisedmethod.py
+++ b/lbmpy/methods/momentbased/recursiveregularisedmethod.py
@@ -335,6 +335,8 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
         if additional_subexpressions is None:
             additional_subexpressions = list()
 
+        half = sp.Rational(1, 2)
+
         omega1 = d[4, 4]
         omega2 = d[7, 7]
         omega3 = d[10, 10]
@@ -356,10 +358,25 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
         cs4 = c_s_sq * c_s_sq
         u = sp.symbols("u_:3")
 
-        taup = rho * c_s_sq / omega1
+        a0xx, a0xy, a0yy, a0xz, a0zz, a0yz, a0xxy, a0xyy, a0xxz, a0xzz, a0yyz, a0yzz = sp.symbols("a0xx a0xy a0yy a0xz a0zz a0yz a0xxy a0xyy a0xxz a0xzz a0yyz a0yzz")
+        a1xx, a1xy, a1yy, a1xz, a1zz, a1yz, a1xxy, a1xyy, a1xxz, a1xzz, a1yyz, a1yzz = sp.symbols("a1xx a1xy a1yy a1xz a1zz a1yz a1xxy a1xyy a1xxz a1xzz a1yyz a1yzz")
+
+        tauS = 1 / omega1
+
+        a12FD = [sp.Symbol(f"a12FD_{i}") for i in range(6)]
+        p1ij = [sp.Symbol(f"p1ij_{i}") for i in range(6)]
+        P = [sp.Symbol(f"P{i}") for i in range(6)]
+        inv36 = sp.Rational(1, 36)
+        inv72 = sp.Rational(1, 72)
+        inv12 = sp.Rational(1, 12)
+        inv24 = sp.Rational(1, 24)
+
+
+
 
         RR = [sp.Symbol(f"M_{index.name[1:]}") for index in Ordering]
-        RReq = [sp.Symbol(f"eq_{index.name[1:]}") for index in Ordering]
+        fEq = [sp.Symbol(f"fEq_{index.name[1:]}") for index in Ordering]
+        fNEq = [sp.Symbol(f"fNEq_{index.name[1:]}") for index in Ordering]
         # RMeq = [sp.Symbol(f"RMeq_{index.name[1:]}") for index in Ordering]
         # eq = sp.symbols(f"eq_:{self.stencil.Q}")
         RRneq = [sp.Symbol(f"neq_{index.name[1:]}") for index in Ordering]
@@ -368,25 +385,25 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
 
         stencil = self.stencil
         F000 = stencil.index((0, 0, 0))
-        FM00 = stencil.index((-1, 0, 0))
-        F0M0 = stencil.index((0, -1, 0))
-        F00M = stencil.index((0, 0, -1))
-        FMM0 = stencil.index((-1, -1, 0))
-        FMP0 = stencil.index((-1, 1, 0))
-        FM0M = stencil.index((-1, 0, -1))
-        FM0P = stencil.index((-1, 0, 1))
-        F0MM = stencil.index((0, -1, -1))
+        FM00 = stencil.index((0, 0, 1))
+        F0M0 = stencil.index((0, 0, -1))
+        F00M = stencil.index((0, 1, 0))
+        FMM0 = stencil.index((0, -1, 0))
+        FMP0 = stencil.index((1, 0, 0))
+        FM0M = stencil.index((-1, 0, 0))
+        FM0P = stencil.index((0, 1, 1))
+        F0MM = stencil.index((0, 1, -1))
         F0MP = stencil.index((0, -1, 1))
 
-        FP00 = stencil.index((1, 0, 0))
-        F0P0 = stencil.index((0, 1, 0))
-        F00P = stencil.index((0, 0, 1))
-        FPP0 = stencil.index((1, 1, 0))
-        FPM0 = stencil.index((1, -1, 0))
-        FP0P = stencil.index((1, 0, 1))
-        FP0M = stencil.index((1, 0, -1))
-        F0PP = stencil.index((0, 1, 1))
-        F0PM = stencil.index((0, 1, -1))
+        FP00 = stencil.index((0, -1, -1))
+        F0P0 = stencil.index((1, 0, 1))
+        F00P = stencil.index((1, 0, -1))
+        FPP0 = stencil.index((-1, 0, 1))
+        FPM0 = stencil.index((-1, 0, -1))
+        FP0P = stencil.index((1, 1, 0))
+        FP0M = stencil.index((1, -1, 0))
+        F0PP = stencil.index((-1, 1, 0))
+        F0PM = stencil.index((-1, -1, 0))
 
         M000 = Ordering.M000
 
@@ -415,6 +432,10 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
         gradient = []
         sr = []
 
+        ux = u[0]
+        uy = u[1]
+        uz = u[2]
+
         if self._velocity_field:
             gradient = [Assignment(sp.Symbol("du_11"), self._velocity_field[1, 0, 0](0) - self._velocity_field[-1, 0, 0](0)),
                         Assignment(sp.Symbol("du_12"), self._velocity_field[0, 1, 0](0) - self._velocity_field[0, -1, 0](0)),
@@ -426,12 +447,12 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
                         Assignment(sp.Symbol("du_32"), self._velocity_field[0, 1, 0](2) - self._velocity_field[0, -1, 0](2)),
                         Assignment(sp.Symbol("du_33"), self._velocity_field[0, 0, 1](2) - self._velocity_field[0, 0, -1](2))]
 
-            sr = [Assignment(sp.Symbol("SR1"), 2.0 * sp.Symbol("du_11")),
-                  Assignment(sp.Symbol("SR2"), 2.0 * sp.Symbol("du_22")),
-                  Assignment(sp.Symbol("SR3"), 2.0 * sp.Symbol("du_33")),
-                  Assignment(sp.Symbol("SR4"), sp.Symbol("du_12") + sp.Symbol("du_21")),
-                  Assignment(sp.Symbol("SR5"), sp.Symbol("du_13") + sp.Symbol("du_31")),
-                  Assignment(sp.Symbol("SR6"), sp.Symbol("du_23") + sp.Symbol("du_32"))]
+            sr = [Assignment(sp.Symbol("SR1"), sp.Symbol("du_11")),
+                  Assignment(sp.Symbol("SR2"), sp.Symbol("du_22")),
+                  Assignment(sp.Symbol("SR3"), sp.Symbol("du_33")),
+                  Assignment(sp.Symbol("SR4"), half * (sp.Symbol("du_12") + sp.Symbol("du_21"))),
+                  Assignment(sp.Symbol("SR5"), half * (sp.Symbol("du_13") + sp.Symbol("du_31"))),
+                  Assignment(sp.Symbol("SR6"), half * (sp.Symbol("du_23") + sp.Symbol("du_32")))]
 
         moments = [Assignment(X_M1, f[FM00] + f[FMM0] + f[FMP0] + f[FM0M] + f[FM0P]),
                    Assignment(X_P1, f[FP00] + f[FPP0] + f[FPM0] + f[FP0P] + f[FP0M]),
@@ -445,162 +466,190 @@ class RecursiveRegularisedLbMethod(AbstractLbMethod):
                    Assignment(inv_rho, 1.0 / rho),
                    Assignment(RR[M000], 1.0),
 
-                   Assignment(RR[M100], inv_rho * (X_P1 - X_M1)),
-                   Assignment(RR[M010], inv_rho * (Y_P1 - Y_M1)),
-                   Assignment(RR[M001], inv_rho * (Z_P1 - Z_M1)),
-                   Assignment(RR[M200], inv_rho * (X_M1 + X_P1) - c_s_sq),
-                   Assignment(RR[M020], inv_rho * (Y_M1 + Y_P1) - c_s_sq),
-                   Assignment(RR[M002], inv_rho * (Z_M1 + Z_P1) - c_s_sq),
-                   Assignment(RR[M110], inv_rho * (f[FMM0] - f[FMP0] + f[FPP0] - f[FPM0])),
-                   Assignment(RR[M101], inv_rho * (f[FM0M] - f[FM0P] + f[FP0P] - f[FP0M])),
-                   Assignment(RR[M011], inv_rho * (f[F0MM] - f[F0MP] + f[F0PP] - f[F0PM])),
+                   Assignment(p1ij[0], inv_rho * (X_M1 + X_P1) - c_s_sq - u[0] * u[0]),
+                   Assignment(p1ij[1], inv_rho * (Y_M1 + Y_P1) - c_s_sq - u[1] * u[1]),
+                   Assignment(p1ij[2], inv_rho * (Z_M1 + Z_P1) - c_s_sq - u[2] * u[2]),
+                   Assignment(p1ij[3], inv_rho * (f[FMM0] - f[FMP0] + f[FPP0] - f[FPM0]) - u[0] * u[1]),
+                   Assignment(p1ij[4], inv_rho * (f[FM0M] - f[FM0P] + f[FP0P] - f[FP0M]) - u[0] * u[2]),
+                   Assignment(p1ij[5], inv_rho * (f[F0MM] - f[F0MP] + f[F0PP] - f[F0PM]) - u[1] * u[2]),
+
+                   Assignment(a12FD[0], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR1")),
+                   Assignment(a12FD[1], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR2")),
+                   Assignment(a12FD[2], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR3")),
+                   Assignment(a12FD[3], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR4")),
+                   Assignment(a12FD[4], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR5")),
+                   Assignment(a12FD[5], -2.0 * tauS * rho * c_s_sq * sp.Symbol("SR6")),
                    ]
 
-        eq_moments = [Assignment(RReq[M000], 1.0),
-                      Assignment(RReq[M100], u[0]),
-                      Assignment(RReq[M010], u[1]),
-                      Assignment(RReq[M001], u[2]),
-                      Assignment(RReq[M200], u[0] * u[0]),
-                      Assignment(RReq[M020], u[1] * u[1]),
-                      Assignment(RReq[M002], u[2] * u[2]),
-                      Assignment(RReq[M110], u[0] * u[1]),
-                      Assignment(RReq[M101], u[0] * u[2]),
-                      Assignment(RReq[M011], u[1] * u[2]),
-                      Assignment(RReq[M210], RReq[M200] * u[1]),
-                      Assignment(RReq[M201], RReq[M200] * u[2]),
-                      Assignment(RReq[M021], RReq[M020] * u[2]),
-                      Assignment(RReq[M120], RReq[M020] * u[0]),
-                      Assignment(RReq[M102], RReq[M002] * u[0]),
-                      Assignment(RReq[M012], RReq[M002] * u[1]),
-                      Assignment(RReq[M220], RReq[M200] * RReq[M020]),
-                      Assignment(RReq[M202], RReq[M200] * RReq[M002]),
-                      Assignment(RReq[M022], RReq[M020] * RReq[M002])]
-
         neq = [
-            Assignment(RRneq[M200], (RR[M200] - RReq[M200]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR1"))),
-            Assignment(RRneq[M020], (RR[M020] - RReq[M020]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR2"))),
-            Assignment(RRneq[M002], (RR[M002] - RReq[M002]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR3"))),
-            Assignment(RRneq[M110], (RR[M110] - RReq[M110]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR4"))),
-            Assignment(RRneq[M101], (RR[M101] - RReq[M101]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR5"))),
-            Assignment(RRneq[M011], (RR[M011] - RReq[M011]) * sigma + (sp.Integer(1) - sigma) * (-taup * sp.Symbol("SR6"))),
-
-            Assignment(RRneq[M210], u[1] * RRneq[M200] + 2.0 * u[0] * RRneq[M110]),
-            Assignment(RRneq[M201], u[2] * RRneq[M200] + 2.0 * u[0] * RRneq[M101]),
-            Assignment(RRneq[M021], u[2] * RRneq[M020] + 2.0 * u[1] * RRneq[M011]),
-            Assignment(RRneq[M120], u[0] * RRneq[M020] + 2.0 * u[1] * RRneq[M110]),
-            Assignment(RRneq[M102], u[0] * RRneq[M002] + 2.0 * u[2] * RRneq[M101]),
-            Assignment(RRneq[M012], u[1] * RRneq[M002] + 2.0 * u[2] * RRneq[M011]),
-
-            Assignment(RRneq[M220],
-                       u[1] * u[1] * RRneq[M200] + u[0] * u[0] * RRneq[M020] + 4.0 * u[0] * u[1] *
-                       RRneq[M110]),
-            Assignment(RRneq[M202],
-                       u[2] * u[2] * RRneq[M200] + u[0] * u[0] * RRneq[M002] + 4.0 * u[0] * u[2] *
-                       RRneq[M101]),
-            Assignment(RRneq[M022],
-                       u[2] * u[2] * RRneq[M020] + u[1] * u[1] * RRneq[M002] + 4.0 * u[1] * u[2] *
-                       RRneq[M011])
-        ]
+            Assignment(P[0], p1ij[0] * sigma + (sp.Integer(1) - sigma) * a12FD[0]),
+            Assignment(P[1], p1ij[1] * sigma + (sp.Integer(1) - sigma) * a12FD[1]),
+            Assignment(P[2], p1ij[2] * sigma + (sp.Integer(1) - sigma) * a12FD[2]),
+            Assignment(P[3], p1ij[3] * sigma + (sp.Integer(1) - sigma) * a12FD[3]),
+            Assignment(P[4], p1ij[4] * sigma + (sp.Integer(1) - sigma) * a12FD[4]),
+            Assignment(P[5], p1ij[5] * sigma + (sp.Integer(1) - sigma) * a12FD[5]),
+
+            Assignment(a0xx, ux * ux),
+            Assignment(a0xy, ux * uy),
+            Assignment(a0yy, uy * uy),
+            Assignment(a0xz, ux * uz),
+            Assignment(a0zz, uz * uz),
+            Assignment(a0yz, uy * uz),
+
+            Assignment(a0xxy, uy * a0xx),
+            Assignment(a0xyy, ux * a0yy),
+            Assignment(a0xxz, uz * a0xx),
+            Assignment(a0xzz, ux * a0zz),
+            Assignment(a0yyz, uz * a0yy),
+            Assignment(a0yzz, uy * a0zz),
+
+            Assignment(fEq[0],
+                       -((sp.Float(3.0) * a0zz + sp.Float(3.0) * a0yy + sp.Float(3.0) * a0xx - 2) * rho) * sp.Float(
+                           1 / 6)),
+            Assignment(fEq[1], (rho * (
+                    sp.Float(6.0) * uz + sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz - sp.Float(3.0) * a0yy - sp.Float(
+                9.0) * a0xxz - sp.Float(3.0) * a0xx + 2)) * (inv36)),
+            Assignment(fEq[2], -(rho * (
+                    sp.Float(6.0) * uz - sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz + sp.Float(3.0) * a0yy - sp.Float(
+                9.0) * a0xxz + sp.Float(3.0) * a0xx - 2)) * (inv36)),
+            Assignment(fEq[3], (rho * (
+                    sp.Float(6.0) * uy - sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz + sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxy - sp.Float(3.0) * a0xx + 2)) * (inv36)),
+            Assignment(fEq[4], -(rho * (
+                    sp.Float(6.0) * uy + sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz - sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxy + sp.Float(3.0) * a0xx - 2)) * (inv36)),
+            Assignment(fEq[5], (rho * (
+                    sp.Float(6.0) * ux - sp.Float(3.0) * a0zz - sp.Float(3.0) * a0yy - sp.Float(9.0) * a0xzz - sp.Float(
+                9.0) * a0xyy + sp.Float(6.0) * a0xx + 2)) * (inv36)),
+            Assignment(fEq[6], -(rho * (
+                    sp.Float(6.0) * ux + sp.Float(3.0) * a0zz + sp.Float(3.0) * a0yy - sp.Float(9.0) * a0xzz - sp.Float(
+                9.0) * a0xyy - sp.Float(6.0) * a0xx - 2)) * (inv36)),
+            Assignment(fEq[7], (rho * (sp.Float(6.0) * uz + sp.Float(6.0) * uy + sp.Float(
+                6.0) * a0zz + 18 * a0yzz + 18 * a0yz + 18 * a0yyz + sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxz - sp.Float(
+                9.0) * a0xxy - sp.Float(3.0) * a0xx + 2)) * (inv72)),
+            Assignment(fEq[8], -(rho * (sp.Float(6.0) * uz - sp.Float(6.0) * uy - sp.Float(
+                6.0) * a0zz - 18 * a0yzz + 18 * a0yz + 18 * a0yyz - sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxz + sp.Float(
+                9.0) * a0xxy + sp.Float(3.0) * a0xx - 2)) * (inv72)),
+            Assignment(fEq[9], (rho * (sp.Float(6.0) * uz - sp.Float(6.0) * uy + sp.Float(
+                6.0) * a0zz - 18 * a0yzz - 18 * a0yz + 18 * a0yyz + sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxz + sp.Float(
+                9.0) * a0xxy - sp.Float(3.0) * a0xx + 2)) * (inv72)),
+            Assignment(fEq[10], -(rho * (sp.Float(6.0) * uz + sp.Float(6.0) * uy - sp.Float(
+                6.0) * a0zz + 18 * a0yzz - 18 * a0yz + 18 * a0yyz - sp.Float(6.0) * a0yy - sp.Float(
+                9.0) * a0xxz - sp.Float(
+                9.0) * a0xxy + sp.Float(3.0) * a0xx - 2)) * (inv72)),
+            Assignment(fEq[11], (rho * (
+                    sp.Float(6.0) * uz + sp.Float(6.0) * ux + sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz - sp.Float(
+                3.0) * a0yy + 18 * a0xzz + 18 * a0xz - sp.Float(9.0) * a0xyy + 18 * a0xxz + sp.Float(
+                6.0) * a0xx + 2)) * (
+                           inv72)),
+            Assignment(fEq[12], -(rho * (
+                    sp.Float(6.0) * uz - sp.Float(6.0) * ux - sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz + sp.Float(
+                3.0) * a0yy - 18 * a0xzz + 18 * a0xz + sp.Float(9.0) * a0xyy + 18 * a0xxz - sp.Float(
+                6.0) * a0xx - 2)) * (
+                           inv72)),
+            Assignment(fEq[13], (rho * (sp.Float(6.0) * uz - sp.Float(6.0) * ux + sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz - sp.Float(3.0) * a0yy - 18 * a0xzz - 18 * a0xz + sp.Float(9.0) * a0xyy + 18 * a0xxz + sp.Float(6.0) * a0xx + 2)) * (inv72)),
+            Assignment(fEq[14], -(rho * (
+                    sp.Float(6.0) * uz + sp.Float(6.0) * ux - sp.Float(6.0) * a0zz - sp.Float(9.0) * a0yyz + sp.Float(
+                3.0) * a0yy + 18 * a0xzz - 18 * a0xz - sp.Float(9.0) * a0xyy + 18 * a0xxz - sp.Float(
+                6.0) * a0xx - 2)) * (
+                           inv72)),
+            Assignment(fEq[15], (rho * (
+                    sp.Float(6.0) * uy + sp.Float(6.0) * ux - sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz + sp.Float(
+                6.0) * a0yy - sp.Float(9.0) * a0xzz + 18 * a0xyy + 18 * a0xy + 18 * a0xxy + sp.Float(
+                6.0) * a0xx + 2)) * (
+                           inv72)),
+            Assignment(fEq[16], -(rho * (
+                    sp.Float(6.0) * uy - sp.Float(6.0) * ux + sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz - sp.Float(
+                6.0) * a0yy + sp.Float(9.0) * a0xzz - 18 * a0xyy + 18 * a0xy + 18 * a0xxy - sp.Float(
+                6.0) * a0xx - 2)) * (
+                           inv72)),
+            Assignment(fEq[17], (rho * (
+                    sp.Float(6.0) * uy - sp.Float(6.0) * ux - sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz + sp.Float(
+                6.0) * a0yy + sp.Float(9.0) * a0xzz - 18 * a0xyy - 18 * a0xy + 18 * a0xxy + sp.Float(
+                6.0) * a0xx + 2)) * (
+                           inv72)),
+            Assignment(fEq[18], -(rho * (
+                    sp.Float(6.0) * uy + sp.Float(6.0) * ux + sp.Float(3.0) * a0zz - sp.Float(9.0) * a0yzz - sp.Float(
+                6.0) * a0yy - sp.Float(9.0) * a0xzz + 18 * a0xyy - 18 * a0xy + 18 * a0xxy - sp.Float(
+                6.0) * a0xx - 2)) * (
+                           inv72))
 
-        col = [
-            Assignment(RRcoll[M200], RR[M200] - omegaPlus * RRneq[M200] - omegaMinus * RRneq[
-                M020] - omegaMinus * RRneq[M002]),
-            Assignment(RRcoll[M020], RR[M020] - omegaMinus * RRneq[M200] - omegaPlus * RRneq[
-                M020] - omegaMinus * RRneq[M002]),
-            Assignment(RRcoll[M002],
-                       RR[M002] - omegaMinus * RRneq[M200] - omegaMinus * RRneq[
-                           M020] - omegaPlus * RRneq[M002]),
-
-            Assignment(RRcoll[M110], (1.0 - omega2) * RRneq[M110] + RReq[M110]),
-            Assignment(RRcoll[M101], (1.0 - omega2) * RRneq[M101] + RReq[M101]),
-            Assignment(RRcoll[M011], (1.0 - omega2) * RRneq[M011] + RReq[M011]),
-
-            Assignment(RRcoll[M210], (1.0 - omega3) * RRneq[M210] + RReq[M210]),
-            Assignment(RRcoll[M201], (1.0 - omega3) * RRneq[M201] + RReq[M201]),
-            Assignment(RRcoll[M021], (1.0 - omega3) * RRneq[M021] + RReq[M021]),
-            Assignment(RRcoll[M120], (1.0 - omega3) * RRneq[M120] + RReq[M120]),
-            Assignment(RRcoll[M102], (1.0 - omega3) * RRneq[M102] + RReq[M102]),
-            Assignment(RRcoll[M012], (1.0 - omega3) * RRneq[M012] + RReq[M012]),
-
-            Assignment(RRcoll[M220], (1.0 - omega4) * RRneq[M220] + RReq[M220]),
-            Assignment(RRcoll[M202], (1.0 - omega4) * RRneq[M202] + RReq[M202]),
-            Assignment(RRcoll[M022], (1.0 - omega4) * RRneq[M022] + RReq[M022]),
-
-            Assignment(RMcoll[M200], RRcoll[M200] + c_s_sq),
-            Assignment(RMcoll[M020], RRcoll[M020] + c_s_sq),
-            Assignment(RMcoll[M002], RRcoll[M002] + c_s_sq),
-
-            Assignment(RMcoll[M110], RRcoll[M110]),
-            Assignment(RMcoll[M101], RRcoll[M101]),
-            Assignment(RMcoll[M011], RRcoll[M011]),
-
-            Assignment(RMcoll[M210], RRcoll[M210] + c_s_sq * u[1]),
-            Assignment(RMcoll[M201], RRcoll[M201] + c_s_sq * u[2]),
-            Assignment(RMcoll[M021], RRcoll[M021] + c_s_sq * u[2]),
-            Assignment(RMcoll[M120], RRcoll[M120] + c_s_sq * u[0]),
-            Assignment(RMcoll[M102], RRcoll[M102] + c_s_sq * u[0]),
-            Assignment(RMcoll[M012], RRcoll[M012] + c_s_sq * u[1]),
-
-            Assignment(RMcoll[M220],
-                       RRcoll[M220] + c_s_sq * (RRcoll[M200] + RRcoll[M020]) + cs4),
-            Assignment(RMcoll[M202],
-                       RRcoll[M202] + c_s_sq * (RRcoll[M200] + RRcoll[M002]) + cs4),
-            Assignment(RMcoll[M022],
-                       RRcoll[M022] + c_s_sq * (RRcoll[M020] + RRcoll[M002]) + cs4),
         ]
 
-        tmp1 = sp.Rational(1, 2) * rho * (
-                u[0] + RMcoll[M200] - RMcoll[M120] - RMcoll[M102] - RMcoll[
-            M220] - RMcoll[M202])
 
-        tmp2 = sp.Rational(1, 2) * rho * (
-                u[1] + RMcoll[M020] - RMcoll[M210] - RMcoll[M012] - RMcoll[
-            M220] - RMcoll[M022])
 
-        tmp3 = sp.Rational(1, 2) * rho * (
-                u[2] + RMcoll[M002] - RMcoll[M201] - RMcoll[M021] - RMcoll[
-            M202] - RMcoll[M022])
 
-        tmp4 = sp.Rational(1, 4) * rho * (
-                RMcoll[M110] + RMcoll[M210] + RMcoll[M120] + RMcoll[M220])
-
-        tmp5 = sp.Rational(1, 4) * rho * (
-                RMcoll[M101] + RMcoll[M201] + RMcoll[M102] + RMcoll[M202])
-
-        tmp6 = sp.Rational(1, 4) * rho * (
-                RMcoll[M011] + RMcoll[M021] + RMcoll[M012] + RMcoll[M022])
-
-        main = [
-            Assignment(d[F000], rho * (
-                    1.0 - RMcoll[M200] - RMcoll[M020] - RMcoll[M002] + RMcoll[
-                M220] + RMcoll[M202] + RMcoll[M022])),
-
-            Assignment(d[FP00], tmp1),
-            Assignment(d[FM00], rho * (-u[0] + RMcoll[M120] + RMcoll[M102]) + tmp1),
-
-            Assignment(d[F0P0], tmp2),
-            Assignment(d[F0M0], rho * (-u[1] + RMcoll[M210] + RMcoll[M012]) + tmp2),
-
-            Assignment(d[F00P], tmp3),
-            Assignment(d[F00M], rho * (-u[2] + RMcoll[M201] + RMcoll[M021]) + tmp3),
-
-            Assignment(d[FPP0], tmp4),
-            Assignment(d[FMP0], sp.Rational(1, 2) * rho * (-RMcoll[M110] - RMcoll[M120]) + tmp4),
-            Assignment(d[FPM0], sp.Rational(1, 2) * rho * (-RMcoll[M110] - RMcoll[M210]) + tmp4),
-            Assignment(d[FMM0], sp.Rational(1, 2) * rho * (- RMcoll[M210] - RMcoll[M120]) + tmp4),
-
-            Assignment(d[FP0P], tmp5),
-            Assignment(d[FM0P], sp.Rational(1, 2) * rho * (-RMcoll[M101] - RMcoll[M102]) + tmp5),
-            Assignment(d[FP0M], sp.Rational(1, 2) * rho * (-RMcoll[M101] - RMcoll[M201]) + tmp5),
-            Assignment(d[FM0M], sp.Rational(1, 2) * rho * (- RMcoll[M201] - RMcoll[M102]) + tmp5),
+        col = [
 
-            Assignment(d[F0PP], tmp6),
-            Assignment(d[F0MP], sp.Rational(1, 2) * rho * (-RMcoll[M011] - RMcoll[M012]) + tmp6),
-            Assignment(d[F0PM], sp.Rational(1, 2) * rho * (-RMcoll[M011] - RMcoll[M021]) + tmp6),
-            Assignment(d[F0MM], sp.Rational(1, 2) * rho * (- RMcoll[M021] - RMcoll[M012]) + tmp6),
+            Assignment(a1xx, p1ij[0]),
+            Assignment(a1xy, p1ij[1]),
+            Assignment(a1xz, p1ij[2]),
+            Assignment(a1yy, p1ij[3]),
+            Assignment(a1yz, p1ij[4]),
+            Assignment(a1zz, p1ij[5]),
+
+            Assignment(a1xxy, sp.Float(2.0) * ux * a1xy + uy * a1xx),
+            Assignment(a1xxz, sp.Float(2.0) * ux * a1xz + uz * a1xx),
+            Assignment(a1xyy, sp.Float(2.0) * uy * a1xy + ux * a1yy),
+            Assignment(a1xzz, sp.Float(2.0) * uz * a1xz + ux * a1zz),
+            Assignment(a1yyz, sp.Float(2.0) * uy * a1yz + uz * a1yy),
+            Assignment(a1yzz, sp.Float(2.0) * uz * a1yz + uy * a1zz),
+
+            Assignment(fNEq[0], -(a1zz + a1yy + a1xx) * sp.Float(0.5)),
+            Assignment(fNEq[1],
+                       (sp.Float(2.0) * a1zz - sp.Float(3.0) * a1yyz - a1yy - sp.Float(3.0) * a1xxz - a1xx) * (inv12)),
+            Assignment(fNEq[2],
+                       (sp.Float(2.0) * a1zz + sp.Float(3.0) * a1yyz - a1yy + sp.Float(3.0) * a1xxz - a1xx) * (inv12)),
+            Assignment(fNEq[3],
+                       -(a1zz + sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy + sp.Float(3.0) * a1xxy + a1xx) * (inv12)),
+            Assignment(fNEq[4],
+                       -(a1zz - sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy - sp.Float(3.0) * a1xxy + a1xx) * (inv12)),
+            Assignment(fNEq[5],
+                       -(a1zz + a1yy + sp.Float(3.0) * a1xzz + sp.Float(3.0) * a1xyy - sp.Float(2.0) * a1xx) * (inv12)),
+            Assignment(fNEq[6],
+                       -(a1zz + a1yy - sp.Float(3.0) * a1xzz - sp.Float(3.0) * a1xyy - sp.Float(2.0) * a1xx) * (inv12)),
+            Assignment(fNEq[7], (sp.Float(2.0) * a1zz + sp.Float(6.0) * a1yzz + sp.Float(6.0) * a1yz + sp.Float(
+                6.0) * a1yyz + sp.Float(2.0) * a1yy - sp.Float(3.0) * a1xxz - sp.Float(3.0) * a1xxy - a1xx) * (inv24)),
+            Assignment(fNEq[8], (sp.Float(2.0) * a1zz + sp.Float(6.0) * a1yzz - sp.Float(6.0) * a1yz - sp.Float(
+                6.0) * a1yyz + sp.Float(2.0) * a1yy + sp.Float(3.0) * a1xxz - sp.Float(3.0) * a1xxy - a1xx) * (inv24)),
+            Assignment(fNEq[9], (sp.Float(2.0) * a1zz - sp.Float(6.0) * a1yzz - sp.Float(6.0) * a1yz + sp.Float(
+                6.0) * a1yyz + sp.Float(2.0) * a1yy - sp.Float(3.0) * a1xxz + sp.Float(3.0) * a1xxy - a1xx) * (inv24)),
+            Assignment(fNEq[10], (sp.Float(2.0) * a1zz - sp.Float(6.0) * a1yzz + sp.Float(6.0) * a1yz - sp.Float(
+                6.0) * a1yyz + sp.Float(2.0) * a1yy + sp.Float(3.0) * a1xxz + sp.Float(3.0) * a1xxy - a1xx) * (inv24)),
+            Assignment(fNEq[11], (
+                        sp.Float(2.0) * a1zz - sp.Float(3.0) * a1yyz - a1yy + sp.Float(6.0) * a1xzz + sp.Float(
+                    6.0) * a1xz - sp.Float(3.0) * a1xyy + sp.Float(6.0) * a1xxz + sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[12], (
+                        sp.Float(2.0) * a1zz + sp.Float(3.0) * a1yyz - a1yy + sp.Float(6.0) * a1xzz - sp.Float(
+                    6.0) * a1xz - sp.Float(3.0) * a1xyy - sp.Float(6.0) * a1xxz + sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[13], (
+                        sp.Float(2.0) * a1zz - sp.Float(3.0) * a1yyz - a1yy - sp.Float(6.0) * a1xzz - sp.Float(
+                    6.0) * a1xz + sp.Float(3.0) * a1xyy + sp.Float(6.0) * a1xxz + sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[14], (
+                        sp.Float(2.0) * a1zz + sp.Float(3.0) * a1yyz - a1yy - sp.Float(6.0) * a1xzz + sp.Float(
+                    6.0) * a1xz + sp.Float(3.0) * a1xyy - sp.Float(6.0) * a1xxz + sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[15], -(
+                        a1zz + sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy + sp.Float(3.0) * a1xzz - sp.Float(
+                    6.0) * a1xyy - sp.Float(6.0) * a1xy - sp.Float(6.0) * a1xxy - sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[16], -(
+                        a1zz - sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy + sp.Float(3.0) * a1xzz - sp.Float(
+                    6.0) * a1xyy + sp.Float(6.0) * a1xy + sp.Float(6.0) * a1xxy - sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[17], -(
+                        a1zz + sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy - sp.Float(3.0) * a1xzz + sp.Float(
+                    6.0) * a1xyy + sp.Float(6.0) * a1xy - sp.Float(6.0) * a1xxy - sp.Float(2.0) * a1xx) * (inv24)),
+            Assignment(fNEq[18], -(
+                        a1zz - sp.Float(3.0) * a1yzz - sp.Float(2.0) * a1yy - sp.Float(3.0) * a1xzz + sp.Float(
+                    6.0) * a1xyy - sp.Float(6.0) * a1xy + sp.Float(6.0) * a1xxy - sp.Float(2.0) * a1xx) * (inv24))
         ]
 
-        subexpressions = list(additional_subexpressions) + gradient + sr + cqe.all_assignments + moments + eq_moments + neq + col
+        main = []
+        for i in range(19):
+            main.append(Assignment(d[i], fEq[i] + (1 - omega1) * fNEq[i]))
+
+        subexpressions = list(additional_subexpressions) + gradient + sr + cqe.all_assignments + moments  + neq + col
         ac = AssignmentCollection(subexpressions=subexpressions, main_assignments=main)
         ac = ac.new_without_unused_subexpressions()
 
diff --git a/lbmpy/stencils.py b/lbmpy/stencils.py
index be935bef3f7ba35f2ad9d02208e32449dd8477eb..d122acc449b4fa9826ef932db5a1b417367cadd5 100644
--- a/lbmpy/stencils.py
+++ b/lbmpy/stencils.py
@@ -229,7 +229,41 @@ def _predefined_stencils(stencil: str, ordering: str):
                         (-1, 0, 1), (0, -1, -1), (0, -1, 1),
                         (1, 0, 0), (0, 1, 0), (0, 0, 1),
                         (1, 1, 0), (1, -1, 0), (1, 0, 1),
-                        (1, 0, -1), (0, 1, 1), (0, 1, -1))
+                        (1, 0, -1), (0, 1, 1), (0, 1, -1)),
+
+            'prolb':         ((0, 0, 0), (0, 0, 1),(0, 0,-1),
+
+            (0, 1, 0),
+
+            (0,-1, 0),
+
+            (1, 0, 0),
+
+            (-1, 0, 0),
+
+            (0, 1, 1),
+
+            (0, 1,-1),
+
+            (0,-1, 1),
+
+            (0,-1,-1),
+
+            (1, 0, 1),
+
+            (1, 0,-1),
+
+            (-1, 0, 1),
+
+            (-1, 0,-1),
+
+            (1, 1, 0),
+
+            (1,-1, 0),
+
+            (-1, 1, 0),
+
+            (-1,-1, 0),)
         },
         'D3Q27': {
             'walberla': ((0, 0, 0),