diff --git a/src/datastructures.c b/src/datastructures.c
index 5993e457ae99d1b1377b63c6cd768580222c7691..0077d6b5716c72e60940f4b992928a699aabd978 100644
--- a/src/datastructures.c
+++ b/src/datastructures.c
@@ -166,6 +166,16 @@ void h_hashtable_put(HHashTable* ht, const void* key, void* value) {
   hte->hashval = hashval;
 }
 
+void h_hashtable_update(HHashTable *dst, const HHashTable *src) {
+    size_t i;
+    HHashTableEntry *hte;
+    for(i=0; i < src->capacity; i++) {
+      for(hte = &src->contents[i]; hte; hte = hte->next) {
+        h_hashtable_put(dst, hte->key, hte->value);
+      }
+    }
+}
+
 int   h_hashtable_present(HHashTable* ht, const void* key) {
   HHashValue hashval = ht->hashFunc(key);
 #ifdef CONSISTENCY_CHECK
diff --git a/src/internal.h b/src/internal.h
index d4ba829b6acf6b907ff2fc5ea99ce62cb70cb5cf..2ba6b22577cb8f855eb66f9b506a028cb1045cb5 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -250,6 +250,7 @@ void h_slist_free(HSlist *slist);
 HHashTable* h_hashtable_new(HArena *arena, HEqualFunc equalFunc, HHashFunc hashFunc);
 void* h_hashtable_get(HHashTable* ht, const void* key);
 void  h_hashtable_put(HHashTable* ht, const void* key, void* value);
+void  h_hashtable_update(HHashTable* dst, const HHashTable *src);
 int   h_hashtable_present(HHashTable* ht, const void* key);
 void  h_hashtable_del(HHashTable* ht, const void* key);
 void  h_hashtable_free(HHashTable* ht);
@@ -258,6 +259,7 @@ static inline bool h_hashtable_empty(HHashTable* ht) { return (ht->used == 0); }
 typedef HHashTable HHashSet;
 #define h_hashset_new(a,eq,hash) h_hashtable_new(a,eq,hash)
 #define h_hashset_put(ht,el)     h_hashtable_put(ht, el, NULL)
+#define h_hashset_put_all(a,b)   h_hashtable_update(a, b)
 #define h_hashset_present(ht,el) h_hashtable_present(ht,el)
 #define h_hashset_empty(ht)      h_hashtable_empty(ht)
 #define h_hashset_del(ht,el)     h_hashtable_del(ht,el)