diff --git a/src/plugins/value/domains/abstract_domain.mli b/src/plugins/value/domains/abstract_domain.mli
index f2dc9ff30e5586e3f4e7d7eb7ed713781fe82655..b512325ade4b44e3cc3eecf4700c20f1de57a9e3 100644
--- a/src/plugins/value/domains/abstract_domain.mli
+++ b/src/plugins/value/domains/abstract_domain.mli
@@ -186,7 +186,7 @@ module type Transfer = sig
 
   (** [update valuation t] updates the state [t] by the values of expressions
       and the locations of lvalues stored in [valuation]. *)
-  val update : valuation -> state -> state
+  val update : valuation -> state -> state or_bottom
 
   (** [assign kinstr lv expr v valuation state] is the transfer function for the
       assignment [lv = expr] for [state]. It must return the state where the
diff --git a/src/plugins/value/domains/apron/apron_domain.ok.ml b/src/plugins/value/domains/apron/apron_domain.ok.ml
index 27aa29d81c1fb68e1a7fccaddc91b732dd74962b..e69f47ab8625886339479d8da73957603665d6aa 100644
--- a/src/plugins/value/domains/apron/apron_domain.ok.ml
+++ b/src/plugins/value/domains/apron/apron_domain.ok.ml
@@ -451,11 +451,7 @@ module Make
     let array = Tcons1.array_make env (List.length constraints) in
     List.iteri (fun i c -> Tcons1.array_set array i c) constraints;
     let st = Abstract1.meet_tcons_array man state array in
-    if debug && Abstract1.is_bottom man st then
-      Value_parameters.result ~current:true ~once:true
-        "Bottom with state %a and constraints %a@."
-        Abstract1.print state (fun fmt a -> Tcons1.array_print fmt a) array;
-    st
+    if Abstract1.is_bottom man st then `Bottom else `Value st
 
   let _constraint_to_typ env state vars =
     let aux (var_apron, vi) =
@@ -615,11 +611,11 @@ module Make
       in
       let constraints = Valuation.fold gather_constraints valuation [] in
       if constraints = []
-      then state
+      then `Value state
       else meet_with_constraints env state constraints
 
     let assign _stmt lvalue expr _value valuation state =
-      let state = update valuation state in
+      update valuation state >>- fun state ->
       try
         let state =
           try
@@ -642,7 +638,7 @@ module Make
 
 
     let assume _stmt exp bool valuation state =
-      let state = update valuation state in
+      update valuation state >>- fun state ->
       try
         let env = Abstract1.env state in
         let eval = make_eval state in
@@ -656,7 +652,7 @@ module Make
       | Out_of_Scope _ -> `Value state
 
     let start_call _stmt call valuation state =
-      let state = update valuation state in
+      update valuation state >>- fun state ->
       let eval = make_eval state in
       let oracle = make_oracle valuation in
       let process_argument (vars, acc) arg =
diff --git a/src/plugins/value/domains/cvalue/cvalue_domain.ml b/src/plugins/value/domains/cvalue/cvalue_domain.ml
index 798c4ea72f7d652d2d5a98d80780ce0f814e5619..995298130d6c76007449e4477f00dbb2b82b3439 100644
--- a/src/plugins/value/domains/cvalue/cvalue_domain.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_domain.ml
@@ -227,7 +227,7 @@ module State = struct
 
     module T = Cvalue_transfer.Transfer (Valuation)
 
-    let update valuation (s, clob) = T.update valuation s, clob
+    let update valuation (s, clob) = T.update valuation s >>-: fun s -> s, clob
 
     let assign stmt lv expr assigned valuation (s, clob) =
       T.assign stmt lv expr assigned valuation s >>-: fun s ->
diff --git a/src/plugins/value/domains/cvalue/cvalue_transfer.ml b/src/plugins/value/domains/cvalue/cvalue_transfer.ml
index a53f6cf775e0fd80581d1887435b1336fc636403..1e9065ac7f380b65e6abef117e52574c604680aa 100644
--- a/src/plugins/value/domains/cvalue/cvalue_transfer.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_transfer.ml
@@ -90,11 +90,7 @@ module Transfer
         else t
       | _ -> t
     in
-    let s = Valuation.fold process valuation t in
-    s
-
-  let assume _stmt _expr _positive valuation state = `Value (update valuation state)
-
+    Valuation.fold process valuation t
 
   (* ---------------------------------------------------------------------- *)
   (*                              Assignments                               *)
@@ -246,4 +242,10 @@ module Transfer
       let typ = Cil.typeOf expr in
       Eval_op.pretty_offsetmap typ fmt offsm
     | _ -> Format.fprintf fmt "%s" (Unicode.top_string ())
+
+
+  (* ----------------- Export assumption functions -------------------------- *)
+
+  let update valuation state = `Value (update valuation state)
+  let assume _stmt _expr _positive = update
 end
diff --git a/src/plugins/value/domains/domain_builder.ml b/src/plugins/value/domains/domain_builder.ml
index 108c1c4eada23618cd0484c2038734e547a3503d..b27b01329e10386ad60dee893ca52c897b1d10a5 100644
--- a/src/plugins/value/domains/domain_builder.ml
+++ b/src/plugins/value/domains/domain_builder.ml
@@ -79,7 +79,7 @@ module Make_Minimal
                                              and type loc = location)
   = struct
 
