diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
index 27be73e9aa22871c561be652f1d95e85a2c06f07..677ad375262d2ce1ef2135a77f6fd86495a0b83b 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_initialized_memtyped.res.oracle
@@ -10,8 +10,8 @@ Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 69):
 Let m = Init_0[shiftfield_F1_S_i(s) <- true].
 Let a = shiftfield_F1_S_a(s).
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Init_undef_0, m, a_1, 10).
-Let a_3 = havoc(Init_undef_1, m, a_1, 10).
+Let a_2 = memcpy(m, Init_undef_0, a_1, a_1, 10).
+Let a_3 = memcpy(m, Init_undef_1, a_1, a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
@@ -63,25 +63,26 @@ Prove: IsInit_S1_S(global(G_glob_82), Init_0).
 
 Goal Preservation of Invariant 'CHECK' (file assigned_initialized_memtyped.i, line 129):
 Let a = shiftfield_F1_S_a(pg_0).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(pg_0) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(pg_0) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Then *)
   Have: i <= 9.
 }
 Prove: ((-1) <= i) /\
     (forall i_1 : Z. ((i_1 <= i) -> ((0 <= i_1) ->
-     (a_1[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
+     (a_2[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
 
 ------------------------------------------------------------
 
@@ -92,20 +93,21 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 142):
 Let m = Init_0[shiftfield_F1_S_i(pg_0) <- true].
-Let a = havoc(Init_undef_0, m, pg_0, 11).
+Let a = memcpy(m, Init_undef_0, pg_0, pg_0, 11).
 Let a_1 = shiftfield_F1_S_a(pg_0).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -121,20 +123,21 @@ Prove: IsInit_S1_S(pg_0, a).
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 143):
 Let m = Init_0[shiftfield_F1_S_i(pg_0) <- true].
-Let a = havoc(Init_undef_0, m, pg_0, 11).
+Let a = memcpy(m, Init_undef_0, pg_0, pg_0, 11).
 Let a_1 = shiftfield_F1_S_a(pg_0).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(G_glob_82) <= 0) /\ (region(pg_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -187,19 +190,20 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 118):
 Let m = Init_0[shiftfield_F1_S_i(s) <- true].
-Let a = havoc(Init_undef_0, m, s, 11).
+Let a = memcpy(m, Init_undef_0, s, s, 11).
 Let a_1 = shiftfield_F1_S_a(s).
-Let a_2 = havoc(Init_undef_1, m, shift_sint32(a_1, 0), 10).
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(m, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_2[shift_sint32(a_1, i_2)]=true)))).
+       (a_3[shift_sint32(a_1, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
@@ -237,7 +241,7 @@ Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 99):
 Let a = shiftfield_F1_S_a(s).
 Let a_1 = shiftfield_F1_S_i(s).
 Let a_2 = shift_sint32(a, 0).
-Let a_3 = havoc(Init_undef_0, Init_1[a_1 <- true], a_2, 10).
+Let a_3 = memcpy(Init_1[a_1 <- true], Init_undef_0, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
@@ -259,7 +263,8 @@ Assume {
       (forall a_4 : addr.
        ((forall i_2 : Z. (((i_2 = 0) \/ (i_2 = 2) \/ (i_2 = 4)) ->
          (shift_sint32(a, i_2) != a_4))) ->
-       (havoc(Mint_undef_0, Mint_0[a_1 <- 0], a_2, 10)[a_4] = Mint_1[a_4]))).
+       (memcpy(Mint_0[a_1 <- 0], Mint_undef_0, a_2, a_2, 10)[a_4] =
+        Mint_1[a_4]))).
   (* Else *)
   Have: 10 <= i_1.
 }
@@ -275,6 +280,7 @@ Prove: true.
 Goal Loop assigns 'CHECK' (2/5):
 Effect at line 96
 Let a = shiftfield_F1_S_a(s).
+Let a_1 = shift_sint32(a, 0).
 Assume {
   Type: is_sint32(i_2) /\ is_sint32(i_3).
   (* Heap *)
@@ -288,11 +294,11 @@ Assume {
   (* Else *)
   Have: 10 <= i_2.
   (* Loop assigns 'CHECK' *)
-  Have: forall a_1 : addr.
+  Have: forall a_2 : addr.
       ((forall i_5 : Z. (((i_5 = 0) \/ (i_5 = 2) \/ (i_5 = 4)) ->
-        (shift_sint32(a, i_5) != a_1))) ->
-      (havoc(Mint_undef_0, Mint_0[shiftfield_F1_S_i(s) <- 0],
-         shift_sint32(a, 0), 10)[a_1] = Mint_1[a_1])).
+        (shift_sint32(a, i_5) != a_2))) ->
+      (memcpy(Mint_0[shiftfield_F1_S_i(s) <- 0], Mint_undef_0, a_1, a_1, 10)
+         [a_2] = Mint_1[a_2])).
   (* Then *)
   Have: i_3 <= 9.
 }
@@ -325,26 +331,27 @@ Prove: true.
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 51):
 Let a = shiftfield_F1_S_i(s).
 Let a_1 = shiftfield_F1_S_a(s).
-Let a_2 = havoc(Init_undef_0, Init_0[a <- true], shift_sint32(a_1, 0), 10).
-Let a_3 = a_2[a <- i].
+Let a_2 = shift_sint32(a_1, 0).
+Let a_3 = memcpy(Init_0[a <- true], Init_undef_0, a_2, a_2, 10).
+Let a_4 = a_3[a <- i].
 Assume {
   Type: is_sint32(i_1) /\ is_sint32(i_2).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10) /\
       (forall i_3 : Z. ((0 <= i_3) -> ((i_3 < i_1) ->
-       (a_2[shift_sint32(a_1, i_3)]=true)))).
+       (a_3[shift_sint32(a_1, i_3)]=true)))).
   (* Else *)
   Have: 10 <= i_1.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_3).
+  Have: cinits(a_4).
   (* Else *)
   Have: 10 <= i_2.
 }
-Prove: IsInit_S1_S(s, a_3).
+Prove: IsInit_S1_S(s, a_4).
 
 ------------------------------------------------------------
 
@@ -364,27 +371,28 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 84):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
-Let a_2 = a_1[shift_sint32(a, 4) <- i].
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
+Let a_3 = a_2[shift_sint32(a, 4) <- i].
 Assume {
   Type: is_sint32(i_1) /\ is_sint32(i_2).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant *)
   Have: (0 <= i_1) /\ (i_1 <= 10) /\
       (forall i_3 : Z. ((0 <= i_3) -> ((i_3 < i_1) ->
-       (a_1[shift_sint32(a, i_3)]=true)))).
+       (a_2[shift_sint32(a, i_3)]=true)))).
   (* Else *)
   Have: 10 <= i_1.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_3).
   (* Else *)
   Have: 10 <= i_2.
 }
-Prove: IsInit_S1_S(s, a_2).
+Prove: IsInit_S1_S(s, a_3).
 
 ------------------------------------------------------------
 
@@ -410,24 +418,25 @@ Prove: true.
 
 Goal Preservation of Invariant 'CHECK' (file assigned_initialized_memtyped.i, line 16):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Then *)
   Have: i <= 9.
 }
 Prove: ((-1) <= i) /\
     (forall i_1 : Z. ((i_1 <= i) -> ((0 <= i_1) ->
-     (a_1[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
+     (a_2[shift_sint32(a, i) <- true][shift_sint32(a, i_1)]=true)))).
 
 ------------------------------------------------------------
 
@@ -438,22 +447,23 @@ Prove: true.
 
 Goal Check 'CHECK' (file assigned_initialized_memtyped.i, line 21):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_0, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant 'CHECK' *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-       (a_1[shift_sint32(a, i_1)]=true)))).
+       (a_2[shift_sint32(a, i_1)]=true)))).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInit_S1_S(s, a_1).
+Prove: IsInit_S1_S(s, a_2).
 
 ------------------------------------------------------------
 
@@ -479,27 +489,29 @@ Prove: true.
 
 Goal Check 'FAILS' (file assigned_initialized_memtyped.i, line 36):
 Let a = shiftfield_F1_S_a(s).
-Let a_1 = havoc(Init_undef_1, Init_0[shiftfield_F1_S_i(s) <- true],
-            shift_sint32(a, 0), 10).
-Let a_2 = havoc(Init_undef_0, a_1, shift_sint32(a, 1), 4).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0[shiftfield_F1_S_i(s) <- true], Init_undef_0, a_1,
+            a_1, 10).
+Let a_3 = shift_sint32(a, 1).
+Let a_4 = memcpy(a_2, Init_undef_1, a_3, a_3, 4).
 Assume {
   Type: is_sint32(i) /\ is_sint32(i_1).
   (* Heap *)
   Type: (region(s.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1).
+  Have: cinits(a_2).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 10) /\
       (forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-       (a_1[shift_sint32(a, i_2)]=true)))).
+       (a_2[shift_sint32(a, i_2)]=true)))).
   (* Else *)
   Have: 10 <= i.
   (* Loop assigns 'CHECK' *)
-  Have: cinits(a_2).
+  Have: cinits(a_4).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: IsInit_S1_S(s, a_2).
+Prove: IsInit_S1_S(s, a_4).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
index cc9ab803f2d5c951225159f082d9bd7eacaa4409..15eea06fe87b20c0f48171dda281ed2bc3721ede 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/assigned_not_initialized_memtyped.res.oracle
@@ -7,17 +7,18 @@
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 28):
-Let a = havoc(Init_undef_0, Init_0, shift_sint32(array_0, 0), 10).
+Let a = shift_sint32(array_0, 0).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(array_0.base) <= 0) /\ cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a).
+  Have: cinits(a_1).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(array_0, 10, a).
+Prove: IsInitArray_sint32(array_0, 10, a_1).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -25,38 +26,41 @@ Prove: IsInitArray_sint32(array_0, 10, a).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 60):
-Let a = havoc(Init_undef_1, Init_0, shift_sint32(global(G_glob_array_51), 0),
-          10).
-Let a_1 = havoc(Init_undef_0, a, shift_sint32(pg_array_0, 0), 10).
+Let a = shift_sint32(global(G_glob_array_51), 0).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 10).
+Let a_2 = shift_sint32(pg_array_0, 0).
+Let a_3 = memcpy(a_1, Init_undef_1, a_2, a_2, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_array_51) <= 0) /\ (region(pg_array_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a) /\ cinits(a_1).
+  Have: cinits(a_1) /\ cinits(a_3).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(pg_array_0, 10, a_1).
+Prove: IsInitArray_sint32(pg_array_0, 10, a_3).
 
 ------------------------------------------------------------
 
 Goal Check 'OK' (file assigned_not_initialized_memtyped.i, line 61):
 Let a = global(G_glob_array_51).
-Let a_1 = havoc(Init_undef_1, Init_0, shift_sint32(a, 0), 10).
-Let a_2 = havoc(Init_undef_0, a_1, shift_sint32(pg_array_0, 0), 10).
+Let a_1 = shift_sint32(a, 0).
+Let a_2 = memcpy(Init_0, Init_undef_0, a_1, a_1, 10).
+Let a_3 = shift_sint32(pg_array_0, 0).
+Let a_4 = memcpy(a_2, Init_undef_1, a_3, a_3, 10).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_array_51) <= 0) /\ (region(pg_array_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a_1) /\ cinits(a_2).
+  Have: cinits(a_2) /\ cinits(a_4).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInitArray_sint32(a, 10, a_2).
+Prove: IsInitArray_sint32(a, 10, a_4).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -97,26 +101,27 @@ Prove: (m_1[a]=true).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 49):
-Let a = havoc(Init_undef_1, Init_0, global(G_glob_comp_45), 11).
-Let a_1 = havoc(Init_undef_0, a, pg_comp_0, 11).
+Let a = global(G_glob_comp_45).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 11).
+Let a_2 = memcpy(a_1, Init_undef_1, pg_comp_0, pg_comp_0, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
   Type: (region(G_glob_comp_45) <= 0) /\ (region(pg_comp_0.base) <= 0) /\
       cinits(Init_0).
   (* Loop assigns ... *)
-  Have: cinits(a) /\ cinits(a_1).
+  Have: cinits(a_1) /\ cinits(a_2).
   (* Else *)
   Have: 10 <= i.
 }
-Prove: IsInit_S1_S(pg_comp_0, a_1).
+Prove: IsInit_S1_S(pg_comp_0, a_2).
 
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 50):
 Let a = global(G_glob_comp_45).
-Let a_1 = havoc(Init_undef_1, Init_0, a, 11).
-Let a_2 = havoc(Init_undef_0, a_1, pg_comp_0, 11).
+Let a_1 = memcpy(Init_0, Init_undef_0, a, a, 11).
+Let a_2 = memcpy(a_1, Init_undef_1, pg_comp_0, pg_comp_0, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
@@ -144,7 +149,7 @@ Prove: (i=true).
 ------------------------------------------------------------
 
 Goal Check 'FAIL' (file assigned_not_initialized_memtyped.i, line 22):
-Let a = havoc(Init_undef_0, Init_0, s, 11).
+Let a = memcpy(Init_0, Init_undef_0, s, s, 11).
 Assume {
   Type: is_sint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
index 4cd6d14f46150aefe136cd15e7ef716d5f47a7c9..ef6d4421d9da3e8577173a9ea953c6596a403e61 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/axioms.res.oracle
@@ -11,7 +11,7 @@
 Goal Post-condition 'P,todo' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -38,7 +38,7 @@ Prove: P_P(a_2, t, a, b).
 Goal Post-condition 'Q' in 'f':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -81,7 +81,9 @@ Assume {
   Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'Positive' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (0 < havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)]))).
