let make_request tables universe request = 
  
  (*** XXX a here is the option architecture *)

  (* always specify the version of the packages on the request *)
  let select_packages l = 
    List.map (fun (n,a,c) -> 
      let candidate = 
        try
          List.find (fun pkg -> 
            try (Cudf.lookup_package_property pkg "apt-candidate") = "true"
            with Not_found -> false
          ) (Cudf.lookup_packages universe n)
        with Not_found -> 
          print_error "Package %s does not have a suitable candidate" n
      in
      (n,Some(`Eq,candidate.Cudf.version))
    ) l 
  in
  if request.Edsp.upgrade || request.Edsp.distupgrade then
    let to_upgrade = function
      |[] ->
        let filter pkg = pkg.Cudf.installed in
        let l = Cudf.get_packages ~filter universe in
        List.map (fun pkg -> (pkg.Cudf.package,None)) l
      |-> select_packages l
    in
    {Cudf.default_request with 
    Cudf.request_id = request.Edsp.request;
    Cudf.upgrade = to_upgrade request.Edsp.install;
    Cudf.remove = select_packages request.Edsp.remove;
    }
  else
    {Cudf.default_request with
    Cudf.request_id = request.Edsp.request;
    Cudf.install = select_packages request.Edsp.install;
    Cudf.remove = select_packages request.Edsp.remove;
    }