diff --git a/examples/test_dace_hl.f90 b/examples/test_dace_hl.f90
index 0de42d7462296d4c4b610e726f5c5af4856d7ebe..bd46c9e89077727a1fddd19b865192f10a541b33 100644
--- a/examples/test_dace_hl.f90
+++ b/examples/test_dace_hl.f90
@@ -1,30 +1,31 @@
-program test_mtime
+PROGRAM test_mtime
   USE mtime_hl
 
-  call setCalendar(proleptic_gregorian)
-  call test1 ()
-  call test2 ()
-contains
-  subroutine test1 ()
-    TYPE(t_timedelta) :: dt, t0, t1, t2, t3
+  CALL setCalendar(proleptic_gregorian)
+  CALL test1 ()
+  CALL test2 ()
+
+CONTAINS
 
+  SUBROUTINE test1 ()
+    TYPE(t_timedelta) :: dt, t0, t1, t2, t3
+    
     WRITE (0,*) "test1:"
     dt = t_timedelta("PT24.000S")
     t0 = t_timedelta("PT3600.000S")
-    t1 = t_timedelta("PT3600.000S")
-    t2 = t_timedelta("PT60M")
-    t3 = t_timedelta("PT1H")
-    t1 =  t1 + dt
-    t2 =  t2 + dt
-    t3 =  t3 + dt
+    t1 = t_timedelta("PT3600.000S") + dt
+    t2 = t_timedelta("PT60M")       + dt
+    t3 = t_timedelta("PT1H")        + dt
+
     WRITE(0,*) "  t0 : ", t0%toString(), "Reference"
     WRITE(0,*) "  dt : ", dt%toString(), "Modification"
     WRITE(0,*) "  t1 : ", t1%toString(), "???"
     WRITE(0,*) "  t2 : ", t2%toString(), "OK"
     WRITE(0,*) "  t3 : ", t3%toString(), "OK"
-  end subroutine test1
+  END SUBROUTINE test1
+
   !-
-  subroutine test2 ()
+  SUBROUTINE test2 ()
     TYPE(t_event)       :: mec_Event
     TYPE(t_datetime)    :: mec_RefDate
     TYPE(t_datetime)    :: mec_StartDate
@@ -33,24 +34,20 @@ contains
     TYPE(t_timedelta)   :: mec_Stop
     TYPE(t_timedelta)   :: mec_Interval
     TYPE(t_timedelta)   :: time_step
-    type(t_eventGroup)  :: mec_Events
-    integer             :: ierr
-    logical             :: lret
+    TYPE(t_eventGroup)  :: mec_Events
     TYPE(t_datetime)    :: mtime
-    integer             :: i
-
+    INTEGER             :: i
+    
     mec_Start      = t_timeDelta("PT0S")
     mec_Stop       = t_timeDelta("PT3600S")
     mec_Interval   = t_timeDelta("PT300S")
-
+    
     time_step      = t_timeDelta("PT24S")
-
+    
     mec_RefDate    = t_datetime ("2016-05-29T00:00:00.000")
-    mec_StartDate  = mec_RefDate
-    mec_EndDate    = mec_RefDate
-    mec_StartDate  = mec_StartDate + mec_Start
-    mec_EndDate    = mec_EndDate   + mec_Stop
-
+    mec_StartDate  = mec_RefDate   + mec_Start
+    mec_EndDate    = mec_RefDate   + mec_Stop
+    
     WRITE (0,*)
     WRITE (0,*) "test2:"
     WRITE (0,*) "Model time step   : ",   time_step%toString()
@@ -62,27 +59,26 @@ contains
     WRITE (0,*) "MEC end date      : ",   mec_EndDate%toString()
     WRITE (0,*)
     WRITE (0,*) "Checking event management"
-!    call initEventManager (mec_RefDate)
 
     mec_Events     =  t_eventGroup('mecEventGroup')
+    mec_EndDate    = mec_EndDate + time_step
     mec_Event      =  t_event('mec', mec_RefDate, mec_StartDate, mec_EndDate, mec_Interval)
-
-    call mec_Events%append(mec_Event)
-    WRITE (0,*) "addEventToEventGroup returns:", lret
-!    CALL printEventGroup (mec_Events)
-
+    
+    CALL mec_Events%append(mec_Event)
+    
     mtime = mec_StartDate
     i = 0