-    let update _valuation state = state
+    let update _valuation state = `Value state
 
     let assign kinstr lv expr _value _valuation state =
       Domain.assign kinstr lv.Eval.lval expr state
@@ -227,7 +227,7 @@ module Complete_Simple_Cvalue (Domain: Simpler_domains.Simple_Cvalue)
       let record valuation = { find = find valuation;
                                find_loc = find_loc valuation; }
 
-      let update _valuation state = state
+      let update _valuation state = `Value state
       let assign kinstr lv expr value valuation state =
         Domain.assign kinstr lv expr value (record valuation) state
       let assume stmt expr positive valuation state =
diff --git a/src/plugins/value/domains/domain_product.ml b/src/plugins/value/domains/domain_product.ml
index 35ada8461ccc5a2169f4c2a5be3ccbb3bfb8e483..fffc784d6c8ec628b931a200e587caf909a8c86c 100644
--- a/src/plugins/value/domains/domain_product.ml
+++ b/src/plugins/value/domains/domain_product.ml
@@ -161,8 +161,9 @@ module Make
     module Right_Transfer = Right.Transfer (Right_Valuation)
 
     let update valuation (left, right) =
-      Left_Transfer.update valuation left,
-      Right_Transfer.update valuation right
+      Left_Transfer.update valuation left >>- fun left ->
+      Right_Transfer.update valuation right >>-: fun right ->
+      left, right
 
     let assign stmt lv expr value valuation (left, right) =
       Left_Transfer.assign stmt lv expr value valuation left >>- fun left ->
diff --git a/src/plugins/value/domains/equality/equality_domain.ml b/src/plugins/value/domains/equality/equality_domain.ml
index 69f1c355b3a96660e6ca6536cfd66394270db1d8..7ccb02c97211ab9dfbf100b5cf16abd9c45358d0 100644
--- a/src/plugins/value/domains/equality/equality_domain.ml
+++ b/src/plugins/value/domains/equality/equality_domain.ml
@@ -338,7 +338,7 @@ module Make
       let deps = HCESet.fold (add_one_dep valuation) lvalues.read deps in
       HCESet.fold (add_one_dep valuation) lvalues.addr deps
 
-    let update _valuation state = state
+    let update _valuation state = `Value state
 
     let is_singleton = match get_cvalue with
       | None -> fun _ -> false
diff --git a/src/plugins/value/domains/gauges/gauges_domain.ml b/src/plugins/value/domains/gauges/gauges_domain.ml
index 11b85c2cbe735c3b9ecbf283b83f25d2cc1f3860..1af3127519259cc44ffd7db880c28f39dc8983da 100644
--- a/src/plugins/value/domains/gauges/gauges_domain.ml
+++ b/src/plugins/value/domains/gauges/gauges_domain.ml
@@ -1174,27 +1174,6 @@ module D_Impl : Abstract_domain.S_with_Structure
        and type valuation := Valuation.t
   = struct
 
-    let update _valuation st = st (* TODO? *)
-
-    exception Unassignable
-
-    let assign _kinstr lv e _assignment valuation (state:state) =
-      let to_loc lv =
-        match Valuation.find_loc valuation lv with
-        | `Value r -> Precise_locs.imprecise_location r.loc
-        | `Top -> raise Unassignable
-      in
-      let to_val e =
-        match Valuation.find valuation e with
-        | `Top -> raise Unassignable
-        | `Value v ->
-          match v.value.initialized, v.value.escaping, v.value.v with
-          | true, false, `Value v -> v
-          | _ -> raise Unassignable
-      in
-      try `Value (G.assign to_loc to_val lv.lval e state)
-      with Unassignable -> `Value (kill lv.lloc state)
-
     let assume_exp valuation e r state =
       if r.reductness = Created || r.reductness = Reduced then
         match e.enode with
