diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml
index 31bf754339466eca00bd5ff0fc79f33ef982db12..773be0b00ab90f64fae7ca4f1b72b32c17e62b67 100644
--- a/src/plugins/value/engine/iterator.ml
+++ b/src/plugins/value/engine/iterator.ml
@@ -88,10 +88,9 @@ module Make_Dataflow
 
   (* Ideally, the slevel parameter should not be used anymore in this file
      but it is still required for logic interpretation *)
-  let slevel, call_return_policy =
+  let slevel =
     let module P = Partitioning_parameters.Make (AnalysisParam) in
-    P.slevel,
-    P.call_return_policy
+    P.slevel
 
 
   (* --- Abstract values storage --- *)
@@ -282,8 +281,7 @@ module Make_Dataflow
       (* Propagate info that the current call cannot be cached either *)
       cacheable := Eval.NoCacheCallers;
     (* Recombine callee partitioning keys with caller key *)
-    let recombine = Partition.Key.recombine ~policy:call_return_policy in
-    List.map (fun (k, s) -> recombine ~caller:key ~callee:k, s) result
+    Partitioning.call_return ~caller:key result
 
   let transfer_instr (stmt : stmt) (instr : instr) : transfer_function =
     match instr with
diff --git a/src/plugins/value/partitioning/partition.ml b/src/plugins/value/partitioning/partition.ml
index 7ff3a9f78438a2d3a081757d8c7e32fe16ef9c72..91f40d87ad344b39aeb2f01e5f018d125c7ee590 100644
--- a/src/plugins/value/partitioning/partition.ml
+++ b/src/plugins/value/partitioning/partition.ml
@@ -247,7 +247,7 @@ struct
 
   let exceed_rationing key = key.ration_stamp = None
 
-  let recombine ~policy ~caller ~callee =
+  let combine ~policy ~caller ~callee =
     let keep_second _ v1 v2 =
       match v1, v2 with
       | None, None -> None
diff --git a/src/plugins/value/partitioning/partition.mli b/src/plugins/value/partitioning/partition.mli
index 7ef819e2a779b6ef05f25c41fc802b8616413f65..8ac9926955e9ec140a9a45f8fe98ac5e20d6c134 100644
--- a/src/plugins/value/partitioning/partition.mli
+++ b/src/plugins/value/partitioning/partition.mli
@@ -52,8 +52,8 @@ module Key : sig
   include Datatype.S_with_collections with type t = key
   val zero : t (** Initial key: no partitioning. *)
   val exceed_rationing: t -> bool
-  val recombine : policy:call_return_policy ->
-    caller:t -> callee:t -> t (** Recombinaison of keys after a call *)
+  val combine : policy:call_return_policy -> caller:t -> callee:t -> t
+  (** Recombinaison of keys after a call *)
 end
 
 (** Collection of states, each identified by a unique key. *)
diff --git a/src/plugins/value/partitioning/trace_partitioning.ml b/src/plugins/value/partitioning/trace_partitioning.ml
index b07eaa7ca62b56a67b775483799d2c9f62a759fb..61f2b7a458ffc32bdefebcfae7d7048304662d08 100644
--- a/src/plugins/value/partitioning/trace_partitioning.ml
+++ b/src/plugins/value/partitioning/trace_partitioning.ml
@@ -175,6 +175,10 @@ struct
           then apply (Restrict (return_exp, i))
           else apply (Ration empty_rationing)
 
+  let call_return ~caller result =
+    let combine = Partition.Key.combine ~policy:call_return_policy in
+    List.map (fun (k, s) -> combine ~caller ~callee:k, s) result
+
   (* Reset state (for hierchical convergence) *)
 
   let reset_store (s : store) : unit =
diff --git a/src/plugins/value/partitioning/trace_partitioning.mli b/src/plugins/value/partitioning/trace_partitioning.mli
index 5c208d99b80fc581c0a806f7bcb2ceeb880ba12a..dbdd548600b7ae0c8926bbfb29adc164f79ea709 100644
--- a/src/plugins/value/partitioning/trace_partitioning.mli
+++ b/src/plugins/value/partitioning/trace_partitioning.mli
@@ -81,6 +81,12 @@ sig
   val next_loop_iteration : flow -> Cil_types.stmt -> flow
   val split_return : flow -> Cil_types.exp option -> flow
 
+  (** After the analysis of a function call, recombines callee partitioning keys
+      with the caller key. *)
+  val call_return:
+    caller:Partition.key ->
+    (Partition.key * state) list -> (Partition.key * state) list
+
   (* --- Operators --- *)
 
   (** Remove all states from the tank, leaving it empty as if it was just