+      (0
+         < memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a)
+             [shift_sint32(t, i_1)]))).
   (* Then *)
   Have: i <= b.
 }
@@ -107,7 +109,7 @@ Goal Preservation of Invariant 'Positive' (file axioms.i, line 31):
 Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
 Let x_1 = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_2 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
@@ -155,7 +157,7 @@ Goal Loop assigns (file axioms.i, line 32) (3/3):
 Effect at line 35
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let a_3 = shift_sint32(t, i).
 Let x_1 = 1 + i.
 Let x_2 = 1 + b.
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
index cd9646ce0fddf6c875276377ab086a9640a342d2..1ebf1e9f5c9ac547305f397cb4918b19ca7fa981 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/chunk_typing.res.oracle
@@ -10,33 +10,33 @@
 
 Goal Post-condition (file chunk_typing.i, line 15) in 'function':
 Let a = shift_uint64(u64_0, 0).
-Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_1 = memcpy(Mint_5, Mint_undef_5, a, a, 10).
 Let a_2 = shift_sint64(i64_0, 0).
-Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_3 = memcpy(Mint_6, Mint_undef_6, a_2, a_2, 10).
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_3, Mint_undef_3, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, 0).
-Let a_7 = havoc(Mint_undef_3, Mint_3, a_6, 10).
+Let a_7 = memcpy(Mint_4, Mint_undef_4, a_6, a_6, 10).
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, 0).
-Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_11 = memcpy(Mint_2, Mint_undef_2, a_10, a_10, 10).
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_13 = memcpy(Mint_0, Mint_undef_0, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, 0).
-Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
+Let a_15 = memcpy(Mchar_0, Mchar_undef_0, a_14, a_14, 10).
 Let a_16 = a_15[shift_sint8(i8_0, i)].
 Let a_17 = a_13[shift_uint8(u8_0, i)].
-Let a_18 = a_11[shift_sint16(i16_0, i)].
-Let a_19 = a_9[shift_uint16(u16_0, i)].
-Let a_20 = a_7[shift_sint32(i32_0, i)].
-Let a_21 = a_5[shift_uint32(u32_0, i)].
+Let a_18 = a_9[shift_uint16(u16_0, i)].
+Let a_19 = a_11[shift_sint16(i16_0, i)].
+Let a_20 = a_5[shift_uint32(u32_0, i)].
+Let a_21 = a_7[shift_sint32(i32_0, i)].
 Let a_22 = a_3[shift_sint64(i64_0, i)].
 Assume {
-  Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_1) /\
-      is_sint32_chunk(Mint_3) /\ is_sint64_chunk(Mint_5) /\
-      is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_2) /\
-      is_uint32_chunk(Mint_4) /\ is_uint64_chunk(Mint_6) /\
+  Type: IsArray_sint8(x) /\ is_sint16_chunk(Mint_2) /\
+      is_sint32_chunk(Mint_4) /\ is_sint64_chunk(Mint_6) /\
+      is_sint8_chunk(Mchar_0) /\ is_uint16_chunk(Mint_1) /\
+      is_uint32_chunk(Mint_3) /\ is_uint64_chunk(Mint_5) /\
       is_uint8_chunk(Mint_0) /\ is_sint32(i_1) /\ is_sint16_chunk(a_11) /\
       is_sint32_chunk(a_7) /\ is_sint64_chunk(a_3) /\ is_sint8_chunk(a_15) /\
       is_uint16_chunk(a_9) /\ is_uint32_chunk(a_5) /\ is_uint64_chunk(a_1) /\
@@ -85,9 +85,9 @@ Assume {
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: (a_16 = (1 + x[i])) /\ (a_17 = (1 + a_16)) /\ (a_18 = (1 + a_17)) /\
-    (a_19 = (1 + a_18)) /\ (a_20 = (1 + a_19)) /\ (a_21 = (1 + a_20)) /\
-    (a_22 = (1 + a_21)) /\ (a_1[shift_uint64(u64_0, i)] = (1 + a_22)).
+Prove: (a_16 = (1 + x[i])) /\ (a_17 = (1 + a_16)) /\ (a_18 = (1 + a_19)) /\
+    (a_19 = (1 + a_17)) /\ (a_20 = (1 + a_21)) /\ (a_21 = (1 + a_18)) /\
+    (a_1[shift_uint64(u64_0, i)] = (1 + a_22)) /\ (a_22 = (1 + a_20)).
 
 ------------------------------------------------------------
 
@@ -111,21 +111,21 @@ Let a_5 = shift_sint16(i16_0, i).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = shift_sint8(i8_0, i).
 Let a_8 = shift_uint64(u64_0, 0).
-Let a_9 = havoc(Mint_undef_5, Mint_5, a_8, 10).
+Let a_9 = memcpy(Mint_5, Mint_undef_5, a_8, a_8, 10).
 Let a_10 = shift_sint64(i64_0, 0).
-Let a_11 = havoc(Mint_undef_2, Mint_2, a_10, 10).
+Let a_11 = memcpy(Mint_2, Mint_undef_2, a_10, a_10, 10).
 Let a_12 = shift_uint32(u32_0, 0).
-Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_13 = memcpy(Mint_4, Mint_undef_4, a_12, a_12, 10).
 Let a_14 = shift_sint32(i32_0, 0).
-Let a_15 = havoc(Mint_undef_1, Mint_1, a_14, 10).
+Let a_15 = memcpy(Mint_1, Mint_undef_1, a_14, a_14, 10).
 Let a_16 = shift_uint16(u16_0, 0).
-Let a_17 = havoc(Mint_undef_3, Mint_3, a_16, 10).
+Let a_17 = memcpy(Mint_3, Mint_undef_3, a_16, a_16, 10).
 Let a_18 = shift_sint16(i16_0, 0).
-Let a_19 = havoc(Mint_undef_0, Mint_0, a_18, 10).
+Let a_19 = memcpy(Mint_0, Mint_undef_0, a_18, a_18, 10).
 Let a_20 = shift_uint8(u8_0, 0).
-Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_21 = memcpy(Mint_6, Mint_undef_6, a_20, a_20, 10).
 Let a_22 = shift_sint8(i8_0, 0).
-Let a_23 = havoc(Mchar_undef_0, Mchar_0, a_22, 10).
+Let a_23 = memcpy(Mchar_0, Mchar_undef_0, a_22, a_22, 10).
 Let a_24 = a_23[a_7 <- 1].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
@@ -213,7 +213,7 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 33):
 Let a = shift_sint8(i8_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, 10).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, 10).
 Let a_2 = shift_sint8(i8_0, i).
 Let a_3 = a_1[a_2 <- 1].
 Let a_4 = shift_uint64(u64_0, i).
@@ -224,19 +224,19 @@ Let a_8 = shift_uint16(u16_0, i).
 Let a_9 = shift_sint16(i16_0, i).
 Let a_10 = shift_uint8(u8_0, i).
 Let a_11 = shift_uint64(u64_0, 0).
-Let a_12 = havoc(Mint_undef_6, Mint_6, a_11, 10).
+Let a_12 = memcpy(Mint_6, Mint_undef_6, a_11, a_11, 10).
 Let a_13 = shift_sint64(i64_0, 0).
-Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_14 = memcpy(Mint_3, Mint_undef_3, a_13, a_13, 10).
 Let a_15 = shift_uint32(u32_0, 0).
-Let a_16 = havoc(Mint_undef_5, Mint_5, a_15, 10).
+Let a_16 = memcpy(Mint_5, Mint_undef_5, a_15, a_15, 10).
 Let a_17 = shift_sint32(i32_0, 0).
-Let a_18 = havoc(Mint_undef_2, Mint_2, a_17, 10).
+Let a_18 = memcpy(Mint_2, Mint_undef_2, a_17, a_17, 10).
 Let a_19 = shift_uint16(u16_0, 0).
-Let a_20 = havoc(Mint_undef_4, Mint_4, a_19, 10).
+Let a_20 = memcpy(Mint_4, Mint_undef_4, a_19, a_19, 10).
 Let a_21 = shift_sint16(i16_0, 0).
-Let a_22 = havoc(Mint_undef_1, Mint_1, a_21, 10).
+Let a_22 = memcpy(Mint_1, Mint_undef_1, a_21, a_21, 10).
 Let a_23 = shift_uint8(u8_0, 0).
-Let a_24 = havoc(Mint_undef_0, Mint_0, a_23, 10).
+Let a_24 = memcpy(Mint_0, Mint_undef_0, a_23, a_23, 10).
 Let a_25 = a_24[a_10 <- 2].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -327,11 +327,11 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 34):
 Let a = shift_uint8(u8_0, 0).
-Let a_1 = havoc(Mint_undef_6, Mint_6, a, 10).
+Let a_1 = memcpy(Mint_6, Mint_undef_6, a, a, 10).
 Let a_2 = shift_uint8(u8_0, i).
 Let a_3 = a_1[a_2 <- 2].
 Let a_4 = shift_sint8(i8_0, 0).
-Let a_5 = havoc(Mchar_undef_0, Mchar_0, a_4, 10).
+Let a_5 = memcpy(Mchar_0, Mchar_undef_0, a_4, a_4, 10).
 Let a_6 = shift_sint8(i8_0, i).
 Let a_7 = a_5[a_6 <- 1].
 Let a_8 = shift_uint64(u64_0, i).
@@ -341,17 +341,17 @@ Let a_11 = shift_sint32(i32_0, i).
 Let a_12 = shift_uint16(u16_0, i).
 Let a_13 = shift_sint16(i16_0, i).
 Let a_14 = shift_uint64(u64_0, 0).
-Let a_15 = havoc(Mint_undef_5, Mint_5, a_14, 10).
+Let a_15 = memcpy(Mint_5, Mint_undef_5, a_14, a_14, 10).
 Let a_16 = shift_sint64(i64_0, 0).
-Let a_17 = havoc(Mint_undef_2, Mint_2, a_16, 10).
+Let a_17 = memcpy(Mint_2, Mint_undef_2, a_16, a_16, 10).
 Let a_18 = shift_uint32(u32_0, 0).
-Let a_19 = havoc(Mint_undef_4, Mint_4, a_18, 10).
+Let a_19 = memcpy(Mint_4, Mint_undef_4, a_18, a_18, 10).
 Let a_20 = shift_sint32(i32_0, 0).
-Let a_21 = havoc(Mint_undef_1, Mint_1, a_20, 10).
+Let a_21 = memcpy(Mint_1, Mint_undef_1, a_20, a_20, 10).
 Let a_22 = shift_uint16(u16_0, 0).
-Let a_23 = havoc(Mint_undef_3, Mint_3, a_22, 10).
+Let a_23 = memcpy(Mint_3, Mint_undef_3, a_22, a_22, 10).
 Let a_24 = shift_sint16(i16_0, 0).
-Let a_25 = havoc(Mint_undef_0, Mint_0, a_24, 10).
+Let a_25 = memcpy(Mint_0, Mint_undef_0, a_24, a_24, 10).
 Let a_26 = a_25[a_13 <- 3].
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
@@ -445,15 +445,15 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 35):
 Let a = shift_sint16(i16_0, 0).
-Let a_1 = havoc(Mint_undef_1, Mint_1, a, 10).
+Let a_1 = memcpy(Mint_1, Mint_undef_1, a, a, 10).
 Let a_2 = shift_sint16(i16_0, i).
 Let a_3 = a_1[a_2 <- 3].
 Let a_4 = shift_uint8(u8_0, 0).
-Let a_5 = havoc(Mint_undef_6, Mint_6, a_4, 10).
+Let a_5 = memcpy(Mint_6, Mint_undef_6, a_4, a_4, 10).
 Let a_6 = shift_uint8(u8_0, i).
 Let a_7 = a_5[a_6 <- 2].
 Let a_8 = shift_sint8(i8_0, 0).
-Let a_9 = havoc(Mchar_undef_0, Mchar_0, a_8, 10).
+Let a_9 = memcpy(Mchar_0, Mchar_undef_0, a_8, a_8, 10).
 Let a_10 = shift_sint8(i8_0, i).
 Let a_11 = a_9[a_10 <- 1].
 Let a_12 = shift_uint64(u64_0, i).
@@ -462,15 +462,15 @@ Let a_14 = shift_uint32(u32_0, i).
 Let a_15 = shift_sint32(i32_0, i).
 Let a_16 = shift_uint16(u16_0, i).
 Let a_17 = shift_uint64(u64_0, 0).
-Let a_18 = havoc(Mint_undef_5, Mint_5, a_17, 10).
+Let a_18 = memcpy(Mint_5, Mint_undef_5, a_17, a_17, 10).
 Let a_19 = shift_sint64(i64_0, 0).
-Let a_20 = havoc(Mint_undef_3, Mint_3, a_19, 10).
+Let a_20 = memcpy(Mint_3, Mint_undef_3, a_19, a_19, 10).
 Let a_21 = shift_uint32(u32_0, 0).
