@Override
  protected void prepareForm(final ActionContext context) throws Exception {
    final Transfer transfer = resolveTransfer(context);

    // Check for transaction password
    final HttpServletRequest request = context.getRequest();
    final boolean requestTransactionPassword = shouldValidateTransactionPassword(context, transfer);
    if (requestTransactionPassword) {
      context.validateTransactionPassword();
    }
    request.setAttribute("requestTransactionPassword", requestTransactionPassword);
    request.setAttribute(
        "wouldRequireAuthorization", paymentService.wouldRequireAuthorization(transfer));

    // Transfer number and number of transfers
    final int transferNumber = getTransferNumber(transfer);
    final int numberOfTransfers = getNumberOfTransfer(transfer);
    request.setAttribute("transferNumber", transferNumber);
    request.setAttribute("numberOfTransfers", numberOfTransfers);

    // Fetch related data
    final AccountOwner from = transfer.getFromOwner();
    final AccountOwner to = transfer.getToOwner();
    final TransferType transferType =
        transferTypeService.load(
            transfer.getType().getId(),
            RelationshipHelper.nested(
                TransferType.Relationships.FROM, AccountType.Relationships.CURRENCY),
            TransferType.Relationships.TO);
    final BigDecimal amount = transfer.getAmount();
    if (from instanceof Member) {
      request.setAttribute("fromMember", from);
    }
    if (to instanceof Member) {
      request.setAttribute("toMember", to);
    }
    transfer.setType(transferType);
    request.setAttribute("unitsPattern", transferType.getFrom().getCurrency().getPattern());

    // Store the transaction fees
    final TransactionFeePreviewDTO preview =
        transactionFeeService.preview(from, to, transferType, amount);
    request.setAttribute("finalAmount", preview.getFinalAmount());
    request.setAttribute("fees", preview.getFees());
    request.setAttribute("transfer", transfer);
  }