@@ -1220,10 +1199,32 @@ module D_Impl : Abstract_domain.S_with_Structure
     let assume_exp_bot valuation e r state =
       state >>- assume_exp valuation e r
 
-    let assume _ _ _ valuation state =
+    let update valuation state =
       let assume_one = assume_exp_bot valuation in
       Valuation.fold assume_one valuation (`Value state)
 
+    let assume _ _ _ = update
+
+    exception Unassignable
+
+    let assign _kinstr lv e _assignment valuation (state:state) =
+      update valuation state >>- fun state ->
+      let to_loc lv =
+        match Valuation.find_loc valuation lv with
+        | `Value r -> Precise_locs.imprecise_location r.loc
+        | `Top -> raise Unassignable
+      in
+      let to_val e =
+        match Valuation.find valuation e with
+        | `Top -> raise Unassignable
+        | `Value v ->
+          match v.value.initialized, v.value.escaping, v.value.v with
+          | true, false, `Value v -> v
+          | _ -> raise Unassignable
+      in
+      try `Value (G.assign to_loc to_val lv.lval e state)
+      with Unassignable -> `Value (kill lv.lloc state)
+
     let finalize_call _stmt _call ~pre ~post =
       let state =
         match function_calls_handling with
@@ -1238,8 +1239,9 @@ module D_Impl : Abstract_domain.S_with_Structure
         match function_calls_handling with
         | FullInterprocedural -> update valuation state
         | IntraproceduralAll
-        | IntraproceduralNonReferenced -> G.empty
+        | IntraproceduralNonReferenced -> `Value G.empty
       in
+      state >>- fun state ->
       (* track [arg.formal] into [state]. Important for functions that
          receive a size as argument. *)
       let aux_arg state arg =
diff --git a/src/plugins/value/domains/inout_domain.ml b/src/plugins/value/domains/inout_domain.ml
index bd2e643f14d79c980524840433d49f992389d28d..12ba3cd152852bbd7ea98e40b0921ae2110bc5a6 100644
--- a/src/plugins/value/domains/inout_domain.ml
+++ b/src/plugins/value/domains/inout_domain.ml
@@ -264,7 +264,7 @@ module Internal
     let finalize_call _stmt _call ~pre ~post =
       `Value (Transfer.catenate pre post)
 
-    let update _valuation state = state
+    let update _valuation state = `Value state
 
     let show_expr _valuation _state _fmt _expr = ()
   end
diff --git a/src/plugins/value/domains/offsm_domain.ml b/src/plugins/value/domains/offsm_domain.ml
index c2653e2de79aad95f7cc5d6d6b5d7fbf056deb03..9eb0b4ef308f90e6784e51eadbe4c34fbb872642 100644
--- a/src/plugins/value/domains/offsm_domain.ml
+++ b/src/plugins/value/domains/offsm_domain.ml
@@ -129,7 +129,7 @@ module Internal  : Domain_builder.InputDomain
        and type valuation := Valuation.t
   = struct
 
-    let update _valuation st = st (* TODO? *)
+    let update _valuation st = `Value st (* TODO? *)
 
     let kill loc state =
       Memory.add_binding ~exact:true state loc V_Or_Uninitialized.top
@@ -171,7 +171,7 @@ module Internal  : Domain_builder.InputDomain
 
     let finalize_call _stmt _call ~pre:_ ~post = `Value post
 
-    let start_call _stmt _call valuation state = `Value (update valuation state)
+    let start_call _stmt _call valuation state = update valuation state
 
     let show_expr _valuation _state _fmt _expr = ()
   end
diff --git a/src/plugins/value/domains/simple_memory.ml b/src/plugins/value/domains/simple_memory.ml
index 4f27194587e18fcd830ddd0b26d8612385048a5e..f312b589f11a835903ac4080566ce7f14b81df3a 100644
--- a/src/plugins/value/domains/simple_memory.ml
+++ b/src/plugins/value/domains/simple_memory.ml
@@ -247,25 +247,26 @@ module Make_Internal (Info: sig val name: string end) (Value: Value) = struct
     (* This function fills [state] according to the information available
        in [valuation]. This information is computed by Eva's engine for
        all the expressions involved in the current statement. *)
-    let update valuation state =
+    let assume_valuation valuation state =
       Valuation.fold (assume_exp valuation) valuation state
 
     (* Abstraction of an assignment. *)
     let assign _kinstr lv _expr value valuation state =
       (* Update the state with the information obtained from evaluating
          [lv] and [e] *)
-      let state = update valuation state in
+      let state = assume_valuation valuation state in
       (* Extract the abstract value *)
       let value = Eval.value_assigned value in
       (* Store the information [lv = e;] in the state *)
       let state = bind_loc lv.lloc lv.ltyp value state in
       `Value state
 
+    let update valuation state = `Value (assume_valuation valuation state)
+
     (* Abstraction of a conditional. All information inferred by the engine
        is present in the valuation, and must be stored in the memory
        abstraction of the domain itself. *)
-    let assume _stmt _expr _pos valuation state =
-      `Value (update valuation state)
+    let assume _stmt _expr _pos = update
 
     let start_call _stmt call _valuation state =
       let bind_argument state argument =
diff --git a/src/plugins/value/domains/symbolic_locs.ml b/src/plugins/value/domains/symbolic_locs.ml
index 952cf517636e04216c67d41e5f55e7d0dbc11d26..42db4cd7cb58a9c6b6cd3cd75b24f28ab2bd0149 100644
--- a/src/plugins/value/domains/symbolic_locs.ml
+++ b/src/plugins/value/domains/symbolic_locs.ml
@@ -540,7 +540,7 @@ module Internal : Domain_builder.InputDomain
             state
         | _ -> state
       in
-      Valuation.fold aux valuation state
+      `Value (Valuation.fold aux valuation state)
 
     let store_value valuation lv loc state v =
       let loc = Precise_locs.imprecise_location loc in
@@ -568,14 +568,14 @@ module Internal : Domain_builder.InputDomain
 
     (* perform [lv = e] in [state] *)
     let assign _kinstr lv _e v valuation state =
-      let state = update valuation state in
+      update valuation state >>- fun state ->
       match v with
       | Copy (_, vc) -> store_copy valuation lv lv.lloc state vc
       | Assign v -> store_value valuation lv.lval lv.lloc state v
 
-    let assume _stmt _exp _pos valuation state = `Value (update valuation state)
+    let assume _stmt _exp _pos valuation state = update valuation state
 
-    let start_call _stmt _call valuation state = `Value (update valuation state)
+    let start_call _stmt _call valuation state = update valuation state
 
     let finalize_call _stmt _call ~pre:_ ~post = `Value post
 
diff --git a/src/plugins/value/domains/unit_domain.ml b/src/plugins/value/domains/unit_domain.ml
index 62aba6028cf854463f08c4ed2e6e2d6b6a308070..4bb14526c7b277ba0348fd36954e862c6d997ab4 100644
--- a/src/plugins/value/domains/unit_domain.ml
+++ b/src/plugins/value/domains/unit_domain.ml
@@ -66,7 +66,7 @@ module Make
                                              and type loc = location)
   = struct
 
-    let update _ _ = ()
+    let update _ _ = `Value ()
     let assign _ _ _ _ _ _ = `Value ()
     let assume _ _ _ _ _ = `Value ()
     let start_call _ _ _ _ = `Value ()
diff --git a/src/plugins/value/engine/transfer_stmt.ml b/src/plugins/value/engine/transfer_stmt.ml
index 2a2ac4ca72bba20f9bb343495dacf900ba5c5799..d3edae41ba28d7ebd2c59a6192d96cef00a5cae7 100644
--- a/src/plugins/value/engine/transfer_stmt.ml
+++ b/src/plugins/value/engine/transfer_stmt.ml
@@ -412,7 +412,7 @@ module Make
       valuation >>- fun valuation ->
       Eva.assume ~valuation state argument.concrete post_value
     in
-    List.fold_left reduce_one_argument valuation reductions >>-: fun valuation ->
+    List.fold_left reduce_one_argument valuation reductions >>- fun valuation ->
     TF.update valuation state
 
   (* -------------------- Treat the results of a call ----------------------- *)
diff --git a/src/plugins/value/register.ml b/src/plugins/value/register.ml
index c3ec4215b3a27fc7e3359de63d965c1d4a964d32..08b9174733a7f6e7d79e466b3f00ca1a63089573 100644
--- a/src/plugins/value/register.ml
+++ b/src/plugins/value/register.ml
@@ -191,6 +191,9 @@ let bot_state = function
   | `Bottom -> Cvalue.Model.bottom
   | `Value s -> s
 
+let update valuation state =
+  bot_state (Transfer.update valuation state >>-: Cvalue_domain.project)
+
 let rec eval_deps state e =
   match e.enode with
   | SizeOf _ | SizeOfE _ | SizeOfStr _ | AlignOf _ | AlignOfE _ | Const _ ->
@@ -240,7 +243,7 @@ let eval_expr_with_valuation ?with_alarms deps state expr=
   match eval with
   | `Bottom -> (Cvalue.Model.bottom, deps, Cvalue.V.bottom), None
   | `Value (valuation, result) ->
-    let state = Cvalue_domain.project (Transfer.update valuation state) in
+    let state = update valuation state in
     (state, deps, result), Some valuation
 
 (* Compatibility layer between the old API of eval_exprs and the new evaluation
@@ -274,8 +277,7 @@ module Eval = struct
     let eval, _alarms =
       Eva.reduce state expr positive
     in
-    bot_state (eval >>-: fun valuation ->
-               Cvalue_domain.project (Transfer.update valuation state))
+    bot_state (eval >>-: fun valuation -> update valuation state)
 
 
   let lval_to_precise_loc_deps_state ?with_alarms ~deps state ~reduce_valid_index:(_:bool) lval =
@@ -295,8 +297,7 @@ module Eval = struct
       notify_opt with_alarms alarms;
       match eval with
       | `Bottom -> Cvalue.Model.bottom, deps, Precise_locs.loc_bottom, (Cil.typeOfLval lval)
-      | `Value (valuation, loc, typ) ->
-        Cvalue_domain.project (Transfer.update valuation state), deps, loc, typ
+      | `Value (valuation, loc, typ) -> update valuation state, deps, loc, typ
 
   let lval_to_loc_deps_state ?with_alarms ~deps state ~reduce_valid_index lv =
     let state, deps, pl, typ =
diff --git a/tests/value/diff_gauges b/tests/value/diff_gauges
index 99a2a77d76eb36ec86e285bdbb15fcf7486ddd9e..26c5b6d4c45adaf15845328b27805fab45e865c8 100644
--- a/tests/value/diff_gauges
+++ b/tests/value/diff_gauges
@@ -96,86 +96,104 @@ diff tests/value/oracle/gauges.res.oracle tests/value/oracle_gauges/gauges.res.o
 < [eva:alarm] tests/value/gauges.c:158: Warning: 
 <   out of bounds write. assert \valid(tmp);
 <                        (tmp from p--)
-255,258d230
+227,231c203,205
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483646..4294967294]
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [1..4294967294]
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [1..4294967294]
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [1..4294967294]
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [1..4294967294]
+---
+> [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483647..4294967294]
+> [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483647..4294967294]
+> [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483647..4294967294]
+235c209,210
+< [eva] tests/value/gauges.c:172: Frama_C_show_each: [1..4294967294]
+---
+> [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483647..4294967294]
+> [eva] tests/value/gauges.c:172: Frama_C_show_each: [2147483647..4294967294]
+255,258d229
 < [eva:alarm] tests/value/gauges.c:192: Warning: 
 <   out of bounds write. assert \valid(p);
 < [eva:alarm] tests/value/gauges.c:193: Warning: 
 <   out of bounds write. assert \valid(q);
