private StreamNegotiator getNegotiator(final FormField field) throws XMPPException {
    String variable;
    boolean isByteStream = false;
    boolean isIBB = false;
    for (final Iterator<FormField.Option> it = field.getOptions(); it.hasNext(); ) {
      variable = it.next().getValue();
      if (variable.equals(Socks5BytestreamManager.NAMESPACE) && !IBB_ONLY) {
        isByteStream = true;
      } else if (variable.equals(InBandBytestreamManager.NAMESPACE)) {
        isIBB = true;
      }
    }

    if (!isByteStream && !isIBB) {
      final XMPPError error =
          new XMPPError(XMPPError.Condition.bad_request, "No acceptable transfer mechanism");
      throw new XMPPException(error.getMessage(), error);
    }

    // if (isByteStream && isIBB &&
    // field.getType().equals(FormField.TYPE_LIST_MULTI)) {
    if (isByteStream && isIBB) {
      return new FaultTolerantNegotiator(
          connection, byteStreamTransferManager, inbandTransferManager);
    } else if (isByteStream) {
      return byteStreamTransferManager;
    } else {
      return inbandTransferManager;
    }
  }