         # More data
         {rc, messages, new_framing_state} =
           apply(state.framing, :remove_framing, [buffer, state.framing_state])
-        new_state = %{state | framing_state: new_framing_state} |>
-          handle_framing_timer(rc)
+        new_state = handle_framing_timer(%{state | framing_state: new_framing_state}, rc)
         if messages == [] do
           # If nothing, poll some more
           handle_call({:read, timeout}, from, new_state)

    {:ok, messages, new_framing_state} =
      apply(state.framing, :frame_timeout, [state.framing_state])

    new_state = %{state | rx_framing_tref: nil, framing_state: new_framing_state}
      |> notify_timedout_messages(messages)

    {:noreply, new_state}
  end

    # Block until the response comes back since the C side
    # doesn't want to handle any queuing of requests. REVISIT
    receive do
      {_, {:data, <<?r, response::binary>>}} ->
        :erlang.binary_to_term(response)
    after
      timeout ->
