      (.next ctx)))
   ([^DefaultContext context data]
    (let [^Context ctx (:catacumba/context context)
-         previous (get-context-params context)
-         ^Registry reg (Registry/single (ContextData. (merge previous data)))]
-     (.next ctx reg))))
+         ^Optional odata (.maybeGet ctx ContextData)]
+     (if (.isPresent odata)
+       (do
+         (vswap! (:payload (.get odata)) merge data)
+         (.next ctx))
+       (let [^Registry reg (Registry/single (ContextData. (volatile! data)))]
+         (.next ctx reg))))))
 
 (defn public-address
   "Get the current public address as URI instance.

  handler using the `delegate` function. Is a simple
  way to communicate the handlers chain."
  [^DefaultContext context]
  (let [^Context ctx (:catacumba/context context)]
    (try
      (let [cdata (.get ctx ContextData)]
        (:payload cdata))
      (catch ratpack.registry.NotInRegistryException e
        {}))))

(defn delegate
  "Delegate handling to the next handler in line.

    (.setAccessible field true)
    (.get field form)))

(defn get-query-params*
  "Parse query params from request and return a
  maybe multivalue map."
  {:internal :true :no-doc true}
  [^Request request]
  (let [^MultiValueMap params (.getQueryParams request)]
    (persistent!
     (reduce (fn [acc key]
               (let [values (.getAll params key)]