-Let a_22 = havoc(Mint_undef_4, Mint_4, a_21, 10).
+Let a_22 = memcpy(Mint_4, Mint_undef_4, a_21, a_21, 10).
 Let a_23 = shift_sint32(i32_0, 0).
-Let a_24 = havoc(Mint_undef_2, Mint_2, a_23, 10).
+Let a_24 = memcpy(Mint_2, Mint_undef_2, a_23, a_23, 10).
 Let a_25 = shift_uint16(u16_0, 0).
-Let a_26 = havoc(Mint_undef_0, Mint_0, a_25, 10).
+Let a_26 = memcpy(Mint_0, Mint_undef_0, a_25, a_25, 10).
 Let a_27 = a_26[a_16 <- 4].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -567,19 +567,19 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 36):
 Let a = shift_uint16(u16_0, 0).
-Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, a, a, 10).
 Let a_2 = shift_uint16(u16_0, i).
 Let a_3 = a_1[a_2 <- 4].
 Let a_4 = shift_sint16(i16_0, 0).
-Let a_5 = havoc(Mint_undef_1, Mint_1, a_4, 10).
+Let a_5 = memcpy(Mint_1, Mint_undef_1, a_4, a_4, 10).
 Let a_6 = shift_sint16(i16_0, i).
 Let a_7 = a_5[a_6 <- 3].
 Let a_8 = shift_uint8(u8_0, 0).
-Let a_9 = havoc(Mint_undef_6, Mint_6, a_8, 10).
+Let a_9 = memcpy(Mint_6, Mint_undef_6, a_8, a_8, 10).
 Let a_10 = shift_uint8(u8_0, i).
 Let a_11 = a_9[a_10 <- 2].
 Let a_12 = shift_sint8(i8_0, 0).
-Let a_13 = havoc(Mchar_undef_0, Mchar_0, a_12, 10).
+Let a_13 = memcpy(Mchar_0, Mchar_undef_0, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, i).
 Let a_15 = a_13[a_14 <- 1].
 Let a_16 = shift_uint64(u64_0, i).
@@ -587,13 +587,13 @@ Let a_17 = shift_sint64(i64_0, i).
 Let a_18 = shift_uint32(u32_0, i).
 Let a_19 = shift_sint32(i32_0, i).
 Let a_20 = shift_uint64(u64_0, 0).
-Let a_21 = havoc(Mint_undef_5, Mint_5, a_20, 10).
+Let a_21 = memcpy(Mint_5, Mint_undef_5, a_20, a_20, 10).
 Let a_22 = shift_sint64(i64_0, 0).
-Let a_23 = havoc(Mint_undef_2, Mint_2, a_22, 10).
+Let a_23 = memcpy(Mint_2, Mint_undef_2, a_22, a_22, 10).
 Let a_24 = shift_uint32(u32_0, 0).
-Let a_25 = havoc(Mint_undef_4, Mint_4, a_24, 10).
+Let a_25 = memcpy(Mint_4, Mint_undef_4, a_24, a_24, 10).
 Let a_26 = shift_sint32(i32_0, 0).
-Let a_27 = havoc(Mint_undef_0, Mint_0, a_26, 10).
+Let a_27 = memcpy(Mint_0, Mint_undef_0, a_26, a_26, 10).
 Let a_28 = a_27[a_19 <- 5].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_0) /\
@@ -693,34 +693,34 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 37):
 Let a = shift_sint32(i32_0, 0).
-Let a_1 = havoc(Mint_undef_2, Mint_2, a, 10).
+Let a_1 = memcpy(Mint_2, Mint_undef_2, a, a, 10).
 Let a_2 = shift_sint32(i32_0, i).
 Let a_3 = a_1[a_2 <- 5].
 Let a_4 = shift_uint16(u16_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_4, Mint_undef_4, a_4, a_4, 10).
 Let a_6 = shift_uint16(u16_0, i).
 Let a_7 = a_5[a_6 <- 4].
 Let a_8 = shift_sint16(i16_0, 0).
-Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, i).
 Let a_11 = a_9[a_10 <- 3].
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_13 = memcpy(Mint_6, Mint_undef_6, a_12, a_12, 10).
 Let a_14 = shift_uint8(u8_0, i).
 Let a_15 = a_13[a_14 <- 2].
 Let a_16 = shift_sint8(i8_0, 0).
-Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
+Let a_17 = memcpy(Mchar_0, Mchar_undef_0, a_16, a_16, 10).
 Let a_18 = shift_sint8(i8_0, i).
 Let a_19 = a_17[a_18 <- 1].
 Let a_20 = shift_uint64(u64_0, i).
 Let a_21 = shift_sint64(i64_0, i).
 Let a_22 = shift_uint32(u32_0, i).
 Let a_23 = shift_uint64(u64_0, 0).
-Let a_24 = havoc(Mint_undef_5, Mint_5, a_23, 10).
+Let a_24 = memcpy(Mint_5, Mint_undef_5, a_23, a_23, 10).
 Let a_25 = shift_sint64(i64_0, 0).
-Let a_26 = havoc(Mint_undef_3, Mint_3, a_25, 10).
+Let a_26 = memcpy(Mint_3, Mint_undef_3, a_25, a_25, 10).
 Let a_27 = shift_uint32(u32_0, 0).
-Let a_28 = havoc(Mint_undef_0, Mint_0, a_27, 10).
+Let a_28 = memcpy(Mint_0, Mint_undef_0, a_27, a_27, 10).
 Let a_29 = a_28[a_22 <- 6].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -823,35 +823,35 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 38):
 Let a = shift_uint32(u32_0, 0).
-Let a_1 = havoc(Mint_undef_4, Mint_4, a, 10).
+Let a_1 = memcpy(Mint_4, Mint_undef_4, a, a, 10).
 Let a_2 = shift_uint32(u32_0, i).
 Let a_3 = a_1[a_2 <- 6].
 Let a_4 = shift_sint32(i32_0, 0).
-Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, i).
 Let a_7 = a_5[a_6 <- 5].
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_9 = memcpy(Mint_3, Mint_undef_3, a_8, a_8, 10).
 Let a_10 = shift_uint16(u16_0, i).
 Let a_11 = a_9[a_10 <- 4].
 Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
+Let a_13 = memcpy(Mint_1, Mint_undef_1, a_12, a_12, 10).
 Let a_14 = shift_sint16(i16_0, i).
 Let a_15 = a_13[a_14 <- 3].
 Let a_16 = shift_uint8(u8_0, 0).
-Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_17 = memcpy(Mint_6, Mint_undef_6, a_16, a_16, 10).
 Let a_18 = shift_uint8(u8_0, i).
 Let a_19 = a_17[a_18 <- 2].
 Let a_20 = shift_sint8(i8_0, 0).
-Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
+Let a_21 = memcpy(Mchar_0, Mchar_undef_0, a_20, a_20, 10).
 Let a_22 = shift_sint8(i8_0, i).
 Let a_23 = a_21[a_22 <- 1].
 Let a_24 = shift_uint64(u64_0, i).
 Let a_25 = shift_sint64(i64_0, i).
 Let a_26 = shift_uint64(u64_0, 0).
-Let a_27 = havoc(Mint_undef_5, Mint_5, a_26, 10).
+Let a_27 = memcpy(Mint_5, Mint_undef_5, a_26, a_26, 10).
 Let a_28 = shift_sint64(i64_0, 0).
-Let a_29 = havoc(Mint_undef_0, Mint_0, a_28, 10).
+Let a_29 = memcpy(Mint_0, Mint_undef_0, a_28, a_28, 10).
 Let a_30 = a_29[a_25 <- 7].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -957,36 +957,36 @@ Prove: true.
 
 Goal Preservation of Invariant (file chunk_typing.i, line 39):
 Let a = shift_sint64(i64_0, 0).
-Let a_1 = havoc(Mint_undef_3, Mint_3, a, 10).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, a, a, 10).
 Let a_2 = shift_sint64(i64_0, i).
 Let a_3 = a_1[a_2 <- 7].
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_5 = memcpy(Mint_5, Mint_undef_5, a_4, a_4, 10).
 Let a_6 = shift_uint32(u32_0, i).
 Let a_7 = a_5[a_6 <- 6].
 Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_2, Mint_undef_2, a_8, a_8, 10).
 Let a_10 = shift_sint32(i32_0, i).
 Let a_11 = a_9[a_10 <- 5].
 Let a_12 = shift_uint16(u16_0, 0).
-Let a_13 = havoc(Mint_undef_4, Mint_4, a_12, 10).
+Let a_13 = memcpy(Mint_4, Mint_undef_4, a_12, a_12, 10).
 Let a_14 = shift_uint16(u16_0, i).
 Let a_15 = a_13[a_14 <- 4].
 Let a_16 = shift_sint16(i16_0, 0).
-Let a_17 = havoc(Mint_undef_1, Mint_1, a_16, 10).
+Let a_17 = memcpy(Mint_1, Mint_undef_1, a_16, a_16, 10).
 Let a_18 = shift_sint16(i16_0, i).
 Let a_19 = a_17[a_18 <- 3].
 Let a_20 = shift_uint8(u8_0, 0).
-Let a_21 = havoc(Mint_undef_6, Mint_6, a_20, 10).
+Let a_21 = memcpy(Mint_6, Mint_undef_6, a_20, a_20, 10).
 Let a_22 = shift_uint8(u8_0, i).
 Let a_23 = a_21[a_22 <- 2].
 Let a_24 = shift_sint8(i8_0, 0).
-Let a_25 = havoc(Mchar_undef_0, Mchar_0, a_24, 10).
+Let a_25 = memcpy(Mchar_0, Mchar_undef_0, a_24, a_24, 10).
 Let a_26 = shift_sint8(i8_0, i).
 Let a_27 = a_25[a_26 <- 1].
 Let a_28 = shift_uint64(u64_0, i).
 Let a_29 = shift_uint64(u64_0, 0).
-Let a_30 = havoc(Mint_undef_0, Mint_0, a_29, 10).
+Let a_30 = memcpy(Mint_0, Mint_undef_0, a_29, a_29, 10).
 Let a_31 = a_30[a_28 <- 8].
 Assume {
   Type: is_sint16_chunk(Mint_1) /\ is_sint32_chunk(Mint_2) /\
@@ -1095,21 +1095,21 @@ Prove: true.
 
 Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 45):
 Let a = shift_uint64(u64_0, 0).
-Let a_1 = havoc(Mint_undef_5, Mint_5, a, 10).
+Let a_1 = memcpy(Mint_5, Mint_undef_5, a, a, 10).
 Let a_2 = shift_sint64(i64_0, 0).
-Let a_3 = havoc(Mint_undef_2, Mint_2, a_2, 10).
+Let a_3 = memcpy(Mint_2, Mint_undef_2, a_2, a_2, 10).
 Let a_4 = shift_uint32(u32_0, 0).
-Let a_5 = havoc(Mint_undef_4, Mint_4, a_4, 10).
+Let a_5 = memcpy(Mint_4, Mint_undef_4, a_4, a_4, 10).
 Let a_6 = shift_sint32(i32_0, 0).
-Let a_7 = havoc(Mint_undef_1, Mint_1, a_6, 10).
+Let a_7 = memcpy(Mint_1, Mint_undef_1, a_6, a_6, 10).
 Let a_8 = shift_uint16(u16_0, 0).
-Let a_9 = havoc(Mint_undef_3, Mint_3, a_8, 10).
+Let a_9 = memcpy(Mint_3, Mint_undef_3, a_8, a_8, 10).
 Let a_10 = shift_sint16(i16_0, 0).
-Let a_11 = havoc(Mint_undef_0, Mint_0, a_10, 10).
+Let a_11 = memcpy(Mint_0, Mint_undef_0, a_10, a_10, 10).
 Let a_12 = shift_uint8(u8_0, 0).
-Let a_13 = havoc(Mint_undef_6, Mint_6, a_12, 10).
+Let a_13 = memcpy(Mint_6, Mint_undef_6, a_12, a_12, 10).
 Let a_14 = shift_sint8(i8_0, 0).
-Let a_15 = havoc(Mchar_undef_0, Mchar_0, a_14, 10).
+Let a_15 = memcpy(Mchar_0, Mchar_undef_0, a_14, a_14, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1165,21 +1165,21 @@ Prove: valid_rw(Malloc_0, shift_sint8(i8_0, i), 1).
 Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 46):
 Let a = shift_sint8(i8_0, i).
 Let a_1 = shift_uint64(u64_0, 0).
-Let a_2 = havoc(Mint_undef_5, Mint_5, a_1, 10).
+Let a_2 = memcpy(Mint_5, Mint_undef_5, a_1, a_1, 10).
 Let a_3 = shift_sint64(i64_0, 0).
-Let a_4 = havoc(Mint_undef_2, Mint_2, a_3, 10).
+Let a_4 = memcpy(Mint_2, Mint_undef_2, a_3, a_3, 10).
 Let a_5 = shift_uint32(u32_0, 0).
-Let a_6 = havoc(Mint_undef_4, Mint_4, a_5, 10).
+Let a_6 = memcpy(Mint_4, Mint_undef_4, a_5, a_5, 10).
 Let a_7 = shift_sint32(i32_0, 0).
-Let a_8 = havoc(Mint_undef_1, Mint_1, a_7, 10).
+Let a_8 = memcpy(Mint_1, Mint_undef_1, a_7, a_7, 10).
 Let a_9 = shift_uint16(u16_0, 0).
