         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)}
+        {:noreply, new_state}
+      {:error, _} ->
+        new_state = %{state | index: nil}
+        {:noreply, new_state, @retry_ms}
     end
+  end
 
-    task = async_poll(self, new_state.index, service)
+  # Poller completed
+  def handle_info({:DOWN, ref, _, _, :normal}, %{service: service, index: index, task: %Task{ref: ref}} = state) do
+    {:noreply, %{state | task: async_poll(self, index, service)}}
+  end
 
-    {:reply, :ok, %{new_state | task: task}}
+  # Poller crashed
+  def handle_info({:DOWN, ref, _, _, _}, %{task: %Task{ref: ref}} = state) do
+    {:noreply, %{state | task: nil, index: nil}, @retry_ms}
   end
 
   def handle_call({:subscribe, module, subscriber}, _from, %{em: em, nodes: nodes} = state) do

    {:ok, %{em: em, service: service, nodes: [], index: nil, task: nil}, 0}
  end

  def handle_info(:timeout, %{service: service, index: nil} = state) do
    case Consul.Catalog.service(service) do
      {:ok, %{body: body} = response} ->

        end
        :ok       = notify_change(new_nodes, state)
        new_state = %{state | nodes: new_nodes, index: consul_index(response)}
        task      = async_poll(self, new_state.index, service)
        {:noreply, %{new_state | task: task}}
      {:error, _} ->
        {:noreply, state, @retry_ms}
    end
  end

  # 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