-266,271d237
+266,271d236
 < [eva:alarm] tests/value/gauges.c:202: Warning: 
 <   out of bounds read. assert \valid_read(tmp);
 <                       (tmp from A++)
 < [eva:alarm] tests/value/gauges.c:202: Warning: 
 <   out of bounds read. assert \valid_read(tmp_0);
 <                       (tmp_0 from B++)
-315,318c281
+299,300d263
+< [eva:alarm] tests/value/gauges.c:220: Warning: 
+<   signed overflow. assert -2147483648 ≤ n - 1;
+315,318c278
 < [eva:alarm] tests/value/gauges.c:240: Warning: 
 <   signed overflow. assert j + 1 ≤ 2147483647;
 < [eva] tests/value/gauges.c:242: 
 <   Frama_C_show_each: {45; 46; 47; 48; 49; 50; 51}, [0..2147483647]
 ---
 > [eva] tests/value/gauges.c:242: Frama_C_show_each: {47; 48}, {6}
-324,325d286
+324,325d283
 < [eva:alarm] tests/value/gauges.c:251: Warning: 
 <   signed overflow. assert j + 1 ≤ 2147483647;
-327c288
+327c285
 <   Frama_C_show_each: {48; 49; 50; 51; 52; 53; 54}, [0..2147483647]
 ---
 >   Frama_C_show_each: {48; 49; 50; 51; 52; 53; 54}, {6; 7}