-Let a_10 = havoc(Mint_undef_3, Mint_3, a_9, 10).
+Let a_10 = memcpy(Mint_3, Mint_undef_3, a_9, a_9, 10).
 Let a_11 = shift_sint16(i16_0, 0).
-Let a_12 = havoc(Mint_undef_0, Mint_0, a_11, 10).
+Let a_12 = memcpy(Mint_0, Mint_undef_0, a_11, a_11, 10).
 Let a_13 = shift_uint8(u8_0, 0).
-Let a_14 = havoc(Mint_undef_6, Mint_6, a_13, 10).
+Let a_14 = memcpy(Mint_6, Mint_undef_6, a_13, a_13, 10).
 Let a_15 = shift_sint8(i8_0, 0).
-Let a_16 = havoc(Mchar_undef_0, Mchar_0, a_15, 10).
+Let a_16 = memcpy(Mchar_0, Mchar_undef_0, a_15, a_15, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1240,21 +1240,21 @@ Goal Assertion 'rte,mem_access' (file chunk_typing.i, line 47):
 Let a = shift_uint8(u8_0, i).
 Let a_1 = shift_sint8(i8_0, i).
 Let a_2 = shift_uint64(u64_0, 0).
-Let a_3 = havoc(Mint_undef_5, Mint_5, a_2, 10).
+Let a_3 = memcpy(Mint_5, Mint_undef_5, a_2, a_2, 10).
 Let a_4 = shift_sint64(i64_0, 0).
-Let a_5 = havoc(Mint_undef_2, Mint_2, a_4, 10).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, a_4, a_4, 10).
 Let a_6 = shift_uint32(u32_0, 0).
-Let a_7 = havoc(Mint_undef_4, Mint_4, a_6, 10).
+Let a_7 = memcpy(Mint_4, Mint_undef_4, a_6, a_6, 10).
 Let a_8 = shift_sint32(i32_0, 0).
-Let a_9 = havoc(Mint_undef_1, Mint_1, a_8, 10).
+Let a_9 = memcpy(Mint_1, Mint_undef_1, a_8, a_8, 10).
 Let a_10 = shift_uint16(u16_0, 0).
-Let a_11 = havoc(Mint_undef_3, Mint_3, a_10, 10).
+Let a_11 = memcpy(Mint_3, Mint_undef_3, a_10, a_10, 10).
 Let a_12 = shift_sint16(i16_0, 0).
-Let a_13 = havoc(Mint_undef_0, Mint_0, a_12, 10).
+Let a_13 = memcpy(Mint_0, Mint_undef_0, a_12, a_12, 10).
 Let a_14 = shift_uint8(u8_0, 0).
-Let a_15 = havoc(Mint_undef_6, Mint_6, a_14, 10).
+Let a_15 = memcpy(Mint_6, Mint_undef_6, a_14, a_14, 10).
 Let a_16 = shift_sint8(i8_0, 0).
-Let a_17 = havoc(Mchar_undef_0, Mchar_0, a_16, 10).
+Let a_17 = memcpy(Mchar_0, Mchar_undef_0, a_16, a_16, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1318,21 +1318,21 @@ Let a = shift_sint16(i16_0, i).
 Let a_1 = shift_uint8(u8_0, i).
 Let a_2 = shift_sint8(i8_0, i).
 Let a_3 = shift_uint64(u64_0, 0).
-Let a_4 = havoc(Mint_undef_5, Mint_5, a_3, 10).
+Let a_4 = memcpy(Mint_5, Mint_undef_5, a_3, a_3, 10).
 Let a_5 = shift_sint64(i64_0, 0).
-Let a_6 = havoc(Mint_undef_2, Mint_2, a_5, 10).
+Let a_6 = memcpy(Mint_2, Mint_undef_2, a_5, a_5, 10).
 Let a_7 = shift_uint32(u32_0, 0).
-Let a_8 = havoc(Mint_undef_4, Mint_4, a_7, 10).
+Let a_8 = memcpy(Mint_4, Mint_undef_4, a_7, a_7, 10).
 Let a_9 = shift_sint32(i32_0, 0).
-Let a_10 = havoc(Mint_undef_1, Mint_1, a_9, 10).
+Let a_10 = memcpy(Mint_1, Mint_undef_1, a_9, a_9, 10).
 Let a_11 = shift_uint16(u16_0, 0).
-Let a_12 = havoc(Mint_undef_3, Mint_3, a_11, 10).
+Let a_12 = memcpy(Mint_3, Mint_undef_3, a_11, a_11, 10).
 Let a_13 = shift_sint16(i16_0, 0).
-Let a_14 = havoc(Mint_undef_0, Mint_0, a_13, 10).
+Let a_14 = memcpy(Mint_0, Mint_undef_0, a_13, a_13, 10).
 Let a_15 = shift_uint8(u8_0, 0).
-Let a_16 = havoc(Mint_undef_6, Mint_6, a_15, 10).
+Let a_16 = memcpy(Mint_6, Mint_undef_6, a_15, a_15, 10).
 Let a_17 = shift_sint8(i8_0, 0).
-Let a_18 = havoc(Mchar_undef_0, Mchar_0, a_17, 10).
+Let a_18 = memcpy(Mchar_0, Mchar_undef_0, a_17, a_17, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1400,21 +1400,21 @@ Let a_1 = shift_sint16(i16_0, i).
 Let a_2 = shift_uint8(u8_0, i).
 Let a_3 = shift_sint8(i8_0, i).
 Let a_4 = shift_uint64(u64_0, 0).
-Let a_5 = havoc(Mint_undef_5, Mint_5, a_4, 10).
+Let a_5 = memcpy(Mint_5, Mint_undef_5, a_4, a_4, 10).
 Let a_6 = shift_sint64(i64_0, 0).
-Let a_7 = havoc(Mint_undef_2, Mint_2, a_6, 10).
+Let a_7 = memcpy(Mint_2, Mint_undef_2, a_6, a_6, 10).
 Let a_8 = shift_uint32(u32_0, 0).
-Let a_9 = havoc(Mint_undef_4, Mint_4, a_8, 10).
+Let a_9 = memcpy(Mint_4, Mint_undef_4, a_8, a_8, 10).
 Let a_10 = shift_sint32(i32_0, 0).
-Let a_11 = havoc(Mint_undef_1, Mint_1, a_10, 10).
+Let a_11 = memcpy(Mint_1, Mint_undef_1, a_10, a_10, 10).
 Let a_12 = shift_uint16(u16_0, 0).
-Let a_13 = havoc(Mint_undef_3, Mint_3, a_12, 10).
+Let a_13 = memcpy(Mint_3, Mint_undef_3, a_12, a_12, 10).
 Let a_14 = shift_sint16(i16_0, 0).
-Let a_15 = havoc(Mint_undef_0, Mint_0, a_14, 10).
+Let a_15 = memcpy(Mint_0, Mint_undef_0, a_14, a_14, 10).
 Let a_16 = shift_uint8(u8_0, 0).
-Let a_17 = havoc(Mint_undef_6, Mint_6, a_16, 10).
+Let a_17 = memcpy(Mint_6, Mint_undef_6, a_16, a_16, 10).
 Let a_18 = shift_sint8(i8_0, 0).
-Let a_19 = havoc(Mchar_undef_0, Mchar_0, a_18, 10).
+Let a_19 = memcpy(Mchar_0, Mchar_undef_0, a_18, a_18, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1485,21 +1485,21 @@ Let a_2 = shift_sint16(i16_0, i).
 Let a_3 = shift_uint8(u8_0, i).
 Let a_4 = shift_sint8(i8_0, i).
 Let a_5 = shift_uint64(u64_0, 0).
-Let a_6 = havoc(Mint_undef_5, Mint_5, a_5, 10).
+Let a_6 = memcpy(Mint_5, Mint_undef_5, a_5, a_5, 10).
 Let a_7 = shift_sint64(i64_0, 0).
-Let a_8 = havoc(Mint_undef_2, Mint_2, a_7, 10).
+Let a_8 = memcpy(Mint_2, Mint_undef_2, a_7, a_7, 10).
 Let a_9 = shift_uint32(u32_0, 0).
-Let a_10 = havoc(Mint_undef_4, Mint_4, a_9, 10).
+Let a_10 = memcpy(Mint_4, Mint_undef_4, a_9, a_9, 10).
 Let a_11 = shift_sint32(i32_0, 0).
-Let a_12 = havoc(Mint_undef_1, Mint_1, a_11, 10).
+Let a_12 = memcpy(Mint_1, Mint_undef_1, a_11, a_11, 10).
 Let a_13 = shift_uint16(u16_0, 0).
-Let a_14 = havoc(Mint_undef_3, Mint_3, a_13, 10).
+Let a_14 = memcpy(Mint_3, Mint_undef_3, a_13, a_13, 10).
 Let a_15 = shift_sint16(i16_0, 0).
-Let a_16 = havoc(Mint_undef_0, Mint_0, a_15, 10).
+Let a_16 = memcpy(Mint_0, Mint_undef_0, a_15, a_15, 10).
 Let a_17 = shift_uint8(u8_0, 0).
-Let a_18 = havoc(Mint_undef_6, Mint_6, a_17, 10).
+Let a_18 = memcpy(Mint_6, Mint_undef_6, a_17, a_17, 10).
 Let a_19 = shift_sint8(i8_0, 0).
-Let a_20 = havoc(Mchar_undef_0, Mchar_0, a_19, 10).
+Let a_20 = memcpy(Mchar_0, Mchar_undef_0, a_19, a_19, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1574,21 +1574,21 @@ Let a_3 = shift_sint16(i16_0, i).
 Let a_4 = shift_uint8(u8_0, i).
 Let a_5 = shift_sint8(i8_0, i).
 Let a_6 = shift_uint64(u64_0, 0).
-Let a_7 = havoc(Mint_undef_5, Mint_5, a_6, 10).
+Let a_7 = memcpy(Mint_5, Mint_undef_5, a_6, a_6, 10).
 Let a_8 = shift_sint64(i64_0, 0).
-Let a_9 = havoc(Mint_undef_2, Mint_2, a_8, 10).
+Let a_9 = memcpy(Mint_2, Mint_undef_2, a_8, a_8, 10).
 Let a_10 = shift_uint32(u32_0, 0).
-Let a_11 = havoc(Mint_undef_4, Mint_4, a_10, 10).
+Let a_11 = memcpy(Mint_4, Mint_undef_4, a_10, a_10, 10).
 Let a_12 = shift_sint32(i32_0, 0).
-Let a_13 = havoc(Mint_undef_1, Mint_1, a_12, 10).
+Let a_13 = memcpy(Mint_1, Mint_undef_1, a_12, a_12, 10).
 Let a_14 = shift_uint16(u16_0, 0).
-Let a_15 = havoc(Mint_undef_3, Mint_3, a_14, 10).
+Let a_15 = memcpy(Mint_3, Mint_undef_3, a_14, a_14, 10).
 Let a_16 = shift_sint16(i16_0, 0).
-Let a_17 = havoc(Mint_undef_0, Mint_0, a_16, 10).
+Let a_17 = memcpy(Mint_0, Mint_undef_0, a_16, a_16, 10).
 Let a_18 = shift_uint8(u8_0, 0).
-Let a_19 = havoc(Mint_undef_6, Mint_6, a_18, 10).
+Let a_19 = memcpy(Mint_6, Mint_undef_6, a_18, a_18, 10).
 Let a_20 = shift_sint8(i8_0, 0).
-Let a_21 = havoc(Mchar_undef_0, Mchar_0, a_20, 10).
+Let a_21 = memcpy(Mchar_0, Mchar_undef_0, a_20, a_20, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
@@ -1666,21 +1666,21 @@ Let a_4 = shift_sint16(i16_0, i).
 Let a_5 = shift_uint8(u8_0, i).
 Let a_6 = shift_sint8(i8_0, i).
 Let a_7 = shift_uint64(u64_0, 0).
-Let a_8 = havoc(Mint_undef_5, Mint_5, a_7, 10).
+Let a_8 = memcpy(Mint_5, Mint_undef_5, a_7, a_7, 10).
 Let a_9 = shift_sint64(i64_0, 0).
-Let a_10 = havoc(Mint_undef_2, Mint_2, a_9, 10).
+Let a_10 = memcpy(Mint_2, Mint_undef_2, a_9, a_9, 10).
 Let a_11 = shift_uint32(u32_0, 0).
-Let a_12 = havoc(Mint_undef_4, Mint_4, a_11, 10).
+Let a_12 = memcpy(Mint_4, Mint_undef_4, a_11, a_11, 10).
 Let a_13 = shift_sint32(i32_0, 0).
-Let a_14 = havoc(Mint_undef_1, Mint_1, a_13, 10).
+Let a_14 = memcpy(Mint_1, Mint_undef_1, a_13, a_13, 10).
 Let a_15 = shift_uint16(u16_0, 0).
-Let a_16 = havoc(Mint_undef_3, Mint_3, a_15, 10).
+Let a_16 = memcpy(Mint_3, Mint_undef_3, a_15, a_15, 10).
 Let a_17 = shift_sint16(i16_0, 0).
-Let a_18 = havoc(Mint_undef_0, Mint_0, a_17, 10).
+Let a_18 = memcpy(Mint_0, Mint_undef_0, a_17, a_17, 10).
 Let a_19 = shift_uint8(u8_0, 0).
-Let a_20 = havoc(Mint_undef_6, Mint_6, a_19, 10).
+Let a_20 = memcpy(Mint_6, Mint_undef_6, a_19, a_19, 10).
 Let a_21 = shift_sint8(i8_0, 0).
-Let a_22 = havoc(Mchar_undef_0, Mchar_0, a_21, 10).
+Let a_22 = memcpy(Mchar_0, Mchar_undef_0, a_21, a_21, 10).
 Assume {
   Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
       is_sint64_chunk(Mint_2) /\ is_sint8_chunk(Mchar_0) /\
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
index 3658aa0a24890468346babe34a84eb13936762ed..1ca8b3a8e795c265a91ff9776bb05fa17d359ee7 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/looplabels.res.oracle
@@ -25,7 +25,7 @@ Prove: true.
 
 Goal Preservation of Invariant (file looplabels.i, line 19):
 Let a_1 = shift_sint32(b, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = shift_sint32(a, 0).
 Let x = 1 + i.
 Assume {
@@ -89,7 +89,7 @@ Prove: true.
 Goal Loop assigns (file looplabels.i, line 20) (3/3):
 Effect at line 24
 Let a_1 = shift_sint32(b, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(b, x).
 Let a_4 = shift_sint32(a, 0).
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
index bbcfeeaf580f5102706858f77a9d7c384a9226a4..a2bb4e0912914f17c8a643001e1ec77335a19772 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/opaque_struct.res.oracle
@@ -52,15 +52,15 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 60):
-Let a = havoc(Mint_undef_0, Mint_0, p, Length_of_S1_S).
-Let a_1 = havoc(Mint_undef_3, Mint_3, p, Length_of_S1_S).
-Let a_2 = havoc(Mint_undef_5, Mint_5, p, Length_of_S1_S).
-Let a_3 = havoc(Mint_undef_7, Mint_7, p, Length_of_S1_S).
-Let a_4 = havoc(Mchar_undef_0, Mchar_0, p, Length_of_S1_S).
-Let a_5 = havoc(Mint_undef_2, Mint_2, p, Length_of_S1_S).
-Let a_6 = havoc(Mint_undef_4, Mint_4, p, Length_of_S1_S).
-Let a_7 = havoc(Mint_undef_6, Mint_6, p, Length_of_S1_S).
-Let a_8 = havoc(Mint_undef_1, Mint_1, p, Length_of_S1_S).
+Let a = memcpy(Mint_0, Mint_undef_0, p, p, Length_of_S1_S).
+Let a_1 = memcpy(Mint_3, Mint_undef_3, p, p, Length_of_S1_S).
+Let a_2 = memcpy(Mint_5, Mint_undef_5, p, p, Length_of_S1_S).
+Let a_3 = memcpy(Mint_7, Mint_undef_7, p, p, Length_of_S1_S).
+Let a_4 = memcpy(Mchar_0, Mchar_undef_0, p, p, Length_of_S1_S).
+Let a_5 = memcpy(Mint_2, Mint_undef_2, p, p, Length_of_S1_S).
+Let a_6 = memcpy(Mint_4, Mint_undef_4, p, p, Length_of_S1_S).
+Let a_7 = memcpy(Mint_6, Mint_undef_6, p, p, Length_of_S1_S).
+Let a_8 = memcpy(Mint_1, Mint_undef_1, p, p, Length_of_S1_S).
 Assume {
   Type: is_bool_chunk(Mint_0) /\ is_sint16_chunk(Mint_3) /\
       is_sint32_chunk(Mint_5) /\ is_sint64_chunk(Mint_7) /\
@@ -74,9 +74,9 @@ Assume {
   Type: (region(p.base) <= 0) /\ framed(Mptr_0) /\ sconst(Mchar_0).
 }
 Prove: EqS1_S(Load_S1_S(p, a, a_8, a_4, a_5, a_1, a_6, a_2, a_7, a_3,
-                havoc(Mf32_undef_0, Mf32_0, p, Length_of_S1_S),
-                havoc(Mf64_undef_0, Mf64_0, p, Length_of_S1_S),
-                havoc(Mptr_undef_0, Mptr_0, p, Length_of_S1_S)),
+                memcpy(Mf32_0, Mf32_undef_0, p, p, Length_of_S1_S),
+                memcpy(Mf64_0, Mf64_undef_0, p, p, Length_of_S1_S),
+                memcpy(Mptr_0, Mptr_undef_0, p, p, Length_of_S1_S)),
          Load_S1_S(p, Mint_0, Mint_1, Mchar_0, Mint_2, Mint_3, Mint_4,
            Mint_5, Mint_6, Mint_7, Mf32_0, Mf64_0, Mptr_0)).
 
@@ -120,7 +120,7 @@ Prove: true.
 
 Goal Check 'fail' (file opaque_struct.i, line 69):
 Let x = Mint_0[p].
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, Length_of_S1_S).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, Length_of_S1_S).
 Let a_2 = a_1[p].
 Assume {
   Type: is_sint32_chunk(Mint_0) /\ is_sint32(x) /\ is_sint32_chunk(a_1) /\
@@ -143,14 +143,14 @@ Assume {
   (* Pre-condition *)
   Have: separated(a, Length_of_S1_S, c, 1).
 }
-Prove: of_f32(havoc(Mf32_undef_0, Mf32_0, a, Length_of_S1_S)[q])
+Prove: of_f32(memcpy(Mf32_0, Mf32_undef_0, a, a, Length_of_S1_S)[q])
          = of_f32(Mf32_0[q]).
 
 ------------------------------------------------------------
 
 Goal Check 'succeed' (file opaque_struct.i, line 71):
 Let x = Mchar_0[c].
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, Length_of_S1_S).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, Length_of_S1_S).
 Let a_2 = a_1[c].
 Assume {
   Type: is_sint8_chunk(Mchar_0) /\ is_sint8(x) /\ is_sint8_chunk(a_1) /\
@@ -201,7 +201,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fails' (file opaque_struct.i, line 38):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ cinits(Init_0).
@@ -242,7 +242,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 54):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ cinits(Init_0).
@@ -256,7 +256,7 @@ Prove: !IsInit_S1_S(p, a).
 ------------------------------------------------------------
 
 Goal Check 'fail' (file opaque_struct.i, line 55):
-Let a = havoc(Init_undef_0, Init_0, p, Length_of_S1_S).
+Let a = memcpy(Init_0, Init_undef_0, p, p, Length_of_S1_S).
 Assume {
   (* Heap *)
   Type: (region(p.base) <= 0) /\ cinits(Init_0).
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
index 08d574c31874b757c8a9a7d2fa29aecc8c300beb..18a691c67f361f003c213fd5981590a7b847648f 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle
@@ -207,7 +207,7 @@ Prove: exists i : Z. forall i_1 : Z. (is_uint8(i_1) ->
 
 Goal Post-condition (file simpl_is_type.i, line 17) in 'f':
 Let a = shift_sint32(t, 0).
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, size_0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0).
   (* Heap *)
@@ -230,7 +230,7 @@ Assume {
   (* Else *)
   Have: size_0 <= i.
 }
-Prove: 0 < havoc(Mint_undef_0, Mint_0, a, i)[shift_sint32(t, i_1)].
+Prove: 0 < memcpy(Mint_0, Mint_undef_0, a, a, i)[shift_sint32(t, i_1)].
 
 ------------------------------------------------------------
 
@@ -245,12 +245,13 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file simpl_is_type.i, line 23):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), size_0).
-Let a_1 = shift_sint32(t, i).
-Let a_2 = a[a_1].
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
+Let a_2 = shift_sint32(t, i).
+Let a_3 = a_1[a_2].
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(1 + i) /\
-      is_sint32(a_2).
+      is_sint32(a_3).
   (* Heap *)
   Type: region(t.base) <= 0.
   (* Goal *)
@@ -264,16 +265,16 @@ Assume {
   Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (0 < a[shift_sint32(t, i_2)]))).
+      (0 < a_1[shift_sint32(t, i_2)]))).
   (* Invariant *)
   Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+      (a_1[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: 0 < a[a_1 <- -a_2][shift_sint32(t, i_1)].
+Prove: 0 < a_1[a_2 <- -a_3][shift_sint32(t, i_1)].
 
 ------------------------------------------------------------
 
@@ -283,13 +284,14 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file simpl_is_type.i, line 24):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), size_0).
-Let a_1 = shift_sint32(t, i).
-Let a_2 = a[a_1].
-Let a_3 = a[a_1 <- -a_2].
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
+Let a_2 = shift_sint32(t, i).
+Let a_3 = a_1[a_2].
+Let a_4 = a_1[a_2 <- -a_3].
 Assume {
   Type: is_sint32(i) /\ is_sint32(size_0) /\ is_sint32(1 + i) /\
-      is_sint32(a_2).
+      is_sint32(a_3).
   (* Heap *)
   Type: region(t.base) <= 0.
   (* Goal *)
@@ -303,19 +305,19 @@ Assume {
   Have: (0 <= i) /\ (i <= size_0).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (0 < a[shift_sint32(t, i_2)]))).
