         end
         :ok       = notify_change(new_nodes, state)
         new_state = %{state | nodes: new_nodes, index: consul_index(response)}
-      {:error, response} ->
-        new_state = %{state | nodes: [], index: consul_index(response)}
+        task      = async_poll(self, new_state.index, service)
+        {:noreply, %{new_state | task: task}}
+      {:error, _} ->
+        {:noreply, state, @retry_ms}
     end
-
-    task = async_poll(self, new_state.index, service)
-
-    {:noreply, %{new_state | task: task}}
   end
 
-  def handle_info({:DOWN, ref, _, _, _}, %{service: service, index: index, task: %Task{ref: ref}} = state) do
-    task = async_poll(self, index, service)
-    {:noreply, %{state | task: task}}
-  end
-
-  def handle_call({:poll_response, results}, _from, %{service: service} = state) do
+  # Handle results from polling task
+  def handle_info({ref, results}, %{task: %Task{ref: ref}} = state) do
     case results do
       {:ok, %{body: body} = response} ->
         case Discovery.Node.build(body) do

        end
        :ok       = notify_change(new_nodes, state)
        new_state = %{state | nodes: new_nodes, index: consul_index(response)}
      {:error, response} ->
        new_state = %{state | nodes: [], index: consul_index(response)}
    end

    task = async_poll(self, new_state.index, service)

    {:reply, :ok, %{new_state | task: task}}
  end

  def handle_call({:subscribe, module, subscriber}, _from, %{em: em, nodes: nodes} = state) do


  @spec poll(pid, binary | integer, binary) :: :ok
  def poll(poller, index, service) do
    Consul.Catalog.service(index, service)
  end

  @spec subscribe(pid, atom, pid) :: :ok
