diff --git a/src/trigger.f90 b/src/trigger.f90
index 910fd0e313aa62e6dfa9fe9c516f2b01e4afd760..7a405b05f180b96da304c61077a53e981579ce07 100644
--- a/src/trigger.f90
+++ b/src/trigger.f90
@@ -1,3 +1,5 @@
+!> TODO: we need undefs for a lot of datatypes
+
 FUNCTION triggerEvent(this, current_dt, plus_slack, minus_slack) RESULT(res)
   CLASS(t_event)                :: this
   TYPE(t_datetime), INTENT(in)  :: current_dt
@@ -344,156 +346,98 @@ FUNCTION getEventFirstTriggerDateTime(start_dt, timestep, offset, ref_dt) RESULT
 
 END FUNCTION getEventFirstTriggerDateTime
 
-function getTriggerNextEventAtDateTime(e, current_dt) result(dt_return)
-  type(t_datetime) :: dt_return
-  type(t_event), intent(in) :: e
-  type(t_datetime), intent(in) :: current_dt  
+FUNCTION getTriggerNextEventAtDateTime(e, current_dt) RESULT(dt_return)
+  TYPE(t_datetime) :: dt_return
+  TYPE(t_event), INTENT(in) :: e
+  TYPE(t_datetime), INTENT(in) :: current_dt  
 
-  type(t_timedelta) :: modulo_td
+  TYPE(t_timedelta) :: modulo_td
   
-  if (e%eventLastDateTime && (compareDatetime(current_dt,e%eventLastDateTime) == greater_than))
-  return NULL
+  IF (e%eventLastDateTime .and. (current_dt > e%eventLastDateTime)) then
+    RETURN
+  ENDIF
   
-  if (e%nextEventIsFirst) .and. (current_dt > e%triggerNextEventDateTime)) then
-  struct _timedelta* modulo_td = newTimeDelta("PT00.000S")
-               // Get the first trigger time and return (WARNING: Do not update e%triggerNextEventDateTime here!).
-               moduloTimeDeltaFromDateTime(e%triggerNextEventDateTime, e%eventInterval, current_dt, modulo_td)
-               addTimeDeltaToDateTime(current_dt,modulo_td,dt_return)
-               // Cleanup. 
-               deallocateTimeDelta(modulo_td)
-               return dt_return
-         }
-       // else ...
-       dt_return = replaceDatetime(e%triggerNextEventDateTime, dt_return)
-       return dt_return
-
-end function getTriggerNextEventAtDateTime
+  IF (e%nextEventIsFirst .AND. (current_dt > e%triggerNextEventDateTime)) THEN
+    moduloTimeDeltaFromDateTime(e%triggerNextEventDateTime, e%eventInterval, current_dt, modulo_td)
+    dt_return = current_dt + modulo_td
+  ELSE
+    dt_return = e%triggerNextEventDateTime
+  ENDIF
+
+END FUNCTION getTriggerNextEventAtDateTime
   
-! /**
-!   * @brief Get the Datetime when 'this' event was triggered last.
-!   *
-!   * @param  e
-!   *         A pointer to struct _event. This is the event being queried.
-!   *
-!   * @param  dt_return
-!   *         A pointer to struct _datetime. The last trigger datetime is copied here.
-!   *
-!   * @return dt_return
-!   *         A pointer to DT with previous-trigger datetime.
-!   */
-! /* NOTE: If the event was never tiggered, default value of 0-01-01T00:00:00.000 is returned. */
-! struct _datetime*
-! getTriggeredPreviousEventAtDateTime(struct _event* e, struct _datetime* dt_return)
-! {
-!   if ((e /= NULL )&& (dt_return /= NULL) )
-!     {
 !       /* No trigger ever happened? */
 !       if (e%nextEventIsFirst)
 !         return NULL 
+FUNCTION getTriggeredPreviousEventAtDateTime(e) result(dt_return)
+  type(t_datetime) :: dt_return
+  type(t_event) :: e
+
+  dt_return = e%triggeredPreviousEventDateTime
+end FUNCTION getTriggeredPreviousEventAtDateTime
 
-!       replaceDatetime(e%triggeredPreviousEventDateTime, dt_return)
-!       return dt_return
-!     }
-!   else
-!     return NULL
-! }
-
-
-! struct _datetime*
-! getEventReferenceDateTime(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventReferenceDateTime
-!   else
-!     return NULL
-! }
-
-! struct _datetime*
-! getEventFirstDateTime(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventFirstDateTime
-!   else
-!     return NULL
-! }
-
-! struct _datetime*
-! getEventLastDateTime(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventLastDateTime
-!   else
-!     return NULL
-! }
-
-! struct _timedelta*
-! getEventInterval(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventInterval
-!   else
-!     return NULL
-! }
-
-! bool
-! getNextEventIsFirst(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%nextEventIsFirst
-!   else
-!     return false
-! }
-
-! bool
-! getEventisFirstInDay(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisFirstInDay
-!   else
-!     return false
-! }
-
-! bool
-! getEventisFirstInMonth(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisFirstInMonth
-!   else
-!     return false
-! }
-
-! bool
-! getEventisFirstInYear(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisFirstInYear
-!   else
-!     return false
-! }
-
-! bool
-! getEventisLastInDay(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisLastInDay
-!   else
-!     return false
-! }
-
-! bool
-! getEventisLastInMonth(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisLastInMonth
-!   else
-!     return false
-! }
-
-! bool
-! getEventisLastInYear(struct _event* e)
-! {
-!   if (e /= NULL)
-!     return e%eventisLastInYear
-!   else
-!     return false
-! }
+function getEventReferenceDateTime(e) result(dt_return)
+  type(t_datetime) :: dt_return
+  type(t_event) :: e
+  dt_return ? e%eventReferenceDateTime
+end function getEventReferenceDateTime
+  
+function getEventFirstDateTime(e) result(dt_return)
+  type(t_datetime) :: dt_return
+  type(t_event) :: e
+  dt_return = e%eventFirstDateTime
+end function getEventFirstDateTime
+  
+function getEventLastDateTime(e) result(dt_return)
+  type(t_datetime) :: dt_return
+  type(t_event) :: e
+  dt_return = e%eventLastDateTime
+end function getEventLastDateTime
+
+function getEventInterval(e) result(td_return)
+  type(t_timedelta) :: td_return
+  type(t_event) :: e
+  dt_return = e%eventInterval
+end function getEventInterval
+
+function getNextEventIsFirst(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%nextEventIsFirst
+end function getNextEventIsFirst
+
+function getEventisFirstInDay(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisFirstInDay
+end function getEventisFirstInDay
+
+function getEventisFirstInMonth(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisFirstInMonth
+end function getEventisFirstInMonth
+
+function getEventisFirstInYear(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisFirstInYear
+end function getEventisFirstInYear
+
+function getEventisLastInDay(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisLastInDay
+end function getEventisLastInDay
+
+function getEventisLastInMonth(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisLastInMonth
+end function getEventisLastInMonth
+
+function getEventisLastInYear(e) result(is)
+  logical :: is
+  type(t_event) :: e
+  is = e%eventisLastInYear
+end function getEventisLastInYear