@Override
  public List<ServiceDefinition> makeServiceDefinitions() {
    Future<List<CatalogItemSummary>> pageFuture =
        admin.getCatalogApplications(config.includesAllCatalogVersions());
    Map<String, ServiceDefinition> definitions = new HashMap<>();
    Set<String> names = Sets.newHashSet();

    List<CatalogItemSummary> page = ServiceUtil.getFutureValueLoggingError(pageFuture);
    for (CatalogItemSummary app : page) {
      try {
        String id = app.getSymbolicName();
        String name;
        LOG.info("Brooklyn Application={}", app);
        if (config.includesAllCatalogVersions()) {
          id = ServiceUtil.getUniqueName(id, new HashSet<>(definitions.keySet()));
          name = ServiceUtil.getSafeName("br_" + app.getName() + "_" + app.getVersion());
        } else {
          name = ServiceUtil.getUniqueName("br_" + app.getName(), names);
        }

        String description = app.getDescription();
        boolean bindable = true;
        boolean planUpdatable = false;
        List<Plan> plans = new ArrayList<>();
        try {
          plans = makePlans(id, app.getPlanYaml());
        } catch (Exception e) {
          LOG.error("unable to make plans: Unexpected blueprint format");
        }
        if (plans.size() == 0) {
          continue;
        }
        List<String> tags = getTags();
        Future<String> iconAsBase64Future = admin.getIconAsBase64(app.getIconUrl());
        String iconUrl = ServiceUtil.getFutureValueLoggingError(iconAsBase64Future);
        Map<String, Object> metadata = getServiceDefinitionMetadata(iconUrl, app.getPlanYaml());
        List<String> requires = getTags();
        DashboardClient dashboardClient = null;
        definitions.put(
            id,
            new ServiceDefinition(
                id,
                name,
                description,
                bindable,
                planUpdatable,
                plans,
                tags,
                metadata,
                requires,
                dashboardClient));
      } catch (Exception e) {
        LOG.error("unable to add catalog item: {}", e.getMessage());
      }
    }
    return new ArrayList<>(definitions.values());
  }