-333,336c294
+333,336c291
 < [eva:alarm] tests/value/gauges.c:263: Warning: 
 <   signed overflow. assert j + 1 ≤ 2147483647;
 < [eva] tests/value/gauges.c:265: 
 <   Frama_C_show_each: {-59; -58; -57; -56; -55; -54; -53}, [0..2147483647]
 ---
 > [eva] tests/value/gauges.c:265: Frama_C_show_each: {-58; -57}, {9}
-342,343d299
+342,343d296
 < [eva:alarm] tests/value/gauges.c:274: Warning: 
 <   signed overflow. assert j + 1 ≤ 2147483647;
-345c301
+345c298
 <   Frama_C_show_each: {-64; -63; -62; -61; -60; -59; -58}, [0..2147483647]
 ---
 >   Frama_C_show_each: {-64; -63; -62; -61; -60; -59; -58}, {9; 10}
-353,354d308
+353,354d305
 < [eva:alarm] tests/value/gauges.c:293: Warning: 
 <   signed overflow. assert j + 1 ≤ 2147483647;
-356c310
+356c307
 <   Frama_C_show_each: {-593; -592; -591; -590; -589; -588}, [0..2147483647]
 ---
 >   Frama_C_show_each: {-593; -592; -591; -590; -589; -588}, [99..119]
