diff --git a/generate_packinfo.py b/generate_packinfo.py
index d3d30dd54d977f34e80c31331fce6b6d3cd6b32c..6da4056fa96eb70f137356ac55a2cf65c15c3dc8 100644
--- a/generate_packinfo.py
+++ b/generate_packinfo.py
@@ -1,5 +1,5 @@
 from itertools import product
-from collections import defaultdict
+from collections import defaultdict, OrderedDict
 from typing import Dict, Sequence, Tuple, Optional
 from jinja2 import Environment, PackageLoader
 from pystencils import Field, FieldType, Assignment, create_kernel
@@ -45,6 +45,10 @@ def generate_pack_info(class_name: str,
                        directions_to_pack_terms: Dict[Tuple[Tuple], Sequence[Field.Access]],
                        namespace='pystencils',
                        **create_kernel_params):
+
+    items = [(e[0], sorted(e[1], key=lambda x: str(x))) for e in directions_to_pack_terms.items()]
+    items = sorted(items, key=lambda e: e[0])
+    directions_to_pack_terms = OrderedDict(items)
     target = create_kernel_params.get('target', 'cpu')
 
     fields_accessed = set()
@@ -60,10 +64,10 @@ def generate_pack_info(class_name: str,
         raise NotImplementedError("Fields of different data types are used - this is not supported")
     dtype = data_types.pop()
 
-    pack_kernels = {}
-    unpack_kernels = {}
+    pack_kernels = OrderedDict()
+    unpack_kernels = OrderedDict()
     all_accesses = set()
-    elements_per_cell = {}
+    elements_per_cell = OrderedDict()
     for direction_set, terms in directions_to_pack_terms.items():
         for d in direction_set:
             if not all(abs(i) <= 1 for i in d):
diff --git a/jinja_filters.py b/jinja_filters.py
index 4e518b7a0b9193c59a2db2e7f2083c7bc76c4288..0dac492aa6eadb4e9bdadf2cb6b19213f3f2ea95 100644
--- a/jinja_filters.py
+++ b/jinja_filters.py
@@ -193,10 +193,11 @@ def generate_call(ctx, kernel_info, ghost_layers_to_include=0, cell_interval=Non
         if cell_interval is None:
             shape_names = ['xSize()', 'ySize()', 'zSize()'][:field_object.spatial_dimensions]
             offset = 2 * ghost_layers_to_include + 2 * required_ghost_layers
-            return ["%s->%s + %s" % (field_object.name, e, offset) for e in shape_names]
+            return ["cell_idx_c(%s->%s) + %s" % (field_object.name, e, offset) for e in shape_names]
         else:
             assert ghost_layers_to_include == 0
-            return ["{ci}.{coord}Size() + {gl}".format(coord=coord_name, ci=cell_interval, gl=2 * required_ghost_layers)
+            return ["cell_idx_c({ci}.{coord}Size()) + {gl}".format(coord=coord_name, ci=cell_interval,
+                                                                   gl=2 * required_ghost_layers)
                     for coord_name in ('x', 'y', 'z')]
 
     for param in ast_params:
@@ -208,9 +209,11 @@ def generate_call(ctx, kernel_info, ghost_layers_to_include=0, cell_interval=Non
             if field.field_type == FieldType.BUFFER:
                 kernel_call_lines.append("%s %s = %s;" % (param.symbol.dtype, param.symbol.name, param.field_name))
             else:
-                coordinates = get_start_coordinates(field)
+                coordinates = set(get_start_coordinates(field))
+                coordinates = sorted(coordinates, key=lambda e: str(e))
                 actual_gls = "int_c(%s->nrOfGhostLayers())" % (param.field_name, )
-                for c in set(coordinates):
+
+                for c in coordinates:
                     kernel_call_lines.append("WALBERLA_ASSERT_GREATER_EQUAL(%s, -%s);" %
                                              (c, actual_gls))
                 while len(coordinates) < 4:
diff --git a/sweep.py b/sweep.py
index e594529689df6b57c5c192551f62bfbdbd9e88a9..1720b3bb9ab94f15b30e7845951310483efc72af 100644
--- a/sweep.py
+++ b/sweep.py
@@ -91,7 +91,8 @@ class Sweep:
             add_pystencils_filters_to_jinja_env(env)
 
             main_kernel_info = KernelInfo(ast, temporary_fields, field_swaps, varying_parameters)
-            representative_field = {p.field_name for p in main_kernel_info.parameters if p.is_field_parameter}.pop()
+            representative_field = {p.field_name for p in main_kernel_info.parameters if p.is_field_parameter}
+            representative_field = sorted(representative_field)[0]
 
             context = {
                 'kernel': main_kernel_info,
diff --git a/templates/GpuPackInfo.tmpl.h b/templates/GpuPackInfo.tmpl.h
index 4202ccdc8939884ec6f3b41f51e819061a7e650a..74bd12b1f66a4b6284dfaf1f1088e2f12bbb1c06 100644
--- a/templates/GpuPackInfo.tmpl.h
+++ b/templates/GpuPackInfo.tmpl.h
@@ -23,7 +23,7 @@ public:
     {{class_name}}( {{fused_kernel|generate_constructor_parameters(parameters_to_ignore=['buffer'])}} )
         : {{ fused_kernel|generate_constructor_initializer_list(parameters_to_ignore=['buffer']) }}
     {};
-
+    virtual ~{{class_name}}() {}
 
     virtual void pack  (stencil::Direction dir, unsigned char * buffer, IBlock * block, cudaStream_t stream);
     virtual void unpack(stencil::Direction dir, unsigned char * buffer, IBlock * block, cudaStream_t stream);