@Override
  public MuleEvent process(MuleEvent event) throws MuleException {
    try {
      String address2Use = expressionManager.parse(addressExpression, event.getMessage());

      ClientMessage msg = writeBodyToMessage(event.getMessage().getPayload(), clientSession);

      if (StringUtils.isNotBlank(event.getMessage().getCorrelationId())) {
        msg.putStringProperty(JMS_CORRELATION_ID, event.getMessage().getCorrelationId());
      }

      for (Map.Entry<String, String> e : headerExpressions.entrySet()) {
        Object value2Use = expressionManager.evaluate(e.getValue(), event.getMessage());
        msg.putObjectProperty(e.getKey(), value2Use);
      }

      for (String prop : event.getMessage().getOutboundPropertyNames()) {
        msg.putObjectProperty(prop, event.getMessage().getOutboundProperty(prop));
      }

      producer.send(address2Use, msg);

      Map<String, Object> props = new HashMap<String, Object>();
      props.put("hornetq.address", address2Use);

      event.getMessage().addProperties(props, PropertyScope.INBOUND);

      return event;

    } catch (Exception e) {
      throw new MessagingException(event, e);
    }
  }