-418a373,376
+418a370,373
 >   # Gauges domain:
 >   V: [{[ p -> {{ &x }}
 >          i -> {1} ]}]
->   s395: λ(0)
-478a437,440
+>   s398: λ(0)
+478a434,437
 >   # Gauges domain:
 >   V: [{[ i -> {1} ]}]
->   s395: λ([0 .. 1])
+>   s398: λ([0 .. 1])
 >         {[ i -> {1} ]}
-537a500,503
+537a497,500
 >   # Gauges domain:
 >   V: [{[ i -> {1} ]}]
->   s395: λ([0 .. 2])
+>   s398: λ([0 .. 2])
 >         {[ i -> {1} ]}
-596a563,566
+596a560,563
 >   # Gauges domain:
 >   V: [{[ i -> {1} ]}]
->   s395: λ([0 .. 10])
+>   s398: λ([0 .. 10])
 >         {[ i -> {1} ]}
-661a632,636
+661a629,633
 >   # Gauges domain:
 >   V: [{[ p -> {{ &a }}
 >          i -> {2} ]}]
->   s409: λ(0)
->   s408: λ(0)
-722a698,702
+>   s412: λ(0)
+>   s411: λ(0)
+722a695,699
 >   # Gauges domain:
 >   V: [{[ i -> {2} ]}]
