@Override
  public Message toInternalMessage(Sms sms)
      throws IllegalArgumentException, UnknownProtocolException, UnknownStatusException,
          UnknownTypeException {
    Message message = new Message(-1); // set id later

    // determine type of message
    Type type = Type.toType(Objects.requireNonNull(sms.getType()));

    // internationalize contact / address
    Contact c = getNormalizedContact(sms.getContactName(), sms.getAddress());

    message.setContact(c);
    message.setType(type);
    message.setBody(sms.getBody());
    message.setDate(getDateOrNull(sms.getDate()));

    // if message type is not SENT, do not set the date sent!
    // this would result in duplicate messages on the phone later.
    message.setDateSent((type != Type.Sent) ? null : getDateOrNull(sms.getDateSent()));

    message.setProtocol(Protocol.toProtocol(Objects.requireNonNull(sms.getProtocol())));
    message.setRead(Integer.valueOf(sms.getRead()));
    message.setServiceCenter(sms.getServiceCenter());
    message.setStatus(Status.toStatus(Objects.requireNonNull(sms.getStatus())));
    message.setSubject(sms.getSubject());

    // keep original values
    message.setOriginalAddress(sms.getAddress());
    message.setOriginalContactName(sms.getContactName());

    return message;
  }