-    do
-       if (mec_Event%isActive(mtime, plus_slack=time_step)) then
-          i = i + 1
-          WRITE (0,*) "MEC will be called on: ", trim (mtime%toString())
-       end if
-       IF (mtime >= mec_EndDate) THEN
-          exit
-       end IF
-       mtime = mtime + time_step
-    end do
-    write(0,*) "check_dace_timer: total MEC calls:", i, "(expected: 13)"
-  end subroutine test2
-end program test_mtime
+    DO
+      IF (mec_Event%isActive(mtime, plus_slack=time_step)) THEN
+        i = i + 1
+        WRITE (0,*) "MEC will be called on: ", TRIM (mtime%toString())
+      END IF
+      IF (mtime >= mec_EndDate) THEN
+        EXIT
+      END IF
+      mtime = mtime + time_step
+    END DO
+    WRITE(0,*) "check_dace_timer: total MEC calls:", i, "(expected: 13)"
+  END SUBROUTINE test2
+
+END PROGRAM test_mtime
diff --git a/include/mtime_eventHandling.h b/include/mtime_eventHandling.h
index fa6fe66785d2369cc7c9b1aea5861d310190a3bd..21cfbbd0c71fe2ad37da9fc2087ae09373292771 100644
--- a/include/mtime_eventHandling.h
+++ b/include/mtime_eventHandling.h
@@ -201,6 +201,10 @@ getEventisLastInMonth(struct _event* e);
 bool
 getEventisLastInYear(struct _event* e);
 
+struct _datetime*
+getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset, 
+                             struct _datetime* ref_dt, struct _datetime* first_trigger_dt);
+
 /**
  * @}
  */
diff --git a/src/libmtime_hl.f90 b/src/libmtime_hl.f90
index f6820cdb0d2acc63d71cdbaf9f62bcb811612d3a..6b40c51866e8768992a309879ca3714959cd30e3 100644
--- a/src/libmtime_hl.f90
+++ b/src/libmtime_hl.f90
@@ -302,7 +302,6 @@ MODULE mtime_hl
     INTEGER(c_int64_t)                   :: eventId
     CHARACTER(len=max_eventname_str_len) :: eventName
 
-    TYPE(t_datetime)                     :: eventsLastEvaluationDateTime
     TYPE(t_datetime)                     :: eventReferenceDateTime
 
     TYPE(t_datetime)                     :: eventFirstDateTime
@@ -325,8 +324,9 @@ MODULE mtime_hl
     LOGICAL                              :: eventisLastInMonth
     LOGICAL                              :: eventisLastInYear
 
-    TYPE(t_datetime)                     :: triggerNextEventDateTime
-    TYPE(t_datetime)                     :: triggeredPreviousEventDateTime
+    TYPE(t_datetime), POINTER            :: eventsLastEvaluationDateTime   => NULL()
+    TYPE(t_datetime), POINTER            :: triggerNextEventDateTime       => NULL()
+    TYPE(t_datetime), POINTER            :: triggeredPreviousEventDateTime => NULL()
 
   CONTAINS
 
@@ -342,6 +342,8 @@ MODULE mtime_hl
     PROCEDURE :: nextEvent                 => t_event_next_event
     PROCEDURE :: isActive                  => t_event_is_active
 
+    PROCEDURE :: getEventFirstTriggerDateTime => t_event_getEventFirstTriggerDateTime
+
   END TYPE t_event
 
   INTERFACE t_event
diff --git a/src/mtime_c_bindings.f90 b/src/mtime_c_bindings.f90
index 0c53dbc3d98918986423aa7ffb74d169faf05fce..eb5cd8316a30bcdfd9c09efe66159c9e325bac42 100644
--- a/src/mtime_c_bindings.f90
+++ b/src/mtime_c_bindings.f90
@@ -549,6 +549,18 @@ MODULE mtime_c_bindings
       type(c_ptr), value :: offset
     end function my_neweventwithdatatypes
     !