->   s409: λ(0)
->   s408: λ([0 .. 1])
+>   s412: λ(0)
+>   s411: λ([0 .. 1])
 >         {[ i -> {0} ]}
-724a705,832
+724a702,829
 > [eva] tests/value/gauges.c:325: 
 >   Frama_C_dump_each:
 >   # Cvalue domain:
@@ -236,8 +254,8 @@ diff tests/value/oracle/gauges.res.oracle tests/value/oracle_gauges/gauges.res.o
 >   S_1___fc_env[0..1] ∈ [--..--]
 >   # Gauges domain:
 >   V: [{[ i -> {2} ]}]
->   s409: λ(0)
->   s408: λ([0 .. 2])
+>   s412: λ(0)
+>   s411: λ([0 .. 2])
 >         {[ i -> {0} ]}
 >   ==END OF DUMP==
 > [eva] tests/value/gauges.c:325: 
@@ -300,57 +318,75 @@ diff tests/value/oracle/gauges.res.oracle tests/value/oracle_gauges/gauges.res.o
 >   S_1___fc_env[0..1] ∈ [--..--]
 >   # Gauges domain:
 >   V: [{[ i -> {2} ]}]
->   s409: λ(0)
->   s408: λ([0 .. +oo])
+>   s412: λ(0)
+>   s411: λ([0 .. +oo])
 >         {[ i -> {0} ]}
 >   ==END OF DUMP==
-732a841,842
+732a838,839
 > [eva] tests/value/gauges.c:343: Call to builtin malloc
 > [eva] tests/value/gauges.c:343: Call to builtin malloc
-785,786c895,896
+785,786c892,893
 <   A ∈ {{ &A + [0..--],0%4 }}
 <   B ∈ {{ &B + [0..--],0%4 }}
 ---
 >   A ∈ {{ &A + [0..36],0%4 }}
 >   B ∈ {{ &B + [0..36],0%4 }}
-804c914
+798c905
+<   n ∈ [-2147483648..99]
+---
+>   n ∈ [-2147483547..99]
+804c911
 <   i ∈ {45; 46; 47; 48; 49; 50; 51}
 ---
 >   i ∈ {45; 46; 47; 48}
-810c920
+810c917
 <   i ∈ {-59; -58; -57; -56; -55; -54; -53}
 ---
 >   i ∈ {-58; -57; -56; -55; -54; -53}
-830c940
+830c937
 <   p ∈ {{ &u + [0..--],0%4 }}
 ---
 >   p ∈ {{ &u + [0..400],0%4 }}
-832c942
+832c939
 <   k ∈ [0..2147483647]
 ---
 >   k ∈ [0..390]
-837c947
+837c944
 <   i ∈ [0..2147483647]
 ---
 >   i ∈ [0..21]
-848,849c958,960
+848,849c955,957
 <    [1..9] ∈ {4; 5; 6; 7; 8; 9} or UNINITIALIZED
 <   p ∈ {{ &y + [4..40],0%4 }}
 ---
 >    [1..6] ∈ {4; 5; 6; 7; 8; 9} or UNINITIALIZED
 >    [7..9] ∈ UNINITIALIZED
 >   p ∈ {{ &y[7] }}
-860c971
+860c968
 <   p ∈ {{ &T + [--..396],0%4 }}
 ---
 >   p ∈ {{ &T + [-4..396],0%4 }}
-995,996c1106,1107
+865,869c973
+<   n ∈ {0}
+<   arr[0] ∈ {0}
+<      [1] ∈ {-1}
+<      [2..65535] ∈ [--..--] or UNINITIALIZED
+<   p ∈ {{ &arr + [12..--],0%4 }}
+---
+>   NON TERMINATING FUNCTION
+972a1077
+> [from] Non-terminating function main8_aux (no dependencies)
+995,996c1100,1101
 <   p FROM p; A; B; n; p; A[0..9]; B[0..9] (and SELF)
 <   \result FROM p; A; B; n; p; A[0..9]; B[0..9]
 ---
 >   p FROM p; A; B; n; p; A[0..8]; B[0..8] (and SELF)
 >   \result FROM p; A; B; n; p; A[0..8]; B[0..8]
