diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py
index bcbc8b1e82a27e3612452d2b68217f03c8d8b341..788ba19253c58f1c0d14b46cfd67a3859f35dde6 100644
--- a/python/dune/perftool/generation/cache.py
+++ b/python/dune/perftool/generation/cache.py
@@ -193,7 +193,13 @@ class _ConditionDict(dict):
 
 
 def _filter_cache_items(gen, condition):
-    return {k: v for k, v in gen._memoize_cache.items() if eval(condition, _ConditionDict(gen.item_tags))}
+    ret = {}
+    for k, v in gen._memoize_cache.items():
+        _, context_tags = k
+        if eval(condition, _ConditionDict(gen.item_tags + context_tags)):
+            ret[k] = v
+
+    return ret
 
 
 def retrieve_cache_items(condition=True, make_generable=False):
diff --git a/python/dune/perftool/generation/context.py b/python/dune/perftool/generation/context.py
index 3766971dd6d469778f71ee74cdc7cd210ed99722..55feda422efbabe48c7663e87fea289585253cde 100644
--- a/python/dune/perftool/generation/context.py
+++ b/python/dune/perftool/generation/context.py
@@ -12,7 +12,7 @@ class _GlobalContext(object):
         for k, v in self.kw.items():
             # First store existing values of the same keys
             if k in _global_context_cache:
-                self.old_kw[k] = v
+                self.old_kw[k] = _global_context_cache[k]
             # Now replace the value with the new one
             _global_context_cache[k] = v
 
diff --git a/python/test/dune/perftool/generation/test_cache.py b/python/test/dune/perftool/generation/test_cache.py
index f974a518f5e4f177e123f3b3222986b31c1f5158..3d97048032d407b41d16699d11bc229bc9b31df1 100644
--- a/python/test/dune/perftool/generation/test_cache.py
+++ b/python/test/dune/perftool/generation/test_cache.py
@@ -1,11 +1,12 @@
 from collections import Counter
 
-from dune.perftool.generation.cache import(delete_cache_items,
-                                           generator_factory,
-                                           no_caching,
-                                           retrieve_cache_functions,
-                                           retrieve_cache_items,
-                                           )
+from dune.perftool.generation import(delete_cache_items,
+                                     generator_factory,
+                                     global_context,
+                                     no_caching,
+                                     retrieve_cache_functions,
+                                     retrieve_cache_items,
+                                     )
 
 
 def print_cache():
@@ -202,3 +203,53 @@ def test_no_caching_function():
     assert compare(["one", "one"], list(retrieve_cache_items("no_caching")))
     no_caching_function("two")
     assert compare(["one", "one", "two"], list(retrieve_cache_items("no_caching")))
+
+
+# =====================
+# Test multiple kernels
+# =====================
+
+
+preamble = generator_factory(item_tags=("preamble",), context_tags=("kernel",))
+
+
+@preamble
+def pre1():
+    return "blubb"
+
+
+@preamble
+def pre2():
+    return "bla"
+
+
+def test_multiple_kernels():
+    with global_context(kernel="k1"):
+        pre1()
+    with global_context(kernel="k2"):
+        pre2()
+
+    preambles = [p for p in retrieve_cache_items("preamble")]
+    assert len(preambles) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "blubb"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bla"
+
+    delete_cache_items()
+
+    with global_context(kernel="k1"):
+        with global_context(kernel="k2"):
+            pre2()
+        pre1()
+
+    preambles = [p for p in retrieve_cache_items("preamble")]
+    assert len(preambles) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "blubb"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bla"