diff --git a/src/plugins/wp/MemLoader.ml b/src/plugins/wp/MemLoader.ml
index f73d8cdc1cd7a2d8ee39be2214c324b5337c7daa..5d940330603ac683267919647abc0ceb32f3e4dc 100644
--- a/src/plugins/wp/MemLoader.ml
+++ b/src/plugins/wp/MemLoader.ml
@@ -117,8 +117,8 @@ struct
     begin
       let prefix = Fun.debug phi in
       let sigma = Sigma.create () in
-      List.iter
-        (fun chunk ->
+      List.iteri
+        (fun i chunk ->
            List.iter
              (fun (name,triggers,conditions,m1,m2) ->
                 let mem1 = assigned sigma chunk m1 chunks in
@@ -137,8 +137,8 @@ struct
                     [ (Trigger.of_term value1 :: triggers );
                       (Trigger.of_term value2 :: triggers ) ]
                 in
-                let l_name = Pretty_utils.sfprintf "%s_%s_%a"
-                    prefix name Chunk.pretty chunk in
+                let l_name = Pretty_utils.sfprintf "%s_%s_%a%d"
+                    prefix name Chunk.pretty chunk i in
                 let l_lemma = F.p_hyps conditions (p_equal value1 value2) in
                 Definitions.define_lemma {
                   l_assumed = true ;
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
new file mode 100644
index 0000000000000000000000000000000000000000..11d6b90bb121a763e572ef50afdcb7947288431b
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/oracle/struct_fields.res.oracle
@@ -0,0 +1,275 @@
+# frama-c -wp -wp-rte -wp-no-let [...]
+[kernel] Parsing tests/wp_acsl/struct_fields.i (no preprocessing)
+[wp] Running WP plugin...
+[wp] Loading driver 'share/wp.driver'
+[rte] annotating function foo
+[wp] 2 goals scheduled
+---------------------------------------------
+--- Context 'typed_foo' Cluster 'Chunk' 
+---------------------------------------------
+theory Chunk
+  (* use why3.BuiltIn.BuiltIn *)
+  
+  (* use bool.Bool *)
+  
+  (* use int.Int *)
+  
+  (* use int.ComputerDivision *)
+  
+  (* use real.RealInfix *)
+  
+  (* use frama_c_wp.qed.Qed *)
+  
+  (* use map.Map *)
+  
+  (* use frama_c_wp.memory.Memory *)
+  
+  (* use frama_c_wp.cint.Cint *)
+  
+  predicate is_sint8_chunk (m:addr -> int) =
+    forall a:addr. is_sint8 (get m a)
+  
+  predicate is_sint16_chunk (m:addr -> int) =
+    forall a:addr. is_sint16 (get m a)
+  
+  predicate is_sint32_chunk (m:addr -> int) =
+    forall a:addr. is_sint32 (get m a)
+end
+---------------------------------------------
+--- Context 'typed_foo' Cluster 'S1_X' 
+---------------------------------------------
+theory S1_X
+  (* use why3.BuiltIn.BuiltIn *)
+  
+  (* use bool.Bool *)
+  
+  (* use int.Int *)
+  
+  (* use int.ComputerDivision *)
+  
+  (* use real.RealInfix *)
+  
+  (* use frama_c_wp.qed.Qed *)
+  
+  (* use map.Map *)
+  
+  type S1_X =
+    | S1_X1 (F1_X_a:int) (F1_X_b:int) (F1_X_c:int)
+  
+  (* use frama_c_wp.cint.Cint *)
+  
+  predicate IsS1_X (s:S1_X) =
+    (is_sint8 (F1_X_a s) /\ is_sint16 (F1_X_b s)) /\ is_sint32 (F1_X_c s)
+end
+---------------------------------------------
+--- Context 'typed_foo' Cluster 'Compound' 
+---------------------------------------------
+theory Compound
+  (* use why3.BuiltIn.BuiltIn *)
+  
+  (* use bool.Bool *)
+  
+  (* use int.Int *)
+  
+  (* use int.ComputerDivision *)
+  
+  (* use real.RealInfix *)
+  
+  (* use frama_c_wp.qed.Qed *)
+  
+  (* use map.Map *)
+  
+  (* use frama_c_wp.memory.Memory *)
+  
+  function shiftfield_F1_X_a (p:addr) : addr = shift p 0
+  
+  function shiftfield_F1_X_b (p:addr) : addr = shift p 1
+  
+  function shiftfield_F1_X_c (p:addr) : addr = shift p 2
+  
+  (* use S1_X *)
+  
+  function Load_S1_X (p:addr) (mchar:addr -> int) (mint:addr -> int) (mint1:
+    addr -> int) : S1_X =
+    S1_X1 (get mchar (shiftfield_F1_X_a p)) (get mint (shiftfield_F1_X_b p))
+    (get mint1 (shiftfield_F1_X_c p))
+  
+  Q_Load_S1_X_update_Mchar0 :
+    forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_X p (set mchar q v) mint mint1].
+     separated p 3 q 1 ->
+     Load_S1_X p (set mchar q v) mint mint1 = Load_S1_X p mchar mint mint1
+  
+  Q_Load_S1_X_eqmem_Mchar0 :
+    forall mchar:addr -> int, mchar1:addr -> int, mint:addr -> int, mint1:
+     addr -> int, n:int, p:addr, q:addr [Load_S1_X p mchar mint mint1,
+     eqmem mchar mchar1 q n| Load_S1_X p mchar1 mint mint1,
+     eqmem mchar mchar1 q n].
+     included p 3 q n ->
+     eqmem mchar mchar1 q n ->
+     Load_S1_X p mchar1 mint mint1 = Load_S1_X p mchar mint mint1
+  
+  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].
+     separated p 3 q n ->
+     Load_S1_X p (havoc mchar1 mchar q n) mint mint1
+     = Load_S1_X p mchar mint mint1
+  
+  Q_Load_S1_X_update_Mint1 :
+    forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_X p mchar (set mint1 q v) mint].
+     separated p 3 q 1 ->
+     Load_S1_X p mchar (set mint1 q v) mint = Load_S1_X p mchar mint1 mint
+  
+  Q_Load_S1_X_eqmem_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 mint1 mint,
+     eqmem mint1 mint2 q n| Load_S1_X p mchar mint2 mint,
+     eqmem mint1 mint2 q n].
+     included p 3 q n ->
+     eqmem mint1 mint2 q n ->
+     Load_S1_X p mchar mint2 mint = Load_S1_X p mchar mint1 mint
+  
+  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].
+     separated p 3 q n ->
+     Load_S1_X p mchar (havoc mint2 mint1 q n) mint
+     = Load_S1_X p mchar mint1 mint
+  
+  Q_Load_S1_X_update_Mint2 :
+    forall mchar:addr -> int, mint:addr -> int, mint1:addr -> int, p:addr, q:
+     addr, v:int [Load_S1_X p mchar mint (set mint1 q v)].
+     separated p 3 q 1 ->
+     Load_S1_X p mchar mint (set mint1 q v) = Load_S1_X p mchar mint mint1
+  
+  Q_Load_S1_X_eqmem_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 mint1,
+     eqmem mint1 mint2 q n| Load_S1_X p mchar mint mint2,
+     eqmem mint1 mint2 q n].
+     included p 3 q n ->
+     eqmem mint1 mint2 q n ->
+     Load_S1_X p mchar mint mint2 = Load_S1_X p mchar mint mint1
+  
+  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)].
+     separated p 3 q n ->
+     Load_S1_X p mchar mint (havoc mint2 mint1 q n)
+     = Load_S1_X p mchar mint mint1
+end
+[wp:print-generated] 
+  theory WP
+    (* use why3.BuiltIn.BuiltIn *)
+    
+    (* use bool.Bool *)
+    
+    (* use int.Int *)
+    
+    (* use int.ComputerDivision *)
+    
+    (* use real.RealInfix *)
+    
+    (* use frama_c_wp.qed.Qed *)
+    
+    (* use map.Map *)
+    
+    (* use frama_c_wp.memory.Memory *)
+    
+    (* use Chunk *)
+    
+    (* use S1_X *)
+    
+    (* use Compound *)
+    
+    goal wp_goal :
+      forall t:int -> int, t1:addr -> int, t2:addr -> int, t3:addr -> int, a:
+       addr.
+       region (base a) <= 0 ->
+       is_sint16_chunk t2 ->
+       is_sint32_chunk t3 ->
+       is_sint8_chunk t1 ->
+       linked t ->
+       sconst t1 ->
+       valid_rd t a 3 -> IsS1_X (Load_S1_X a t1 t2 t3) -> valid_rw t a 3
+  end
+[wp:print-generated] 
+  theory WP1
+    (* use why3.BuiltIn.BuiltIn *)
+    
+    (* use bool.Bool *)
+    
+    (* use int.Int *)
+    
+    (* use int.ComputerDivision *)
+    
+    (* use real.RealInfix *)
+    
+    (* use frama_c_wp.qed.Qed *)
+    
+    (* use map.Map *)
+    
+    (* use frama_c_wp.memory.Memory *)
+    
+    (* use Chunk *)
+    
+    (* use S1_X *)
+    
+    (* use Compound *)
+    
+    goal wp_goal :
+      forall t:int -> int, t1:addr -> int, t2:addr -> int, t3:addr -> int, a:
+       addr.
+       region (base a) <= 0 ->
+       is_sint16_chunk t2 ->
+       is_sint32_chunk t3 ->
+       is_sint8_chunk t1 ->
+       linked t -> sconst t1 -> IsS1_X (Load_S1_X a t1 t2 t3) -> valid_rd t a 3
+  end
+[wp] 2 goals generated
+------------------------------------------------------------
+  Function foo
+------------------------------------------------------------
+
+Goal Assertion 'rte,mem_access' (file tests/wp_acsl/struct_fields.i, line 15):
+Assume {
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0) /\
+      IsS1_X(Load_S1_X(p, Mchar_0, Mint_0, Mint_1)).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0).
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0).
+}
+Prove: valid_rd(Malloc_0, p, 3).
+
+------------------------------------------------------------
+
+Goal Assertion 'rte,mem_access' (file tests/wp_acsl/struct_fields.i, line 16):
+Let a = Load_S1_X(p, Mchar_0, Mint_0, Mint_1).
+Assume {
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0) /\ IsS1_X(a).
+  (* Heap *)
+  Type: (region(p.base) <= 0) /\ linked(Malloc_0) /\ sconst(Mchar_0).
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0).
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0).
+  Type: is_sint16_chunk(Mint_0) /\ is_sint32_chunk(Mint_1) /\
+      is_sint8_chunk(Mchar_0).
+  (* Assertion 'rte,mem_access' *)
+  Have: valid_rd(Malloc_0, p, 3).
+  (* Initializer *)
+  Init: a = r.
+}
+Prove: valid_rw(Malloc_0, p, 3).
+
+------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/struct_fields.i b/src/plugins/wp/tests/wp_acsl/struct_fields.i
new file mode 100644
index 0000000000000000000000000000000000000000..93b9c90858aaca1db67542015efe50acabd61703
--- /dev/null
+++ b/src/plugins/wp/tests/wp_acsl/struct_fields.i
@@ -0,0 +1,17 @@
+/* run.config
+   OPT:-wp-rte -wp-no-let -wp-gen -wp-prover why3 -wp-msg-key print-generated
+*/
+/* run.config_qualif
+   DONTRUN:
+*/
+
+struct X {
+  char a ;
+  short b ;
+  int c ;
+};
+
+void foo(struct X* p){
+  struct X r = *p ;
+  *p = r ;
+}
\ No newline at end of file
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 2842dc0b66878ac96c03c3ff2756011a1b9d2ecf..b1af7c7da5cf23d35ee6e70c4dbfdb89fb3af036 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
@@ -60,19 +60,19 @@ theory Compound
   function Load_S2_A (p:addr) (mint:addr -> int) : S2_A =
     S2_A1 (get mint (shiftfield_F2_A_dummy p))
   
-  Q_Load_S2_A_update_Mint :
+  Q_Load_S2_A_update_Mint0 :
     forall mint:addr -> int, p:addr, q:addr, v:int
      [Load_S2_A p (set mint q v)].
      not q = p -> Load_S2_A p (set mint q v) = Load_S2_A p mint
   
-  Q_Load_S2_A_eqmem_Mint :
+  Q_Load_S2_A_eqmem_Mint0 :
     forall mint:addr -> int, mint1:addr -> int, n:int, p:addr, q:addr
      [Load_S2_A p mint, eqmem mint mint1 q n| Load_S2_A p mint1,
      eqmem mint mint1 q n].
      included p 1 q n ->
      eqmem mint mint1 q n -> Load_S2_A p mint1 = Load_S2_A p mint
   
-  Q_Load_S2_A_havoc_Mint :
+  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)].
      separated p 1 q n ->