private ims.dto.Result list(boolean loadAllRecords, int maxRecords) {
    DataCollection.clear();

    ims.dto.Result reLoginResult = Connection.reLogin();
    if (reLoginResult != null)
      return new ims.dto.Result(reLoginResult.getMessage(), "DTO.Client.Go_mdt_hcps.List");

    listInProgress = true;
    ims.dto.Result result = Connection.list(serviceName, encodeNASFilter());
    if (result != null) {
      listInProgress = false;
      if (result.getId() == -2) // NAS list empty
      return null;
      return result;
    }

    if (decodeNASMessage() == 0) {
      listInProgress = false;
      return null;
    }

    ims.dto.Result execResult = null;
    while (execResult == null && canContinueToList(loadAllRecords, maxRecords))
      execResult = nextList();

    if (execResult != null) {
      if (execResult.getId() != -3) {
        listInProgress = false;
        return execResult;
      }
    } else // NAS next list empty
    {
      listInProgress = false;
      return null;
    }

    if (!loadAllRecords || !listInProgress) {
      listInProgress = false;
      return Connection.stopList(serviceName);
    }

    listInProgress = false;
    return null;
  }