       zip: manifest.zip,
       executable: manifest.executable,
       args: manifest.args,
-      config: Map.new(manifest.config, fn({key, config_data}) -> {key, Config.view(config_data)} end),
+      config: manifest.config,
       package_version: manifest.package_version,
       farmware_tools_version_requirement: manifest.farmware_tools_version_requirement,
       farmware_manifest_version: manifest.farmware_manifest_version,

    end
  end

  defp validate_config(%{valid?: false} = change), do: change
  defp validate_config(changeset) do
    config = get_field(changeset, :config)
    Enum.reduce(config, changeset, fn
      {name, %{} = params}, changeset when is_binary(name) ->
        case Config.changeset(%Config{}, params) do
          %{valid?: true} = config_changeset ->
            validated_config_data = Ecto.Changeset.apply_changes(config_changeset)
            new_config = Map.put(config, name, validated_config_data)
            put_change(changeset, :config, new_config)
          %{valid?: false} = config_changeset ->
            add_error(changeset, :config, "invalid config item", config_changeset.errors)
        end
      {_, _}, changeset ->
        add_error(changeset, :config, "invalid config item (bad key or value type)")
    end)
  end

  defp validate_url(%{valid?: false} = change), do: change
  defp validate_url(changeset) do
    # `url` is optional

    |> validate_farmware_manifest_version()
    |> validate_farmware_tools_version_requirement()
    |> validate_package_version()
    |> validate_url()
    |> validate_zip()
  end