+    FUNCTION my_geteventfirsttriggerdatetime(start_dt, timestep, offset, &
+      &                                      ref_dt, first_trigger_dt)   &
+      &      RESULT(c_pointer) BIND(c, name='getEventFirstTriggerDateTime')
+      import :: c_ptr
+      type(c_ptr) :: c_pointer
+      type(c_ptr), value :: start_dt
+      type(c_ptr), value :: timestep
+      type(c_ptr), value :: offset
+      type(c_ptr), value :: ref_dt
+      TYPE(c_ptr), value :: first_trigger_dt
+    END FUNCTION my_geteventfirsttriggerdatetime
+    !
     subroutine my_deallocateevent(ev) bind(c,name='deallocateEvent')
       import :: c_ptr
       type(c_ptr), value :: ev
@@ -567,6 +579,51 @@ MODULE mtime_c_bindings
       character(kind=c_char), dimension(*) :: string
     end function my_eventtostring
     !
+    FUNCTION my_isCurrentEventActiveRaw(current_dt,                           &  ! in
+      &                                 event_eventFirstDateTime,             &  ! in
+      &                                 event_eventLastDateTime,              &  ! in
+      &                                 event_eventInterval,                  &  ! in
+      &                                 plus_slack,                           &  ! in
+      &                                 minus_slack,                          &  ! in
+      &                                 event_neverTriggerEvent,              &  ! inout
+      &                                 event_triggerCurrentEvent,            &  ! inout
+      &                                 event_eventisFirstInDay,              &  ! inout
+      &                                 event_eventisFirstInMonth,            &  ! inout
+      &                                 event_eventisFirstInYear,             &  ! inout
+      &                                 event_eventisLastInDay,               &  ! inout
+      &                                 event_eventisLastInMonth,             &  ! inout
+      &                                 event_eventisLastInYear,              &  ! inout
+      &                                 event_nextEventIsFirst,               &  ! inout
+      &                                 event_lastEventWasFinal,              &  ! inout
+      &                                 event_triggerNextEventDateTime,       &  ! inout
+      &                                 event_eventsLastEvaluationDateTime,   &  ! inout
+      &                                 event_triggeredPreviousEventDateTime) &  ! inout
+      !
+      &                      RESULT(ret) BIND(c, name='isCurrentEventActiveRaw')
+      !
+      IMPORT :: c_bool, c_ptr
+      TYPE(c_ptr),     VALUE :: current_dt
+      TYPE(c_ptr),     VALUE :: event_eventFirstDateTime
+      TYPE(c_ptr),     VALUE :: event_eventLastDateTime
+      TYPE(c_ptr),     VALUE :: event_eventInterval
+      TYPE(c_ptr),     VALUE :: plus_slack
+      TYPE(c_ptr),     VALUE :: minus_slack
+      LOGICAL(c_bool)        :: event_neverTriggerEvent
+      LOGICAL(c_bool)        :: event_triggerCurrentEvent
+      LOGICAL(c_bool)        :: event_eventisFirstInDay
+      LOGICAL(c_bool)        :: event_eventisFirstInMonth
+      LOGICAL(c_bool)        :: event_eventisFirstInYear
+      LOGICAL(c_bool)        :: event_eventisLastInDay
+      LOGICAL(c_bool)        :: event_eventisLastInMonth
+      LOGICAL(c_bool)        :: event_eventisLastInYear
+      LOGICAL(c_bool)        :: event_nextEventIsFirst
+      LOGICAL(c_bool)        :: event_lastEventWasFinal
+      TYPE(c_ptr)            :: event_triggerNextEventDateTime
+      TYPE(c_ptr)            :: event_eventsLastEvaluationDateTime
+      TYPE(c_ptr)            :: event_triggeredPreviousEventDateTime
+      LOGICAL(c_bool)        :: ret
+    END FUNCTION my_isCurrentEventActiveRaw
+    !
     function my_isCurrentEventActive(my_event, my_datetime, plus_slack, minus_slack) &
          &                      result(ret) bind(c, name='isCurrentEventActive')
       import :: c_bool, c_ptr
diff --git a/src/mtime_eventHandling.c b/src/mtime_eventHandling.c
index 27a45a47d8c6477eb24d11cbc8460ab7fd7c0cc1..c21f7f09a03af5d8a43e15626dc2de65b21edb2f 100644
--- a/src/mtime_eventHandling.c
+++ b/src/mtime_eventHandling.c
@@ -24,9 +24,6 @@
 #include "mtime_eventList.h"
 #include "mtime_iso8601.h"
 