-1074c1185
+1040c1145
+<   NO EFFECTS
+---
+>   NON TERMINATING - NO EFFECTS
+1074c1179
 <     p; A[0..9]; B[0..9]
 ---
 >     p; A[0..8]; B[0..8]
@@ -864,6 +900,10 @@ diff tests/value/oracle/reevaluate_alarms.res.oracle tests/value/oracle_gauges/r
 < [eva:alarm] tests/value/reevaluate_alarms.i:14: Warning: 
 <   out of bounds write. assert \valid(tmp);
 <                        (tmp from p++)
+59c56
+<   p ∈ {{ &T + [0..--],0%4 }}
+---
+>   p ∈ {{ &T{[0], [1], [2], [3], [4], [5]} }}
 124,125d120
 < [    -    ] Assertion 'Eva,mem_access' (file tests/value/reevaluate_alarms.i, line 14)
 <             tried with Eva.
@@ -905,16 +945,22 @@ diff tests/value/oracle/undefined_sequence.0.res.oracle tests/value/oracle_gauge
 101a103
 > [eva] tests/value/undefined_sequence.i:49: starting to merge loop iterations
 diff tests/value/oracle/unroll.res.oracle tests/value/oracle_gauges/unroll.res.oracle
-16a17
+13,14d12
+< [eva:alarm] tests/value/unroll.i:34: Warning: 
+<   signed overflow. assert -2147483648 ≤ j - 1;
+16a15
 > [eva] tests/value/unroll.i:39: starting to merge loop iterations
-26c27
+26c25
 <   j ∈ [-2147483648..-123]
 ---
 >   j ∈ {-238}
 diff tests/value/oracle/unroll_simple.res.oracle tests/value/oracle_gauges/unroll_simple.res.oracle
-11a12
+8,9d7
+< [eva:alarm] tests/value/unroll_simple.i:11: Warning: 
+<   signed overflow. assert -2147483648 ≤ j - 1;
+11a10
 > [eva] tests/value/unroll_simple.i:16: starting to merge loop iterations
-21c22
+21c20
 <   j ∈ [-2147483648..-126]
 ---
 >   j ∈ {-250}
@@ -950,3 +996,8 @@ diff tests/value/oracle/widen_on_non_monotonic.res.oracle tests/value/oracle_gau
 25a26,27
 > [eva] tests/value/widen_on_non_monotonic.i:21: starting to merge loop iterations
 > [eva] tests/value/widen_on_non_monotonic.i:18: starting to merge loop iterations
+diff tests/value/oracle/widen_overflow.res.oracle tests/value/oracle_gauges/widen_overflow.res.oracle
+31a32,34
+> [eva] computing for function u <- main.
+>   Called from tests/value/widen_overflow.i:9.
+> [eva] Done for function u
diff --git a/tests/value/gauges.c b/tests/value/gauges.c
index cd1619e90e511a5f15dfd714a89486470171026b..ab2963f70b41dbb3f18e2a7915fc2d81a7c0d5d4 100644
--- a/tests/value/gauges.c
+++ b/tests/value/gauges.c
@@ -170,12 +170,12 @@ void main8_aux (unsigned int n) {
   int *p = arr;
   do {
     Frama_C_show_each(n);
-    *p++ = n;
+    *p++ = n; // Invalid access memory if more than 65536 iterations.
   } while (--n);
 }
 
 void main8() {
-  main8_aux(0);
+  if (v) main8_aux(0); // This call can legitimately lead to bottom.
 }
 
 void main9() {
diff --git a/tests/value/oracle/gauges.res.oracle b/tests/value/oracle/gauges.res.oracle
index 18dd8eea6bdd67932e7fc01d51851c6e6edc9444..fa19ee9d0ef3002d43a7656080239d7a89f6a42b 100644
--- a/tests/value/oracle/gauges.res.oracle
+++ b/tests/value/oracle/gauges.res.oracle
@@ -1163,7 +1163,7 @@
 [inout] Out (internal) for function main8:
     \nothing
 [inout] Inputs for function main8:
-    \nothing
+    v
 [inout] Out (internal) for function main9:
     x[0..9]; y[0..9]; p; q; z; i; r
 [inout] Inputs for function main9: