diff --git a/lbmpy/boundaries/boundaryhandling.py b/lbmpy/boundaries/boundaryhandling.py
index 8a94802d0aa0dfe766913fcd0707a791b7fb9648..ccc8fb270d8de8cd67b51140a66808507c05ff06 100644
--- a/lbmpy/boundaries/boundaryhandling.py
+++ b/lbmpy/boundaries/boundaryhandling.py
@@ -2,12 +2,13 @@ import numpy as np
 import sympy as sp
 from lbmpy.advanced_streaming.indexing import BetweenTimestepsIndexing
 from lbmpy.advanced_streaming.utility import is_inplace, Timestep, AccessPdfValues
-from pystencils import Field, Assignment, TypedSymbol, create_kernel
+from pystencils import Assignment, Field, TypedSymbol, create_kernel
 from pystencils.stencil import inverse_direction
 from pystencils import CreateKernelConfig, Target
 from pystencils.boundaries import BoundaryHandling
 from pystencils.boundaries.createindexlist import numpy_data_type_for_boundary_object
 from pystencils.backends.cbackend import CustomCodeNode
+from pystencils.simp import add_subexpressions_for_field_reads
 
 
 class LatticeBoltzmannBoundaryHandling(BoundaryHandling):
@@ -194,13 +195,16 @@ def create_lattice_boltzmann_boundary_kernel(pdf_field, index_field, lb_method,
     boundary_assignments = boundary_functor(f_out, f_in, dir_symbol, inv_dir, lb_method, index_field)
     boundary_assignments = indexing.substitute_proxies(boundary_assignments)
 
-    #   Code Elements inside the loop
-    elements = [Assignment(dir_symbol, index_field[0]('dir'))]
-    elements += boundary_assignments.all_assignments
-
     config = CreateKernelConfig(index_fields=[index_field], target=target, default_number_int="int32",
                                 skip_independence_check=True, **kernel_creation_args)
 
+    default_data_type = config.data_type.default_factory()
+    if pdf_field.dtype != default_data_type:
+        boundary_assignments = add_subexpressions_for_field_reads(boundary_assignments, data_type=default_data_type)
+
+    elements = [Assignment(dir_symbol, index_field[0]('dir'))]
+    elements += boundary_assignments.all_assignments
+
     kernel = create_kernel(elements, config=config)
 
     #   Code Elements ahead of the loop
diff --git a/lbmpy/updatekernels.py b/lbmpy/updatekernels.py
index 89cfa30f829e4a2426ba85246aeda5701fb02cef..31612dd4cde7c7d16b952c43ed4f98d2e9973e38 100644
--- a/lbmpy/updatekernels.py
+++ b/lbmpy/updatekernels.py
@@ -10,7 +10,8 @@ from pystencils.sympyextensions import fast_subs
 # -------------------------------------------- LBM Kernel Creation -----------------------------------------------------
 
 
-def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=StreamPullTwoFieldsAccessor()):
+def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=StreamPullTwoFieldsAccessor(),
+                      data_type=None):
     """Replaces the pre- and post collision symbols in the collision rule by field accesses.
 
     Args:
@@ -19,6 +20,7 @@ def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=Stream
         dst_field: field used for writing pdf values if accessor.is_inplace this parameter is ignored
         accessor: instance of PdfFieldAccessor, defining where to read and write values
                   to create e.g. a fused stream-collide kernel See 'fieldaccess.PdfFieldAccessor'
+        data_type: If a datatype is given the field reads are isolated and written to TypedSymbols of type data_type
 
     Returns:
         LbmCollisionRule where pre- and post collision symbols have been replaced
@@ -49,8 +51,9 @@ def create_lbm_kernel(collision_rule, src_field, dst_field=None, accessor=Stream
             new_split_groups.append([fast_subs(e, substitutions) for e in split_group])
         result.simplification_hints['split_groups'] = new_split_groups
 
-    if accessor.is_inplace:
-        result = add_subexpressions_for_field_reads(result, subexpressions=True, main_assignments=True)
+    if accessor.is_inplace or (data_type is not None and src_field.dtype != data_type):
+        result = add_subexpressions_for_field_reads(result, subexpressions=True, main_assignments=True,
+                                                    data_type=data_type)
 
     return result