diff --git a/src/plugins/value/domains/abstract_domain.mli b/src/plugins/value/domains/abstract_domain.mli
index b1b06f70f1de294cd7e568cd67b2a971da8feb78..cc7d69a289e2b01cb05a874c13a16a31bab624e0 100644
--- a/src/plugins/value/domains/abstract_domain.mli
+++ b/src/plugins/value/domains/abstract_domain.mli
@@ -358,12 +358,13 @@ module type S = sig
   (** Logical evaluation. This API is subject to changes. *)
   (* TODO: cooperative evaluation of predicates in the engine. *)
 
-  (** [logic_assign from loc_asgn pre state] applies the effect of the
-      [assigns ... \from ...] clause [from] to [state]. [pre] is the state
-      before the assign clauses, in which the terms of the clause are evaluated.
-      [loc_asgn] is the result of the evaluation of the [assigns] part of [from]
-      in [pre]. *)
-  val logic_assign: logic_assign -> location -> pre:state -> state -> state
+  (** [logic_assign None loc state] removes from [state] all inferred properties
+      that depend on the memory location [loc].
+      If the first argument is not None, it contains the logical clause being
+      interpreted and the pre-state in which the terms of the clause are
+      evaluated. The clause can be an \assign, \allocated or \free clause.
+      [loc] is then the memory location concerned by the clause. *)
+  val logic_assign: (logic_assign * state) option -> location -> state -> state
 
   (** Evaluates a [predicate] to a logical status in the current [state].
       The [logic_environment] contains the states at some labels and the
diff --git a/src/plugins/value/domains/apron/apron_domain.ml b/src/plugins/value/domains/apron/apron_domain.ml
index c9fd86075f1fcccffea2d705ed1df8241cddd739..c21820f2b2dfa19d7132a2b9f646c38321d72881 100644
--- a/src/plugins/value/domains/apron/apron_domain.ml
+++ b/src/plugins/value/domains/apron/apron_domain.ml
@@ -673,7 +673,7 @@ module Make (Man : Input) = struct
 
   let show_expr _valuation _state _fmt _expr = ()
 
-  let logic_assign _assigns location ~pre:_ state = kill_bases location state
+  let logic_assign _assigns location state = kill_bases location state
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ state _ _ = `Value state
 
diff --git a/src/plugins/value/domains/cvalue/cvalue_domain.ml b/src/plugins/value/domains/cvalue/cvalue_domain.ml
index b5a165f31890864f6d0491dc2c653587f132a9d3..5257e966b8729ffd4b3223a17080b80706964655 100644
--- a/src/plugins/value/domains/cvalue/cvalue_domain.ml
+++ b/src/plugins/value/domains/cvalue/cvalue_domain.ml
@@ -308,15 +308,19 @@ module State = struct
           Printer.pp_from assign pp_eval_error e;
         Cvalue.V.top
 
-  let logic_assign logic_assign location ~pre:(pre_state, _) (state, sclob) =
+  let logic_assign logic_assign location (state, sclob) =
     match logic_assign with
-    | Assigns assign ->
+    | None ->
+      let location = Precise_locs.imprecise_location location
+      and value = Cvalue.V.top in
+      Cvalue.Model.add_binding ~exact:false state location value, sclob
+    | Some (Assigns assign, (pre_state, _)) ->
       let location = Precise_locs.imprecise_location location in
       let env = Eval_terms.env_assigns pre_state in
       let value = evaluate_from_clause env assign in
       Locals_scoping.remember_if_locals_in_value sclob location value;
       Cvalue.Model.add_binding ~exact:false state location value, sclob
-    | Frees _ | Allocates _ -> state, sclob
+    | Some ((Frees _ | Allocates _), _) -> state, sclob
 
   (* ------------------------------------------------------------------------ *)
   (*                             Initialization                               *)
diff --git a/src/plugins/value/domains/domain_builder.ml b/src/plugins/value/domains/domain_builder.ml
index 4be9203e8c2f4c0ff6e351757aec427445f57334..a574d3a3c4a82d66b9c5c5844dfada3d02dab530 100644
--- a/src/plugins/value/domains/domain_builder.ml
+++ b/src/plugins/value/domains/domain_builder.ml
@@ -102,7 +102,7 @@ module Make_Minimal
     let lval = Cil.var varinfo in
     Domain.initialize_variable lval ~initialized:true Abstract_domain.Top state
 
-  let logic_assign _assigns _location ~pre:_ _state = top
+  let logic_assign _assigns _location _state = top
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ t _ _ = `Value t
 
@@ -239,7 +239,7 @@ module Complete_Simple_Cvalue (Domain: Simpler_domains.Simple_Cvalue)
       let lval = Cil.var varinfo in
       Domain.initialize_variable lval ~initialized:true Abstract_domain.Top state
 
-    let logic_assign _assigns _location ~pre:_ _state = top
+    let logic_assign _assigns _location _state = top
     let evaluate_predicate _ _ _ = Alarmset.Unknown
     let reduce_by_predicate _ t _ _ = `Value t
 
diff --git a/src/plugins/value/domains/domain_lift.ml b/src/plugins/value/domains/domain_lift.ml
index 0e8d958ef1dd6fe0dbb2bbc9526d6252af663df3..46331911138dce10ab88edc059e32d695b44c0ac 100644
--- a/src/plugins/value/domains/domain_lift.ml
+++ b/src/plugins/value/domains/domain_lift.ml
@@ -123,8 +123,8 @@ module Make
 
   let show_expr valuation = Domain.show_expr (lift_valuation valuation)
 
-  let logic_assign assigns location ~pre state =
-    Domain.logic_assign assigns (Convert.restrict_loc location) ~pre state
+  let logic_assign assigns location state =
+    Domain.logic_assign assigns (Convert.restrict_loc location) state
 
   let evaluate_predicate = Domain.evaluate_predicate
   let reduce_by_predicate = Domain.reduce_by_predicate
diff --git a/src/plugins/value/domains/domain_product.ml b/src/plugins/value/domains/domain_product.ml
index e9894fa2f069890427ec9d54768eecf47e04d85a..06574e327e6fed7fb945168a33b07b20372d9f98 100644
--- a/src/plugins/value/domains/domain_product.ml
+++ b/src/plugins/value/domains/domain_product.ml
@@ -227,9 +227,14 @@ module Make
          print_one_side fmt right_log Right.name Right.pretty right)
 
 
-  let logic_assign assign location ~pre:(left_pre, right_pre) (left, right) =
-    Left.logic_assign assign location ~pre:left_pre left,
-    Right.logic_assign assign location ~pre:right_pre right
+  let logic_assign assign location (left, right) =
+    let left_assign, right_assign =
+      match assign with
+      | None -> None, None
+      | Some (assign, (left, right)) -> Some (assign, left), Some (assign, right)
+    in
+    Left.logic_assign left_assign location left,
+    Right.logic_assign right_assign location right
 
   let lift_logic_env f logic_env =
     Abstract_domain.{ states = (fun label -> f (logic_env.states label));
diff --git a/src/plugins/value/domains/equality/equality_domain.ml b/src/plugins/value/domains/equality/equality_domain.ml
index f78930c6d92601bcfd31e60239dc47ceac7565a4..b04cd0ffa19955c80a0e67c183af5193509399ff 100644
--- a/src/plugins/value/domains/equality/equality_domain.ml
+++ b/src/plugins/value/domains/equality/equality_domain.ml
@@ -503,7 +503,7 @@ module Make
     | Some equality -> Equality.Equality.pretty fmt equality
     | None -> ()
 
-  let logic_assign _assigns location ~pre:_ state =
+  let logic_assign _assigns location state =
     let loc = Precise_locs.imprecise_location location in
     let zone = Locations.(enumerate_valid_bits Write loc) in
     kill Hcexprs.Modified zone state
diff --git a/src/plugins/value/domains/gauges/gauges_domain.ml b/src/plugins/value/domains/gauges/gauges_domain.ml
index 3b60576b8157c6a06a7c9df8f92de01e185e1b5e..4c8dec87e1ecf236a920ef4eb38a1134f3a6ceb7 100644
--- a/src/plugins/value/domains/gauges/gauges_domain.ml
+++ b/src/plugins/value/domains/gauges/gauges_domain.ml
@@ -1296,7 +1296,7 @@ module D_Impl : Abstract_domain.S
   let initialize_variable _ _ ~initialized:_ _ state = state
 
   (* Logic *)
-  let logic_assign _assigns location ~pre:_ state = kill location state
+  let logic_assign _assigns location state = kill location state
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ state _ _ = `Value state
 
diff --git a/src/plugins/value/domains/inout_domain.ml b/src/plugins/value/domains/inout_domain.ml
index da068efc2f9b332de553c61e6d909d1fcc5d7381..5bbf25ba1ff5dc18b3f392d07d6d25b5d35c4fcf 100644
--- a/src/plugins/value/domains/inout_domain.ml
+++ b/src/plugins/value/domains/inout_domain.ml
@@ -261,7 +261,7 @@ module Internal
   let initialize_variable_using_type _ _ state  = state
 
   (* TODO *)
-  let logic_assign _assign _location ~pre:_ _state = top
+  let logic_assign _assign _location _state = top
 
   (* Logic *)
   let evaluate_predicate _ _ _ = Alarmset.Unknown
diff --git a/src/plugins/value/domains/octagons.ml b/src/plugins/value/domains/octagons.ml
index 853183f0d398055d4a1e6d57a4bfaa00a49c49b5..b1faca4b4d688ab17f84382b814b3b23c4206a6b 100644
--- a/src/plugins/value/domains/octagons.ml
+++ b/src/plugins/value/domains/octagons.ml
@@ -1235,7 +1235,7 @@ module Domain = struct
 
   let show_expr _valuation _state _fmt _expr = ()
 
-  let logic_assign _logic_assign location ~pre:_ state =
+  let logic_assign _logic_assign location state =
     let loc = Precise_locs.imprecise_location location in
     let zone = Locations.(enumerate_valid_bits Write loc) in
     let state = kill zone state in
diff --git a/src/plugins/value/domains/offsm_domain.ml b/src/plugins/value/domains/offsm_domain.ml
index 4d8a15d53eba5c6c7ace3746c759011de0f1d28b..cb7c583d9e8aa74a6008cbd9a746de1f3223d8ad 100644
--- a/src/plugins/value/domains/offsm_domain.ml
+++ b/src/plugins/value/domains/offsm_domain.ml
@@ -216,7 +216,7 @@ module Internal  : Domain_builder.InputDomain
   let initialize_variable _ _ ~initialized:_ _ state = state
 
   (* Logic *)
-  let logic_assign _assign location ~pre:_ state =
+  let logic_assign _assign location state =
     let loc = Precise_locs.imprecise_location location in
     kill loc state
 
diff --git a/src/plugins/value/domains/simple_memory.ml b/src/plugins/value/domains/simple_memory.ml
index 20f91dc4a9992519580c145c2293034678f98bb5..f2e84f2c345451919a483d69b896082546acb526 100644
--- a/src/plugins/value/domains/simple_memory.ml
+++ b/src/plugins/value/domains/simple_memory.ml
@@ -300,7 +300,7 @@ module Make_Internal (Info: sig val name: string end) (Value: Value) = struct
   let incr_loop_counter _ state = state
   let leave_loop _ state = state
 
-  let logic_assign _assign location ~pre:_ state = remove location state
+  let logic_assign _assign location state = remove location state
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ state _ _ = `Value state
 
diff --git a/src/plugins/value/domains/symbolic_locs.ml b/src/plugins/value/domains/symbolic_locs.ml
index 91b53803645608e876c6e66d40a581d37dff92ba..9464308a6e2d57bed2ad1a649186983298815d56 100644
--- a/src/plugins/value/domains/symbolic_locs.ml
+++ b/src/plugins/value/domains/symbolic_locs.ml
@@ -631,7 +631,7 @@ module Internal : Domain_builder.InputDomain
   let initialize_variable _ _ ~initialized:_ _ state = state
 
   (* Logic *)
-  let logic_assign _assigns location ~pre:_ state =
+  let logic_assign _assigns location state =
     let loc = Precise_locs.imprecise_location location in
     Memory.kill loc state
 
diff --git a/src/plugins/value/domains/traces_domain.ml b/src/plugins/value/domains/traces_domain.ml
index 4c533c30c2c260dfbd0c9d383599576a17be9d32..de5887617b6b296e62609fe8fbe67d6ae974e4fb 100644
--- a/src/plugins/value/domains/traces_domain.ml
+++ b/src/plugins/value/domains/traces_domain.ml
@@ -931,7 +931,7 @@ module Internal = struct
     Traces.add_trans state (Msg msg)
 
   (* TODO *)
-  let logic_assign _assign _location ~pre:_ state =
+  let logic_assign _assign _location state =
     Traces.add_trans state (Msg "logic assign")
 
   (* Logic *)
diff --git a/src/plugins/value/domains/unit_domain.ml b/src/plugins/value/domains/unit_domain.ml
index 5d1a55942186ade66365ccbc5164f1c5bbf3e958..c12cdfc9f3cfa03bc6b7b3ac6ef2001b96513110 100644
--- a/src/plugins/value/domains/unit_domain.ml
+++ b/src/plugins/value/domains/unit_domain.ml
@@ -67,7 +67,7 @@ module Make
   let finalize_call _ _ ~pre:_ ~post:_ = `Value ()
   let show_expr _ _ _ _ = ()
 
-  let logic_assign _ _ ~pre:_ _ = ()
+  let logic_assign _ _ _ = ()
   let evaluate_predicate _ _ _ = Alarmset.Unknown
   let reduce_by_predicate _ _ _ _ = `Value ()
 
diff --git a/src/plugins/value/engine/transfer_specification.ml b/src/plugins/value/engine/transfer_specification.ml
index d84a01a562d01814e83e121f2c0deb60109e5a05..4521648ffbbe9efce1e5e6a20a06226aba7309fb 100644
--- a/src/plugins/value/engine/transfer_specification.ml
+++ b/src/plugins/value/engine/transfer_specification.ml
@@ -267,7 +267,7 @@ module Make
     let env = make_env state in
     let assigns_with_locations = evaluate_locations env retres_loc assigns in
     let transfer state (logic_assign, location) =
-      Domain.logic_assign logic_assign location ~pre state
+      Domain.logic_assign (Some (logic_assign, pre)) location state
     in
     List.fold_left transfer state assigns_with_locations