+      (0 < a_1[shift_sint32(t, i_2)]))).
   (* Invariant *)
   Have: forall i_2 : Z. ((i <= i_2) -> ((i_2 < size_0) ->
-      (a[shift_sint32(t, i_2)] < 0))).
+      (a_1[shift_sint32(t, i_2)] < 0))).
   (* Then *)
   Have: i < size_0.
   (* Invariant *)
   Have: (-1) <= i.
   (* Invariant *)
   Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
-      (0 < a_3[shift_sint32(t, i_2)]))).
+      (0 < a_4[shift_sint32(t, i_2)]))).
 }
-Prove: a_3[shift_sint32(t, i_1)] < 0.
+Prove: a_4[shift_sint32(t, i_1)] < 0.
 
 ------------------------------------------------------------
 
@@ -350,7 +352,7 @@ Prove: true.
 Goal Loop assigns (file simpl_is_type.i, line 25) (3/3):
 Effect at line 29
 Let a = shift_sint32(t, 0).
-Let a_1 = havoc(Mint_undef_0, Mint_0, a, size_0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, size_0).
 Let x = i - 1.
 Let a_2 = shift_sint32(t, x).
 Let a_3 = a_1[a_2].
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
index f43f3e075ee415b68f1f1fd6a9b033a6b4f85c39..3488a9b01fa6bd5889a73076f63621ef96f36efe 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
@@ -149,9 +149,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mchar0 :
     forall mchar:addr -> int, mchar1:addr -> int, mint:addr -> int, mint1:
      addr -> int, n:int, p:addr, q:addr
-     [Load_S1_X p (havoc mchar1 mchar q n) mint mint1].
+     [Load_S1_X p (memcpy mchar mchar1 q q n) mint mint1].
      separated p 3 q n ->
-     Load_S1_X p (havoc mchar1 mchar q n) mint mint1 =
+     Load_S1_X p (memcpy mchar mchar1 q q n) mint mint1 =
      Load_S1_X p mchar mint mint1
   
   axiom Q_Load_S1_X_update_Mint1 :
@@ -172,9 +172,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mint1 :
     forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, mint2:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_X p mchar (havoc mint2 mint1 q n) mint].
+     [Load_S1_X p mchar (memcpy mint1 mint2 q q n) mint].
      separated p 3 q n ->
-     Load_S1_X p mchar (havoc mint2 mint1 q n) mint =
+     Load_S1_X p mchar (memcpy mint1 mint2 q q n) mint =
      Load_S1_X p mchar mint1 mint
   
   axiom Q_Load_S1_X_update_Mint2 :
@@ -195,9 +195,9 @@ theory Compound
   axiom Q_Load_S1_X_havoc_Mint2 :
     forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, mint2:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_X p mchar mint (havoc mint2 mint1 q n)].
+     [Load_S1_X p mchar mint (memcpy mint1 mint2 q q n)].
      separated p 3 q n ->
-     Load_S1_X p mchar mint (havoc mint2 mint1 q n) =
+     Load_S1_X p mchar mint (memcpy mint1 mint2 q q n) =
      Load_S1_X p mchar mint mint1
   
   axiom Q_Load_Init_S1_X_update_Init0 :
@@ -215,9 +215,9 @@ theory Compound
   
   axiom Q_Load_Init_S1_X_havoc_Init0 :
     forall init:addr -> bool, init1:addr -> bool, n:int, p:addr, q:addr
-     [Load_Init_S1_X p (havoc init1 init q n)].
+     [Load_Init_S1_X p (memcpy init init1 q q n)].
      separated p 3 q n ->
-     Load_Init_S1_X p (havoc init1 init q n) = Load_Init_S1_X p init
+     Load_Init_S1_X p (memcpy init init1 q q n) = Load_Init_S1_X p init
   
 end
 [wp:print-generated] 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
index 9ba398399278b1469c599882ee1765879e2e6cf3..71e9a2acf38590e0e77d26cd7848c15ac2dc5ebf 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/zero.0.res.oracle
@@ -30,7 +30,8 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'is_zero' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (of_f64(havoc(Mf64_undef_0, Mf64_0, a, 10)[shift_float64(s, i_1)]) = .0))).
+      (of_f64(memcpy(Mf64_0, Mf64_undef_0, a, a, 10)[shift_float64(s, i_1)])
+         = .0))).
   (* Then *)
   Have: i <= 9.
 }
@@ -46,7 +47,7 @@ Prove: true.
 Goal Preservation of Invariant 'is_zero' (file zero.i, line 25):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -101,7 +102,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file zero.i, line 29):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
index 8d825e0428891547822d7de7e0d66b6800a6d445..313b9ed702fb07546d799397e2e4f787356948a6 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/zero.1.res.oracle
@@ -30,7 +30,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'is_zero' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      (havoc(Mf64_undef_0, Mf64_0, a, 10)[shift_float64(s, i_1)] = 0))).
+      (memcpy(Mf64_0, Mf64_undef_0, a, a, 10)[shift_float64(s, i_1)] = 0))).
   (* Then *)
   Have: i <= 9.
 }
@@ -46,7 +46,7 @@ Prove: true.
 Goal Preservation of Invariant 'is_zero' (file zero.i, line 25):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
@@ -100,7 +100,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file zero.i, line 29):
 Let x = to_uint32(1 + i).
 Let a = shift_float64(s, 0).
-Let a_1 = havoc(Mf64_undef_0, Mf64_0, a, 10).
+Let a_1 = memcpy(Mf64_0, Mf64_undef_0, a, a, 10).
 Assume {
   Type: is_uint32(i).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
index 710eb5bae2e3540c792e2cbbe288d29130b3f7bd..2befafc093ee3f83727f0e8400cc003a5f8f911a 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/bts_2110.res.oracle
@@ -82,9 +82,9 @@ theory Compound
   
   axiom Q_Load_S2_A_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, p:addr, q:addr
-     [Load_S2_A p (havoc mint1 mint q n)].
+     [Load_S2_A p (memcpy mint mint1 q q n)].
      separated p 1 q n ->
-     Load_S2_A p (havoc mint1 mint q n) = Load_S2_A p mint
+     Load_S2_A p (memcpy mint mint1 q q n) = Load_S2_A p mint
   
 end
 [wp:print-generated] 
@@ -113,7 +113,7 @@ end
        let a2 = shiftfield_F1_FD_pos a1 in
        let x = get t a2 in
        let a3 = Load_S2_A a t in
-       let a4 = Load_S2_A a (set (havoc t1 t a 1) a2 i) in
+       let a4 = Load_S2_A a (set (memcpy t t1 a a 1) a2 i) in
        not x = i ->
        region (a1.base) <= 0 ->
        region (a.base) <= 0 ->
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
index c2ac0df24d1c944b1ba1698b273a280e0c8ca8c1..0df97f15cf94863f0a8ec13d11c8185cfe7332d2 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/assigns_sep.res.oracle
@@ -47,8 +47,8 @@ Goal Check (file assigns_sep.i, line 27):
 Let x = read_uint32(mem_0, array_0).
 Let m = write_uint8(mem_0, shift_uint8(array_0, 7), v).
 Let x_1 = read_uint32(m, array_0).
-Let x_2 = read_uint32(havoc(mem_undef_0, m, shift_uint8(array_0, 4), 4),
-            array_0).
+Let a = shift_uint8(array_0, 4).
+Let x_2 = read_uint32(memcpy(m, mem_undef_0, a, a, 4), array_0).
 Assume {
   Type: is_uint32(x) /\ is_uint32(x_1) /\ is_uint32(x_2).
   (* Heap *)
@@ -60,19 +60,20 @@ Prove: (x_1 = x) /\ (x_2 = x_1).
 
 Goal Check (file assigns_sep.i, line 30):
 Let m = write_uint8(mem_0, shift_uint8(array_0, 7), v).
-Let a = havoc(mem_undef_0, m, shift_uint8(array_0, 4), 4).
+Let a = shift_uint8(array_0, 4).
+Let a_1 = memcpy(m, mem_undef_0, a, a, 4).
 Let x = read_uint32(mem_1, array_0).
-Let x_1 = read_uint32(a, array_0).
+Let x_1 = read_uint32(a_1, array_0).
 Assume {
   Type: is_uint32(x) /\ is_uint32(read_uint32(mem_0, array_0)) /\
       is_uint32(read_uint32(m, array_0)) /\ is_uint32(x_1).
   (* Heap *)
   Type: (region(array_0.base) <= 0) /\ framed(mem_0) /\ sconst(mem_0).
   (* Call Effects *)
-  Have: forall a_1 : addr.
+  Have: forall a_2 : addr.
       ((forall i : Z. (((i = 4) \/ (i = 6)) ->
-        (shift_uint8(array_0, i) != a_1))) ->
-      (raw_get(a, a_1) = raw_get(mem_1, a_1))).
+        (shift_uint8(array_0, i) != a_2))) ->
+      (raw_get(a_1, a_2) = raw_get(mem_1, a_2))).
 }
 Prove: x_1 = x.
 
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
index 898225de01563300510514f311a8ce95fa55f7f3..31b9b8eebe15cb97ec92ac1cf6f38d17f2704bf9 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/structs.res.oracle
@@ -16,7 +16,7 @@ Prove: true.
 
 Goal Post-condition (file structs.i, line 18) in 'caller':
 Let a = Load_S2_Y(u, mem_0).
-Let a_1 = Load_S2_Y(u, havoc(mem_undef_0, mem_0, y, 32)).
+Let a_1 = Load_S2_Y(u, memcpy(mem_0, mem_undef_0, y, y, 32)).
 Assume {
   Type: IsS2_Y(a) /\ IsS2_Y(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle b/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
index 23b86bc3588bab56bd3c49ca3803ac687e15e650..a5aa25272a03fdde841792a8786c40d0c4d7cb1b 100644
--- a/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
+++ b/src/plugins/wp/tests/wp_bytes/oracle/union.res.oracle
@@ -341,7 +341,7 @@ Prove: read_uint8(m, shift_uint8(shiftfield_F2_U_a(u), i)) = 0.
 
 Goal Check (file union.i, line 70):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Let x = read_uint64(a_1, shiftfield_F2_U_u(u)).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\ is_uint64(x).
@@ -361,7 +361,7 @@ Prove: x = 4294967295.
 
 Goal Check (file union.i, line 72):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\
       is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
@@ -383,7 +383,7 @@ Prove: read_uint8(a_1, shift_uint8(shiftfield_F2_U_a(u), i)) = 255.
 
 Goal Check (file union.i, line 73):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Assume {
   Type: is_uint32(read_uint32(a_1, shiftfield_F2_U_s(u))) /\
       is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
@@ -405,7 +405,7 @@ Prove: read_uint8(a_1, shift_uint8(shiftfield_F2_U_a(u), i)) = 0.
 
 Goal Check (file union.i, line 75):
 Let a = shiftfield_F2_U_x(u).
-Let a_1 = havoc(mem_undef_0, mem_0, a, 8).
+Let a_1 = memcpy(mem_0, mem_undef_0, a, a, 8).
 Let x = read_uint32(a_1, shiftfield_F2_U_s(u)).
 Assume {
   Type: is_uint32(x) /\ is_uint64(read_uint64(a_1, shiftfield_F2_U_u(u))).
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
index 997835abf96355220efc2465c42901bcbe31a285..cd4f15d440d800bd6f8cd9bd6f33d0ea11b9097e 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle
@@ -281,7 +281,7 @@ Prove: true.
 Goal Post-condition 'Preset_5_tps' in 'call_reset_5_tps':
 Let a = tps_0[9].
 Let a_1 = shift_S1_T(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, 10).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 10).
 Assume {
   (* Heap *)
   Type: linked(Malloc_0) /\ (forall i_1 : Z. region(tps_0[i_1].base) <= 0).
diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
index 66fd41e239956f69ce7a0cb0f2af4c436d869866..b819acb565871b9630721bb0b6a870fb28d0e3ed 100644
--- a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
+++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle
@@ -432,7 +432,7 @@ Prove: true.
 Goal Post-condition (file reference_array.i, line 36) in 'reset_1_5':
 Let a = shift_A5_sint32(rp_0, 0).
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, 5).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 5).
 Assume {
   (* Heap *)
   Type: (region(rp_0.base) <= 0) /\ linked(Malloc_0).
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
index e3f4ccc6a7f73225bd142897ad1566d36a40e616..0e23fe0de0bffb66e66b60b267a895dee10d1803 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/combined.res.oracle
@@ -39,7 +39,8 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file combined.c, line 30):
-Let a = havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50).
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, 50).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(v) /\ is_sint32(1 + i).
   (* Heap *)
@@ -52,7 +53,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      P_P(a[shift_sint32(t, i_2)]))).
+      P_P(a_1[shift_sint32(t, i_2)]))).
   (* Then *)
   Have: i <= 49.
   (* Call 'f' *)
@@ -60,7 +61,7 @@ Assume {
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: P_P(a[shift_sint32(t, i) <- v][shift_sint32(t, i_1)]).
+Prove: P_P(a_1[shift_sint32(t, i) <- v][shift_sint32(t, i_1)]).
 
 ------------------------------------------------------------
 
@@ -70,6 +71,7 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Preservation of Invariant (file combined.c, line 36):
+Let a = shift_sint32(t, 0).
 Let x = 1 + j.
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j) /\ is_sint32(x).
@@ -81,8 +83,7 @@ Assume {
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
-            [shift_sint32(t, i_1)]))).
+      P_P(memcpy(Mint_0, Mint_undef_0, a, a, 50)[shift_sint32(t, i_1)]))).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
@@ -100,7 +101,9 @@ Prove: true.
 ------------------------------------------------------------
 
 Goal Assertion (file combined.c, line 42):
-Let a = havoc(Mint_undef_1, Mint_0, shift_sint32(t, 0), 50).
+Let a = shift_sint32(t, 0).
+Let a_1 = memcpy(Mint_0, Mint_undef_0, a, a, 50).
+Let a_2 = shift_sint32(t, A).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i_1) /\ is_sint32(j).
   (* Heap *)
@@ -113,7 +116,7 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 50).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      P_P(a[shift_sint32(t, i_2)]))).
+      P_P(a_1[shift_sint32(t, i_2)]))).
   (* Else *)
   Have: 50 <= i_1.
   (* Invariant *)
@@ -121,8 +124,7 @@ Assume {
   (* Else *)
   Have: 100 <= j.
 }
-Prove: P_P(havoc(Mint_undef_0, a, shift_sint32(t, A), 100 - A)
-             [shift_sint32(t, i)]).
+Prove: P_P(memcpy(a_1, Mint_undef_1, a_2, a_2, 100 - A)[shift_sint32(t, i)]).
 
 ------------------------------------------------------------
 
@@ -156,22 +158,22 @@ Prove: true.
 
 Goal Loop assigns (file combined.c, line 37) (3/3):
 Call Result at line 40
+Let a = shift_sint32(t, 0).
 Let x = j - 1.
-Let a = shift_sint32(t, x).
+Let a_1 = shift_sint32(t, x).
 Assume {
   Type: is_sint32(A) /\ is_sint32(i) /\ is_sint32(j) /\ is_sint32(x).
   (* Heap *)
   Type: (region(t.base) <= 0) /\ linked(Malloc_0).
   (* Goal *)
-  When: !invalid(Malloc_0, a, 1).
+  When: !invalid(Malloc_0, a_1, 1).
   (* Assertion *)
   Have: (50 <= A) /\ (A <= 100).
   (* Invariant *)
   Have: (0 <= i) /\ (i <= 50).
   (* Invariant *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) ->
-      P_P(havoc(Mint_undef_0, Mint_0, shift_sint32(t, 0), 50)
-            [shift_sint32(t, i_1)]))).
+      P_P(memcpy(Mint_0, Mint_undef_0, a, a, 50)[shift_sint32(t, i_1)]))).
   (* Else *)
   Have: 50 <= i.
   (* Invariant *)
@@ -179,7 +181,7 @@ Assume {
   (* Then *)
   Have: j <= 100.
 }
-Prove: included(a, 1, shift_sint32(t, A), 100 - A).
+Prove: included(a_1, 1, shift_sint32(t, A), 100 - A).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
index ed01601330865a25589b55354713a1bbdf5f0ede..c3d598aa21a027398090107226ce13e2f9c1f7b4 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/copy.res.oracle
@@ -10,8 +10,8 @@
 
 Goal Post-condition (file copy.i, line 5) in 'copy':
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_1, i).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
   (* Heap *)
@@ -36,7 +36,7 @@ Prove: a_3[shift_sint32(b, i_1)] = a_3[shift_sint32(a, i_1)].
 
 Goal Preservation of Invariant 'Copy' (file copy.i, line 11):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
@@ -85,7 +85,7 @@ Prove: true.
 
 Goal Assertion 'A' (file copy.i, line 18):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = shift_sint32(a, i_1).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
@@ -111,7 +111,7 @@ Prove: a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]][a_3] = a_2[a_3].
 
 Goal Assertion 'B' (file copy.i, line 19):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let a_4 = shift_sint32(b, i_1).
 Assume {
@@ -153,7 +153,7 @@ Prove: true.
 Goal Loop assigns (file copy.i, line 12) (3/3):
 Effect at line 17
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, x)]].
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
index d43b32da8529f1ac99e258f8dd7b4ed415305b79..1a0f184dade8ad8d09bd40b8b6f9701781adffc6 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/loop.res.oracle
@@ -11,7 +11,7 @@
 Goal Post-condition 'qed_ok' in 'init':
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_1 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i).
@@ -56,7 +56,8 @@ Assume {
   Have: (a <= i) /\ (i <= x_1).
   (* Invariant 'qed_ok' *)
   Have: forall i_1 : Z. ((a <= i_1) -> ((i_1 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, i - a)[shift_sint32(t, i_1)] = e))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a)[shift_sint32(t, i_1)] =
+       e))).
   (* Then *)
   Have: i <= b.
 }
@@ -82,7 +83,7 @@ Goal Preservation of Invariant 'qed_ok' (file loop.i, line 13):
 Let x = 1 + i.
 Let a_1 = shift_sint32(t, a).
 Let x_1 = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let x_2 = 1 + b.
 Assume {
   Type: is_sint32(a) /\ is_sint32(b) /\ is_sint32(i) /\ is_sint32(x).
@@ -130,7 +131,7 @@ Goal Loop assigns 'qed_ok' (3/3):
 Effect at line 18
 Let a_1 = shift_sint32(t, a).
 Let x = -a.
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, i - a).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, i - a).
 Let a_3 = shift_sint32(t, i).
 Let x_1 = 1 + i.
 Let x_2 = 1 + b.
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
index f48b3ded68263a065479634b4753f4c460a2b653..e9fcd31a9e07a7a1b6978dd26d4c1c1734711e5f 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/string_c.res.oracle
@@ -7,7 +7,7 @@
 
 Goal Post-condition 'copied_contents' in 'memcpy':
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -29,8 +29,8 @@ Assume {
   (* Else *)
   Have: n <= i.
 }
-Prove: L_memcmp(Mchar_0, havoc(Mchar_undef_0, Mchar_0, a, i), dest_0, src_0,
-         i) = 0.
+Prove: L_memcmp(Mchar_0, memcpy(Mchar_0, Mchar_undef_0, a, a, i), dest_0,
+         src_0, i) = 0.
 
 ------------------------------------------------------------
 
@@ -41,7 +41,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 33):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
   (* Heap *)
@@ -75,7 +75,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 34):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
@@ -126,7 +126,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 35) (3/3):
 Effect at line 39
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(dest_0, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(src_0, i)]].
 Assume {
@@ -170,7 +170,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 38):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(dest_0, i) <- a_1[shift_sint8(src_0, i)]].
 Assume {
   Type: is_uint64(i) /\ is_uint64(n).
@@ -242,7 +242,7 @@ Assume {
       (* Invariant 'no_eva' *)
       Have: 0 <= n.
       (* Loop assigns ... *)
-      Have: havoc(Mchar_undef_0, Mchar_0, a, n) = Mchar_1.
+      Have: memcpy(Mchar_0, Mchar_undef_0, a, a, n) = Mchar_1.
       (* Invariant 'no_eva' *)
       Have: (0 <= i) /\ (i <= n).
       (* Invariant 'no_eva' *)
@@ -267,7 +267,7 @@ Assume {
           (Mchar_0[shift_sint8(src_0, i_3)]
              = Mchar_0[shift_sint8(dest_0, i_3)]))).
       (* Loop assigns ... *)
-      Have: havoc(Mchar_undef_1, Mchar_0, a, n) = Mchar_2.
+      Have: memcpy(Mchar_0, Mchar_undef_1, a, a, n) = Mchar_2.
       (* Invariant 'no_eva' *)
       Have: (0 <= i_1) /\ (i_1 < n).
       (* Invariant 'no_eva' *)
@@ -299,7 +299,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 95):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -345,7 +345,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 96):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(s, 0).
 Assume {
   Type: is_sint32(memoverlap_0) /\ is_uint64(i) /\ is_uint64(n).
@@ -396,7 +396,7 @@ Prove: true.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 97):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let a_3 = shift_sint8(s, 0).
 Let a_4 = shift_sint8(s, i_1).
@@ -450,7 +450,7 @@ Prove: true.
 
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 107):
 Let a = shift_sint8(dest_0, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let x = to_uint64(n - 1).
 Let a_2 = shift_sint8(src_0, 0).
 Assume {
@@ -521,7 +521,7 @@ Prove: to_uint64(n - 1) < n.
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 108):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let x_1 = to_uint64(n - 1).
 Let a_2 = shift_sint8(s, 0).
 Assume {
@@ -603,7 +603,7 @@ Prove: Mchar_0[shift_sint8(src_0, i)] = Mchar_0[shift_sint8(dest_0, i)].
 Goal Preservation of Invariant 'no_eva' (file FRAMAC_SHARE/libc/string.c, line 109):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
 Let a_3 = shift_sint8(s, 0).
@@ -674,7 +674,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 98) (3/3):
 Effect at line 102
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(d, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
 Let a_4 = shift_sint8(s, 0).
@@ -739,7 +739,7 @@ Goal Loop assigns (file FRAMAC_SHARE/libc/string.c, line 110) (3/3):
 Effect at line 114
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = shift_sint8(d, i).
 Let a_3 = a_1[a_2 <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
@@ -842,7 +842,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 101):
 Let x = to_uint64(1 + i).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let a_3 = shift_sint8(s, 0).
 Assume {
@@ -897,7 +897,7 @@ Prove: true.
 Goal Decreasing of Loop variant at loop (file FRAMAC_SHARE/libc/string.c, line 113):
 Let x = to_uint64(i - 1).
 Let a = shift_sint8(d, 0).
-Let a_1 = havoc(Mchar_undef_0, Mchar_0, a, n).
+Let a_1 = memcpy(Mchar_0, Mchar_undef_0, a, a, n).
 Let a_2 = a_1[shift_sint8(d, i) <- a_1[shift_sint8(s, i)]].
 Let x_1 = to_uint64(n - 1).
 Let a_3 = shift_sint8(s, 0).
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
index f93ab5d670e722d562863c19bf2d0757a4e7db30..b9bb077fb3160a3cdfd61820518eca062c65a6ff 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.0.res.oracle
@@ -370,7 +370,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -415,7 +415,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
index 012860dfab7b29a231aa22404ae6e264c6369b6f..e1451269a58d696b578b2918c815eee2d546e4f5 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.1.res.oracle
@@ -386,7 +386,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -425,7 +425,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
index 2a09b8ccd3dcfc3e511a597843fb9264a52f56fb..d5264fbf8ce3482ba0fecd0deb96a2fdca85b226 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.2.res.oracle
@@ -374,7 +374,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -413,7 +413,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
index 28a5ec81a80847145016be6dfd208d2666542c7e..d47dda21e787edf9f85558132de384d06435560a 100644
--- a/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
+++ b/src/plugins/wp/tests/wp_plugin/oracle/unfold_assigns.3.res.oracle
@@ -370,7 +370,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 52) in 'USE_ASSIGN_UNFOLD_KO':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
@@ -409,7 +409,7 @@ Prove: true.
 
 Goal Post-condition (file unfold_assigns.i, line 43) in 'USE_ASSIGN_UNFOLD_OK':
 Let a = Load_S1_S(q, Mint_0).
-Let a_1 = Load_S1_S(q, havoc(Mint_undef_0, Mint_0, p, 2)).
+Let a_1 = Load_S1_S(q, memcpy(Mint_0, Mint_undef_0, p, p, 2)).
 Assume {
   Type: IsS1_S(a) /\ IsS1_S(a_1).
   (* Heap *)
diff --git a/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle b/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
index 75bce10e9805bbf6ad133de1cd99b97755d66e1d..d0453d1612a309bf5265a04d2860be56896e24d0 100644
--- a/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
+++ b/src/plugins/wp/tests/wp_region/oracle/copy_array.res.oracle
@@ -13,9 +13,9 @@
 
 Goal Post-condition (file copy_array.c, line 4) in 'copy':
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = 4 * n.
-Let a_3 = havoc(Msint32_undef_0, Msint32_0, a_1, i).
+Let a_3 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, i).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n).
   (* Heap *)
@@ -40,7 +40,7 @@ Prove: a_3[shift_sint32(b, i_1)] = a_3[shift_sint32(a, i_1)].
 
 Goal Preservation of Invariant 'Copy' (file copy_array.c, line 11):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let x = 4 * n.
 Assume {
@@ -90,7 +90,7 @@ Prove: true.
 
 Goal Assertion 'A' (file copy_array.c, line 18):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = 4 * n.
 Let a_3 = shift_sint32(a, i_1).
 Assume {
@@ -117,7 +117,7 @@ Prove: a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]][a_3] = a_2[a_3].
 
 Goal Assertion 'B' (file copy_array.c, line 19):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let a_3 = a_2[shift_sint32(a, i) <- a_2[shift_sint32(b, i)]].
 Let x = 4 * n.
 Let a_4 = shift_sint32(b, i_1).
@@ -160,7 +160,7 @@ Prove: true.
 Goal Loop assigns (file copy_array.c, line 12) (3/3):
 Effect at line 17
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Msint32_undef_0, Msint32_0, a_1, n).
+Let a_2 = memcpy(Msint32_0, Msint32_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Let a_4 = a_2[a_3 <- a_2[shift_sint32(b, x)]].
diff --git a/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
index ffdcf75c1ce8f8fefa6f2cf6e22756dd9c789022..ba812dcdc33df4645808a3a3153ba4d10f8258f5 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/multi_matrix_types.res.oracle
@@ -132,9 +132,9 @@ theory Compound
   
   axiom Q_Array_uint32_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
-     [Array_uint32 p n (havoc mint1 mint q n1)].
+     [Array_uint32 p n (memcpy mint mint1 q q n1)].
      separated p 1 q n1 ->
-     Array_uint32 p n (havoc mint1 mint q n1) = Array_uint32 p n mint
+     Array_uint32 p n (memcpy mint mint1 q q n1) = Array_uint32 p n mint
   
   axiom Q_Array_sint64_access :
     forall mint:addr -> int, i:int, n:int, p:addr
@@ -156,9 +156,9 @@ theory Compound
   
   axiom Q_Array_sint64_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, n1:int, p:addr, q:addr
-     [Array_sint64 p n (havoc mint1 mint q n1)].
+     [Array_sint64 p n (memcpy mint mint1 q q n1)].
      separated p 1 q n1 ->
-     Array_sint64 p n (havoc mint1 mint q n1) = Array_sint64 p n mint
+     Array_sint64 p n (memcpy mint mint1 q q n1) = Array_sint64 p n mint
   
   axiom Q_Load_S1_S_update_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, p:addr, q:
@@ -178,9 +178,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p (havoc mint1 mint q n) mint2 mint3].
+     [Load_S1_S p (memcpy mint mint1 q q n) mint2 mint3].
      separated p 11 q n ->
-     Load_S1_S p (havoc mint1 mint q n) mint2 mint3 =
+     Load_S1_S p (memcpy mint mint1 q q n) mint2 mint3 =
      Load_S1_S p mint mint2 mint3
   
   axiom Q_Load_S1_S_update_Mint1 :
@@ -201,9 +201,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint1 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p mint3 (havoc mint2 mint1 q n) mint].
+     [Load_S1_S p mint3 (memcpy mint1 mint2 q q n) mint].
      separated p 11 q n ->
-     Load_S1_S p mint3 (havoc mint2 mint1 q n) mint =
+     Load_S1_S p mint3 (memcpy mint1 mint2 q q n) mint =
      Load_S1_S p mint3 mint1 mint
   
   axiom Q_Load_S1_S_update_Mint2 :
@@ -224,9 +224,9 @@ theory Compound
   axiom Q_Load_S1_S_havoc_Mint2 :
     forall mint:addr -> int, mint1:addr -> int, mint2:addr -> int, mint3:addr
      -> int, n:int, p:addr, q:addr
-     [Load_S1_S p mint1 mint (havoc mint3 mint2 q n)].
+     [Load_S1_S p mint1 mint (memcpy mint2 mint3 q q n)].
      separated p 11 q n ->
-     Load_S1_S p mint1 mint (havoc mint3 mint2 q n) =
+     Load_S1_S p mint1 mint (memcpy mint2 mint3 q q n) =
      Load_S1_S p mint1 mint mint2
   
 end
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
index 64c2f4fe31278495da45277f2ffa04c9b07b7225..6e39bf3db9623fde7c36d04d2c7bc1e534524d45 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle
@@ -32,17 +32,17 @@ Assume {
   Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, n)[shift_sint32(a, i_2)] = v))).
   (* Else *)
   Have: n <= i.
 }
-Prove: havoc(Mint_undef_0, Mint_0, a_1, i)[shift_sint32(a, i_1)] = v.
+Prove: memcpy(Mint_0, Mint_undef_0, a_1, a_1, i)[shift_sint32(a, i_1)] = v.
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file user_init.i, line 17):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
   (* Heap *)
@@ -96,7 +96,7 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Assume {
@@ -287,7 +287,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -324,14 +324,15 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 135):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -342,8 +343,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -370,7 +371,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -412,7 +413,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -515,7 +516,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
@@ -605,7 +606,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -641,13 +642,14 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 153):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -658,8 +660,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -686,7 +688,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -726,7 +728,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -822,7 +824,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
index 76eef451c0280573f54b869fa2f6f87a76ecfe64..5c0b0175dda6169450dddf3a55e8e226e5e59303 100644
--- a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
+++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle
@@ -32,17 +32,17 @@ Assume {
   Have: (0 <= i) /\ (i <= n).
   (* Invariant 'Partial' *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (havoc(Mint_undef_0, Mint_0, a_1, n)[shift_sint32(a, i_2)] = v))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, n)[shift_sint32(a, i_2)] = v))).
   (* Else *)
   Have: n <= i.
 }
