   end
 
   defp reenable_tasks(config) do
-    Mix.Task.reenable("app.start")
     Mix.Task.reenable("compile")
     Mix.Task.reenable("compile.all")
+    Mix.Task.reenable("compile.protocols")
     compilers = config[:compilers] || Mix.compilers
     Enum.each compilers, &Mix.Task.reenable("compile.#{&1}")
-  end
-
-  defp stop_apps(config) do
-    apps =
-      cond do
-        Mix.Project.umbrella?(config) ->
-          for %Mix.Dep{app: app} <- Mix.Dep.Umbrella.loaded, do: app
-        app = config[:app] ->
-          [app]
-        true ->
-          []
-      end
-    stopped? =
-      Enum.reverse(apps)
-      |> Enum.all?(&match?({:error, {:not_started, &1}}, Application.stop(&1)))
-      |> Kernel.not
-    {stopped?, apps}
   end
 
   @doc """

  Recompiles the current Mix application.

  This helper only works when IEx is started with a Mix
  project, for example, `iex -S mix`. Before compiling
  the code, it will stop the current application, and
  start it again afterwards. Stopping applications are
  required so processes in the supervision tree won't
  crash when code is upgraded multiple times without
  going through the proper hot-code swapping mechanism.

  Changes to `mix.exs` or configuration files won't be
  picked up by this helper, only changes to sources.
  Restarting the shell and Mix is required in such cases.

  If you want to reload a single module, consider using
  `r ModuleName` instead.

    if mix_started? do
      config = Mix.Project.config
      reenable_tasks(config)
      Mix.Task.run("compile")
    else
      IO.puts IEx.color(:eval_error, "Mix is not running. Please start IEx with: iex -S mix")
      :error