-/* Local static functions. */
-static struct _datetime*
-getEventFirstTriggerDateTime(struct _datetime*, struct _timedelta*, struct _timedelta*, struct _datetime*, struct _datetime*);
 
 // The IDs are unique only when they are live. Once a group/event has been deleted, the IDs will be reused.
 // Currently, the IDs are generated but not used.
@@ -332,11 +329,17 @@ newEvent(const char* _en,
     goto cleanup_and_exit;
 
   e->triggerNextEventDateTime = newDateTime(initDummyDTString);
-  /* triggerNextEventDateTime holds the DateTime when an event should be triggered subjectively (i.e assuming real time starts at -Inf and moves fwd.)
-     At init (right now), triggerNextEventDateTime stores the DateTime of First-Ever trigger.
-     Events trigger at e->eventReferenceDateTime (+ e-> eventOffset ) + N * e->eventInterval where N is a positive, negative integer.
-     Hence, first trigger happens at the nearest possible trigger >= e->eventFirstDateTime. */
-  if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, e->eventReferenceDateTime, e->triggerNextEventDateTime))
+  /* triggerNextEventDateTime holds the DateTime when an event should
+     be triggered subjectively (i.e assuming real time starts at -Inf
+     and moves fwd.)
+     At init (right now), triggerNextEventDateTime stores the DateTime
+     of First-Ever trigger.
+     Events trigger at e->eventReferenceDateTime (+ e-> eventOffset )
+     + N * e->eventInterval where N is a positive, negative integer.
+     Hence, first trigger happens at the nearest possible trigger >=
+     e->eventFirstDateTime. */
+  if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset,
+                                    e->eventReferenceDateTime, e->triggerNextEventDateTime))
     goto cleanup_and_exit;
 
   /* Init the Flags. */