-Prove: havoc(Mint_undef_0, Mint_0, a_1, i)[shift_sint32(a, i_1)] = v.
+Prove: memcpy(Mint_0, Mint_undef_0, a_1, a_1, i)[shift_sint32(a, i_1)] = v.
 
 ------------------------------------------------------------
 
 Goal Preservation of Invariant 'Partial' (file user_init.i, line 17):
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Assume {
   Type: is_sint32(i) /\ is_sint32(n) /\ is_sint32(1 + i).
   (* Heap *)
@@ -96,7 +96,7 @@ Prove: true.
 Goal Loop assigns 'Zone' (3/3):
 Effect at line 20
 Let a_1 = shift_sint32(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, n).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, n).
 Let x = i - 1.
 Let a_3 = shift_sint32(a, x).
 Assume {
@@ -287,7 +287,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -324,14 +324,15 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 135):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) ->
         ((i_1 <= 19) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -342,8 +343,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -370,7 +371,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -412,7 +413,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -515,7 +516,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'lack,Zone' *)
@@ -605,7 +606,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, 20).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -641,13 +642,14 @@ Prove: true.
 Goal Preservation of Invariant 'Range' (file user_init.i, line 153):
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
+Let a_2 = shift_sint32(a_1, 0).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
-  Have: forall a_2 : addr.
+  Have: forall a_3 : addr.
       ((forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 <= 9) ->
-        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_2)))) ->
-      (Mint_0[a_2] = Mint_1[a_2])).
+        (shift_sint32(shift_A20_sint32(a, i_2), i_1) != a_3)))) ->
+      (Mint_0[a_3] = Mint_1[a_3])).
   (* Invariant 'Range' *)
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant 'Partial' *)
@@ -658,8 +660,8 @@ Assume {
   Have: i <= 9.
   (* Call 'init' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) ->
-      (havoc(Mint_undef_0, Mint_1, shift_sint32(a_1, 0), 20)
-         [shift_sint32(a_1, i_1)] = v))).
+      (memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20)[shift_sint32(a_1, i_1)] =
+       v))).
 }
 Prove: to_uint32(1 + i) <= 10.
 
@@ -686,7 +688,7 @@ Let x = to_uint32(1 + i_2).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i_2).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i_2) /\ is_sint32(v).
   (* Goal *)
@@ -726,7 +728,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Goal *)
@@ -822,7 +824,7 @@ Let x = to_uint32(1 + i).
 Let a = global(G_t2_52).
 Let a_1 = shift_A20_sint32(a, i).
 Let a_2 = shift_sint32(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_1, a_2, 20).
+Let a_3 = memcpy(Mint_1, Mint_undef_0, a_2, a_2, 20).
 Assume {
   Type: is_uint32(i) /\ is_sint32(v).
   (* Loop assigns 'tactic,Zone' *)
diff --git a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
index f8d4fe69e12360cf59669d317ed19d89b74295cd..5f9dfd94dc87ea5f28bf8b1578815ffac9eb0020 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/caveat_range.res.oracle
@@ -10,7 +10,8 @@
 
 Goal Post-condition (file caveat_range.i, line 12) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
@@ -19,20 +20,21 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i))] = 1.
+Prove: a_2[shiftfield_F1_S_f(shift_S1_S(a, i))] = 1.
 
 ------------------------------------------------------------
 
 Goal Post-condition (file caveat_range.i, line 13) in 'reset':
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i_1).
   (* Goal *)
@@ -41,14 +43,14 @@ Assume {
   Have: (0 <= i_1) /\ (i_1 <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i_1) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Else *)
   Have: 10 <= i_1.
 }
-Prove: a_1[shiftfield_F1_S_g(shift_S1_S(a, i))] = 2.
+Prove: a_2[shiftfield_F1_S_g(shift_S1_S(a, i))] = 2.
 
 ------------------------------------------------------------
 
@@ -64,7 +66,8 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 20):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
@@ -73,16 +76,16 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
   (* Invariant *)
   Have: (-1) <= i.
 }
-Prove: a_1[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
+Prove: a_2[shiftfield_F1_S_f(shift_S1_S(a, i)) <- 1]
          [shiftfield_F1_S_f(shift_S1_S(a, i_1))] = 1.
 
 ------------------------------------------------------------
@@ -94,9 +97,10 @@ Prove: true.
 
 Goal Preservation of Invariant (file caveat_range.i, line 21):
 Let a = global(G_p_22).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_S1_S(a, 0), 20).
-Let a_2 = shift_S1_S(a, i).
-Let a_3 = a_1[shiftfield_F1_S_f(a_2) <- 1].
+Let a_1 = shift_S1_S(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, 20).
+Let a_3 = shift_S1_S(a, i).
+Let a_4 = a_2[shiftfield_F1_S_f(a_3) <- 1].
 Assume {
   Type: is_sint32(i) /\ is_sint32(1 + i).
   (* Goal *)
@@ -105,19 +109,19 @@ Assume {
   Have: (0 <= i) /\ (i <= 10).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_2[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
   (* Invariant *)
   Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) ->
-      (a_1[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
+      (a_2[shiftfield_F1_S_g(shift_S1_S(a, i_2))] = 2))).
   (* Then *)
   Have: i <= 9.
   (* Invariant *)
   Have: (-1) <= i.
   (* Invariant *)
   Have: forall i_2 : Z. ((i_2 <= i) -> ((0 <= i_2) ->
-      (a_3[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
+      (a_4[shiftfield_F1_S_f(shift_S1_S(a, i_2))] = 1))).
 }
-Prove: a_3[shiftfield_F1_S_g(a_2) <- 2]
+Prove: a_4[shiftfield_F1_S_g(a_3) <- 2]
          [shiftfield_F1_S_g(shift_S1_S(a, i_1))] = 2.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
index 78be9b03031296ebcc358cecff7e9a2dafa3ce59..793bf4c678c6a7efadbd03369070a188457846b8 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.0.res.oracle
@@ -13,7 +13,7 @@
 Goal Post-condition 'memcpy' in 'memcpy_alias_vars':
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -47,7 +47,7 @@ Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 Goal Post-condition 'unmodified' in 'memcpy_alias_vars':
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = shift_uint8(a_3, i).
@@ -82,7 +82,7 @@ Prove: a_2[a_5] = Mint_0[a_5].
 Goal Preservation of Invariant 'cpy' (file issue-189-bis.i, line 27):
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = a_2[v <- a_2[v_1]].
@@ -134,7 +134,7 @@ Prove: true.
 Goal Preservation of Invariant 'len' (file issue-189-bis.i, line 23):
 Let a = Mptr_0[global(P_dst_25)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1).
 Let a_3 = Mptr_0[global(P_src_24)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -200,7 +200,7 @@ Effect at line 33
 Let a = global(P_dst_25).
 Let a_1 = Mptr_0[a].
 Let a_2 = shift_uint8(a_1, 0).
-Let a_3 = havoc(Mint_undef_0, Mint_0, a_2, len_0).
+Let a_3 = memcpy(Mint_0, Mint_undef_0, a_2, a_2, len_0).
 Let a_4 = a_3[v <- a_3[v_1]].
 Let a_5 = global(P_src_24).
 Let a_6 = Mptr_0[a_5].
@@ -260,7 +260,7 @@ Prove: true.
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -294,7 +294,7 @@ Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 Goal Post-condition 'unmodified,ok' in 'memcpy_context_vars':
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = shift_uint8(a_3, i).
@@ -329,7 +329,7 @@ Prove: a_2[a_5] = Mint_0[a_5].
 Goal Preservation of Invariant 'ok,cpy' (file issue-189-bis.i, line 56):
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Let a_5 = a_2[dst2_0 <- a_2[src2_0]].
@@ -381,7 +381,7 @@ Prove: true.
 Goal Preservation of Invariant 'ok,len' (file issue-189-bis.i, line 52):
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_1).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1).
 Let a_3 = Mptr_0[global(P_src_47)].
 Let a_4 = shift_uint8(a_3, 0).
 Assume {
@@ -446,7 +446,7 @@ Goal Loop assigns (file issue-189-bis.i, line 55) (4/4):
 Effect at line 62
 Let a = Mptr_0[global(P_dst_48)].
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
 Let a_4 = Mptr_0[global(P_src_47)].
 Let a_5 = shift_uint8(a_4, 0).
diff --git a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
index 9478cae317a68fa68d78ec786c346668d6240f2c..b65c788fa082bcf61f8f648e5487ee8b73c610bf 100644
--- a/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
+++ b/src/plugins/wp/tests/wp_usage/oracle/issue-189-bis.1.res.oracle
@@ -7,8 +7,9 @@
 
 Goal Post-condition 'memcpy,ok' in 'memcpy_context_vars':
 Let a = global(G_dst_48).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
-Let a_2 = global(G_src_47).
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
+Let a_3 = global(G_src_47).
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1).
   (* Goal *)
@@ -18,16 +19,16 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
   (* Invariant 'ok,cpy' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
+      (a_2[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_3, i_1)]))).
   (* Else *)
   Have: len_1 <= 0.
 }
-Prove: a_1[shift_uint8(a, i)] = Mint_0[shift_uint8(a_2, i)].
+Prove: a_2[shift_uint8(a, i)] = Mint_0[shift_uint8(a_3, i)].
 
 ------------------------------------------------------------
 
@@ -38,9 +39,10 @@ Prove: true.
 
 Goal Preservation of Invariant 'ok,cpy' (file issue-189-bis.i, line 56):
 Let a = global(G_dst_48).
-Let a_1 = havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_0).
-Let a_2 = global(G_src_47).
-Let a_3 = a_1[dst2_0 <- a_1[src2_0]].
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
+Let a_3 = global(G_src_47).
+Let a_4 = a_2[dst2_0 <- a_2[src2_0]].
 Assume {
   Type: is_sint32(len_0) /\ is_sint32(len_1) /\ is_sint32(len_1 - 1).
   (* Goal *)
@@ -50,18 +52,18 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_1 <= len_0.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_2, len_0) = shift_uint8(src2_0, len_1).
+  Have: shift_uint8(a_3, len_0) = shift_uint8(src2_0, len_1).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_0) = shift_uint8(dst2_0, len_1).
   (* Invariant 'ok,cpy' *)
   Have: forall i_1 : Z. ((0 <= i_1) -> (((len_1 + i_1) < len_0) ->
-      (a_1[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_2, i_1)]))).
+      (a_2[shift_uint8(a, i_1)] = Mint_0[shift_uint8(a_3, i_1)]))).
   (* Then *)
   Have: 0 < len_1.
   (* Invariant 'ok,len' *)
   Have: len_1 <= (1 + len_0).
 }
-Prove: a_3[shift_uint8(a_2, i)] = a_3[shift_uint8(a, i)].
+Prove: a_4[shift_uint8(a_3, i)] = a_4[shift_uint8(a, i)].
 
 ------------------------------------------------------------
 
@@ -82,7 +84,8 @@ Prove: true.
 
 Goal Preservation of Invariant 'ok,len' (file issue-189-bis.i, line 52):
 Let a = global(G_dst_48).
-Let a_1 = global(G_src_47).
+Let a_1 = shift_uint8(a, 0).
+Let a_2 = global(G_src_47).
 Assume {
   Type: is_sint32(len_1) /\ is_sint32(len_0) /\ is_sint32(len_0 - 1).
   (* Pre-condition 'write_access' *)
@@ -90,13 +93,13 @@ Assume {
   (* Invariant 'ok,len' *)
   Have: len_0 <= len_1.
   (* Invariant 'ok,src' *)
-  Have: shift_uint8(a_1, len_1) = shift_uint8(src2_0, len_0).
+  Have: shift_uint8(a_2, len_1) = shift_uint8(src2_0, len_0).
   (* Invariant 'ok,dst' *)
   Have: shift_uint8(a, len_1) = shift_uint8(dst2_0, len_0).
   (* Invariant 'ok,cpy' *)
   Have: forall i : Z. ((0 <= i) -> (((len_0 + i) < len_1) ->
-      (havoc(Mint_undef_0, Mint_0, shift_uint8(a, 0), len_1)
-         [shift_uint8(a, i)] = Mint_0[shift_uint8(a_1, i)]))).
+      (memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_1)[shift_uint8(a, i)] =
+       Mint_0[shift_uint8(a_2, i)]))).
   (* Then *)
   Have: 0 < len_0.
 }
@@ -140,7 +143,7 @@ Goal Loop assigns (file issue-189-bis.i, line 55) (4/4):
 Effect at line 62
 Let a = global(G_dst_48).
 Let a_1 = shift_uint8(a, 0).
-Let a_2 = havoc(Mint_undef_0, Mint_0, a_1, len_0).
+Let a_2 = memcpy(Mint_0, Mint_undef_0, a_1, a_1, len_0).
 Let a_3 = a_2[tmp_0 <- a_2[src2_0]].
 Let a_4 = global(G_src_47).
 Assume {