diff --git a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c b/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
index 21985b94e1cd2eca4695e98af06be88476ce5e06..b35e8dc11f8e27f6766e3d738cd33c0d38b74749 100644
--- a/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
+++ b/src/plugins/e-acsl/share/e-acsl/bittree_model/e_acsl_bittree_mmodel.c
@@ -314,6 +314,17 @@ static void delete_block(void* ptr) {
     }
   }
 }
+
+static void* store_block_duplicate(void* ptr, size_t size) {
+  if (ptr != NULL) {
+    bt_block * tmp = bt_lookup(ptr);
+    if (tmp)
+      delete_block(tmp);
+    store_block(ptr, size);
+  }
+  return ptr;
+}
+
 /* }}} */
 
 /* HEAP ALLOCATION {{{ */
@@ -566,6 +577,7 @@ strong_alias(bittree_aligned_alloc, aligned_alloc)
 /* Explicit tracking */
 public_alias(delete_block)
 public_alias(store_block)
+public_alias(store_block_duplicate)
 /* Predicates */
 public_alias(offset)
 public_alias(base_addr)
diff --git a/src/plugins/e-acsl/share/e-acsl/e_acsl_mmodel_api.h b/src/plugins/e-acsl/share/e-acsl/e_acsl_mmodel_api.h
index 46a375dc46cf7548137a3ad8ea58c50c09f5b0d8..f19c4294999fd8276c77caa25075c4e87785026a 100644
--- a/src/plugins/e-acsl/share/e-acsl/e_acsl_mmodel_api.h
+++ b/src/plugins/e-acsl/share/e-acsl/e_acsl_mmodel_api.h
@@ -82,6 +82,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size)
 void * __e_acsl_store_block(void * ptr, size_t size)
   __attribute__((FC_BUILTIN));
 
+/*! \brief Same as `__e_acsl_store_block`, but first check
+ * checks whether a block with a base address given by `ptr` exists in the
+ * tracked allocation and remove it before storing a new block.
+ *
+ * \param ptr base address of the tracked memory block
+ * \param size size of the tracked block in bytes */
+/*@ assigns \result \from *(((char*)ptr)+(0..size-1)); */
+void * __e_acsl_store_block_duplicate(void * ptr, size_t size)
+  __attribute__((FC_BUILTIN));
+
 /*! \brief Remove a memory block which base address is \p ptr from tracking. */
 /*@ assigns \nothing; */
 void __e_acsl_delete_block(void * ptr)
diff --git a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c b/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c
index a740e1e360c7fd0646467249027c2b6d61182a33..4699f2d81716064a64b8dc1578e6783eb36080dc 100644
--- a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c
+++ b/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_mmodel.c
@@ -31,6 +31,7 @@
 #include <sys/resource.h>
 
 static int valid(void * ptr, size_t size);
+static int valid_read(void * ptr, size_t size);
 
 #include "e_acsl_string.h"
 #include "e_acsl_bits.h"
@@ -57,6 +58,13 @@ static void delete_block(void * ptr) {
   shadow_freea(ptr);
 }
 
+static void * store_block_duplicate(void * ptr, size_t size) {
+  if (valid_read(ptr, size))
+    delete_block(ptr);
+  shadow_alloca(ptr, size);
+  return ptr;
+}
+
 static void full_init(void * ptr) {
   initialize(ptr, block_length(ptr));
 }
@@ -180,6 +188,7 @@ strong_alias(shadow_posix_memalign, posix_memalign)
 /* Explicit tracking */
 public_alias(delete_block)
 public_alias(store_block)
+public_alias(store_block_duplicate)
 /* Predicates */
 public_alias2(segment_offset, offset)
 public_alias2(segment_base_addr, base_addr)