@@ -470,7 +473,6 @@ newEventWithDataType(const char* _en,
   else
       e->eventLastDateTime = NULL; // Logically equivalent to Inf.
 
-
   if (_eventInterval->year == 0 && _eventInterval->month == 0 && _eventInterval->day == 0
       && _eventInterval->hour == 0 && _eventInterval->minute == 0 && _eventInterval->second == 0 && _eventInterval->ms == 0)
     {
@@ -515,11 +517,18 @@ newEventWithDataType(const char* _en,
     goto cleanup_and_exit;
 
   e->triggerNextEventDateTime = newDateTime(initDummyDTString);
-  /* triggerNextEventDateTime holds the DateTime when an event should be triggered subjectively (i.e assuming real time starts at -Inf and moves fwd.)
-     At init (right now), triggerNextEventDateTime stores the DateTime of First-Ever trigger.
-     Events trigger at e->eventReferenceDateTime (+ e->eventOffset) + N*e->eventInterval where N is a positive, negative or zero integer.
-     Hence, first trigger happens at the nearest possible trigger >= e->eventFirstDateTime. */
-  if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset, e->eventReferenceDateTime, e->triggerNextEventDateTime))
+  /* triggerNextEventDateTime holds the DateTime when an event should
+     be triggered subjectively (i.e assuming real time starts at -Inf
+     and moves fwd.)
+     At init (right now), triggerNextEventDateTime stores the DateTime
+     of First-Ever trigger.
+     Events trigger at e->eventReferenceDateTime (+ e->eventOffset) +
+     N*e->eventInterval where N is a positive, negative or zero
+     integer.
+     Hence, first trigger happens at the nearest possible trigger >=
+     e->eventFirstDateTime. */
+  if (!getEventFirstTriggerDateTime(e->eventFirstDateTime, e->eventInterval, e->eventOffset,
+                                    e->eventReferenceDateTime, e->triggerNextEventDateTime))
     goto cleanup_and_exit;
 
   /* Init the Flags. */
@@ -657,9 +666,13 @@ constructAndCopyEvent(struct _event* ev)
 //Get if trigger is true. Trigger true in [T-minus_slack,T+plus_slack].
 static
 compare_return_val
-isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNextEventDateTime, struct _timedelta* plus_slack, struct _timedelta* minus_slack)
+isTriggerTimeInRange(struct _datetime* current_dt,
+                     struct _datetime* triggerNextEventDateTime,
+                     struct _timedelta* plus_slack,
+                     struct _timedelta* minus_slack)
 {
   int cmp_val_flag = -128;
+  if (triggerNextEventDateTime == NULL)  return cmp_val_flag;
 
   /* Make a local copy of slack to avoid updating the user supplied timedeltas. */
   struct _timedelta* plus_slack_local  = NULL;
@@ -782,16 +795,16 @@ isCurrentEventActiveRaw(/* in: */
                         bool *event_eventisLastInYear,
                         bool *event_nextEventIsFirst,
                         bool *event_lastEventWasFinal,
-                        struct _datetime** event_triggerNextEventDateTime,
                         struct _datetime** event_eventsLastEvaluationDateTime,
+                        struct _datetime** event_triggerNextEventDateTime,
                         struct _datetime** event_triggeredPreviousEventDateTime)
 {
 
   /* check for undefined input. allowed slacks can be NULL. */
-  if (current_dt == NULL) {fprintf(stderr,"6\n"); return false;}
-  if ((event_eventFirstDateTime == NULL)  ||
-      (event_eventLastDateTime  == NULL)  ||
-      (event_eventInterval      == NULL)) return false;
+  if (current_dt == NULL) return false;
+  if ((event_eventFirstDateTime  == NULL)  ||
+      (event_eventLastDateTime   == NULL)  ||
+      (event_eventInterval       == NULL)) return false;
   if ((event_neverTriggerEvent   == NULL) ||
       (event_triggerCurrentEvent == NULL) ||
       (event_eventisFirstInDay   == NULL) ||
@@ -857,6 +870,7 @@ isCurrentEventActiveRaw(/* in: */
 
   /* Check if trigger time is now. Trigger allowed with a slack
      provided [start-end] condition is met. */
+
   if( !(*event_lastEventWasFinal) &&
       (isTriggerTimeInRange(current_dt, *event_triggerNextEventDateTime, plus_slack, minus_slack) == equal_to) )
     {
@@ -1009,8 +1023,8 @@ isCurrentEventActive(struct _event*     event,
                                  &event->eventisLastInYear,
                                  &event->nextEventIsFirst,
                                  &event->lastEventWasFinal,
-                                 &event->triggerNextEventDateTime,
                                  &event->eventsLastEvaluationDateTime,
+                                 &event->triggerNextEventDateTime,
                                  &event->triggeredPreviousEventDateTime);
 }
 
@@ -1186,9 +1200,9 @@ eventToString(struct _event* e, char* string)
 
 /* Calculate the first trigger time. First trigger is the nearest allowed trigger time >= start_dt.
    Triggers are allowd only ref_dt + N * timestep where N can be positive, negative or 0. */
-static
 struct _datetime*
-getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset, struct _datetime* ref_dt, struct _datetime* first_trigger_dt)
+getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* timestep, struct _timedelta* offset,
+                             struct _datetime* ref_dt, struct _datetime* first_trigger_dt)
 {
   if ((start_dt != NULL) && (timestep != NULL) && (ref_dt != NULL) && (first_trigger_dt != NULL) ) //offset can be NULL.
     {
diff --git a/src/mtime_t_event.inc b/src/mtime_t_event.inc
index e8db15edb01e684b018438f243d3ba64d29b48ba..2b78e4636c5af5464ff42c0063a70821d32ae28f 100644
--- a/src/mtime_t_event.inc
+++ b/src/mtime_t_event.inc
@@ -26,6 +26,20 @@
       t_event_assign_raw%eventOffset = t_timedelta(zeroOffset)
     ENDIF
 
+    ALLOCATE(t_event_assign_raw%triggerNextEventDateTime)
+    t_event_assign_raw%triggerNextEventDateTime = t_event_assign_raw%getEventFirstTriggerDateTime()
+
+    t_event_assign_raw%neverTriggerEvent   = .FALSE.
+    t_event_assign_raw%triggerCurrentEvent = .FALSE.
+    t_event_assign_raw%eventisFirstInDay   = .FALSE.
+    t_event_assign_raw%eventisFirstInMonth = .FALSE.
+    t_event_assign_raw%eventisFirstInYear  = .FALSE.
+    t_event_assign_raw%eventisLastInDay    = .FALSE.
+    t_event_assign_raw%eventisLastInMonth  = .FALSE.
+    t_event_assign_raw%eventisLastInYear   = .FALSE.
+    t_event_assign_raw%nextEventIsFirst    = .TRUE.
+    t_event_assign_raw%lastEventWasFinal   = .FALSE.
+
   END FUNCTION t_event_assign_raw
 
   FUNCTION t_event_assign_types(name, referenceDate, firstdate, lastDate, interval, offset)
@@ -50,8 +64,51 @@
       t_event_assign_types%eventOffset = t_timedelta(zeroOffset)
     ENDIF
 
+    ALLOCATE(t_event_assign_types%triggerNextEventDateTime)
+    t_event_assign_types%triggerNextEventDateTime = t_event_assign_types%getEventFirstTriggerDateTime()
+
+    t_event_assign_types%neverTriggerEvent   = .FALSE.
+    t_event_assign_types%triggerCurrentEvent = .FALSE.
+    t_event_assign_types%eventisFirstInDay   = .FALSE.
+    t_event_assign_types%eventisFirstInMonth = .FALSE.
+    t_event_assign_types%eventisFirstInYear  = .FALSE.
+    t_event_assign_types%eventisLastInDay    = .FALSE.
+    t_event_assign_types%eventisLastInMonth  = .FALSE.
+    t_event_assign_types%eventisLastInYear   = .FALSE.
+    t_event_assign_types%nextEventIsFirst    = .TRUE.
+    t_event_assign_types%lastEventWasFinal   = .FALSE.
+
   END FUNCTION t_event_assign_types
 
+
+  FUNCTION t_event_getEventFirstTriggerDateTime(this)  RESULT(result_dt)
+    CLASS(t_event), INTENT(IN) :: this
+    TYPE(t_datetime)           :: result_dt
+    !
+    TYPE(c_ptr) :: c_pointer,tmp_evFirstDateTime, tmp_evOffset, tmp_evInterval, &
+      &            tmp_evReferenceDateTime
+    TYPE(datetime),  POINTER :: tmp_dt
+
+    tmp_evFirstDateTime            = this%eventFirstDateTime%get_c_pointer()
+    tmp_evOffset                   = this%eventOffset%get_c_pointer()
+    tmp_evInterval                 = this%eventInterval%get_c_pointer()
+    tmp_evReferenceDateTime        = this%eventReferenceDateTime%get_c_pointer()
+
+    c_pointer = this%eventFirstDateTime%get_c_pointer()
+    c_pointer = my_geteventfirsttriggerdatetime(tmp_evFirstDateTime, tmp_evInterval, tmp_evOffset, &
+      &                                         tmp_evReferenceDateTime, c_pointer)
+    CALL C_F_POINTER(c_pointer, tmp_dt)
+    result_dt%dt = tmp_dt
+
+    IF (C_ASSOCIATED(c_pointer))                      CALL my_deallocatedatetime(c_pointer)
+    IF (C_ASSOCIATED(tmp_evFirstDateTime))            CALL my_deallocatedatetime(tmp_evFirstDateTime)
+    IF (C_ASSOCIATED(tmp_evOffset))                   CALL my_deallocatetimedelta(tmp_evOffset)
+    IF (C_ASSOCIATED(tmp_evInterval))                 CALL my_deallocatetimedelta(tmp_evInterval)
+    IF (C_ASSOCIATED(tmp_evReferenceDateTime))        CALL my_deallocatedatetime(tmp_evReferenceDateTime)
+
+  END FUNCTION t_event_getEventFirstTriggerDateTime
+
+
   ! Iterate to next event in event group.
   !
   ! @return NULL() if no next event available.
@@ -114,30 +171,117 @@
     TYPE(t_datetime)            :: my_datetime
     TYPE(t_timedelta), OPTIONAL :: plus_slack
     TYPE(t_timedelta), OPTIONAL :: minus_slack
-    TYPE(t_event), POINTER      :: tmp_ev
-    TYPE(c_ptr) :: tmp_dt, tmp_plus, tmp_minus
-    logical(c_bool) :: ret
-
-    tmp_ev => this
-    tmp_dt = my_datetime%get_c_pointer()
-    if (present(plus_slack)) then
-      tmp_plus = plus_slack%get_c_pointer()
-    else
-      tmp_plus = c_null_ptr
-    endif
-
-    if (present(minus_slack)) then
-      tmp_minus = minus_slack%get_c_pointer()
-    else
-      tmp_minus = c_null_ptr
-    endif
-
-    ret = my_isCurrentEventActive(c_loc(tmp_ev), tmp_dt, &
-          &                       tmp_plus,  tmp_minus)
+    TYPE(c_ptr)     :: tmp_dt, tmp_plus, tmp_minus, tmp_evFirstDateTime, tmp_evLastDateTime, tmp_evInterval
+    LOGICAL(c_bool) :: event_neverTriggerEvent, event_triggerCurrentEvent, event_eventisFirstInDay, &
+                       event_eventisFirstInMonth, event_eventisFirstInYear, event_eventisLastInDay, &
+                       event_eventisLastInMonth, event_eventisLastInYear, event_nextEventIsFirst,   &
+                       event_lastEventWasFinal, ret
+    TYPE(c_ptr)     :: event_triggerNextEventDateTime,     &
+                       event_eventsLastEvaluationDateTime, &
+                       event_triggeredPreviousEventDateTime
+    TYPE(datetime),  POINTER        :: dt_tmp
+
+    ! --- copy-in:
+
+    tmp_dt                  = my_datetime%get_c_pointer()
+    tmp_evFirstDateTime     = this%eventFirstDateTime%get_c_pointer()
+    tmp_evLastDateTime      = this%eventLastDateTime%get_c_pointer()
+    tmp_evInterval          = this%eventInterval%get_c_pointer()
+
+    tmp_plus  = c_null_ptr
+    tmp_minus = c_null_ptr
+    IF (PRESENT(plus_slack))  tmp_plus  = plus_slack%get_c_pointer()
+    IF (PRESENT(minus_slack)) tmp_minus = minus_slack%get_c_pointer()
+
+    event_neverTriggerEvent    = this%neverTriggerEvent
+    event_triggerCurrentEvent  = this%triggerCurrentEvent
+    event_eventisFirstInDay    = this%eventisFirstInDay
+    event_eventisFirstInMonth  = this%eventisFirstInMonth
+    event_eventisFirstInYear   = this%eventisFirstInYear
+    event_eventisLastInDay     = this%eventisLastInDay
+    event_eventisLastInMonth   = this%eventisLastInMonth
+    event_eventisLastInYear    = this%eventisLastInYear
+    event_nextEventIsFirst     = this%nextEventIsFirst
+    event_lastEventWasFinal    = this%lastEventWasFinal
+
+    event_triggerNextEventDateTime       = c_null_ptr
+    event_eventsLastEvaluationDateTime   = c_null_ptr
+    event_triggeredPreviousEventDateTime = c_null_ptr
+
+    IF (ASSOCIATED(this%triggerNextEventDateTime      ))  &
+      &   event_triggerNextEventDateTime       = this%triggerNextEventDateTime%get_c_pointer()
+    IF (ASSOCIATED(this%eventsLastEvaluationDateTime  ))  &
+      &   event_eventsLastEvaluationDateTime   = this%eventsLastEvaluationDateTime%get_c_pointer()
+    IF (ASSOCIATED(this%triggeredPreviousEventDateTime))  &
+      &   event_triggeredPreviousEventDateTime = this%triggeredPreviousEventDateTime%get_c_pointer()
+
+    ! --- call C routine:
+
+    ret = my_isCurrentEventActiveRaw(tmp_dt,                               &  ! in
+      &                              tmp_evFirstDateTime,                  &  ! in
+      &                              tmp_evLastDateTime,                   &  ! in
+      &                              tmp_evInterval,                       &  ! in
+      &                              tmp_plus,                             &  ! in
+      &                              tmp_minus,                            &  ! in
+      &                              event_neverTriggerEvent,              &  ! inout
+      &                              event_triggerCurrentEvent,            &  ! inout
+      &                              event_eventisFirstInDay,              &  ! inout
+      &                              event_eventisFirstInMonth,            &  ! inout
+      &                              event_eventisFirstInYear,             &  ! inout
+      &                              event_eventisLastInDay,               &  ! inout
+      &                              event_eventisLastInMonth,             &  ! inout
+      &                              event_eventisLastInYear,              &  ! inout
+      &                              event_nextEventIsFirst,               &  ! inout
+      &                              event_lastEventWasFinal,              &  ! inout
+      &                              event_eventsLastEvaluationDateTime,   &  ! inout
+      &                              event_triggerNextEventDateTime,       &  ! inout
+      &                              event_triggeredPreviousEventDateTime)    ! inout
+
+    ! --- copy-out:
+
+    this%neverTriggerEvent    = event_neverTriggerEvent
+    this%triggerCurrentEvent  = event_triggerCurrentEvent
+    this%eventisFirstInDay    = event_eventisFirstInDay
+    this%eventisFirstInMonth  = event_eventisFirstInMonth
+    this%eventisFirstInYear   = event_eventisFirstInYear
+    this%eventisLastInDay     = event_eventisLastInDay
+    this%eventisLastInMonth   = event_eventisLastInMonth
+    this%eventisLastInYear    = event_eventisLastInYear
+    this%nextEventIsFirst     = event_nextEventIsFirst
+    this%lastEventWasFinal    = event_lastEventWasFinal
+
+    IF (C_ASSOCIATED(event_triggerNextEventDateTime)) THEN
+      IF (.NOT. ASSOCIATED(this%triggerNextEventDateTime)) ALLOCATE(this%triggerNextEventDateTime)
+      CALL C_F_POINTER(event_triggerNextEventDateTime, dt_tmp)
+      this%triggerNextEventDateTime%dt = dt_tmp
+    END IF
+    IF (C_ASSOCIATED(event_eventsLastEvaluationDateTime)) THEN
+      IF (.NOT. ASSOCIATED(this%eventsLastEvaluationDateTime)) ALLOCATE(this%eventsLastEvaluationDateTime)
+      CALL C_F_POINTER(event_eventsLastEvaluationDateTime, dt_tmp)
+      this%eventsLastEvaluationDateTime%dt = dt_tmp
+    END IF
+    IF (C_ASSOCIATED(event_triggeredPreviousEventDateTime)) THEN
+      IF (.NOT. ASSOCIATED(this%triggeredPreviousEventDateTime)) ALLOCATE(this%triggeredPreviousEventDateTime)
+      CALL C_F_POINTER(event_triggeredPreviousEventDateTime, dt_tmp)
+      this%triggeredPreviousEventDateTime%dt = dt_tmp
+    END IF
+
+    ! --- clean up:
 
     CALL my_deallocatedatetime(tmp_dt)
-    if (c_associated(tmp_plus))  CALL my_deallocatetimedelta(tmp_plus)
-    if (c_associated(tmp_minus)) CALL my_deallocatetimedelta(tmp_minus)
+    IF (C_ASSOCIATED(tmp_plus))            CALL my_deallocatetimedelta(tmp_plus)
+    IF (C_ASSOCIATED(tmp_minus))           CALL my_deallocatetimedelta(tmp_minus)
+    IF (C_ASSOCIATED(tmp_evFirstDateTime)) CALL my_deallocatedatetime(tmp_evFirstDateTime)
+    IF (C_ASSOCIATED(tmp_evLastDateTime))  CALL my_deallocatedatetime(tmp_evLastDateTime)
+    IF (C_ASSOCIATED(tmp_evInterval))      CALL my_deallocatetimedelta(tmp_evInterval)
+
+    IF (C_ASSOCIATED(event_triggerNextEventDateTime      )) &
+      &     CALL my_deallocatedatetime(event_triggerNextEventDateTime      )
+    IF (C_ASSOCIATED(event_eventsLastEvaluationDateTime  )) &
+      &     CALL my_deallocatedatetime(event_eventsLastEvaluationDateTime  )
+    IF (C_ASSOCIATED(event_triggeredPreviousEventDateTime)) &
+      &     CALL my_deallocatedatetime(event_triggeredPreviousEventDateTime)
+
   END FUNCTION t_event_is_active
 
   ! ================================================================================