@Override
    public void run() {
      try {
        ReservationStatus currentStatus = null;

        // No need to retrieve status when there is no reservationId
        while (numberOfTries < maxPollingTries && reservation.getReservationId() != null) {

          // Get the latest version of the reservation..
          Reservation reservationFresh = reservationService.find(reservation.getId());

          logger.debug(
              "Checking status update for: '{}' (try {})",
              reservation.getReservationId(),
              numberOfTries);

          currentStatus = reservationService.getStatus(reservationFresh);
          logger.debug("Got back status {}", currentStatus);

          if (!currentStatus.equals(startStatus)) {
            logger.info(
                "Status change detected {} -> {} for reservation {}",
                new Object[] {startStatus, currentStatus, reservationFresh.getReservationId()});

            reservationFresh = reservationService.updateStatus(reservationFresh, currentStatus);

            Optional<NsiRequestDetails> requestDetails;
            if (reservationFresh.getConnection().isPresent()) {
              requestDetails =
                  Optional.fromNullable(
                      reservationFresh.getConnection().get().getProvisionRequestDetails());
            } else {
              requestDetails = Optional.absent();
            }

            reservationEventPublisher.notifyListeners(
                new ReservationStatusChangeEvent(startStatus, reservationFresh, requestDetails));

            return;
          }

          numberOfTries++;
          Uninterruptibles.sleepUninterruptibly(pollingIntervalInMillis, TimeUnit.MILLISECONDS);
        }
      } catch (Exception e) {
        logger.error(
            "The poller failed for reservation "
                + reservation.getId()
                + "/"
                + reservation.getReservationId(),
            e);
        emailSender.sendErrorMail(e);
      }
    }