diff --git a/lbmpy_walberla/templates/LatticeModel.tmpl.cpp b/lbmpy_walberla/templates/LatticeModel.tmpl.cpp
index 3db08c03826ed181371699bd3e849ef9597759f2..2b2065cc7600e4d230d7d21f801e8e1044bb7701 100644
--- a/lbmpy_walberla/templates/LatticeModel.tmpl.cpp
+++ b/lbmpy_walberla/templates/LatticeModel.tmpl.cpp
@@ -66,7 +66,7 @@ void {{class_name}}::Sweep::streamCollide( IBlock * block, const uint_t numberOf
     {{stream_collide_kernel|generate_block_data_to_field_extraction(parameters=['pdfs', 'pdfs_tmp'])|indent(4)}}
 
     auto & lm = dynamic_cast< lbm::PdfField<{{class_name}}> * > (pdfs)->latticeModel();
-    lm.configureBlock(block);
+    WALBERLA_ASSERT_EQUAL( *(lm.blockId), block->getId() );
 
     {{stream_collide_kernel|generate_refs_for_kernel_parameters(prefix='lm.', parameters_to_ignore=['pdfs', 'pdfs_tmp'])|indent(4) }}
     {{stream_collide_kernel|generate_call('cell_idx_c(numberOfGhostLayersToInclude)')|indent(4)}}
@@ -78,7 +78,7 @@ void {{class_name}}::Sweep::collide( IBlock * block, const uint_t numberOfGhostL
    {{collide_kernel|generate_block_data_to_field_extraction(parameters=['pdfs'])|indent(4)}}
 
     auto & lm = dynamic_cast< lbm::PdfField<{{class_name}}> * > (pdfs)->latticeModel();
-    lm.configureBlock(block);
+    WALBERLA_ASSERT_EQUAL( *(lm.blockId), block->getId() );
 
     {{collide_kernel|generate_refs_for_kernel_parameters(prefix='lm.', parameters_to_ignore=['pdfs', 'pdfs_tmp'])|indent(4) }}
     {{collide_kernel|generate_call('cell_idx_c(numberOfGhostLayersToInclude)')|indent(4)}}
diff --git a/lbmpy_walberla/templates/LatticeModel.tmpl.h b/lbmpy_walberla/templates/LatticeModel.tmpl.h
index e76e2dd3f41d09ceb3b0ce910156272c2dcf2b8c..b5f2d37c871d00ae100be57389b1fd46df651599 100644
--- a/lbmpy_walberla/templates/LatticeModel.tmpl.h
+++ b/lbmpy_walberla/templates/LatticeModel.tmpl.h
@@ -57,6 +57,7 @@
 #endif
 
 {% set lmIgnores = ('pdfs', 'pdfs_tmp') %}
+{% set lmOffsets = ('block_offset_0', 'block_offset_1', 'block_offset_2') %}
 
 
 // Forward declarations
@@ -121,19 +122,23 @@ public:
         {{stream_collide_kernel|generate_members(only_fields=True)|indent(8)}}
     };
 
-    {{class_name}}( {{stream_collide_kernel|generate_constructor_parameters(lmIgnores) }} )
-        : {{ stream_collide_kernel|generate_constructor_initializer_list(lmIgnores) }}, currentLevel(0)
+    {{class_name}}( {{stream_collide_kernel|generate_constructor_parameters(lmIgnores+lmOffsets) }} )
+        : {{ stream_collide_kernel|generate_constructor_initializer_list(lmIgnores+lmOffsets) }}, currentLevel(0)
     {};
 
-    void configure( IBlock & block, StructuredBlockStorage &)  { configureBlock( &block ); }
+    void configure( IBlock & block, StructuredBlockStorage & storage )  { configureBlock( &block, &storage ); }
 
     // Parameters:
     {{stream_collide_kernel|generate_members(lmIgnores)|indent(4)}}
 
 private:
-    void configureBlock(IBlock * block)
+    void configureBlock(IBlock * block, StructuredBlockStorage * storage)
     {
-        {{stream_collide_kernel|generate_block_data_to_field_extraction(lmIgnores, no_declarations=True)|indent(8)}}
+        {{stream_collide_kernel|generate_block_data_to_field_extraction(lmIgnores+lmOffsets, no_declarations=True)|indent(8)}}
+        block_offset_0 = uint32_c(storage->getBlockCellBB(*block).xMin());
+        block_offset_1 = uint32_c(storage->getBlockCellBB(*block).yMin());
+        block_offset_2 = uint32_c(storage->getBlockCellBB(*block).zMin());
+        blockId = &block->getId();
 
         {% if refinement_scaling -%}
         const uint_t targetLevel = block->getBlockStorage().getLevel(*block);
@@ -171,6 +176,7 @@ private:
 
     // Updated by configureBlock:
     {{stream_collide_kernel|generate_block_data_to_field_extraction(lmIgnores, declarations_only=True)|indent(4)}}
+    const IBlockID * blockId;
     uint_t currentLevel;
 
     // Backend classes can access private members: