diff --git a/src/backends/llk.c b/src/backends/llk.c
index 387dfd6a966b0f6a55004c8c23a14a03dd3830b0..3f369224e6028c1a6d51d343dfb5b62aa59dc2d7 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -81,11 +81,8 @@ static void *combine_entries(HHashSet *workset, void *dst, const void *src)
 
 // add the mappings of src to dst, marking conflicts and adding the conflicting
 // values to workset.
-// note: reuses parts of src to build dst!
 static void stringmap_merge(HHashSet *workset, HStringMap *dst, HStringMap *src)
 {
-  assert(src->arena == dst->arena);
-
   if(src->epsilon_branch) {
     if(dst->epsilon_branch)
       dst->epsilon_branch =
@@ -120,10 +117,13 @@ static void stringmap_merge(HHashSet *workset, HStringMap *dst, HStringMap *src)
 
       if(src_) {
         HStringMap *dst_ = h_hashtable_get(dst->char_branches, (void *)c);
-        if(dst_)
+        if(dst_) {
           stringmap_merge(workset, dst_, src_);
-        else
+        } else {
+	  if(src_->arena != dst->arena)
+	    src_ = h_stringmap_copy(dst->arena, src_);
           h_hashtable_put(dst->char_branches, (void *)c, src_);
+	}
       }
     }
   }