   `SMPPEX.ESME` can be used when more complicated client logic is needed, for example
   custom immediate reactions to all incoming PDUs, rps/window control, etc.
 
-  `SMPPEX.ESME` provides "empty" defaults for all required callbacks, so minimal ESME
+  `SMPPEX.Session` provides "empty" defaults for all required callbacks, so minimal ESME
   could be very simple:
 
       defmodule DummyESME do
-        use SMPPEX.ESME
+        use SMPPEX.Session
 
         def start_link(host, port) do
           SMPPEX.ESME.start_link(host, port, {__MODULE__, []})

    end

    def handle_pdu(pdu, last_id) do
      case pdu |> SMPPEX.Pdu.command_id |> SMPPEX.Protocol.CommandNames.name_by_id do
        {:ok, :submit_sm} ->
          SMPPEX.MC.reply(self(), pdu, SMPPEX.Pdu.Factory.submit_sm_resp(0, to_string(last_id)))
          last_id + 1
        {:ok, :bind_transmitter} ->
          SMPPEX.MC.reply(self(), pdu, SMPPEX.Pdu.Factory.bind_transmitter_resp(0))
          last_id
        {:ok, :enquire_link} ->
          SMPPEX.MC.reply(self(), pdu, SMPPEX.Pdu.Factory.enquire_link_resp)
          last_id
        _ -> last_id
      end
    end
  end
  ```


  * Responds with incremental message ids to all incoming `submit_sm` packets (regardless of the bind state).


  ```elixir
  
  defmodule MC do

    use SMPPEX.Session

    alias SMPPEX.Pdu
    alias SMPPEX.Pdu.Factory, as: PduFactory

    def start(port) do
      SMPPEX.MC.start({__MODULE__, []}, [transport_opts: [port: port]])
