From d7586b2b79849f2eedea28153e70baed0239ab9b Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Fri, 19 Jan 2024 11:49:09 +0100
Subject: [PATCH] Revert the codebase to d524da1d

---
 examples/.gitignore           |   1 -
 examples/Makefile.am          |   3 -
 examples/Makefile.in          |  19 +-
 examples/test_cf_timeaxis.f90 | 146 -------
 include/mtime_julianDay.h     |   4 +-
 src/.dir-locals.el            |   1 -
 src/libmtime.f90              | 755 +++++++++++++++++++---------------
 src/mtime_c_bindings.f90      |   7 +-
 src/mtime_date.c              |  12 +-
 src/mtime_datetime.c          |  51 ++-
 src/mtime_eventHandling.c     | 435 +++++++++++++-------
 src/mtime_iso8601.c           |  20 +-
 src/mtime_iso8601.rl          |  20 +-
 src/mtime_julianDay.c         |  22 +-
 src/mtime_t_datetime.inc      |   1 +
 src/mtime_t_event.inc         |   2 +-
 src/mtime_t_timedelta.inc     |   2 +-
 src/mtime_timedelta.c         | 585 +++++++++++++++++---------
 test/mtime_julianDay_test.c   |  98 ++---
 test/mtime_julianDay_test.h   |   4 +-
 20 files changed, 1238 insertions(+), 950 deletions(-)
 delete mode 100644 examples/test_cf_timeaxis.f90
 delete mode 100644 src/.dir-locals.el

diff --git a/examples/.gitignore b/examples/.gitignore
index accddae9..36bb2ef7 100644
--- a/examples/.gitignore
+++ b/examples/.gitignore
@@ -21,5 +21,4 @@ simulate_iau
 test_dace
 time_calculus
 test_jd_logic
-test_cf_timeaxis
 uniq
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 648550a4..3d3c1278 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -22,7 +22,6 @@ noinst_PROGRAMS =     \
     test_dace         \
     time_calculus     \
     test_jd_logic     \
-    test_cf_timeaxis  \
     uniq
 endif ENABLE_EXAMPLES
 
@@ -40,7 +39,6 @@ recurrence_SOURCES = recurrence.c
 test_dace_SOURCES = test_dace.f90 mo_event_manager.f90
 time_calculus_SOURCES = time_calculus.c
 test_jd_logic_SOURCES = test_jd_logic.f90
-test_cf_timeaxis_SOURCES = test_cf_timeaxis.f90
 
 if FCMODUC
 mo_event_manager_mod = MO_EVENT_MANAGER.$(FCMODEXT)
@@ -82,7 +80,6 @@ simulate_iau.$(OBJEXT)     \
 tas.$(OBJEXT)              \
 test_dace.$(OBJEXT)        \
 test_jd_logic.$(OBJEXT)    \
-test_cf_timeaxis.$(OBJEXT) \
 uniq.$(OBJEXT): $(top_builddir)/src/$(mtime_mod)
 
 example_hl.$(OBJEXT)   \
diff --git a/examples/Makefile.in b/examples/Makefile.in
index adbcbd21..071b84ea 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -99,8 +99,7 @@ host_triplet = @host@
 @ENABLE_EXAMPLES_TRUE@	simulate_iau$(EXEEXT) tas$(EXEEXT) \
 @ENABLE_EXAMPLES_TRUE@	test_dace$(EXEEXT) \
 @ENABLE_EXAMPLES_TRUE@	time_calculus$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	test_jd_logic$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	test_cf_timeaxis$(EXEEXT) uniq$(EXEEXT)
+@ENABLE_EXAMPLES_TRUE@	test_jd_logic$(EXEEXT) uniq$(EXEEXT)
 subdir = examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \
@@ -184,10 +183,6 @@ tas_SOURCES = tas.f90
 tas_OBJECTS = tas.$(OBJEXT)
 tas_LDADD = $(LDADD)
 tas_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-am_test_cf_timeaxis_OBJECTS = test_cf_timeaxis.$(OBJEXT)
-test_cf_timeaxis_OBJECTS = $(am_test_cf_timeaxis_OBJECTS)
-test_cf_timeaxis_LDADD = $(LDADD)
-test_cf_timeaxis_DEPENDENCIES = $(top_builddir)/src/libmtime.la
 am_test_dace_OBJECTS = test_dace.$(OBJEXT) mo_event_manager.$(OBJEXT)
 test_dace_OBJECTS = $(am_test_dace_OBJECTS)
 test_dace_LDADD = $(LDADD)
@@ -260,15 +255,13 @@ SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \
 	example.f90 example_hl.f90 $(iconatm_SOURCES) \
 	$(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \
 	$(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \
-	repetitor.f90 simulate_iau.f90 tas.f90 \
-	$(test_cf_timeaxis_SOURCES) $(test_dace_SOURCES) \
+	repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \
 	$(test_jd_logic_SOURCES) $(time_calculus_SOURCES) uniq.f90
 DIST_SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \
 	example.f90 example_hl.f90 $(iconatm_SOURCES) \
 	$(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \
 	$(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \
-	repetitor.f90 simulate_iau.f90 tas.f90 \
-	$(test_cf_timeaxis_SOURCES) $(test_dace_SOURCES) \
+	repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \
 	$(test_jd_logic_SOURCES) $(time_calculus_SOURCES) uniq.f90
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -472,7 +465,6 @@ recurrence_SOURCES = recurrence.c
 test_dace_SOURCES = test_dace.f90 mo_event_manager.f90
 time_calculus_SOURCES = time_calculus.c
 test_jd_logic_SOURCES = test_jd_logic.f90
-test_cf_timeaxis_SOURCES = test_cf_timeaxis.f90
 @FCMODUC_FALSE@mo_event_manager_mod = mo_event_manager.$(FCMODEXT)
 @FCMODUC_TRUE@mo_event_manager_mod = MO_EVENT_MANAGER.$(FCMODEXT)
 @FCMODUC_FALSE@mo_exception_mod = mo_exception.$(FCMODEXT)
@@ -589,10 +581,6 @@ tas$(EXEEXT): $(tas_OBJECTS) $(tas_DEPENDENCIES) $(EXTRA_tas_DEPENDENCIES)
 	@rm -f tas$(EXEEXT)
 	$(AM_V_FCLD)$(FCLINK) $(tas_OBJECTS) $(tas_LDADD) $(LIBS)
 
-test_cf_timeaxis$(EXEEXT): $(test_cf_timeaxis_OBJECTS) $(test_cf_timeaxis_DEPENDENCIES) $(EXTRA_test_cf_timeaxis_DEPENDENCIES) 
-	@rm -f test_cf_timeaxis$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(test_cf_timeaxis_OBJECTS) $(test_cf_timeaxis_LDADD) $(LIBS)
-
 test_dace$(EXEEXT): $(test_dace_OBJECTS) $(test_dace_DEPENDENCIES) $(EXTRA_test_dace_DEPENDENCIES) 
 	@rm -f test_dace$(EXEEXT)
 	$(AM_V_FCLD)$(FCLINK) $(test_dace_OBJECTS) $(test_dace_LDADD) $(LIBS)
@@ -921,7 +909,6 @@ simulate_iau.$(OBJEXT)     \
 tas.$(OBJEXT)              \
 test_dace.$(OBJEXT)        \
 test_jd_logic.$(OBJEXT)    \
-test_cf_timeaxis.$(OBJEXT) \
 uniq.$(OBJEXT): $(top_builddir)/src/$(mtime_mod)
 
 example_hl.$(OBJEXT)   \
diff --git a/examples/test_cf_timeaxis.f90 b/examples/test_cf_timeaxis.f90
deleted file mode 100644
index d560e1a0..00000000
--- a/examples/test_cf_timeaxis.f90
+++ /dev/null
@@ -1,146 +0,0 @@
-!! Copyright (c) 2013-2024 MPI-M, Luis Kornblueh, Rahul Sinha and DWD, Florian Prill. All rights reserved.
-!!
-!! SPDX-License-Identifier: BSD-3-Clause
-!!
-program test_cf_timeaxis
-  
-  use, intrinsic :: iso_fortran_env, only: int64, wp => real64
-
-  use mtime
-  
-  implicit none
-
-  type(juliandelta), parameter :: timeunit_day    = juliandelta('+', 0_int64, 86400000_int64)
-  type(juliandelta), parameter :: timeunit_hour   = juliandelta('+', 0_int64,  3600000_int64)
-  type(juliandelta), parameter :: timeunit_minute = juliandelta('+', 0_int64,    60000_int64)
-  type(juliandelta), parameter :: timeunit_second = juliandelta('+', 0_int64,     1000_int64)  
-
-  ! epoch: 1870-01-01T00:00
-  type(julianday) :: epoch = julianday(2404063, 43200000)
-      
-  ! example 1:  "days since 1870-01-01T00:00"
-  !
-  character(len=4) :: time1_unit = 'days'
-  real(wp) :: time1(148) = [    38730.5, 38760.5, 38790.5, 38821.0, 38851.5, &
-       &      38882.0, 38912.5, 38943.5, 38974.0, 39004.5, 39035.0, 39065.5, &
-       &      39096.5, 39126.0, 39155.5, 39186.0, 39216.5, 39247.0, 39277.5, &
-       &      39308.5, 39339.0, 39369.5, 39400.0, 39430.5, 39461.5, 39491.0, &
-       &      39520.5, 39551.0, 39581.5, 39612.0, 39642.5, 39673.5, 39704.0, &
-       &      39734.5, 39765.0, 39795.5, 39826.5, 39856.0, 39885.5, 39916.0, &
-       &      39946.5, 39977.0, 40007.5, 40038.5, 40069.0, 40099.5, 40130.0, &
-       &      40160.5, 40191.5, 40221.5, 40251.5, 40282.0, 40312.5, 40343.0, &
-       &      40373.5, 40404.5, 40435.0, 40465.5, 40496.0, 40526.5, 40557.5, &
-       &      40587.0, 40616.5, 40647.0, 40677.5, 40708.0, 40738.5, 40769.5, &
-       &      40800.0, 40830.5, 40861.0, 40891.5, 40922.5, 40952.0, 40981.5, &
-       &      41012.0, 41042.5, 41073.0, 41103.5, 41134.5, 41165.0, 41195.5, &
-       &      41226.0, 41256.5, 41287.5, 41317.0, 41346.5, 41377.0, 41407.5, &
-       &      41438.0, 41468.5, 41499.5, 41530.0, 41560.5, 41591.0, 41621.5, &
-       &      41652.5, 41682.5, 41712.5, 41743.0, 41773.5, 41804.0, 41834.5, &
-       &      41865.5, 41896.0, 41926.5, 41957.0, 41987.5, 42018.5, 42048.0, &
-       &      42077.5, 42108.0, 42138.5, 42169.0, 42199.5, 42230.5, 42261.0, &
-       &      42291.5, 42322.0, 42352.5, 42383.5, 42413.0, 42442.5, 42473.0, &
-       &      42503.5, 42534.0, 42564.5, 42595.5, 42626.0, 42656.5, 42687.0, &
-       &      42717.5, 42748.5, 42778.0, 42807.5, 42838.0, 42868.5, 42899.0, &
-       &      42929.5, 42960.5, 42991.0, 43021.5, 43052.0, 43082.5, 43113.5, &
-       &      43143.5, 43173.5, 43204.0 ]
-
-  ! example 2:
-  character(len=7) :: time2_unit = 'seconds'
-  real(wp) ::  time2(125) = [   0.0,   21600.0,   43200.0,   64800.0,   86400.0, &
-       &       108000.0,  129600.0,  151200.0,  172800.0,  194400.0,  216000.0, &
-       &       237600.0,  259200.0,  280800.0,  302400.0,  324000.0,  345600.0, &
-       &       367200.0,  388800.0,  410400.0,  432000.0,  453600.0,  475200.0, &
-       &       496800.0,  518400.0,  540000.0,  561600.0,  583200.0,  604800.0, &
-       &       626400.0,  648000.0,  669600.0,  691200.0,  712800.0,  734400.0, &
-       &       756000.0,  777600.0,  799200.0,  820800.0,  842400.0,  864000.0, &
-       &       885600.0,  907200.0,  928800.0,  950400.0,  972000.0,  993600.0, &
-       &      1015200.0, 1036800.0, 1058400.0, 1080000.0, 1101600.0, 1123200.0, &
-       &      1144800.0, 1166400.0, 1188000.0, 1209600.0, 1231200.0, 1252800.0, &
-       &      1274400.0, 1296000.0, 1317600.0, 1339200.0, 1360800.0, 1382400.0, &
-       &      1404000.0, 1425600.0, 1447200.0, 1468800.0, 1490400.0, 1512000.0, &
-       &      1533600.0, 1555200.0, 1576800.0, 1598400.0, 1620000.0, 1641600.0, &
-       &      1663200.0, 1684800.0, 1706400.0, 1728000.0, 1749600.0, 1771200.0, &
-       &      1792800.0, 1814400.0, 1836000.0, 1857600.0, 1879200.0, 1900800.0, &
-       &      1922400.0, 1944000.0, 1965600.0, 1987200.0, 2008800.0, 2030400.0, &
-       &      2052000.0, 2073600.0, 2095200.0, 2116800.0, 2138400.0, 2160000.0, &
-       &      2181600.0, 2203200.0, 2224800.0, 2246400.0, 2268000.0, 2289600.0, &
-       &      2311200.0, 2332800.0, 2354400.0, 2376000.0, 2397600.0, 2419200.0, &
-       &      2440800.0, 2462400.0, 2484000.0, 2505600.0, 2527200.0, 2548800.0, &
-       &      2570400.0, 2592000.0, 2613600.0, 2635200.0, 2656800.0, 2678400.0 ]
-
-  iteration1: block
-
-    type(juliandelta) :: time_multiplicator
-    real(wp) :: s, s0, days, ms
-    integer :: i
-
-    select case (time1_unit)
-    case('days')
-      time_multiplicator = timeunit_day 
-    case('hours')
-      time_multiplicator = timeunit_hour  
-    case('minuets')
-      time_multiplicator = timeunit_minute     
-    case('seconds')
-      time_multiplicator = timeunit_second     
-    end select
-
-    do i = 1, size(time1)
-      s0 = time1(i)*(1.0e-3_wp*time_multiplicator%ms)    ! in seconds
-      s = s0
-      days = 0.0_wp
-      do while (s >= 86400.0_wp)
-        s = s - 86400.0_wp
-        days = days + 1.0_wp
-      enddo
-      do while (s < 0.0_wp)
-        s = s + 86400.0_wp
-        days = days - 1.0_wp
-      enddo
-      write(0,'(i4,4f16.2)') i, time1(i), days, s, s/86400.0_wp
-      s = s0
-      days = floor(s/86400.0_wp)
-      ms = s - days*86400.0_wp
-      write(0,'(20x,3f16.2)') days, ms, ms/86400.0_wp
-    enddo
-  end block iteration1
-
-  iteration2: block
-
-    type(juliandelta) :: time_multiplicator
-
-    real(wp) :: s, s0, days, ms
-    integer :: i
-    
-    select case (time2_unit)
-    case('days')
-      time_multiplicator = timeunit_day 
-    case('hours')
-      time_multiplicator = timeunit_hour  
-    case('minuets')
-      time_multiplicator = timeunit_minute     
-    case('seconds')
-      time_multiplicator = timeunit_second     
-    end select
-
-    do i = 1, size(time2)
-      s0 = time2(i)*(1.0e-3_wp*time_multiplicator%ms)    ! in seconds    
-      s = s0
-      days = 0.0_wp
-      do while (s >= 86400.0_wp)
-        s = s - 86400.0_wp
-        days = days + 1.0_wp
-      enddo
-      do while (s < 0.0_wp)
-        s = s + 86400.0_wp
-        days = days - 1.0_wp
-      enddo
-      write(0,'(i4,4f16.2)') i, time2(i), days, s, s/86400.0_wp
-      s = s0
-      days = floor(s/86400.0_wp)
-      ms = s - days*86400.0_wp
-      write(0,'(20x,3f16.2)') days, ms, ms/86400.0_wp
-    enddo
-  end block iteration2
-  
-end program test_cf_timeaxis
diff --git a/include/mtime_julianDay.h b/include/mtime_julianDay.h
index d3dc8a1f..d575801e 100644
--- a/include/mtime_julianDay.h
+++ b/include/mtime_julianDay.h
@@ -64,11 +64,11 @@ struct _julianday*
 addJulianDeltaToJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd);
 
 struct _julianday*
-subtractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd);
+substractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd);
 
 /*! \cond PRIVATE */
 struct _juliandelta*
-subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd);
+substractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd);
 /*! \endcond */
 
 char*
diff --git a/src/.dir-locals.el b/src/.dir-locals.el
deleted file mode 100644
index 528aa5a3..00000000
--- a/src/.dir-locals.el
+++ /dev/null
@@ -1 +0,0 @@
-((f90-mode . ((f90-auto-keyword-case . upcase-word))))
diff --git a/src/libmtime.f90 b/src/libmtime.f90
index cf8dad08..95776f48 100644
--- a/src/libmtime.f90
+++ b/src/libmtime.f90
@@ -91,8 +91,10 @@ CONTAINS
     INTEGER :: i
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_calendartostring(string)
-    IF (.NOT. C_ASSOCIATED(c_pointer)) THEN
+    IF (.NOT. c_ASSOCIATED(c_pointer)) THEN
+      IF (PRESENT(errno)) errno = 0 * 100 + 4
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -100,7 +102,6 @@ CONTAINS
       END DO char_loop
       string(i:LEN(string)) = ' '
     ENDIF
-    IF (PRESENT(errno)) errno = MERGE(0, 0 * 100 + 4, C_ASSOCIATED(c_pointer))
   END SUBROUTINE calendarToString
   !
 END MODULE mtime_calendar
@@ -131,8 +132,9 @@ CONTAINS
     TYPE(c_ptr)                    :: c_pointer
     INTEGER, OPTIONAL              :: errno
 
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newjuliandelta(sign,day, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 1, C_ASSOCIATED(c_pointer))
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 1 * 100 + 1
     CALL c_f_POINTER(c_pointer, ret_juliandelta)
   END FUNCTION newJuliandelta
   !
@@ -140,7 +142,7 @@ CONTAINS
   !! @brief destructor for a Julian delta
   SUBROUTINE deallocateJuliandelta(my_juliandelta) !OK-TESTED.
     TYPE(juliandelta), POINTER :: my_juliandelta
-    CALL my_deallocatejuliandelta(C_LOC(my_juliandelta))
+    CALL my_deallocatejuliandelta(c_LOC(my_juliandelta))
     my_juliandelta => NULL()
   END SUBROUTINE deallocateJuliandelta
   !
@@ -167,13 +169,13 @@ MODULE mtime_julianday
   PUBLIC :: juliandayToString
   PUBLIC :: ASSIGNMENT(=)
   PUBLIC :: OPERATOR(+)
-  PUBLIC :: OPERATOR(-)
+  PUBLIC :: OPERATOR(-)  
   PUBLIC :: OPERATOR(>)
   PUBLIC :: OPERATOR(<)
   PUBLIC :: OPERATOR(<=)
   PUBLIC :: OPERATOR(>=)
   PUBLIC :: OPERATOR(==)
-  PUBLIC :: OPERATOR(/=)
+  PUBLIC :: OPERATOR(/=)  
   !
   INTERFACE ASSIGNMENT (=)
     MODULE PROCEDURE replacejulianday
@@ -185,7 +187,7 @@ MODULE mtime_julianday
   END INTERFACE OPERATOR (+)
   !
   INTERFACE OPERATOR (-)
-    MODULE PROCEDURE subtractjuliandayfromjulianday
+    MODULE PROCEDURE substractjuliandayfromjulianday
   END INTERFACE OPERATOR (-)
   !
   INTERFACE OPERATOR (>)
@@ -227,9 +229,10 @@ CONTAINS
     INTEGER(c_int64_t), INTENT(in) :: ms
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newjulianday(day, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_julianday)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 1 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_julianday)
   END FUNCTION newJulianday
   !
   !>
@@ -238,7 +241,7 @@ CONTAINS
   !! @param     my_julianday   a pointer of type(julianday)
   SUBROUTINE deallocateJulianday(my_julianday) !OK-TESTED.
     TYPE(julianday), POINTER :: my_julianday
-    CALL my_deallocatejulianday(C_LOC(my_julianday))
+    CALL my_deallocatejulianday(c_LOC(my_julianday))
     my_julianday => NULL()
   END SUBROUTINE deallocateJulianday
   !
@@ -247,7 +250,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(inout) :: dest
     TYPE(julianday), TARGET, INTENT(in) :: src
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_replacejulianday(C_LOC(src), C_LOC(dest))
+    dummy_ptr = my_replacejulianday(c_LOC(src), c_LOC(dest))
   END SUBROUTINE replacejulianday
   !
   !>
@@ -262,8 +265,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_juliandaytostring(C_LOC(my_julianday), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 3, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_juliandaytostring(c_LOC(my_julianday), string)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 1 * 100 + 3
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -275,7 +279,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(juliandelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addjuliandeltatojulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addjuliandeltatojulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addJuliandeltaToJulianday
   !
   FUNCTION addJuliandayToJuliandelta(op2, op1) RESULT(ret)
@@ -283,23 +287,23 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(juliandelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addjuliandeltatojulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addjuliandeltatojulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addJuliandayToJuliandelta
   !
-  FUNCTION subtractJuliandayFromJulianday(op1, op2) RESULT(ret)
+  FUNCTION substractJuliandayFromJulianday(op1, op2) RESULT(ret)
     TYPE(juliandelta), TARGET :: ret
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_subtractjulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret))
-  END FUNCTION subtractJuliandayFromJulianday
+    dummy_ptr = my_substractjulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret))
+  END FUNCTION substractJuliandayFromJulianday
   !
   FUNCTION julianday_gt(op1, op2) RESULT(gt)
     LOGICAL :: gt
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF (ret == 1) THEN
       gt = .TRUE.
     ELSE
@@ -312,7 +316,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF (ret == -1) THEN
       lt = .TRUE.
     ELSE
@@ -325,7 +329,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF ((ret == 0) .OR. (ret == -1)) THEN
       lt_or_eq = .TRUE.
     ELSE
@@ -338,7 +342,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF ((ret == 0) .OR. (ret == 1)) THEN
       gt_or_eq = .TRUE.
     ELSE
@@ -351,7 +355,7 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF (ret == 0) THEN
       eq = .TRUE.
     ELSE
@@ -364,14 +368,14 @@ CONTAINS
     TYPE(julianday), TARGET, INTENT(in) :: op1
     TYPE(julianday), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparejulianday(C_LOC(op1), C_LOC(op2))
+    ret = my_comparejulianday(c_LOC(op1), c_LOC(op2))
     IF (ret /= 0) THEN
       ne = .TRUE.
     ELSE
       ne = .FALSE.
     ENDIF
   END FUNCTION julianday_ne
-  !
+  !  
 END MODULE mtime_julianday
 !>
 !! @brief Date and some operations supported on Date.
@@ -382,7 +386,7 @@ END MODULE mtime_julianday
 MODULE mtime_date
   !
   USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_int64_t, c_char, c_ptr, c_null_char, &
-      &                                  c_loc, c_f_pointer, c_associated
+                                       & c_loc, c_f_pointer, c_associated
   USE mtime_c_bindings
   USE mtime_constants
   USE mtime_error_handling
@@ -419,9 +423,10 @@ CONTAINS
     CHARACTER(len=*), INTENT(in) :: string
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL :: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newdatefromstring(TRIM(ADJUSTL(string))//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_date)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_date)
   END FUNCTION newdatefromstring
   !>
   !! @brief construct a new date from raw date
@@ -437,9 +442,10 @@ CONTAINS
     INTEGER(c_int), INTENT(in) :: month, day
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newrawdate(year, month, day)
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 2, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_date)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 2
+    CALL c_f_POINTER(c_pointer, ret_date)
   END FUNCTION newdatefromraw_yi8
   !>
   !! @brief construct a new date from raw date
@@ -454,9 +460,10 @@ CONTAINS
     INTEGER(c_int), INTENT(in) :: year, month, day
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newrawdate(INT(year,c_int64_t), month, day)
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 3, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_date)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 3
+    CALL c_f_POINTER(c_pointer, ret_date)
   END FUNCTION newdatefromraw
   !>
   !! @brief construct a new date from an existing by construct and copy
@@ -469,9 +476,10 @@ CONTAINS
     TYPE(date), TARGET :: src
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
-    c_pointer = my_constructandcopydate(C_LOC(src))
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 4, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, dest)
+    IF (PRESENT(errno)) errno = 0
+    c_pointer = my_constructandcopydate(c_LOC(src))
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 4
+    CALL c_f_POINTER(c_pointer, dest)
   END FUNCTION newdatefromconstructandcopy
   !>
   !! @brief destructor for a date
@@ -479,7 +487,7 @@ CONTAINS
   !! @param[in] my_date        a pointer of type(date)
   SUBROUTINE deallocateDate(my_date) !OK-TESTED.
     TYPE(date), POINTER :: my_date
-    CALL my_deallocatedate(C_LOC(my_date))
+    CALL my_deallocatedate(c_LOC(my_date))
     my_date => NULL()
   END SUBROUTINE deallocateDate
   !>
@@ -493,8 +501,9 @@ CONTAINS
     TYPE(date), TARGET, INTENT(in) :: src
     TYPE(c_ptr) :: dummy_ptr
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_replacedate(C_LOC(src), C_LOC(dest))
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 6, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_replacedate(c_LOC(src), c_LOC(dest))
+    IF ((.NOT. c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 6
   END SUBROUTINE replaceDate
   !>
   !! @brief Get Date as an extended string.
@@ -515,8 +524,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_datetostring(C_LOC(my_date), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 7, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_datetostring(c_LOC(my_date), string)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 7
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -544,8 +554,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_datetoposixstring(C_LOC(my_date), string, fmtstr)
-    IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 8, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_datetoposixstring(c_LOC(my_date), string, fmtstr)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 8
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -595,9 +606,10 @@ CONTAINS
     CHARACTER(len=*), INTENT(in) :: string
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newtimefromstring(TRIM(ADJUSTL(string))//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_time)
+    IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_time)
   END FUNCTION newtimefromstring
   !
   !! @param[out]       errno       optional, error message
@@ -606,9 +618,10 @@ CONTAINS
     INTEGER(c_int), INTENT(in) :: hour, minute, second, ms
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newrawtime(hour, minute, second, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 2, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_time)
+    IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 2
+    CALL c_f_POINTER(c_pointer, ret_time)
   END FUNCTION newtimefromraw
   !
   !! @param[out]       errno       optional, error message
@@ -617,9 +630,10 @@ CONTAINS
     TYPE(time), TARGET :: src
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
-    c_pointer = my_constructandcopytime(C_LOC(src))
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 3, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, dest)
+    IF (PRESENT(errno)) errno = 0
+    c_pointer = my_constructandcopytime(c_LOC(src))
+    IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 3
+    CALL c_f_POINTER(c_pointer, dest)
   END FUNCTION newtimefromconstructandcopy
   !>
   !! @brief Destructor of Time.
@@ -628,7 +642,7 @@ CONTAINS
   !!         A pointer to type time. my_time is deallocated.
   SUBROUTINE deallocateTime(my_time) !OK-TESTED.
     TYPE(time), POINTER :: my_time
-    CALL my_deallocatetime(C_LOC(my_time))
+    CALL my_deallocatetime(c_LOC(my_time))
     my_time => NULL()
   END SUBROUTINE deallocateTime
   !>
@@ -648,8 +662,9 @@ CONTAINS
     TYPE(time), TARGET, INTENT(inout) :: dest
     TYPE(c_ptr) :: dummy_ptr
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_replacetime(C_LOC(src), C_LOC(dest))
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 5, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_replacetime(c_LOC(src), c_LOC(dest))
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 5
   END SUBROUTINE replaceTime
   !>
   !! @brief Get time as an extended string.
@@ -669,8 +684,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_timetostring(C_LOC(my_time), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 6, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_timetostring(c_LOC(my_time), string)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 6
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -696,8 +712,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_timetoposixstring(C_LOC(my_time), string, fmtstr)
-    IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 7, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_timetoposixstring(c_LOC(my_time), string, fmtstr)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 7
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -805,9 +822,10 @@ CONTAINS
     CHARACTER(len=*), INTENT(in) :: string
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newdatetime(TRIM(ADJUSTL(string))//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_datetime)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_datetime)
   END FUNCTION newdatetimefromstring
   !
   !! @param[out]       errno       optional, error message
@@ -817,9 +835,10 @@ CONTAINS
     INTEGER(c_int), INTENT(in) :: month, day, hour, minute, second, ms
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newrawdatetime(year, month, day, hour, minute, second, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 2, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_datetime)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 2
+    CALL c_f_POINTER(c_pointer, ret_datetime)
   END FUNCTION newdatetimefromraw_yi8
   !
   !! @param[out]       errno       optional, error message
@@ -828,9 +847,10 @@ CONTAINS
     INTEGER(c_int), INTENT(in) :: year, month, day, hour, minute, second, ms
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_newrawdatetime(INT(year,c_int64_t), month, day, hour, minute, second, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 3, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_datetime)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 3
+    CALL c_f_POINTER(c_pointer, ret_datetime)
   END FUNCTION newdatetimefromraw
   !
   !! @param[out]       errno       optional, error message
@@ -839,9 +859,10 @@ CONTAINS
     TYPE(datetime), TARGET :: src
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
-    c_pointer = my_constructandcopydatetime(C_LOC(src))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 4, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, dest)
+    IF (PRESENT(errno)) errno = 0
+    c_pointer = my_constructandcopydatetime(c_LOC(src))
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 4
+    CALL c_f_POINTER(c_pointer, dest)
   END FUNCTION newdatetimefromconstructandcopy
 
 
@@ -884,7 +905,7 @@ CONTAINS
   !!         A pointer to type datetime. my_datetime is deallocated.
   SUBROUTINE deallocateDatetime(my_datetime) !OK-TESTED.
     TYPE(datetime), POINTER :: my_datetime
-    CALL my_deallocatedatetime(C_LOC(my_datetime))
+    CALL my_deallocatedatetime(c_LOC(my_datetime))
     NULLIFY(my_datetime)
   END SUBROUTINE deallocateDatetime
   !>
@@ -905,9 +926,10 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_datetimetostring(C_LOC(my_datetime), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 6, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_datetimetostring(c_LOC(my_datetime), string)
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 4 * 100 + 6
       string ='<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -938,8 +960,9 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_datetimetoposixstring(C_LOC(my_datetime), string, fmtstr)
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 7, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_datetimetoposixstring(c_LOC(my_datetime), string, fmtstr)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 7
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -951,7 +974,7 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(inout) :: dest
     TYPE(datetime), TARGET, INTENT(in) :: src
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_replacedatetime(C_LOC(src), C_LOC(dest))
+    dummy_ptr = my_replacedatetime(c_LOC(src), c_LOC(dest))
   END SUBROUTINE replacedatetime
   !
   FUNCTION datetime_gt(op1, op2) RESULT(gt) !OK-TESTED.
@@ -959,8 +982,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    gt = (ret == 1_c_int)
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF (ret == 1) THEN
+      gt = .TRUE.
+    ELSE
+      gt = .FALSE.
+    ENDIF
   END FUNCTION datetime_gt
   !
   FUNCTION datetime_lt(op1, op2) RESULT(lt) !OK-TESTED.
@@ -968,8 +995,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    lt = (ret == -1_c_int)
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF (ret == -1) THEN
+      lt = .TRUE.
+    ELSE
+      lt = .FALSE.
+    ENDIF
   END FUNCTION datetime_lt
   !
   FUNCTION datetime_lt_or_eq(op1, op2) RESULT(lt_or_eq) !OK-TESTED.
@@ -977,8 +1008,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    lt_or_eq = (ret == 0_c_int) .OR. (ret == -1_c_int)
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF ((ret == 0) .OR. (ret == -1)) THEN
+      lt_or_eq = .TRUE.
+    ELSE
+      lt_or_eq = .FALSE.
+    ENDIF
   END FUNCTION datetime_lt_or_eq
   !
   FUNCTION datetime_gt_or_eq(op1, op2) RESULT(gt_or_eq) !OK-TESTED
@@ -986,8 +1021,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    gt_or_eq = (ret == 0_c_int) .OR. (ret == 1_c_int)
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF ((ret == 0) .OR. (ret == 1)) THEN
+      gt_or_eq = .TRUE.
+    ELSE
+      gt_or_eq = .FALSE.
+    ENDIF
   END FUNCTION datetime_gt_or_eq
   !
   FUNCTION datetime_eq(op1, op2) RESULT(eq) !OK-TESTED.
@@ -995,8 +1034,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    eq = ret == 0_c_int
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF (ret == 0) THEN
+      eq = .TRUE.
+    ELSE
+      eq = .FALSE.
+    ENDIF
   END FUNCTION datetime_eq
   !
   FUNCTION datetime_ne(op1, op2) RESULT(ne) !OK-TESTED.
@@ -1004,8 +1047,12 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(datetime), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparedatetime(C_LOC(op1), C_LOC(op2))
-    ne = ret /= 0_c_int
+    ret = my_comparedatetime(c_LOC(op1), c_LOC(op2))
+    IF (ret /= 0) THEN
+      ne = .TRUE.
+    ELSE
+      ne = .FALSE.
+    ENDIF
   END FUNCTION datetime_ne
   !>
   !! @brief Get nod (number of Days) in the month of DateTime.
@@ -1027,8 +1074,9 @@ CONTAINS
     TYPE(datetime), TARGET :: dt
     INTEGER(c_int) :: getNoOfDaysInMonthDateTime
     INTEGER, OPTIONAL:: errno
-    getNoOfDaysInMonthDateTime = my_getnoofdaysinmonthdatetime(C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 15, getNoOfDaysInMonthDateTime /= 0)
+    IF (PRESENT(errno)) errno = 0
+    getNoOfDaysInMonthDateTime = my_getnoofdaysinmonthdatetime(c_LOC(dt))
+    IF (getNoOfDaysInMonthDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 15
   END FUNCTION getNoOfDaysInMonthDateTime
   !>
   !! @brief Get number of days in the Year of DateTime.
@@ -1049,8 +1097,9 @@ CONTAINS
     TYPE(datetime), TARGET :: dt
     INTEGER(c_int) :: getNoOfDaysInYearDateTime
     INTEGER, OPTIONAL:: errno
-    getNoOfDaysInYearDateTime = my_getnoofdaysinyeardatetime(C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 16, getNoOfDaysInYearDateTime /= 0)
+    IF (PRESENT(errno)) errno = 0
+    getNoOfDaysInYearDateTime = my_getnoofdaysinyeardatetime(c_LOC(dt))
+    IF (getNoOfDaysInYearDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 16
   END FUNCTION getNoOfDaysInYearDateTime
   !>
   !! @brief Get the 'day-of-year' value of a DateTime.
@@ -1072,8 +1121,9 @@ CONTAINS
     TYPE(datetime), TARGET :: dt
     INTEGER(c_int) :: getDayOfYearFromDateTime
     INTEGER, OPTIONAL:: errno
-    getDayOfYearFromDateTime = my_getdayofyearfromdatetime(C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 17, getDayOfYearFromDateTime /= 0)
+    IF (PRESENT(errno)) errno = 0
+    getDayOfYearFromDateTime = my_getdayofyearfromdatetime(c_LOC(dt))
+    IF (getDayOfYearFromDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 17
   END FUNCTION getDayOfYearFromDateTime
   !>
   !! @brief Get number of seconds elapsed in the month of DateTime.
@@ -1089,8 +1139,9 @@ CONTAINS
     TYPE(datetime), TARGET :: dt
     INTEGER(c_int64_t) :: getNoOfSecondsElapsedInMonthDateTime
     INTEGER, OPTIONAL:: errno
-    getNoOfSecondsElapsedInMonthDateTime = my_getnoofsecondselapsedinmonthdatetime(C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0,  4 * 100 + 18, getNoOfSecondsElapsedInMonthDateTime /= -1)
+    IF (PRESENT(errno)) errno = 0
+    getNoOfSecondsElapsedInMonthDateTime = my_getnoofsecondselapsedinmonthdatetime(c_LOC(dt))
+    IF (getNoOfSecondsElapsedInMonthDateTime == -1 .AND. PRESENT(errno)) errno = 4 * 100 + 18
   END FUNCTION getNoOfSecondsElapsedInMonthDateTime
   !>
   !! @brief Get number of seconds elapsed in the day of DateTime.
@@ -1106,8 +1157,9 @@ CONTAINS
     TYPE(datetime), TARGET :: dt
     INTEGER(c_int) :: getNoOfSecondsElapsedInDayDateTime
     INTEGER, OPTIONAL:: errno
-    getNoOfSecondsElapsedInDayDateTime = my_getnoofsecondselapsedindaydatetime(C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 19, getNoOfSecondsElapsedInDayDateTime /= -1)
+    IF (PRESENT(errno)) errno = 0
+    getNoOfSecondsElapsedInDayDateTime = my_getnoofsecondselapsedindaydatetime(c_LOC(dt))
+    IF (getNoOfSecondsElapsedInDayDateTime == -1 .AND. PRESENT(errno)) errno = 4 * 100 + 19
   END FUNCTION getNoOfSecondsElapsedInDayDateTime
   !>
   !! @brief Get the Julian Day from DateTime.
@@ -1127,8 +1179,9 @@ CONTAINS
     TYPE(julianday), TARGET :: jd
     TYPE(c_ptr) :: dummy_ptr
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_getjuliandayfromdatetime(C_LOC(dt), C_LOC(jd))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 20, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_getjuliandayfromdatetime(c_LOC(dt), c_LOC(jd))
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 20
   END SUBROUTINE getJulianDayFromDatetime
   !>
   !! @brief Get the DateTime from Julian Day.
@@ -1148,8 +1201,9 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(out) :: dt
     TYPE(c_ptr) :: dummy_ptr
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_getdatetimefromjulianday(C_LOC(jd), C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 21, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_getdatetimefromjulianday(c_LOC(jd), c_LOC(dt))
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 21
   END SUBROUTINE getDatetimeFromJulianDay
   !
 END MODULE mtime_datetime
@@ -1177,7 +1231,7 @@ MODULE mtime_timedelta
   !
   IMPLICIT NONE
   !
-!  PRIVATE
+!  private
   !
   PUBLIC :: divisionquotienttimespan
   PUBLIC :: newTimedelta
@@ -1238,27 +1292,27 @@ MODULE mtime_timedelta
   END INTERFACE OPERATOR (*)
   !
   INTERFACE OPERATOR (>)
-    MODULE PROCEDURE timedelta_gt
+  MODULE PROCEDURE timedelta_gt
   END INTERFACE OPERATOR (>)
   !
   INTERFACE OPERATOR (<)
-    MODULE PROCEDURE timedelta_lt
+  MODULE PROCEDURE timedelta_lt
   END INTERFACE OPERATOR (<)
   !
   INTERFACE OPERATOR (<=)
-    MODULE PROCEDURE timedelta_lt_or_eq
+  MODULE PROCEDURE timedelta_lt_or_eq
   END INTERFACE OPERATOR (<=)
   !
   INTERFACE OPERATOR (>=)
-    MODULE PROCEDURE timedelta_gt_or_eq
+  MODULE PROCEDURE timedelta_gt_or_eq
   END INTERFACE OPERATOR (>=)
   !
   INTERFACE OPERATOR (==)
-    MODULE PROCEDURE timedelta_eq
+  MODULE PROCEDURE timedelta_eq
   END INTERFACE OPERATOR (==)
   !
   INTERFACE OPERATOR (/=)
-    MODULE PROCEDURE timedelta_ne
+  MODULE PROCEDURE timedelta_ne
   END INTERFACE OPERATOR (/=)
   !
   INTERFACE getPTStringFromSeconds
@@ -1275,12 +1329,13 @@ CONTAINS
     CHARACTER(len=*), INTENT(in) :: string
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
+    ret_timedelta => NULL()
     c_pointer = my_newtimedeltafromstring(TRIM(ADJUSTL(string))//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 1, C_ASSOCIATED(c_pointer))
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_timedelta)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) THEN
+      errno = 5 * 100 + 1
     ELSE
-      NULLIFY(ret_timedelta)
+      CALL c_f_POINTER(c_pointer, ret_timedelta)
     ENDIF
   END FUNCTION newtimedeltafromstring
   !
@@ -1292,14 +1347,11 @@ CONTAINS
     TYPE(c_ptr) :: c_pointer
     CHARACTER(c_char) ::c_sign
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_sign = SIGN(1:1)
     c_pointer = my_newrawtimedelta(c_sign, INT(year,c_int64_t), month, day, hour, minute, second, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 2, C_ASSOCIATED(c_pointer))
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_timedelta)
-    ELSE
-      NULLIFY(ret_timedelta)
-    END IF
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 2
+    CALL c_f_POINTER(c_pointer, ret_timedelta)
   END FUNCTION newtimedeltafromraw
   !
   !! @param[out]       errno       optional, error message
@@ -1311,14 +1363,11 @@ CONTAINS
     TYPE(c_ptr) :: c_pointer
     CHARACTER(c_char) ::c_sign
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_sign = SIGN(1:1)
     c_pointer = my_newrawtimedelta(c_sign, year, month, day, hour, minute, second, ms)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 3, C_ASSOCIATED(c_pointer))
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_timedelta)
-    ELSE
-      NULLIFY(ret_timedelta)
-    END IF
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 3
+    CALL c_f_POINTER(c_pointer, ret_timedelta)
   END FUNCTION newtimedeltafromraw_yi8
   !
   !! @param[out]       errno       optional, error message
@@ -1327,13 +1376,10 @@ CONTAINS
     TYPE(timedelta), TARGET :: src
     TYPE(c_ptr) :: c_pointer
     INTEGER, OPTIONAL:: errno
-    c_pointer = my_constructandcopytimedelta(C_LOC(src))
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 4, C_ASSOCIATED(c_pointer))
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, dest)
-    ELSE
-      NULLIFY(dest)
-    END IF
+    IF (PRESENT(errno)) errno = 0
+    c_pointer = my_constructandcopytimedelta(c_LOC(src))
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 4
+    CALL c_f_POINTER(c_pointer, dest)
   END FUNCTION newtimedeltafromconstructandcopy
   !>
   !! @brief Destructor of TimeDelta.
@@ -1342,7 +1388,7 @@ CONTAINS
   !!         A pointer to typetimedelta. my_timedelta is deallocated.
   SUBROUTINE deallocateTimedelta(my_timedelta) !OK-TESTED.
     TYPE(timedelta), POINTER :: my_timedelta
-    CALL my_deallocatetimedelta(C_LOC(my_timedelta))
+    CALL my_deallocatetimedelta(c_LOC(my_timedelta))
     NULLIFY(my_timedelta)
   END SUBROUTINE deallocateTimedelta
   !
@@ -1351,8 +1397,12 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    gt = ret == 1_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF (ret == 1) THEN
+      gt = .TRUE.
+    ELSE
+      gt = .FALSE.
+    ENDIF
   END FUNCTION timedelta_gt
   !
   FUNCTION timedelta_lt(op1, op2) RESULT(lt)
@@ -1360,8 +1410,12 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    lt = ret == -1_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF (ret == -1) THEN
+      lt = .TRUE.
+    ELSE
+      lt = .FALSE.
+    ENDIF
   END FUNCTION timedelta_lt
   !
   FUNCTION timedelta_lt_or_eq(op1, op2) RESULT(lt_or_eq)
@@ -1369,8 +1423,12 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    lt_or_eq = ret == 0_c_int .OR. ret == -1_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF ((ret == 0) .OR. (ret == -1)) THEN
+      lt_or_eq = .TRUE.
+    ELSE
+      lt_or_eq = .FALSE.
+    ENDIF
   END FUNCTION timedelta_lt_or_eq
   !
   FUNCTION timedelta_gt_or_eq(op1, op2) RESULT(gt_or_eq)
@@ -1378,8 +1436,12 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    gt_or_eq = ret == 0_c_int .OR. ret == 1_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF ((ret == 0) .OR. (ret == 1)) THEN
+      gt_or_eq = .TRUE.
+    ELSE
+      gt_or_eq = .FALSE.
+    ENDIF
   END FUNCTION timedelta_gt_or_eq
   !
   FUNCTION timedelta_eq(op1, op2) RESULT(eq)
@@ -1387,8 +1449,12 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    eq = ret == 0_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF (ret == 0) THEN
+      eq = .TRUE.
+    ELSE
+      eq = .FALSE.
+    ENDIF
   END FUNCTION timedelta_eq
   !
   FUNCTION timedelta_ne(op1, op2) RESULT(ne)
@@ -1396,13 +1462,17 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     INTEGER(c_int) :: ret
-    ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2))
-    ne = ret /= 0_c_int
+    ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2))
+    IF (ret /= 0) THEN
+      ne = .TRUE.
+    ELSE
+      ne = .FALSE.
+    ENDIF
   END FUNCTION timedelta_ne
   !>
   !! @brief Get the TimeDelta between two Dates op1 and op2 as (op1-op22).
   !!
-  !! Routine getTimeDeltaFromDate 'subtracts' two Dates and returns the TimeDelta between
+  !! Routine getTimeDeltaFromDate 'substracts' two Dates and returns the TimeDelta between
   !! them. Internally, Dates are converted to DateTimes and then delta is calculated using
   !! getTimeDeltaFromDateTime().
   !!
@@ -1419,18 +1489,18 @@ CONTAINS
   !!         A pointer to type date.
   !!
   !! @return ret
-  !!         A pointer to TimeDelta containing the result of subtraction.
+  !!         A pointer to TimeDelta containing the result of substraction.
   FUNCTION getTimeDeltaFromDate(op1,op2) RESULT(ret) !OK-TESTED.
     TYPE(timedelta), TARGET :: ret
     TYPE(date), TARGET, INTENT(in)  :: op1, op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_gettimedeltafromdate(C_LOC(op1),C_LOC(op2),C_LOC(ret))
+    dummy_ptr = my_gettimedeltafromdate(c_LOC(op1),c_LOC(op2),c_LOC(ret))
   END FUNCTION getTimeDeltaFromDate
   !>
   !! @brief Get the TimeDelta between two DateTimes op1 and op2 as (op1-op2).
   !!
-  !! Routine getTimeDeltaFromDateTime 'subtracts' two DateTime's and returns the TimeDelta between
-  !! them. Each datetime is converted to an equivalent Julian Date. Subtraction is then performed
+  !! Routine getTimeDeltaFromDateTime 'substracts' two DateTime's and returns the TimeDelta between
+  !! them. Each datetime is converted to an equivalent Julian Date. Substraction is then performed
   !! on Julian axis. The "Julian delta" is finally converted back to normal calendar delta.
   !!
   !! This routine handles all supported Calendar types; i.e. the translation from Calendar date
@@ -1447,12 +1517,12 @@ CONTAINS
   !!         A pointer to type datetime.
   !!
   !! @return ret
-  !!        A pointer to TimeDelta containing the result of subtraction.
+  !!        A pointer to TimeDelta containing the result of substraction.
   FUNCTION getTimeDeltaFromDateTime(op1,op2) RESULT(ret) !OK-TESTED.
     TYPE(timedelta), TARGET :: ret
     TYPE(datetime), TARGET, INTENT(in) :: op1, op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_gettimedeltafromdatetime(C_LOC(op1),C_LOC(op2),C_LOC(ret))
+    dummy_ptr = my_gettimedeltafromdatetime(c_LOC(op1),c_LOC(op2),c_LOC(ret))
   END FUNCTION getTimeDeltaFromDateTime
   !>
   !! @brief Get total number of milliseconds in timedelta.
@@ -1480,8 +1550,9 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in):: td
     TYPE(datetime), TARGET, INTENT(in) :: dt
     INTEGER, OPTIONAL:: errno
-    getTotalMilliSecondsTimeDelta = my_gettotalmillisecondstimedelta(C_LOC(td), C_LOC(dt))
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 8, getTotalMilliSecondsTimeDelta /= 0)
+    IF (PRESENT(errno)) errno = 0
+    getTotalMilliSecondsTimeDelta = my_gettotalmillisecondstimedelta(c_LOC(td), c_LOC(dt))
+    IF ((getTotalMilliSecondsTimeDelta == 0) .AND. PRESENT(errno)) errno = 5 * 100 + 8
   END FUNCTION getTotalMilliSecondsTimeDelta
   !>
   !! @brief Get total number of seconds in timedelta.
@@ -1510,7 +1581,7 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: dt
     INTEGER, OPTIONAL:: errno
     IF (PRESENT(errno)) errno = 0
-    getTotalSecondsTimeDelta = my_gettotalsecondstimedelta(C_LOC(td), C_LOC(dt))
+    getTotalSecondsTimeDelta = my_gettotalsecondstimedelta(c_LOC(td), c_LOC(dt))
     ! error handling with "errno" not yet implemented.
   END FUNCTION getTotalSecondsTimeDelta
   !>
@@ -1531,10 +1602,11 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    string = ''
-    dummy_ptr = my_timedeltatostring(C_LOC(my_timedelta), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 10, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (PRESENT(errno)) errno = 0
+    string(:) = ''
+    dummy_ptr = my_timedeltatostring(c_LOC(my_timedelta), string)
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 10
       string ='<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1549,7 +1621,7 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addtimedeltatodatetime(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addtimedeltatodatetime(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addTimedeltaToDatetime
   !
   FUNCTION addDatetimeToTimedelta(op2, op1) RESULT(ret) !OK-TESTED.
@@ -1557,7 +1629,7 @@ CONTAINS
     TYPE(datetime), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addtimedeltatodatetime(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addtimedeltatodatetime(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addDatetimeToTimedelta
   !
   FUNCTION addTimedeltaToDate(op1, op2) RESULT(ret) !OK-TESTED.
@@ -1565,7 +1637,7 @@ CONTAINS
     TYPE(date), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addtimedeltatodate(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addtimedeltatodate(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addTimedeltaToDate
   !
   FUNCTION addDateToTimedelta(op2, op1) RESULT(ret) !OK-TESTED.
@@ -1573,7 +1645,7 @@ CONTAINS
     TYPE(date), TARGET, INTENT(in) :: op1
     TYPE(timedelta), TARGET, INTENT(in) :: op2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_addtimedeltatodate(C_LOC(op1), C_LOC(op2), C_LOC(ret))
+    dummy_ptr = my_addtimedeltatodate(c_LOC(op1), c_LOC(op2), c_LOC(ret))
   END FUNCTION addDateToTimedelta
   !
   FUNCTION elementwiseScalarMultiplyTimeDelta(base_td, ilambda) RESULT(scaled_td) !OK-TESTED.
@@ -1583,7 +1655,7 @@ CONTAINS
     INTEGER(c_int64_t) :: lambda
     TYPE(c_ptr) :: dummy_ptr
     lambda = INT(ilambda, c_int64_t)
-    dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td))
+    dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td))
   END FUNCTION elementwiseScalarMultiplyTimeDelta
   !
   FUNCTION elementwiseScalarMultiplyTimeDeltaInv(ilambda, base_td) RESULT(scaled_td) !OK-TESTED.
@@ -1593,7 +1665,7 @@ CONTAINS
     INTEGER(c_int64_t) :: lambda
     TYPE(c_ptr) :: dummy_ptr
     lambda = INT(ilambda, c_int64_t)
-    dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td))
+    dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td))
   END FUNCTION elementwiseScalarMultiplyTimeDeltaInv
   !
   FUNCTION elementwiseScalarMultiplyTimeDelta_long(base_td, lambda) RESULT(scaled_td) !OK-TESTED.
@@ -1601,7 +1673,7 @@ CONTAINS
     INTEGER(c_int64_t), INTENT(in) :: lambda
     TYPE(timedelta), TARGET, INTENT(in) :: base_td
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td))
+    dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td))
   END FUNCTION elementwiseScalarMultiplyTimeDelta_long
   !
   FUNCTION elementwiseScalarMultiplyTimeDeltaInv_long(lambda, base_td) RESULT(scaled_td) !OK-TESTED.
@@ -1609,7 +1681,7 @@ CONTAINS
     INTEGER(c_int64_t), INTENT(in) :: lambda
     TYPE(timedelta), TARGET, INTENT(in) :: base_td
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td))
+    dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td))
   END FUNCTION elementwiseScalarMultiplyTimeDeltaInv_long
   !
   FUNCTION elementwisescalarmultiplytimedelta_real(base_td, lambda) RESULT(scaled_td) !OK-TESTED.
@@ -1617,14 +1689,14 @@ CONTAINS
     REAL(c_double), INTENT(in) :: lambda
     TYPE(timedelta), TARGET, INTENT(in) :: base_td
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_elementwisescalarmultiplytimedeltadp(C_LOC(base_td), lambda, C_LOC(scaled_td))
+    dummy_ptr = my_elementwisescalarmultiplytimedeltadp(c_LOC(base_td), lambda, c_LOC(scaled_td))
   END FUNCTION elementwisescalarmultiplytimedelta_real
   !
   FUNCTION elementwiseAddTimeDeltatoTimeDelta(td1, td2) RESULT(added_td) !OK-TESTED.
     TYPE(timedelta), TARGET :: added_td
     TYPE(timedelta), TARGET, INTENT(in) :: td1, td2
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_elementwiseaddtimedeltatotimedelta(C_LOC(td1), C_LOC(td2), C_LOC(added_td))
+    dummy_ptr = my_elementwiseaddtimedeltatotimedelta(c_LOC(td1), c_LOC(td2), c_LOC(added_td))
   END FUNCTION elementwiseAddTimeDeltatoTimeDelta
   !>
   !! @brief Returns modulo(a,p) and the quotient.
@@ -1645,7 +1717,7 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: p
     INTEGER(c_int64_t), TARGET, INTENT(out) :: quot
     INTEGER(c_int64_t) :: rem
-    rem = my_modulotimedelta(C_LOC(a), C_LOC(p), C_LOC(quot))
+    rem = my_modulotimedelta(c_LOC(a), c_LOC(p), c_LOC(quot))
   END FUNCTION moduloTimedelta
   !>
   !! @brief Return a PT String corresponding to arbitrary number of milliseconds.
@@ -1665,10 +1737,11 @@ CONTAINS
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     string(:) = ''
     dummy_ptr = my_getptstringfromms(ms, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1685,9 +1758,10 @@ CONTAINS
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
     string(:) = ''
+    IF (PRESENT(errno)) errno = 0
     dummy_ptr = my_getptstringfromsecondsint(s, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1704,9 +1778,10 @@ CONTAINS
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
     string(:) = ''
+    IF (PRESENT(errno)) errno = 0
     dummy_ptr = my_getptstringfromsecondsfloat(s, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1723,9 +1798,10 @@ CONTAINS
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
     string(:) = ''
+    IF (PRESENT(errno)) errno = 0
     dummy_ptr = my_getptstringfromsecondsdouble(s, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1753,9 +1829,10 @@ CONTAINS
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
     string(:) = ''
+    IF (PRESENT(errno)) errno = 0
     dummy_ptr = my_getptstringfromminutes(m, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1783,9 +1860,10 @@ CONTAINS
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
     string(:) = ''
+    IF (PRESENT(errno)) errno = 0
     dummy_ptr = my_getptstringfromhours(h, string)
-    IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr))
-    IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN
+      IF (PRESENT(errno)) errno = 5 * 100 + 11
       string = '<null>'
     ELSE
       char_loop: DO i = 1 , LEN(string)
@@ -1803,7 +1881,7 @@ CONTAINS
     TYPE(timedelta), TARGET, INTENT(in) :: td
     TYPE(datetime),  TARGET, INTENT(in) :: dt
     TYPE(juliandelta),  TARGET, INTENT(out) :: jd
-    dummy_ptr = my_timedeltatojuliandelta(C_LOC(td),C_LOC(dt),C_LOC(jd))
+    dummy_ptr = my_timedeltatojuliandelta(c_LOC(td),c_LOC(dt),c_LOC(jd))
   END SUBROUTINE timeDeltaToJulianDelta
 
   !>
@@ -1825,8 +1903,8 @@ CONTAINS
     INTEGER, INTENT(out), OPTIONAL :: errna
     TYPE(c_ptr) :: dummy_ptr
     IF (PRESENT(errna)) errna = 0 ! FIXME: no_error
-    dummy_ptr = my_dividetimedeltainseconds(C_LOC(dividend), C_LOC(divisor), C_LOC(quotient))
-    IF (PRESENT(errna) .AND. .NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    dummy_ptr = my_dividetimedeltainseconds(c_LOC(dividend), c_LOC(divisor), c_LOC(quotient))
+    IF (PRESENT(errna) .AND. .NOT. c_ASSOCIATED(dummy_ptr)) THEN
       errna = errna + 2  ! increment error number by 2, see below for an explanation.
     ENDIF
   END SUBROUTINE divideTimeDeltaInSeconds
@@ -1850,9 +1928,9 @@ CONTAINS
     INTEGER(c_int64_t), TARGET, INTENT(out) :: denominator
     TYPE(divisionquotienttimespan), TARGET, INTENT(out) :: quotient
     TYPE(c_ptr) :: dummy_ptr
-    dummy_ptr = my_dividetwodatetimediffsinseconds(C_LOC(dt1_dividend), C_LOC(dt2_dividend),  &
-        &                                                C_LOC(dt1_divisor), C_LOC(dt2_divisor),  &
-        &                                                C_LOC(denominator), C_LOC(quotient))
+    dummy_ptr = my_dividetwodatetimediffsinseconds(c_LOC(dt1_dividend), c_LOC(dt2_dividend),  &
+        &                                                c_LOC(dt1_divisor), c_LOC(dt2_divisor),  &
+        &                                                c_LOC(denominator), c_LOC(quotient))
   END SUBROUTINE divideTwoDatetimeDiffsInSeconds
 
   !>
@@ -1880,8 +1958,8 @@ CONTAINS
     INTEGER, INTENT(out), OPTIONAL :: errna
     TYPE(c_ptr) :: dummy_ptr
     IF (PRESENT(errna)) errna = 0 ! FIXME: no_error
-    dummy_ptr = my_dividedatetimedifferenceinseconds(C_LOC(dt1), C_LOC(dt2), C_LOC(divisor), C_LOC(quotient))
-    IF (PRESENT(errna) .AND. .NOT. C_ASSOCIATED(dummy_ptr)) THEN
+    dummy_ptr = my_dividedatetimedifferenceinseconds(c_LOC(dt1), c_LOC(dt2), c_LOC(divisor), c_LOC(quotient))
+    IF (PRESENT(errna) .AND. .NOT. c_ASSOCIATED(dummy_ptr)) THEN
       errna = errna + 2  ! increment error number by 2, see below for an explanation.
     ENDIF
   END SUBROUTINE divideDatetimeDifferenceInSeconds
@@ -1949,46 +2027,51 @@ CONTAINS
     CHARACTER(len=*), INTENT(in)           :: firstDate
     CHARACTER(len=*), INTENT(in)           :: lastDate
     CHARACTER(len=*), INTENT(in)           :: interval
-    CHARACTER(len=*), TARGET, INTENT(in), OPTIONAL :: offset
-    CHARACTER(len=5), SAVE, TARGET :: zeroOffset = "PT00S" !Optional offset's proxy string.
+    CHARACTER(len=*), INTENT(in), OPTIONAL :: offset
+    CHARACTER(len=32)                      :: zeroOffset = "PT00S" !Optional offset's proxy string.
     TYPE(c_ptr) :: c_pointer
-    CHARACTER(len=:), POINTER :: offset_arg
     INTEGER, OPTIONAL:: errno
-    IF(PRESENT(offset)) THEN
-      offset_arg => offset(VERIFY(offset, " "):len_TRIM(offset))
-    ELSE
-      offset_arg => zeroOffset
-    END IF
-    c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char,          &
+    IF (PRESENT(errno)) errno = 0
+    IF(PRESENT(offset)) THEN !offset is not null.
+         c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char,          &
          &                  TRIM(ADJUSTL(referenceDate))//c_null_char,      &
          &                  TRIM(ADJUSTL(firstDate))//c_null_char,          &
          &                  TRIM(ADJUSTL(lastDate))//c_null_char,           &
          &                  TRIM(ADJUSTL(interval))//c_null_char,           &
-         &                  offset_arg//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_event)
+         &                  TRIM(ADJUSTL(offset))//c_null_char)
+    ELSE                     !offset is null. Pass a 0 offset.
+         c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char,    &
+         &                  TRIM(ADJUSTL(referenceDate))//c_null_char,      &
+         &                  TRIM(ADJUSTL(firstDate))//c_null_char,          &
+         &                  TRIM(ADJUSTL(lastDate))//c_null_char,           &
+         &                  TRIM(ADJUSTL(interval))//c_null_char,           &
+         &                  TRIM(ADJUSTL(zeroOffset))//c_null_char)
+    END IF
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_event)
   END FUNCTION newEventWithString
   !
   !! @param[out]       errno       optional, error message
   FUNCTION newEventWithDataTypes(name, referenceDate, firstdate, lastDate, interval, offset, errno) RESULT(ret_event) !OK-TESTED.
     TYPE(event), POINTER :: ret_event
     CHARACTER(len=*), INTENT(in) :: name
-    TYPE(datetime), TARGET, INTENT(in) :: referenceDate
-    TYPE(datetime), TARGET, INTENT(in) :: firstDate
-    TYPE(datetime), TARGET, INTENT(in) :: lastDate
-    TYPE(timedelta), TARGET, INTENT(in) :: interval
-    TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: offset
-    TYPE(c_ptr) :: c_pointer, offset_c
-    INTEGER, OPTIONAL, INTENT(out) :: errno
+    TYPE(datetime), POINTER :: referenceDate
+    TYPE(datetime), POINTER :: firstDate
+    TYPE(datetime), POINTER :: lastDate
+    TYPE(timedelta), POINTER :: interval
+    TYPE(timedelta), POINTER, OPTIONAL :: offset
+    TYPE(c_ptr) :: c_pointer
+    INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     IF (PRESENT(offset)) THEN
-      offset_c = C_LOC(offset)
+    c_pointer = my_neweventwithdatatypes(TRIM(ADJUSTL(name))//c_null_char, &
+         &                  c_LOC(referenceDate), c_LOC(firstDate), c_LOC(lastDate), c_LOC(interval), c_LOC(offset))
     ELSE
-      offset_c = c_null_ptr
-    END IF
     c_pointer = my_neweventwithdatatypes(TRIM(ADJUSTL(name))//c_null_char, &
-         &                  C_LOC(referenceDate), C_LOC(firstDate), C_LOC(lastDate), C_LOC(interval), offset_c)
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_event)
+         &                  c_LOC(referenceDate), c_LOC(firstDate), c_LOC(lastDate), c_LOC(interval), c_null_ptr)
+    END IF
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_event)
   END FUNCTION newEventWithDataTypes
   !>
   !! @brief Destructor of Event.
@@ -2000,37 +2083,39 @@ CONTAINS
   !! use removeEventFromEventGroup instead.
   SUBROUTINE deallocateEvent(my_event)
     TYPE(event), POINTER :: my_event
-    CALL my_deallocateevent(C_LOC(my_event))
+    CALL my_deallocateevent(c_LOC(my_event))
     my_event => NULL()
   END SUBROUTINE deallocateEvent
   !>
   FUNCTION constructAndCopyEvent(my_event, errno) RESULT(ret_event) !OK-TESTED.
     TYPE(event), POINTER :: ret_event
-    TYPE(event), TARGET, INTENT(in) :: my_event
-    INTEGER, OPTIONAL, INTENT(out) :: errno
+    TYPE(event), TARGET  :: my_event
+    INTEGER, OPTIONAL:: errno
     TYPE(c_ptr) :: c_pointer
-    c_pointer = my_constructandcopyevent(C_LOC(my_event))
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_event)
+    IF (PRESENT(errno)) errno = 0
+    c_pointer = my_constructandcopyevent(c_LOC(my_event))
+    IF ((.NOT. C_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_event)
   END FUNCTION constructAndCopyEvent
   !>
   !! @brief Get Event as a string.
   !!
   !! @param[in]  my_event
-  !!         A variable of type event. The event to be converted to string.
+  !!         A pointer to type event. The event to be converted to string.
   !!
   !! @param[out]  string
   !!         String where event is to be written.
   !!
   !! @param[out]       errno       optional, error message
   SUBROUTINE eventToString(my_event, string, errno) !TODO:C code still incomplete.
-    TYPE(event), TARGET, INTENT(in) :: my_event
-    CHARACTER(len=max_eventname_str_len), INTENT(out) :: string
+    TYPE(event), POINTER :: my_event
+    CHARACTER(len=max_eventname_str_len) :: string
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
-    INTEGER, OPTIONAL, INTENT(out) :: errno
-    dummy_ptr = my_eventtostring(C_LOC(my_event), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 3, C_ASSOCIATED(dummy_ptr))
+    INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_eventtostring(c_LOC(my_event), string)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 3
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -2050,40 +2135,44 @@ CONTAINS
   !!        application at fixed intervals.
   !!
   !! @param  my_event
-  !!         A variable of type event. This is the event being tested.
+  !!         A pointer to type event. This is the event being tested.
   !!
   !! @param  my_datetime
-  !!         A variable of type datetime. This is the 'current' datetime of the system.
+  !!         A pointer to type datetime. This is the 'current' datetime of the system.
   !!
   !! @param  plus_slack
-  !!         A variable of type timedelta. Events are triggered between [actual_trigger_time, actual_trigger_time + plus_slack].
+  !!         A pointer to type timedelta. Events are triggered between [actual_trigger_time, actual_trigger_time + plus_slack].
   !!         Sign MUST be '+'
   !!
   !! @param  minus_slack
-  !!         A variable of type timedelta. Events are triggered between [actual_trigger_time - minus_slack, actual_trigger_time].
+  !!         A pointer to type timedelta. Events are triggered between [actual_trigger_time - minus_slack, actual_trigger_time].
   !!         Sign MUST be '+'
   !!
   !! @return ret
   !!        true/false indicating if the event is active.
   FUNCTION isCurrentEventActive(my_event, my_datetime, plus_slack, minus_slack) RESULT(ret)
-    TYPE(event), TARGET, INTENT(in) :: my_event
-    TYPE(datetime), TARGET, INTENT(in) :: my_datetime
-    TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: plus_slack
-    TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: minus_slack
-    TYPE(c_ptr) :: plus_slack_c, minus_slack_c
+    TYPE(event), POINTER :: my_event
+    TYPE(datetime), TARGET :: my_datetime
+    TYPE(timedelta), POINTER, OPTIONAL :: plus_slack
+    TYPE(timedelta), POINTER, OPTIONAL :: minus_slack
     LOGICAL(c_bool) :: ret
-    IF (PRESENT(plus_slack)) THEN
-      plus_slack_c = C_LOC(plus_slack)
-    ELSE
-      plus_slack_c = c_null_ptr
-    END IF
-    IF (PRESENT(minus_slack)) THEN
-      minus_slack_c = C_LOC(minus_slack)
+    IF (PRESENT(plus_slack) .AND. PRESENT(minus_slack)) THEN
+      ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), &
+            &                   c_LOC(plus_slack),  c_LOC(minus_slack))
+
+    ELSE IF (PRESENT(plus_slack) .AND. .NOT.PRESENT(minus_slack)) THEN
+      ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), &
+            &                           c_LOC(plus_slack),  c_null_ptr)
+
+    ELSE IF (.NOT.PRESENT(plus_slack) .AND. PRESENT(minus_slack)) THEN
+      ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), &
+            &                          c_null_ptr,  c_LOC(minus_slack))
+
     ELSE
-      minus_slack_c = c_null_ptr
+      ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), &
+            &                                   c_null_ptr, c_null_ptr)
+
     END IF
-    ret = my_isCurrentEventActive(C_LOC(my_event), C_LOC(my_datetime), &
-         &                        plus_slack_c, minus_slack_c)
   END FUNCTION isCurrentEventActive
   !>
   !! @brief Checks, if next event is on a new day
@@ -2094,35 +2183,35 @@ CONTAINS
   !! @returns ret
   !!        Logical: true if next event is on new day
   FUNCTION isEventNextInNextDay(my_event) RESULT(ret)
-    TYPE(event), TARGET, INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_iseventnextinnextday(C_LOC(my_event))
+    ret = my_iseventnextinnextday(c_LOC(my_event))
   END FUNCTION isEventNextInNextDay
   !>
   !! @brief Checks, if next event is in a new month
   !!
   !! @param[in] my_event
-  !!        A variable of type event
+  !!        A pointer to a type event
   !!
   !! @returns ret
   !!        Logical: true if next event is in a new month
   FUNCTION iseventNextInNextMonth(my_event) RESULT(ret)
-    TYPE(event), TARGET, INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_iseventnextinnextmonth(C_LOC(my_event))
+    ret = my_iseventnextinnextmonth(c_LOC(my_event))
   END FUNCTION iseventNextInNextMonth
   !>
   !! @brief Checks, if next event is in a new year
   !!
   !! @param[in] my_event
-  !!        A variable of type event
+  !!        A pointer to a type event
   !!
   !! @returns ret
   !!        Logical: true if next event is in a new year
   FUNCTION iseventNextInNextYear(my_event) RESULT(ret)
-    TYPE(event), TARGET, INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_iseventnextinnextyear(C_LOC(my_event))
+    ret = my_iseventnextinnextyear(c_LOC(my_event))
   END FUNCTION iseventNextInNextYear
   !>
   !! @brief Get the Datetime when 'this' event will be triggered next.
@@ -2132,23 +2221,24 @@ CONTAINS
   !!          data structure.
   !!
   !! @param[in] my_event
-  !!         A variable of type event. This is the event being queried.
+  !!         A pointer to type event. This is the event being queried.
   !!
   !! @param[in]  my_currentdatetime
-  !!         A variable of type datetime. The next trigger datetime is copied here.
+  !!         A pointer to type datetime. The next trigger datetime is copied here.
   !!
   !! @param[out] my_datetime
-  !!         A variable of type datetime with next-trigger datetime.
+  !!         A pointer to type datetime with next-trigger datetime.
   !!
   !! @param[out]       errno       optional, error message
   SUBROUTINE getTriggerNextEventAtDateTime(my_event,my_currentdatetime,my_datetime, errno)
     TYPE(event), TARGET, INTENT(in) :: my_event
     TYPE(datetime), TARGET, INTENT(in) :: my_currentdatetime
-    TYPE(datetime), TARGET, INTENT(out) :: my_datetime
+    TYPE(datetime), TARGET :: my_datetime
     TYPE(c_ptr) :: dummy_ptr
-    INTEGER, OPTIONAL, INTENT(out) :: errno
-    dummy_ptr = my_gettriggernexteventatdatetime(C_LOC(my_event),C_LOC(my_currentdatetime),C_LOC(my_datetime))
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 8, C_ASSOCIATED(dummy_ptr))
+    INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_gettriggernexteventatdatetime(c_LOC(my_event),c_LOC(my_currentdatetime),c_LOC(my_datetime))
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 8
   END SUBROUTINE getTriggerNextEventAtDateTime
   !>
   !! @brief Get the Datetime when 'this' event will be triggered last.
@@ -2160,16 +2250,17 @@ CONTAINS
   !!         A pointer to type event. This is the event being queried.
   !!
   !! @param[out] my_datetime
-  !!         A variable of type datetime with last-trigger datetime.
+  !!         A pointer to type datetime with last-trigger datetime.
   !!
   !! @param[out]       errno       optional, error message
   SUBROUTINE getTriggeredPreviousEventAtDateTime(my_event,my_datetime,errno)
     TYPE(event), TARGET, INTENT(in) :: my_event
-    TYPE(datetime), TARGET, INTENT(out) :: my_datetime
+    TYPE(datetime), TARGET :: my_datetime
     TYPE(c_ptr) :: dummy_ptr
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_gettriggeredpreviouseventatdatetime(C_LOC(my_event),C_LOC(my_datetime))
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 9, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_gettriggeredpreviouseventatdatetime(c_LOC(my_event),c_LOC(my_datetime))
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 9
   END SUBROUTINE getTriggeredPreviousEventAtDateTime
   !>
   !! @brief get the event id
@@ -2195,13 +2286,14 @@ CONTAINS
   !!
   !! @param[out]       errno       optional, error message
   SUBROUTINE getEventName(my_event, string, errno) !OK-TESTED.
-    TYPE(event), TARGET, INTENT(in) :: my_event
-    CHARACTER(len=max_eventname_str_len), INTENT(out) :: string
+    TYPE(event), POINTER :: my_event
+    CHARACTER(len=max_eventname_str_len) :: string
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL :: errno
-    dummy_ptr = my_geteventname(C_LOC(my_event), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 11, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_geteventname(c_LOC(my_event), string)
+    IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 11
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -2211,18 +2303,18 @@ CONTAINS
   !! @brief get the event reference date
   !!
   !! @param[in] my_event
-  !!        A variable of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret_referenceDateTime
   !!        A pointer of type datetime. The event's reference date.
   !!
   FUNCTION getEventReferenceDateTime(my_event) RESULT(ret_referenceDateTime) !OK-TESTED.
     TYPE(datetime), POINTER :: ret_referenceDateTime
-    TYPE(event), INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_event%eventReferenceDatetime
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_referenceDateTime)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_referenceDateTime)
     ELSE
       ret_referenceDateTime => NULL()
     ENDIF
@@ -2231,18 +2323,18 @@ CONTAINS
   !! @brief get the event first date
   !!
   !! @param[in] my_event
-  !!        A variable of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret_eventFirstDateTime
   !!        A pointer of type datetime. The event's first date.
   !!
   FUNCTION getEventFirstDateTime(my_event) RESULT(ret_eventFirstDateTime) !OK-TESTED.
     TYPE(datetime), POINTER :: ret_eventFirstDateTime
-    TYPE(event), INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_event%eventFirstDateTime
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_eventFirstDateTime)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_eventFirstDateTime)
     ELSE
       ret_eventFirstDateTime => NULL()
     ENDIF
@@ -2251,18 +2343,18 @@ CONTAINS
   !! @brief get the event last date
   !!
   !! @param[in] my_event
-  !!        A variable of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret_eventLastDateTime
   !!        A pointer of type datetime. The event's last date.
   !!
   FUNCTION getEventLastDateTime(my_event) RESULT(ret_eventLastDateTime) !OK-TESTED.
     TYPE(datetime), POINTER :: ret_eventLastDateTime
-    TYPE(event), INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_event%eventLastDateTime
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_eventLastDateTime)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_eventLastDateTime)
     ELSE
       ret_eventLastDateTime => NULL()
     ENDIF
@@ -2271,18 +2363,18 @@ CONTAINS
   !! @brief get the event interval
   !!
   !! @param[in] my_event
-  !!        A variable of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret_eventInterval
   !!        A pointer of type timedelta. The event's last date.
   !!
   FUNCTION getEventInterval(my_event) RESULT(ret_eventInterval) !OK-TESTED.
     TYPE(timedelta), POINTER :: ret_eventInterval
-    TYPE(event), INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_event%eventInterval
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_eventInterval)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_eventInterval)
     ELSE
       ret_eventInterval => NULL()
     ENDIF
@@ -2291,7 +2383,7 @@ CONTAINS
   !! @brief Check if event is first
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is first
@@ -2299,13 +2391,13 @@ CONTAINS
   FUNCTION getNextEventIsFirst(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_getnexteventisfirst(C_LOC(my_event))
+    ret = my_getnexteventisfirst(c_LOC(my_event))
   END FUNCTION getNextEventIsFirst
   !>
   !! @brief Check if event is first in day
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is first in day
@@ -2313,13 +2405,13 @@ CONTAINS
   FUNCTION getEventisFirstInDay(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventisfirstinday(C_LOC(my_event))
+    ret = my_geteventisfirstinday(c_LOC(my_event))
   END FUNCTION getEventisFirstInDay
   !>
   !! @brief Check if event is first in month
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is first in month
@@ -2327,13 +2419,13 @@ CONTAINS
   FUNCTION getEventisFirstInMonth(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventisfirstinmonth(C_LOC(my_event))
+    ret = my_geteventisfirstinmonth(c_LOC(my_event))
   END FUNCTION getEventisFirstInMonth
   !>
   !! @brief Check if event is first in year
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is first in year
@@ -2341,13 +2433,13 @@ CONTAINS
   FUNCTION getEventisFirstInYear(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventisfirstinyear(C_LOC(my_event))
+    ret = my_geteventisfirstinyear(c_LOC(my_event))
   END FUNCTION getEventisFirstInYear
   !>
   !! @brief Check if event is last in day
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is last in day
@@ -2356,13 +2448,13 @@ CONTAINS
   FUNCTION getEventisLastInDay(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventislastinday(C_LOC(my_event))
+    ret = my_geteventislastinday(c_LOC(my_event))
   END FUNCTION getEventisLastInDay
   !>
   !! @brief Check if event is last in month
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is last in month
@@ -2370,13 +2462,13 @@ CONTAINS
   FUNCTION getEventisLastInMonth(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventislastinmonth(C_LOC(my_event))
+    ret = my_geteventislastinmonth(c_LOC(my_event))
   END FUNCTION getEventisLastInMonth
   !>
   !! @brief Check if event is last in year
   !!
   !! @param[in] my_event
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @returns ret
   !!        Logical: true if event is last in year
@@ -2384,7 +2476,7 @@ CONTAINS
   FUNCTION getEventisLastInYear(my_event) RESULT(ret)
     TYPE(event), TARGET, INTENT(in) :: my_event
     LOGICAL(c_bool) :: ret
-    ret = my_geteventislastinyear(C_LOC(my_event))
+    ret = my_geteventislastinyear(c_LOC(my_event))
   END FUNCTION getEventisLastInYear
   !
 END MODULE mtime_events
@@ -2439,10 +2531,11 @@ CONTAINS
     TYPE(eventgroup), POINTER :: ret_eventgroup
     CHARACTER(len=*), INTENT(in) :: name
     TYPE(c_ptr) :: c_pointer
-    INTEGER, OPTIONAL, INTENT(out):: errno
+    INTEGER, OPTIONAL:: errno
+    IF (PRESENT(errno)) errno = 0
     c_pointer = my_neweventgroup(TRIM(ADJUSTL(name))//c_null_char)
-    IF (PRESENT(errno)) errno = MERGE(0, 7 * 100 + 1, C_ASSOCIATED(c_pointer))
-    CALL C_F_POINTER(c_pointer, ret_eventgroup)
+    IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 7 * 100 + 1
+    CALL c_f_POINTER(c_pointer, ret_eventgroup)
   END FUNCTION newEventGroup
   !>
   !! @brief Destructor of EventGroup.
@@ -2452,25 +2545,25 @@ CONTAINS
   !!
   SUBROUTINE deallocateEventGroup(my_eventgroup) !OK-TESTED.
     TYPE(eventgroup), POINTER :: my_eventgroup
-    CALL my_deallocateeventgroup(C_LOC(my_eventgroup))
+    CALL my_deallocateeventgroup(c_LOC(my_eventgroup))
     my_eventgroup => NULL()
   END SUBROUTINE deallocateEventGroup
   !>
   !! @brief Add new event to an eventgroup.
   !!
   !! @param  my_event
-  !!         A reference to type event. The event to be added.
+  !!         A pointer to type event. The event to be added.
   !!
   !! @param  my_eventgroup
-  !!         A reference to type eventgroup. The eventgroup where the event is added.
+  !!         A pointer to type eventgroup. The eventgroup where the event is added.
   !!
   !! @return ret
   !!         true/false indicating success or failure of addition.
   FUNCTION addEventToEventGroup(my_event, my_eventgroup) RESULT(ret) !OK-TESTED.
     LOGICAL :: ret
-    TYPE(event), TARGET, INTENT(in) :: my_event
-    TYPE(eventgroup), TARGET, INTENT(inout) :: my_eventgroup
-    ret = my_addeventtoeventgroup(C_LOC(my_event), C_LOC(my_eventgroup))
+    TYPE(event), POINTER :: my_event
+    TYPE(eventgroup), POINTER :: my_eventgroup
+    ret = my_addeventtoeventgroup(c_LOC(my_event), c_LOC(my_eventgroup))
   END FUNCTION addEventToEventGroup
   !>
   !! @brief Remove event from eventgroup. CRITICAL: Also, deallocate the event.
@@ -2479,46 +2572,47 @@ CONTAINS
   !!         The name of event to be removed.
   !!
   !! @param  my_eventgroup
-  !!         A reference to  type eventgroup. The eventgroup to which this event belongs.
+  !!         A pointer to  type eventgroup. The eventgroup to which this event belongs.
   !!
   !! @return ret
   !!         true/false indicating success or failure of removal.
   FUNCTION removeEventfromEventGroup(my_name, my_eventgroup) RESULT(ret) !OK-TESTED.
     LOGICAL :: ret
     CHARACTER(len=*), INTENT(in) :: my_name
-    TYPE(eventgroup), TARGET, INTENT(inout) :: my_eventgroup
-    ret = my_removeeventfromeventgroup(TRIM(ADJUSTL(my_name))//c_null_char, C_LOC(my_eventgroup))
+    TYPE(eventgroup), POINTER :: my_eventgroup
+    ret = my_removeeventfromeventgroup(TRIM(ADJUSTL(my_name))//c_null_char, c_LOC(my_eventgroup))
   END FUNCTION removeEventFromEventGroup
   !>
   !! @brief Get event group id
   !!
   !! @param[in]  my_eventgroup
-  !!         A reference to  type eventgroup.
+  !!         A pointer to  type eventgroup.
   !!
   !! @return ret_grpid
   !!         The event group id
   FUNCTION getEventGroupId(my_eventgroup) RESULT(ret_grpid) !OK-TESTED.
     INTEGER(c_int64_t) :: ret_grpid
-    TYPE(eventgroup), INTENT(in) :: my_eventgroup
+    TYPE(eventgroup), POINTER :: my_eventgroup
     ret_grpid = my_eventgroup%eventGroupId
   END FUNCTION getEventGroupId
   !>
   !! @brief get the event group name
   !!
   !! @param[in] my_eventgroup
-  !!        A reference of type event.
+  !!        A pointer of type event.
   !!
   !! @param[out]       string      the name of the event group
   !!
   !! @param[out]       errno       optional, error message
   SUBROUTINE getEventGroupName(my_eventgroup, string, errno)  !TESTED-OK.
-    TYPE(eventgroup), TARGET, INTENT(in) :: my_eventgroup
+    TYPE(eventgroup), POINTER :: my_eventgroup
     CHARACTER(len=max_groupname_str_len) :: string
     TYPE(c_ptr) :: dummy_ptr
     INTEGER :: i
     INTEGER, OPTIONAL:: errno
-    dummy_ptr = my_geteventgroupname(C_LOC(my_eventgroup), string)
-    IF (PRESENT(errno)) errno = MERGE(0, 7 * 100 + 6, C_ASSOCIATED(dummy_ptr))
+    IF (PRESENT(errno)) errno = 0
+    dummy_ptr = my_geteventgroupname(c_LOC(my_eventgroup), string)
+    IF ((.NOT. c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 7 * 100 + 6
     char_loop: DO i = 1 , LEN(string)
       IF (string(i:i) == c_null_char) EXIT char_loop
     END DO char_loop
@@ -2534,11 +2628,11 @@ CONTAINS
   !!        A pointer of type event. The first event in eventgroup
   FUNCTION getFirstEventFromEventGroup(my_eventgroup) RESULT(ret_event) !OK-TESTED.
     TYPE(event), POINTER :: ret_event
-    TYPE(eventgroup), INTENT(in) :: my_eventgroup
+    TYPE(eventgroup), POINTER :: my_eventgroup
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_eventgroup%firstEventInGroup
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_event)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_event)
     ELSE
       ret_event => NULL()
     ENDIF
@@ -2553,11 +2647,11 @@ CONTAINS
   !!        A pointer of type event. The next event in eventgroup
   FUNCTION getNextEventFromEventGroup(my_event) RESULT(ret_event) !OK-TESTED.
     TYPE(event), POINTER :: ret_event
-    TYPE(event), INTENT(in) :: my_event
+    TYPE(event), POINTER :: my_event
     TYPE(c_ptr) :: c_pointer
     c_pointer = my_event%nextEventInGroup
-    IF (C_ASSOCIATED(c_pointer)) THEN
-      CALL C_F_POINTER(c_pointer, ret_event)
+    IF (c_ASSOCIATED(c_pointer)) THEN
+      CALL c_f_POINTER(c_pointer, ret_event)
     ELSE
       ret_event => NULL()
     ENDIF
@@ -2635,7 +2729,7 @@ CONTAINS
     CHARACTER(len=*), INTENT(in) :: recurringTimeInterval
     CHARACTER(len=*), INTENT(out) :: repetitor
     CHARACTER(len=*), INTENT(out) :: start
-    CHARACTER(len=*), INTENT(out) :: end
+    CHARACTER(len=*), INTENT(out) :: END
     CHARACTER(len=*), INTENT(out) :: duration
 
     LOGICAL, INTENT(out) :: lrepetitor
@@ -2645,34 +2739,39 @@ CONTAINS
 
     INTEGER :: i
 
+    lrepetitor = .FALSE.
+    lstart = .FALSE.
+    lend = .FALSE.
+    lduration = .FALSE.
+
     CALL my_splitRepetitionString(TRIM(ADJUSTL(recurringTimeInterval))//c_null_char, repetitor, start, END, duration)
 
-    lrepetitor = repetitor(1:1) /= c_null_char
+    IF (repetitor(1:1) /= c_null_char) lrepetitor = .TRUE.
     char_loop1: DO i = 1 , LEN(repetitor)
       IF (repetitor(i:i) == c_null_char) EXIT char_loop1
     END DO char_loop1
     repetitor(i:LEN(repetitor)) = ' '
 
-    lstart = start(1:1) /= c_null_char
+    IF (start(1:1) /= c_null_char) lstart = .TRUE.
     char_loop2: DO i = 1 , LEN(start)
       IF (start(i:i) == c_null_char) EXIT char_loop2
     END DO char_loop2
     start(i:LEN(start)) = ' '
 
-    lend = end(1:1) /= c_null_char
-    char_loop3: DO i = 1 , LEN(end)
-      IF (end(i:i) == c_null_char) EXIT char_loop3
+    IF (END(1:1) /= c_null_char) lend = .TRUE.
+    char_loop3: DO i = 1 , LEN(END)
+      IF (END(i:i) == c_null_char) EXIT char_loop3
     END DO char_loop3
-    end(i:LEN(end)) = ' '
+    END(i:LEN(END)) = ' '
 
-    lduration = duration(1:1) /= c_null_char
+    IF (duration(1:1) /= c_null_char) lduration = .TRUE.
     char_loop4: DO i = 1 , LEN(duration)
       IF (duration(i:i) == c_null_char) EXIT char_loop4
     END DO char_loop4
     duration(i:LEN(duration)) = ' '
 
   END SUBROUTINE splitRepetitionString
-!
+  !
 END MODULE mtime_utilities
 !>
 !! @}
diff --git a/src/mtime_c_bindings.f90 b/src/mtime_c_bindings.f90
index 09b413cb..a943119a 100644
--- a/src/mtime_c_bindings.f90
+++ b/src/mtime_c_bindings.f90
@@ -175,12 +175,12 @@ module mtime_c_bindings
       type(c_ptr), value :: my_julianday, my_juliandelta, ret_julianday
     end function my_addjuliandeltatojulianday
     !
-    function my_subtractjulianday(my_julianday1, my_julianday2, ret_juliandelta) result(juliandelta_ptr) &
-         &   bind(c, name='subtractJulianDay')
+    function my_substractjulianday(my_julianday1, my_julianday2, ret_juliandelta) result(juliandelta_ptr) &
+         &   bind(c, name='substractJulianDay')
       import :: c_ptr
       type(c_ptr) :: juliandelta_ptr
       type(c_ptr), value :: my_julianday1, my_julianday2, ret_juliandelta
-    end function my_subtractjulianday
+    end function my_substractjulianday
     !
   end interface
   !
@@ -808,6 +808,7 @@ contains
     integer, intent(IN) :: lineno
 
     character(LEN=*), intent(IN) :: routine_str
+    character(len=max_mtime_error_str_len)     :: error_str
     if (lcond)  call handle_errno_base(errno, routine_str, lineno)
   end subroutine handle_errno_cond
 
diff --git a/src/mtime_date.c b/src/mtime_date.c
index 34d228c0..c813076a 100644
--- a/src/mtime_date.c
+++ b/src/mtime_date.c
@@ -115,13 +115,21 @@ newDate(const char* ds)
 struct _date*
 newRawDate(int64_t _year, int _month, int _day)
 {
-  char ds[MAX_DATE_STR_LEN];
-  memset(ds, 0, sizeof(ds));
+  char* ds = (char*) calloc(MAX_DATE_STR_LEN, sizeof(char));
+  if (ds == NULL )
+    {
+      return NULL ;
+    }
 
   snprintf(ds, MAX_DATE_STR_LEN, "%" PRIi64 "-%02d-%02d", _year, _month, _day);
 
   /* Resuse string interface and create object. */
   struct _date* d = newDate(ds);
+
+  /* Cleanup. */
+  free(ds);
+  ds = NULL;
+
   return d;
 }
 
diff --git a/src/mtime_datetime.c b/src/mtime_datetime.c
index 414b2203..94d2dec4 100644
--- a/src/mtime_datetime.c
+++ b/src/mtime_datetime.c
@@ -73,27 +73,42 @@
 struct _datetime*
 newDateTime(const char* dts)
 {
-  struct _datetime *dt = NULL;
   if ((dts != NULL) && (getCalendarType()))
     {
       /* Intialize a dummy ISO8601 object. */
-      struct iso8601_datetime isoDt = { .sign_of_year = '+' };
+      struct iso8601_datetime* isoDt = new_iso8601_datetime('+', 0, 0, 0, 0, 0, 0, 0);
+      if (isoDt == NULL)
+        return NULL ;
 
       /* Check ISO8601 compliance. */
-      if (verify_string_datetime(dts, &isoDt) == DATETIME_MATCH
-          && (dt = (struct _datetime*)calloc(1,sizeof(struct _datetime)))
-          != NULL )
+      if (verify_string_datetime(dts, isoDt) != DATETIME_MATCH)
         {
-          dt->date.year     = isoDt.year;
-          dt->date.month    = isoDt.month;
-          dt->date.day      = isoDt.day;
-          dt->time.hour     = isoDt.hour;
-          dt->time.minute   = isoDt.minute;
-          dt->time.second   = isoDt.second;
-          dt->time.ms       = isoDt.ms;
+          deallocate_iso8601_datetime(isoDt);
+          return NULL ;
         }
+
+      struct _datetime *dt = (struct _datetime*)calloc(1,sizeof(struct _datetime));
+      if (dt == NULL )
+        {
+          deallocate_iso8601_datetime(isoDt);
+          return NULL ;
+        }
+
+      dt->date.year     = isoDt->year;
+      dt->date.month    = isoDt->month;
+      dt->date.day      = isoDt->day;
+      dt->time.hour     = isoDt->hour;
+      dt->time.minute   = isoDt->minute;
+      dt->time.second   = isoDt->second;
+      dt->time.ms       = isoDt->ms;
+
+      //Cleanup.        
+      deallocate_iso8601_datetime(isoDt);
+    
+      return dt;
     }
-  return dt;
+  else
+    return NULL ;
 }
 
 
@@ -122,8 +137,11 @@ newDateTime(const char* dts)
 struct _datetime*
 newRawDateTime(int64_t _year, int _month, int _day, int _hour, int _minute, int _second, int _ms)
 {
-  char dts[MAX_DATETIME_STR_LEN];
-  memset(dts, 0, sizeof(dts));
+  char* dts = (char*)calloc(MAX_DATETIME_STR_LEN, sizeof(char));
+  if (dts == NULL )
+    {
+      return NULL ;
+    }
 
   snprintf(dts, MAX_DATETIME_STR_LEN, "%" PRIi64 "-%02d-%02dT%02d:%02d:%02d.%03d", _year, _month, _day, _hour, _minute, _second,
       _ms);
@@ -131,6 +149,9 @@ newRawDateTime(int64_t _year, int _month, int _day, int _hour, int _minute, int
   /* Resuse string interface and create object. */
   struct _datetime* dt = newDateTime(dts);
 
+  free(dts);
+  dts = NULL;
+
   return dt;
 }
 
diff --git a/src/mtime_eventHandling.c b/src/mtime_eventHandling.c
index a0815f3b..fab1e42f 100644
--- a/src/mtime_eventHandling.c
+++ b/src/mtime_eventHandling.c
@@ -259,10 +259,10 @@ newEvent(const char* _en,
   e->eventsLastEvaluationDateTime = NULL;
 
   /* Start Date. */
-  // Default start date = "0-01-01T00:00:00.000".
-  e->eventFirstDateTime
-    = newDateTime(_eventFirstDT ? _eventFirstDT : initDummyDTString);
-
+  if (_eventFirstDT)
+    e->eventFirstDateTime = newDateTime(_eventFirstDT);
+  else
+    e->eventFirstDateTime = newDateTime(initDummyDTString); // Default start date = "0-01-01T00:00:00.000".
 
   if (e->eventFirstDateTime == NULL )
     goto cleanup_and_exit;
@@ -361,27 +361,31 @@ newEvent(const char* _en,
   return e;
 
   cleanup_and_exit:
-    if (e->eventName)
-      {
-        free(e->eventName);
-        e->eventName = NULL;
-      }
-    deallocateDateTime(e->eventReferenceDateTime);
-    e->eventReferenceDateTime = NULL;
-    deallocateDateTime(e->eventFirstDateTime);
-    e->eventFirstDateTime = NULL;
-    deallocateDateTime(e->eventLastDateTime);
-    e->eventLastDateTime = NULL;
-    deallocateTimeDelta(e->eventInterval);
-    e->eventInterval = NULL;
-    deallocateTimeDelta(e->eventOffset);
-    e->eventOffset = NULL;
-    deallocateDateTime(e->triggeredPreviousEventDateTime);
-    e->triggeredPreviousEventDateTime = NULL;
-    deallocateDateTime(e->triggerNextEventDateTime);
-    e->triggerNextEventDateTime = NULL;
-    free(e);
-    return NULL ;
+		if (e)
+		  {
+		    if (e->eventName)
+		      {
+			free(e->eventName);
+			e->eventName = NULL;
+		      }
+		    deallocateDateTime(e->eventReferenceDateTime);
+		    e->eventReferenceDateTime = NULL;
+		    deallocateDateTime(e->eventFirstDateTime);
+		    e->eventFirstDateTime = NULL;
+		    deallocateDateTime(e->eventLastDateTime);
+		    e->eventLastDateTime = NULL;
+		    deallocateTimeDelta(e->eventInterval);
+		    e->eventInterval = NULL;
+                    deallocateTimeDelta(e->eventOffset);
+                    e->eventOffset = NULL;
+		    deallocateDateTime(e->triggeredPreviousEventDateTime);
+		    e->triggeredPreviousEventDateTime = NULL;
+                    deallocateDateTime(e->triggerNextEventDateTime);
+                    e->triggerNextEventDateTime = NULL;
+		    free(e);
+		    e = NULL;
+		  }
+		return NULL ;
   }
   else
     return NULL;
@@ -662,35 +666,35 @@ isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNext
   int cmp_val_flag = -128;
 
   /* Make a local copy of slack to avoid updating the user supplied timedeltas. */
-  struct _timedelta minus_slack_local;
+  struct _timedelta* plus_slack_local  = NULL;
+  struct _timedelta* minus_slack_local = NULL;
+
+  if (plus_slack)
+          plus_slack_local  = constructAndCopyTimeDelta(plus_slack);
+  else
+          plus_slack_local  = newTimeDelta(initDummyTDString); //Translates to 0.
 
   if (minus_slack)
-    replaceTimeDelta(minus_slack, &minus_slack_local);
+          minus_slack_local = constructAndCopyTimeDelta(minus_slack);
+  else
+          minus_slack_local = newTimeDelta(initDummyTDString); //Translates to 0.
 
 
 
-  /* If plus_slack is defined, return the status of current_dt vis-a-vis trigger time +/- allowed delta.  */
-  if((!plus_slack || plus_slack->sign == '+')
-     && (!minus_slack || minus_slack->sign == '+'))
+  /* If plus_slack_local is defined, return the status of current_dt vis-a-vis trigger time +/- allowed delta.  */
+  if((plus_slack_local->sign == '+') && ((minus_slack_local->sign == '+')))
     {
       int upper_val_flag = -128;
       int lower_val_flag = -128;
 
-      struct _datetime dt_upperbound, dt_lowerbound, *pub, *plb;
-      if (plus_slack)
-        pub = addTimeDeltaToDateTime(triggerNextEventDateTime,plus_slack,&dt_upperbound);
-      else
-        pub = triggerNextEventDateTime;
-      upper_val_flag = compareDatetime(current_dt,pub);
+      struct _datetime *dt_upperbound              = newDateTime(initDummyDTString);
+      struct _datetime *dt_lowerbound              = newDateTime(initDummyDTString);
 
-      if (minus_slack)
-      {
-        minus_slack_local.sign = '-'; /* Change sign to obtain subtraction. */
-        plb = addTimeDeltaToDateTime(triggerNextEventDateTime,&minus_slack_local,&dt_lowerbound);
-      }
-      else
-        plb = triggerNextEventDateTime;
-      lower_val_flag = compareDatetime(current_dt,plb);
+      minus_slack_local->sign = '-'; /* Change sign to obtain substraction. */
+
+
+      upper_val_flag = compareDatetime(current_dt,addTimeDeltaToDateTime(triggerNextEventDateTime,plus_slack_local,dt_upperbound));
+      lower_val_flag = compareDatetime(current_dt,addTimeDeltaToDateTime(triggerNextEventDateTime,minus_slack_local,dt_lowerbound));
 
       if (
            (upper_val_flag == less_than || upper_val_flag == equal_to)
@@ -709,12 +713,18 @@ isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNext
           cmp_val_flag = less_than;
         }
 
+      //Cleaup.
+      deallocateDateTime(dt_upperbound);
+      deallocateDateTime(dt_lowerbound);
     }
   else /* If slack is malformed (negative sign is not permitted), return as normal (follow exact match for equal).  */
     {
       cmp_val_flag = compareDatetime(current_dt,triggerNextEventDateTime);
     }
 
+  deallocateTimeDelta(plus_slack_local);
+  deallocateTimeDelta(minus_slack_local);
+
   return cmp_val_flag;
 }
 
@@ -795,9 +805,11 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct
     if (isTriggerTimeInRange(current_dt, event->triggerNextEventDateTime, plus_slack, NULL) == greater_than)
       {
 	/* Get the first trigger time and update. */
-	struct _timedelta modulo_td;
-	moduloTimeDeltaFromDateTime(event->triggerNextEventDateTime, event->eventInterval, current_dt, &modulo_td);
-	addTimeDeltaToDateTime(current_dt,&modulo_td,event->triggerNextEventDateTime);
+	struct _timedelta* modulo_td = newTimeDelta(initDummyTDString);
+	moduloTimeDeltaFromDateTime(event->triggerNextEventDateTime, event->eventInterval, current_dt, modulo_td);
+	addTimeDeltaToDateTime(current_dt,modulo_td,event->triggerNextEventDateTime);
+	/* Cleanup. */
+	deallocateTimeDelta(modulo_td);
       }
 
     /* Check if trigger time is now. Trigger allowed with a slack provided [start-end] condition is met. */
@@ -824,7 +836,7 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct
 	replaceDatetime(current_dt, event->triggeredPreviousEventDateTime);
 
 	int cmp_val_flag = -128;
-	struct _datetime tmp_dt;
+	struct _datetime* tmp_dt = newDateTime(initDummyDTString);
 
 	/* Set the new next-trigger datetime. If eventLastDateTime is defined, then update should not happen
 	   if current_dt + eventInterval > eventLastDateTime */
@@ -832,7 +844,7 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct
             !( event->eventLastDateTime
                &&
                (
-		( cmp_val_flag = isTriggerTimeInRange ( addTimeDeltaToDateTime(current_dt, event->eventInterval,&tmp_dt),
+		( cmp_val_flag = isTriggerTimeInRange ( addTimeDeltaToDateTime(current_dt, event->eventInterval,tmp_dt),
 							event->eventLastDateTime,
 							NULL,
 							minus_slack
@@ -847,6 +859,8 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct
 	else
 	  event->lastEventWasFinal = true;
 
+	deallocateDateTime(tmp_dt); // Cleanup.
+
 	/* Set event.*/
 	event->triggerCurrentEvent = true;
 
@@ -914,11 +928,26 @@ iseventNextInNextDay(struct _event* e)
 {
   if( e != NULL )
     {
-      struct _date d_next, d_prev;
-      convertDateTimeToDate(e->triggerNextEventDateTime,&d_next);
-      convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev);
+      bool ret = false;
+
+      struct _date* d_next = newDate(initDummyDString);
+      struct _date* d_prev = newDate(initDummyDString);
+      d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next);
+      d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev);
 
-      return compareDate(&d_next,&d_prev) == greater_than;
+      if(compareDate(d_next,d_prev) == greater_than)
+	{
+	  ret = true;
+	}
+      else
+	{
+	  ret = false;
+	}
+
+      deallocateDate(d_next);
+      deallocateDate(d_prev);
+
+      return ret;
     }
   else
     return false;
@@ -931,14 +960,29 @@ iseventNextInNextMonth(struct _event* e)
 {
   if( e != NULL )
     {
-      struct _date d_next, d_prev;
-      convertDateTimeToDate(e->triggerNextEventDateTime,&d_next);
-      convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev);
+      bool ret = false;
+
+      struct _date* d_next = newDate(initDummyDString);
+      struct _date* d_prev = newDate(initDummyDString);
+      d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next);
+      d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev);
+
+      d_next->day = 1;
+      d_prev->day = 1;
+
+      if(compareDate(d_next,d_prev) == greater_than)
+	{
+	  ret = true;
+	}
+      else
+	{
+	  ret = false;
+	}
 
-      d_next.day = 1;
-      d_prev.day = 1;
+      deallocateDate(d_next);
+      deallocateDate(d_prev);
 
-      return compareDate(&d_next,&d_prev) == greater_than;
+      return ret;
     }
   else
     return false;
@@ -950,18 +994,33 @@ iseventNextInNextYear(struct _event* e)
 {
   if( e != NULL )
     {
-      struct _date d_next, d_prev;
-      convertDateTimeToDate(e->triggerNextEventDateTime,&d_next);
-      convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev);
+      bool ret = false;
 
-      d_next.day = 1;
-      d_next.month = 1;
+      struct _date* d_next = newDate(initDummyDString);
+      struct _date* d_prev = newDate(initDummyDString);
+      d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next);
+      d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev);
 
-      d_prev.day = 1;
-      d_prev.month = 1;
+      d_next->day = 1;
+      d_next->month = 1;
 
+      d_prev->day = 1;
+      d_prev->month = 1;
 
-      return compareDate(&d_next,&d_prev) == greater_than;
+
+      if(compareDate(d_next,d_prev) == greater_than)
+	{
+	  ret = true;
+	}
+      else
+      {
+	ret = false;
+      }
+
+      deallocateDate(d_next);
+      deallocateDate(d_prev);
+
+      return ret;
     }
   else
     return false;
@@ -1013,32 +1072,35 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time
   if ((start_dt != NULL) && (timestep != NULL) && (ref_dt != NULL) && (first_trigger_dt != NULL) ) //offset can be NULL.
     {
 
-      /* Get anchor. ref + offset is the real anchor. */
-      struct _datetime anchor;
-      memcpy(&anchor, ref_dt, sizeof (anchor));
-      addTimeDeltaToDateTime(ref_dt, offset, &anchor); // Note: If offset is null, no addition takes place.
-
       if (timestep->year != 0 && timestep->month == 0 && timestep->day == 0
           && timestep->hour == 0 && timestep->minute == 0 && timestep->second == 0 && timestep->ms == 0)
         {
           /* NOTE: years only is a trivial case. */
 
+          /* Get anchor. ref + offset is the real anchor. */
+          struct _datetime *anchor = constructAndCopyDateTime(ref_dt);
+          addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place.
 
-	  if (compareDatetime(&anchor, start_dt) == greater_than)
+	  if (compareDatetime(anchor, start_dt) == greater_than)
 	    {
-	      replaceDatetime(&anchor, first_trigger_dt);
+	      replaceDatetime(anchor, first_trigger_dt);
 	    }
 	  else
 	    {
 	      /* Determine difference between anchor and start year */
-	      int64_t differenceOfYears = start_dt->date.year - anchor.date.year; // result always >= 0.
+	      int64_t differenceOfYears = start_dt->date.year - anchor->date.year; // result always >= 0.
 	      int64_t yearsToAdd = differenceOfYears % timestep->year;
 
 	      /* We only need to update the year */
-	      replaceDatetime(&anchor, first_trigger_dt);
+	      replaceDatetime(anchor, first_trigger_dt);
 	      first_trigger_dt->date.year += yearsToAdd;
 	    }
 
+          /* Cleanup. */
+          deallocateDateTime(anchor);
+
+          /* And return. */
+          return first_trigger_dt;
         }
 
       else if (timestep->year == 0 && timestep->month != 0 && timestep->day == 0
@@ -1046,25 +1108,33 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time
         {
           /* NOTE: months only is again a trivial case. */
 
+          /* Get anchor. ref + offset is the real anchor. */
+          struct _datetime *anchor = constructAndCopyDateTime(ref_dt);
+          addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place.
 
-	  if (compareDatetime(&anchor, start_dt) == greater_than)
+	  if (compareDatetime(anchor, start_dt) == greater_than)
 	    {
-	      replaceDatetime(&anchor, first_trigger_dt);
+	      replaceDatetime(anchor, first_trigger_dt);
 	    }
 	  else
 	    {
 	      /* Determine difference between anchor and start in months */
-	      int differenceOfMonths = 12*(start_dt->date.year - anchor.date.year) + start_dt->date.month - anchor.date.month;
+	      int differenceOfMonths = 12*(start_dt->date.year - anchor->date.year) + start_dt->date.month - anchor->date.month;
 
 	      int yearsToAdd = differenceOfMonths / 12;
 	      int monthsToAdd = differenceOfMonths % timestep->month;
 
 	      /* We only need to update the year and month */
-	      replaceDatetime(&anchor, first_trigger_dt);
+	      replaceDatetime(anchor, first_trigger_dt);
 	      first_trigger_dt->date.year += yearsToAdd;
 	      first_trigger_dt->date.month += monthsToAdd;
 	    }
 
+          /* Cleanup. */
+          deallocateDateTime(anchor);
+
+          /* And return. */
+          return first_trigger_dt;
         }
 
       else if (timestep->year == 0 && timestep->month == 0)
@@ -1075,56 +1145,73 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time
              will be too slow and hence the ends justify the means.
           */
 
+          struct _timedelta* timestep_bkw;
+
           /* Get start date in julian. */
-          struct _julianday start_jd;
-          date2julian(start_dt, &start_jd);
+          struct _julianday* start_jd = newJulianDay(0, 0);
+          start_jd = date2julian(start_dt, start_jd);
 
 
           /* Get timedelta in juliandelta. */
-          struct _juliandelta timestep_jd;
-          timeDeltaToJulianDelta(timestep, ref_dt, &timestep_jd);
+          struct _juliandelta* timestep_jd = newJulianDelta('+', 0, 0);
+          timestep_jd = timeDeltaToJulianDelta(timestep, ref_dt, timestep_jd);
 
-          /* Get anchor in julian. */
-          struct _julianday anchor_jd;
-          date2julian(&anchor, &anchor_jd);
 
           /* For speed-up */
+          struct _juliandelta* timestep_fastfwd_jd = newJulianDelta('+', 0, 0);
+          struct _juliandelta* timestep_fastbkw_jd = newJulianDelta('+', 0, 0);
+
+
+          /* Get anchor. ref + offset is the real anchor. */
+          struct _datetime* anchor = constructAndCopyDateTime(ref_dt);
+          addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place.
+
+          /* Get anchor in julian. */
+          struct _julianday* anchor_jd = newJulianDay(0, 0);
+          anchor_jd = date2julian(anchor, anchor_jd);
+
           /* Optimization hack: Calculate an approx metric are_dates_too_far and speed up the jumps.  */
           int64_t are_dates_too_far = 0;
-          if (timestep_jd.day)
-            are_dates_too_far = (start_jd.day - anchor_jd.day)/(timestep_jd.day);
-          else if (timestep_jd.ms)
-            are_dates_too_far = (start_jd.day - anchor_jd.day)/((float)timestep_jd.ms/NO_OF_MS_IN_A_DAY);
+          if (timestep_jd->day)
+            are_dates_too_far = (start_jd->day - anchor_jd->day)/(timestep_jd->day);
+          else if (timestep_jd->ms)
+            are_dates_too_far = (start_jd->day - anchor_jd->day)/((float)timestep_jd->ms/NO_OF_MS_IN_A_DAY);
           //else ... well, should never happen. If it does, the initialized value of zero persists.
 
 
           int lambda = 1; //speed-up const. Default is 1 or no speedup.
-          if (are_dates_too_far > 10 || are_dates_too_far < -10)
+          if (are_dates_too_far>10 || are_dates_too_far<-10)
             lambda = 100000; //speed up if start-date and anchor are 'too-far' away.
 
 
           /* Fast-Fwd */
-          lldiv_t norm_fwd = lldiv(lambda*timestep_jd.ms, NO_OF_MS_IN_A_DAY);
-          struct _juliandelta timestep_fastfwd_jd;
-          timestep_fastfwd_jd.sign = '+';
-          timestep_fastfwd_jd.day = lambda*timestep_jd.day + norm_fwd.quot;
-          timestep_fastfwd_jd.ms = norm_fwd.rem;
+          timestep_fastfwd_jd->day = lambda*timestep_jd->day;
+          timestep_fastfwd_jd->ms  = lambda*timestep_jd->ms;
+
+          while( timestep_fastfwd_jd->ms >= NO_OF_MS_IN_A_DAY )
+            {
+              timestep_fastfwd_jd->day++;
+              timestep_fastfwd_jd->ms = timestep_fastfwd_jd->ms - NO_OF_MS_IN_A_DAY;
+            }
 
 
           /* We need to Loop backwards: Create a timestep replica and change the sign to negative to travel-back-in-time. */
-          struct _timedelta timestep_bkw;
-          memcpy(&timestep_bkw, timestep, sizeof (timestep_bkw));
-          timestep_bkw.sign = '-';
+          timestep_bkw = constructAndCopyTimeDelta(timestep);
+          timestep_bkw->sign = '-';
 
-          struct _juliandelta timestep_bkw_jd;
-          timeDeltaToJulianDelta(&timestep_bkw, ref_dt, &timestep_bkw_jd);
+          struct _juliandelta* timestep_bkw_jd = newJulianDelta('+', 0, 0);
+          timeDeltaToJulianDelta(timestep_bkw, ref_dt, timestep_bkw_jd);
 
           /* Fast-Bkwd */
-          lldiv_t norm_bkw = lldiv(lambda*timestep_bkw_jd.ms, NO_OF_MS_IN_A_DAY);
-          struct _juliandelta timestep_fastbkw_jd;
-          timestep_fastbkw_jd.sign = '+';
-          timestep_fastbkw_jd.day = lambda*timestep_bkw_jd.day + norm_bkw.quot;
-          timestep_fastbkw_jd.ms = norm_bkw.rem;
+          timestep_fastbkw_jd->day = lambda*timestep_bkw_jd->day;
+          timestep_fastbkw_jd->ms  = lambda*timestep_bkw_jd->ms;
+
+          while( timestep_fastbkw_jd->ms <=  (-1)*(NO_OF_MS_IN_A_DAY) )
+            {
+              timestep_fastbkw_jd->day--;
+              timestep_fastbkw_jd->ms = timestep_fastbkw_jd->ms + NO_OF_MS_IN_A_DAY;
+            }
+
 
           switch (compareDatetime(start_dt,ref_dt))
             {
@@ -1136,45 +1223,45 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time
                   /* Jump very fast and reach the start date quickly. */
                   do
                     {
-                      anchor_jd.day = anchor_jd.day + timestep_fastfwd_jd.day;
-                      anchor_jd.ms  = anchor_jd.ms  + timestep_fastfwd_jd.ms;
+                      anchor_jd->day = anchor_jd->day + timestep_fastfwd_jd->day;
+                      anchor_jd->ms  = anchor_jd->ms  + timestep_fastfwd_jd->ms;
 
-                      if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY)
+                      if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY)
                         {
-                          anchor_jd.day = anchor_jd.day + 1;
-                          anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY;
+                          anchor_jd->day = anchor_jd->day + 1;
+                          anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY;
                         }
 
-                    } while ( !((anchor_jd.day > start_jd.day)  ||  (anchor_jd.day == start_jd.day && anchor_jd.ms > start_jd.ms)) );
+                    } while ( !((anchor_jd->day > start_jd->day)  ||  (anchor_jd->day == start_jd->day && anchor_jd->ms > start_jd->ms)) );
 
 
                   /* But I jumped one time too much. Move back */
-                  anchor_jd.day = anchor_jd.day - timestep_fastfwd_jd.day;
-                  anchor_jd.ms  = anchor_jd.ms  - timestep_fastfwd_jd.ms;
+                  anchor_jd->day = anchor_jd->day - timestep_fastfwd_jd->day;
+                  anchor_jd->ms  = anchor_jd->ms  - timestep_fastfwd_jd->ms;
 
-                  if (anchor_jd.ms < 0)
+                  if (anchor_jd->ms < 0)
                     {
-                      anchor_jd.day = anchor_jd.day - 1;
-                      anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY;
+                      anchor_jd->day = anchor_jd->day - 1;
+                      anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY;
                     }
                 }
 
               /* I am close. Now determine the actual time. */
               do
                 {
-                  anchor_jd.day = anchor_jd.day + timestep_jd.day;
-                  anchor_jd.ms = anchor_jd.ms + timestep_jd.ms;
+                  anchor_jd->day = anchor_jd->day + timestep_jd->day;
+                  anchor_jd->ms = anchor_jd->ms + timestep_jd->ms;
 
-                  if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY)
+                  if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY)
                     {
-                      anchor_jd.day = anchor_jd.day + 1;
-                      anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY;
+                      anchor_jd->day = anchor_jd->day + 1;
+                      anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY;
                     }
 
-                } while ( !((anchor_jd.day > start_jd.day)  ||  (anchor_jd.day == start_jd.day && anchor_jd.ms >= start_jd.ms)) );
+                } while ( !((anchor_jd->day > start_jd->day)  ||  (anchor_jd->day == start_jd->day && anchor_jd->ms >= start_jd->ms)) );
 
               /* anchor_jd is now the true event-trigger-time. Set it to anchor. */
-              julian2date(&anchor_jd,&anchor);
+              julian2date(anchor_jd,anchor);
 
               break;
 
@@ -1188,78 +1275,103 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time
               /* Jump very fast bkwd and reach the start date quickly. */
               do
                 {
-                  anchor_jd.day = anchor_jd.day + timestep_fastbkw_jd.day;
-                  anchor_jd.ms = anchor_jd.ms + timestep_fastbkw_jd.ms;
+                  anchor_jd->day = anchor_jd->day + timestep_fastbkw_jd->day;
+                  anchor_jd->ms = anchor_jd->ms + timestep_fastbkw_jd->ms;
 
-                  if ( anchor_jd.ms < 0 )
+                  if ( anchor_jd->ms < 0 )
                     {
-                      anchor_jd.day = anchor_jd.day - 1;
-                      anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY;
+                      anchor_jd->day = anchor_jd->day - 1;
+                      anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY;
                     }
 
-                } while(! (anchor_jd.day < start_jd.day  ||  (anchor_jd.day == start_jd.day && anchor_jd.ms < start_jd.ms)) );
+                } while(! (anchor_jd->day < start_jd->day  ||  (anchor_jd->day == start_jd->day && anchor_jd->ms < start_jd->ms)) );
 
 
               /* I jumped one time too much. Move forward. */
-              anchor_jd.day = anchor_jd.day + timestep_fastfwd_jd.day;
-              anchor_jd.ms = anchor_jd.ms + timestep_fastfwd_jd.ms;
+              anchor_jd->day = anchor_jd->day + timestep_fastfwd_jd->day;
+              anchor_jd->ms = anchor_jd->ms + timestep_fastfwd_jd->ms;
 
-              if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY)
+              if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY)
                 {
-                  anchor_jd.day = anchor_jd.day + 1;
-                  anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY;
+                  anchor_jd->day = anchor_jd->day + 1;
+                  anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY;
                 }
 
 
               /* I am close. Get the real time. */
               do
                 {
-                  anchor_jd.day = anchor_jd.day + timestep_bkw_jd.day;
-                  anchor_jd.ms = anchor_jd.ms + timestep_bkw_jd.ms;
+                  anchor_jd->day = anchor_jd->day + timestep_bkw_jd->day;
+                  anchor_jd->ms = anchor_jd->ms + timestep_bkw_jd->ms;
 
-                  if ( anchor_jd.ms < 0 )
+                  if ( anchor_jd->ms < 0 )
                     {
-                      anchor_jd.day = anchor_jd.day - 1;
-                      anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY;
+                      anchor_jd->day = anchor_jd->day - 1;
+                      anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY;
                     }
 
-                } while(! (anchor_jd.day < start_jd.day  ||  (anchor_jd.day == start_jd.day && anchor_jd.ms < start_jd.ms)) );
+                } while(! (anchor_jd->day < start_jd->day  ||  (anchor_jd->day == start_jd->day && anchor_jd->ms < start_jd->ms)) );
 
 
               /* I jumped one time too much. Move forward.  */
-              anchor_jd.day = anchor_jd.day + timestep_jd.day;
-              anchor_jd.ms = anchor_jd.ms + timestep_jd.ms;
+              anchor_jd->day = anchor_jd->day + timestep_jd->day;
+              anchor_jd->ms = anchor_jd->ms + timestep_jd->ms;
 
-              if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY)
+              if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY)
                 {
-                  anchor_jd.day = anchor_jd.day + 1;
-                  anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY;
+                  anchor_jd->day = anchor_jd->day + 1;
+                  anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY;
                 }
 
               /* anchor_jd now has the true trigger time. Copy it to anchor. */
-              julian2date(&anchor_jd,&anchor);
+              julian2date(anchor_jd,anchor);
 
             default:
 
-              return NULL;
+              ; //Should never happen. Don't return NULL just yet as deallocateDateTime(anchor) still needs to be called.
 
             }
 
           /* Copy the contents to target. */
-          replaceDatetime(&anchor,first_trigger_dt);
+          replaceDatetime(anchor,first_trigger_dt);
+
+
+          /* Cleanup. */
+
+          deallocateDateTime(anchor);
+          deallocateJulianDay(start_jd);
+          deallocateJulianDay(anchor_jd);
+          deallocateJulianDelta(timestep_jd);
+          deallocateTimeDelta(timestep_bkw);
+          deallocateJulianDelta(timestep_bkw_jd);
+
+          deallocateJulianDelta(timestep_fastfwd_jd);
+          deallocateJulianDelta(timestep_fastbkw_jd);
+
+          /* And return. */
+          return first_trigger_dt;
         }
       else
         {
           /* NOTE: general case updates by explicit adding. */
-          while (compareDatetime(&anchor, start_dt) == less_than)
+
+          /* Get anchor. ref + offset is the real anchor. */
+          struct _datetime *anchor = constructAndCopyDateTime(ref_dt);
+          addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place.
+
+          while (compareDatetime(anchor, start_dt) == less_than)
             {
-              addTimeDeltaToDateTime(&anchor, timestep, &anchor);
+              addTimeDeltaToDateTime(anchor, timestep, anchor);
             }
           /* Copy the contents to target. */
-          replaceDatetime(&anchor,first_trigger_dt);
+          replaceDatetime(anchor,first_trigger_dt);
+
+          /* Cleanup. */
+          deallocateDateTime(anchor);
+
+          /* And return. */
+          return first_trigger_dt;
         }
-      /* And return. */
-      return first_trigger_dt;
     }
   else
     return NULL;
@@ -1299,13 +1411,16 @@ getTriggerNextEventAtDateTime(struct _event* e, struct _datetime* current_dt, st
            (compareDatetime(current_dt,e->triggerNextEventDateTime) == greater_than)
          )
         {
-              struct _timedelta modulo_td;
+              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);
+              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);
+      // else ...
+      dt_return = replaceDatetime(e->triggerNextEventDateTime, dt_return);
       return dt_return;
     }
   else
diff --git a/src/mtime_iso8601.c b/src/mtime_iso8601.c
index 7c4acf0a..bc995bfb 100644
--- a/src/mtime_iso8601.c
+++ b/src/mtime_iso8601.c
@@ -773,10 +773,14 @@ get_date_time(const char* buffer, struct iso8601_datetime* datetimeObj, struct i
 ISO8601_STATUS 
 verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_isoDtObj)
   {
-    struct iso8601_duration dummy_isoDObj = { .sign = '+' };
+    ISO8601_STATUS stat = FAILURE;
+    struct iso8601_duration* dummy_isoDObj = new_iso8601_duration('+',0,0,0,0,0,0,0);
+    if (dummy_isoDObj == NULL)
+      return FAILURE;
+
+    stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj);
 
-    ISO8601_STATUS stat
-      = get_date_time(test_string, dummy_isoDtObj, &dummy_isoDObj);
+    deallocate_iso8601_duration(dummy_isoDObj);
 
     return stat;
   }
@@ -785,10 +789,14 @@ verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_is
 ISO8601_STATUS
 verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isoDObj)
   {
-    struct iso8601_datetime dummy_isoDtObj = { .sign_of_year='+' };
+    ISO8601_STATUS stat = FAILURE;
+    struct iso8601_datetime* dummy_isoDtObj = new_iso8601_datetime('+',0,0,0,0,0,0,0);
+    if ( dummy_isoDtObj == NULL)
+      return FAILURE;
+
+    stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj);
 
-    ISO8601_STATUS stat
-      = get_date_time(test_string, &dummy_isoDtObj, dummy_isoDObj);
+    deallocate_iso8601_datetime(dummy_isoDtObj);
 
     return stat;
   }
diff --git a/src/mtime_iso8601.rl b/src/mtime_iso8601.rl
index 029451f2..19b648ec 100644
--- a/src/mtime_iso8601.rl
+++ b/src/mtime_iso8601.rl
@@ -642,10 +642,14 @@ get_date_time(const char* buffer, struct iso8601_datetime* datetimeObj, struct i
 ISO8601_STATUS 
 verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_isoDtObj)
   {
-    struct iso8601_duration dummy_isoDObj = { .sign = '+' };
+    ISO8601_STATUS stat = FAILURE;
+    struct iso8601_duration* dummy_isoDObj = new_iso8601_duration('+',0,0,0,0,0,0,0);
+    if (dummy_isoDObj == NULL)
+      return FAILURE;
+
+    stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj);
 
-    ISO8601_STATUS stat
-      = get_date_time(test_string, dummy_isoDtObj, &dummy_isoDObj);
+    deallocate_iso8601_duration(dummy_isoDObj);
 
     return stat;
   }
@@ -654,10 +658,14 @@ verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_is
 ISO8601_STATUS
 verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isoDObj)
   {
-    struct iso8601_datetime dummy_isoDtObj = { .sign_of_year='+' };
+    ISO8601_STATUS stat = FAILURE;
+    struct iso8601_datetime* dummy_isoDtObj = new_iso8601_datetime('+',0,0,0,0,0,0,0);
+    if ( dummy_isoDtObj == NULL)
+      return FAILURE;
+
+    stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj);
 
-    ISO8601_STATUS stat
-      = get_date_time(test_string, &dummy_isoDtObj, dummy_isoDObj);
+    deallocate_iso8601_datetime(dummy_isoDtObj);
 
     return stat;
   }
diff --git a/src/mtime_julianDay.c b/src/mtime_julianDay.c
index 4183fbf6..b3ab41ad 100644
--- a/src/mtime_julianDay.c
+++ b/src/mtime_julianDay.c
@@ -182,7 +182,11 @@ replaceJulianday(struct _julianday* jdsrc, struct _julianday* jddest)
 struct _juliandelta*
 newJulianDelta(char _sign, int64_t _day, int64_t _ms)
 {
-  if ((_sign == '+' || _sign == '-') && getCalendarType())
+  if (_sign != '+' && _sign != '-')
+  {
+    return NULL;
+  }
+  if (getCalendarType())
     {
       struct _juliandelta* jd = (struct _juliandelta *)calloc(1,sizeof(struct _juliandelta));
       if (jd == NULL )
@@ -253,13 +257,13 @@ return NULL;
 
 
 struct _julianday*
-subtractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd)
+substractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd)
 {
   if ((jd1 != NULL )&& (jd2 != NULL) && (jd != NULL) ){
 
-  /* subtractJulianDelta 'looks like' addJulianDelta but it is not. 
-     Usually, when subtractJulianDelta is called, jd2 will have every element with a negative sign. 
-     This will ensure subtraction in the proper sense. */
+  /* substractJulianDelta 'looks like' addJulianDelta but it is not. 
+     Usually, when substractJulianDelta is called, jd2 will have every element with a negative sign. 
+     This will ensure substraction in the proper sense. */
 
   jd->day = jd1->day + jd2->day;
   jd->ms = jd1->ms + jd2->ms;
@@ -313,7 +317,7 @@ compareJulianDay(struct _julianday* jd1, struct _julianday* jd2)
 /*Internal function.*/
 /* Return jd1 >= jd2 */
 
-static bool
+bool
 internal_compareJulianDay(struct _julianday* jd1, struct _julianday* jd2)
 {
   if (jd1->day > jd2->day)
@@ -342,11 +346,11 @@ internal_compareJulianDay(struct _julianday* jd1, struct _julianday* jd2)
  *         A pointer to struct _juliandelta. Copy the result of (jd1 - jd2) in jd.
  *
  * @return jd
- *         A pointer to Juliandelta containing the result of subtraction.
+ *         A pointer to Juliandelta containing the result of substraction.
  */
 
 struct _juliandelta*
-subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd)
+substractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd)
 {
   if ((jd1 != NULL )&& (jd2 != NULL) && (jd != NULL) ){
 
@@ -369,7 +373,7 @@ subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _julian
       /*  JD2 > JD1 */
 
       /*Recursive call with jd1 and jd2 switched and then negate the values.*/
-      jd = subtractJulianDay(jd2,jd1,jd);
+      jd = substractJulianDay(jd2,jd1,jd);
 
       jd->sign = '-';
       jd->day = (-1)*jd->day;
diff --git a/src/mtime_t_datetime.inc b/src/mtime_t_datetime.inc
index 8326a9a8..f7af889f 100644
--- a/src/mtime_t_datetime.inc
+++ b/src/mtime_t_datetime.inc
@@ -13,6 +13,7 @@
     CHARACTER(len=*), INTENT(in) :: dt_string
     TYPE(c_ptr)             :: c_pointer
     TYPE(datetime), POINTER :: dt_tmp
+    INTEGER :: errno
     c_pointer = my_newdatetime(TRIM(ADJUSTL(dt_string))//c_null_char)
     CALL handle_errno(.NOT. c_ASSOCIATED(c_pointer), 4 *100 + 1, &
       & __FILE__, &
diff --git a/src/mtime_t_event.inc b/src/mtime_t_event.inc
index c7b26ede..eb78b606 100644
--- a/src/mtime_t_event.inc
+++ b/src/mtime_t_event.inc
@@ -154,7 +154,7 @@
   END SUBROUTINE t_eventGroup_addToGroup
 
   FUNCTION t_eventGroup_getGroupId(this) RESULT(group_id)
-    INTEGER(c_int64_t) :: group_id
+    INTEGER :: group_id
     CLASS(t_eventGroup) ::this
     group_id = this%event_group_id
   END FUNCTION t_eventGroup_getGroupId
diff --git a/src/mtime_t_timedelta.inc b/src/mtime_t_timedelta.inc
index 0012a9c2..318c3171 100644
--- a/src/mtime_t_timedelta.inc
+++ b/src/mtime_t_timedelta.inc
@@ -174,7 +174,7 @@
     INTEGER(c_int32_t),       INTENT(in) :: lambda
     CLASS(t_timedelta), TARGET, INTENT(in) :: this
     TYPE(timedelta), POINTER             :: td_tmp
-    TYPE(c_ptr) :: dummy_ptr
+    TYPE(c_ptr) :: c_pointer, dummy_ptr, c_ptr_result
 
     dummy_ptr = my_elementwisescalarmultiplytimedelta(c_loc(this%td), int(lambda, c_int64_t), c_loc(scaled_td%td))
     IF (.NOT. c_associated(dummy_ptr)) THEN
diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c
index ab2cef18..2df803d9 100644
--- a/src/mtime_timedelta.c
+++ b/src/mtime_timedelta.c
@@ -67,20 +67,24 @@ newTimeDelta(const char* tds)
 
       /* Create TimeDelta object. */
       struct _timedelta* td = (struct _timedelta *)calloc(1,sizeof(struct _timedelta));
-      if (td != NULL)
+      if (td == NULL )
         {
-          td->flag_std_form = duration_type_flag == 2;
-          /* IMPORTANT: Negative/Positive time delta is indicated using td->sign (-/+). year,month,day..etc are always positive integers or 0. */
-          td->sign          = isoDuration->sign;
-          td->year          = isoDuration->year;
-          td->month         = isoDuration->month;
-          td->day           = isoDuration->day;
-          td->hour          = isoDuration->hour;
-          td->minute        = isoDuration->minute;
-          td->second        = isoDuration->second;
-          td->ms            = isoDuration->ms;
+          deallocate_iso8601_duration(isoDuration);
+          isoDuration = NULL;
+          return NULL ;
         }
 
+      duration_type_flag == 2?(td->flag_std_form = 1):(td->flag_std_form = 0);
+      /* IMPORTANT: Negative/Positive time delta is indicated using td->sign (-/+). year,month,day..etc are always positive integers or 0. */
+      td->sign          = isoDuration->sign;
+      td->year          = isoDuration->year;
+      td->month         = isoDuration->month;
+      td->day           = isoDuration->day;
+      td->hour          = isoDuration->hour;
+      td->minute        = isoDuration->minute;
+      td->second        = isoDuration->second;
+      td->ms            = isoDuration->ms;
+
       //Cleanup.
       deallocate_iso8601_duration(isoDuration);
       isoDuration = NULL;       
@@ -119,8 +123,9 @@ newTimeDelta(const char* tds)
 struct _timedelta *
 newRawTimeDelta(char _sign, int64_t _year, int _month, int _day, int _hour, int _minute, int _second, int _ms)
 {
-  struct _timedelta* td
-    = (struct _timedelta *) calloc(1, sizeof(struct _timedelta));
+  struct _timedelta* td;
+  
+  td = (struct _timedelta *) calloc(1, sizeof(struct _timedelta));
   if (td == NULL )
     {
       return NULL ;
@@ -162,8 +167,8 @@ constructAndCopyTimeDelta(struct _timedelta* td)
 {
   if ( td != NULL )
     {
-      struct _timedelta* td_new
-        = (struct _timedelta *) calloc(1, sizeof(struct _timedelta));
+      struct _timedelta* td_new;
+      td_new = (struct _timedelta *) calloc(1, sizeof(struct _timedelta));
       if (td_new == NULL )
         {
           return NULL ;
@@ -471,38 +476,59 @@ else
 static 
 struct _juliandelta*
 localTimeDeltaToJulianDelta_NonStandardTimeDelta(struct _timedelta* td, struct _datetime* base_dt, struct _juliandelta* jd_return)
-{
-  (void)base_dt;
-  int64_t sign_apply = td->sign == '-' ? -1 : (td->sign == '+' ? 1 : 0);
-  if (sign_apply) {
-    /* Positive or negative timedelta can be handled symmetrically. */
-    /* Negative TimeDelta.  A negative juliandelta is represented in the following
-       way: -P01DT00.500S  = jd2->sign = '-', jd2->day = -30, jd2->ms = -500. */
+  {
 
-      jd_return->sign = sign_apply < 0 ? '-' : '+';
+    if ( td->sign == '-' )
+      {
+        /* Negative TimeDelta.  A negative juliandelta is represented in the following 
+           way: -P01DT00.500S  = jd2->sign = '-', jd2->day = -30, jd2->ms = -500. */
 
-      /* Non standard Months not supported. */
+        jd_return->sign = '-';
 
-      /* Day. */
-      int64_t day = sign_apply * (int64_t)td->day;
-      /* Rest. */
-      int64_t ms  = sign_apply * (int64_t)td->hour   * NO_OF_MS_IN_A_HOUR
-                  + sign_apply * (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE
-                  + sign_apply * (int64_t)td->second * NO_OF_MS_IN_A_SECOND
-                  + sign_apply * td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */
+        /* Non standard Months not supported. */
 
-      day += ms / NO_OF_MS_IN_A_DAY;
-      ms = ms % NO_OF_MS_IN_A_DAY;
+        /* Day. */
+        jd_return->day = (-1) * (int64_t)td->day;
+        /* Rest. */
+        jd_return->ms   = (-1) * (int64_t)td->hour   * NO_OF_MS_IN_A_HOUR
+                        + (-1) * (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE
+                        + (-1) * (int64_t)td->second * NO_OF_MS_IN_A_SECOND
+                        + (-1) * td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */
 
-      jd_return->day = day;
-      jd_return->ms = ms;
+        while (jd_return->ms <= (-1) *NO_OF_MS_IN_A_DAY)
+          {
+            jd_return->ms = jd_return->ms + NO_OF_MS_IN_A_DAY;
+            jd_return->day--;
+          }
 
-  }
-  else
-    return NULL; /* ERROR: TD sign not defined. Should never happen. */
+      }
+    else if ( td->sign == '+' )
+      {
+        /* Positive TimeDelta. */
 
-  return jd_return;
-}
+        jd_return->sign = '+';
+
+        /* Non standard Months not supported. */
+
+        /* Day. */
+        jd_return->day = (int64_t)td->day;
+        /* Rest. */
+        jd_return->ms    = (int64_t)td->hour   * NO_OF_MS_IN_A_HOUR
+                         + (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE
+                         + (int64_t)td->second * NO_OF_MS_IN_A_SECOND
+                         + td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */
+
+        while (jd_return->ms >= NO_OF_MS_IN_A_DAY)
+          {
+            jd_return->ms = jd_return->ms - NO_OF_MS_IN_A_DAY;
+            jd_return->day++;
+          }
+      }
+    else
+      return NULL; /* ERROR: TD sign not defined. Should never happen. */
+
+    return jd_return;
+  }
 
 
 static
@@ -686,7 +712,7 @@ localTimeDeltaToJulianDelta_StandardTimeDelta_CalTypeGREGORIAN(struct _timedelta
               /* If the (base year - delta year) is a year after leap year and base month is < 3 
                OR 
                base year - delta year is a leap year and month is >= 3
-               => A subtraction of leap-year specific delta for each month.
+               => A substraction of leap-year specific delta for each month.
               */
               msdinm = monthSpecificDeltaInMonthsLeapyear;
               ndiny = NO_OF_DAYS_IN_A_LEAP_YEAR;
@@ -835,6 +861,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
 {
   if ((jd != NULL) && (base_dt != NULL) && (td_return != NULL)){
 
+  int i = 0;
   /* No of days in a year. */
   int ndiny;
 
@@ -879,43 +906,64 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
              For each loop forward, increment year by 1.
           */
           int64_t j = base_dt->date.year;
+          /* Initialize to 0. */
+          td_return->year = 0;
 
           /* Fast-Fwd >= 400 */
           if (days >= NO_OF_DAYS_IN_400_YEARS)
             {
               int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS;
-              j -= numberOf400YearPeriods * 400;
-              days -= numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS;
+              td_return->year = td_return->year + numberOf400YearPeriods * 400;
+              j = j - numberOf400YearPeriods * 400;
+              days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS;
             }
 
-          int year_offset = -(base_dt->date.month < 3);
           do
             {
 
-              /* Loop over and get to the final year by subtracting 366/365 days depending
-                 on leap/non-leap year. For each subtraction, increment year by 1.
+              /* Loop over and get to the final year by substracting 366/365 days depending
+                 on leap/non-leap year. For each substraction, increment year by 1.
               */
 
               /* The crucial point is month of february. */
               delta_final_year = days;
-              /* If year is leap year and base month is >= 3
-                 OR
-                 next year is a leap year and month is < 3
-                 => delta of 1 year corresponds to 366 day julian delta.
-              */
-              days -= testYearIsLeapYear(j+year_offset) ? NO_OF_DAYS_IN_A_LEAP_YEAR
-                : NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365;
+              if (
+                  ( (testYearIsLeapYear(j)) && (base_dt->date.month >= 3) )
+                  ||
+                  ( (testYearIsLeapYear(j-1)) && (base_dt->date.month < 3) )
+                  )
+                {
+                  /* If year is leap year and base month is >= 3
+                     OR
+                     next year is a leap year and month is < 3
+                     => delta of 1 year corresponds to 366 day julian delta.
+                  */
+                  days = days - NO_OF_DAYS_IN_A_LEAP_YEAR;
+                }
+              else
+                {
+                  /* Otherwise. */
+                  days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365;
+                }
+              td_return->year++;
               j--;
             } while (days >= 0);
 
-          /* Step back if the loop ran one time too much. */
-          j += (days < 0);
+          /* The loop ran one time too much. */
 
-          td_return->year = base_dt->date.year - j;
+          if (days < 0)
+            {
+              td_return->year--;
+              j++;
+            }
 
           /* In final year, the crucial point is the month of february. */
 
-          if (testYearIsLeapYear(j+year_offset))
+          if (
+              ((testYearIsLeapYear(j)) && (base_dt->date.month >= 3))
+              ||
+              ((testYearIsLeapYear(j-1)) && (base_dt->date.month < 3))
+              )
             {
               /* If final year is a leap year and base month is >= 3
                  OR
@@ -932,7 +980,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
               ndiny = NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365;
             }
 
-          for (int i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++)
+          for (i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++)
             {
               if (delta_final_year < msdinm[base_dt->date.month - 1][i])
                 {
@@ -961,40 +1009,62 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
              For each loop back, increment year by 1.
           */
           int64_t j = base_dt->date.year;
+          /* Initialize. */
+          td_return->year = 0;
 
           /* Fast-Fwd >= 400 */
           if (days >= NO_OF_DAYS_IN_400_YEARS)
             {
               int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS;
-              j += numberOf400YearPeriods * 400;
-              days -= numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS;
+              td_return->year = td_return->year + numberOf400YearPeriods * 400;
+              j = j - numberOf400YearPeriods * 400;
+              days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS;
             }
 
-          int year_offset = base_dt->date.month >= 3;
           do
             {
-              /* Loop over and get the year by subtracting 366/365 days depending
-                 on leap/non-leap year. For each subtraction, increment year by 1.
+              /* Loop over and get the year by substracting 366/365 days depending
+                 on leap/non-leap year. For each substraction, increment year by 1.
               */
 
               /* The crucial point is month of february. */
               delta_final_year = days;
-              /* If next year is leap year and base month is < 3
-                 OR
-                 this year is a leap year and month is < 3
-                 => delta of 1 year corresponds to 366 day julian delta.
-              */
-              days -= testYearIsLeapYear(j+year_offset) ? NO_OF_DAYS_IN_A_LEAP_YEAR
-                : NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365;
+              if (
+                  ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3))
+                  ||
+                  ((testYearIsLeapYear(j)) && (base_dt->date.month < 3))
+                  )
+                {
+                  /* If next year is leap year and base month is < 3
+                     OR
+                     this year is a leap year and month is < 3
+                     => delta of 1 year corresponds to 366 day julian delta.
+                  */
+                  days = days - NO_OF_DAYS_IN_A_LEAP_YEAR;
+                }
+              else
+                {
+                  /* Otherwise. */
+                  days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365;
+                }
+
+              td_return->year++;
               j++;
             } while (days >= 0);
 
           /* The loop ran one time too much. */
-          j -= (days < 0);
-          td_return->year = -(base_dt->date.year - j);
+          if (days < 0)
+            {
+              td_return->year--;
+              j--;
+            }
 
           /* In final year, the crucial point is the month of february. */
-          if (testYearIsLeapYear(j+year_offset))
+          if (
+              ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3))
+              ||
+              ((testYearIsLeapYear(j)) && (base_dt->date.month < 3))
+              )
             {
               /* If final year is a leap year and base month is >= 3
                  OR
@@ -1013,7 +1083,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
 
           td_return->month = 0;
           td_return->day = (int) delta_final_year;
-          for (int i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--)
+          for (i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--)
             {
               if (delta_final_year >= msdinm[base_dt->date.month - 1][i])
                 {
@@ -1050,7 +1120,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
 
       int delta_final_year = jd->day % ndiny;
 
-      for (int i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--)
+      for (i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--)
         {
           if ((int) delta_final_year < (ndiny - msdinm[base_dt->date.month - 1][i - 1]))
             {
@@ -1081,7 +1151,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc
 
       int delta_final_year = ((-1)*jd->day) % ndiny;
 
-      for (int i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++)
+      for (i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++)
         {
           if ((int)delta_final_year < msdinm[base_dt->date.month - 1][i])
             {
@@ -1160,26 +1230,29 @@ divideDatetimeDifferenceInSeconds(struct _datetime* dt1, struct _datetime* dt2,
     {
       if ((divisor->year == 0) && (divisor->month == 0))
         {
-          struct _julianday jd1;
-          date2julian(dt1, &jd1);
+          struct _julianday* jd1 = newJulianDay(0, 0);
+          if (jd1 != NULL) jd1 = date2julian(dt1, jd1);
 
-          struct _julianday jd2;
-          date2julian(dt2, &jd2);
+          struct _julianday* jd2 = newJulianDay(0, 0);
+          if (jd2 != NULL) jd2 = date2julian(dt2, jd2);
 
           intmax_t denominator = (intmax_t) (((int64_t) divisor->day  * 86400 + divisor->hour * 3600 +divisor->minute  * 60 + divisor->second ) * 1000 + divisor->ms);
 
           if (denominator == 0) /* Division by zero is illegal. */
             return NULL;
 
-          struct _juliandelta jd;
-          subtractJulianDay(&jd1, &jd2, &jd);
-          intmax_t numerator = (intmax_t) (jd.day * 86400000 + jd.ms);
+          struct _juliandelta* jd = newJulianDelta('+', 0, 0);
+          jd = substractJulianDay(jd1, jd2, jd);  
+          intmax_t numerator = (intmax_t) (jd->day * 86400000 + jd->ms);
           
           imaxdiv_t div = imaxdiv(numerator, denominator);
-
+          
           quo_ret->quotient        = (int64_t) div.quot;          
           quo_ret->remainder_in_ms = (int64_t) div.rem;
-
+          
+          if (jd1 != NULL)  deallocateJulianDay(jd1);
+          if (jd2 != NULL)  deallocateJulianDay(jd2);
+          if (jd  != NULL)  deallocateJulianDelta(jd);
           return quo_ret;
         }
     }
@@ -1204,34 +1277,42 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime
       (dt1_divisor != NULL) && (dt2_divisor != NULL) && (quo_ret != NULL))
     {
           // dividend
-          struct _julianday jd1_dividend;
-          date2julian(dt1_dividend, &jd1_dividend);
+          struct _julianday* jd1_dividend = newJulianDay(0, 0);
+          if (jd1_dividend != NULL) jd1_dividend = date2julian(dt1_dividend, jd1_dividend);
 
-          struct _julianday jd2_dividend;
-          date2julian(dt2_dividend, &jd2_dividend);
+          struct _julianday* jd2_dividend = newJulianDay(0, 0);
+          if (jd2_dividend != NULL) jd2_dividend = date2julian(dt2_dividend, jd2_dividend);
 
-          struct _juliandelta jd_dividend;
-          subtractJulianDay(&jd1_dividend, &jd2_dividend, &jd_dividend);
-          intmax_t numerator = (intmax_t) (jd_dividend.day * 86400000 + jd_dividend.ms);
+          struct _juliandelta* jd_dividend = newJulianDelta('+', 0, 0);
+          jd_dividend = substractJulianDay(jd1_dividend, jd2_dividend, jd_dividend);  
+          intmax_t numerator = (intmax_t) (jd_dividend->day * 86400000 + jd_dividend->ms);
 
           // divisor
-          struct _julianday jd1_divisor;
-          date2julian(dt1_divisor, &jd1_divisor);
+          struct _julianday* jd1_divisor = newJulianDay(0, 0);
+          if (jd1_divisor != NULL) jd1_divisor = date2julian(dt1_divisor, jd1_divisor);
 
-          struct _julianday jd2_divisor;
-          date2julian(dt2_divisor, &jd2_divisor);
+          struct _julianday* jd2_divisor = newJulianDay(0, 0);
+          if (jd2_divisor != NULL) jd2_divisor = date2julian(dt2_divisor, jd2_divisor);
 
-          struct _juliandelta jd_divisor;
-          subtractJulianDay(&jd1_divisor, &jd2_divisor, &jd_divisor);
-          intmax_t denominator = (intmax_t) (jd_divisor.day * 86400000 + jd_divisor.ms);
+          struct _juliandelta* jd_divisor = newJulianDelta('+', 0, 0);
+          jd_divisor = substractJulianDay(jd1_divisor, jd2_divisor, jd_divisor);  
+          intmax_t denominator = (intmax_t) (jd_divisor->day * 86400000 + jd_divisor->ms);
           
           imaxdiv_t div = imaxdiv(numerator, denominator);
           
           quo_ret->quotient        = (int64_t) div.quot;          
           quo_ret->remainder_in_ms = (int64_t) div.rem;
           *denominator_ret = (int64_t) (denominator / 1000);
-
-          return quo_ret;
+          
+          if (jd1_dividend != NULL)  deallocateJulianDay(jd1_dividend);
+          if (jd2_dividend != NULL)  deallocateJulianDay(jd2_dividend);
+          if (jd_dividend  != NULL)  deallocateJulianDelta(jd_dividend);
+          
+          if (jd1_divisor != NULL)  deallocateJulianDay(jd1_divisor);
+          if (jd2_divisor != NULL)  deallocateJulianDay(jd2_divisor);
+          if (jd_divisor  != NULL)  deallocateJulianDelta(jd_divisor);
+          
+          return quo_ret;          
     }
   else 
     return NULL;
@@ -1240,7 +1321,7 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime
 /**
  * @brief Get the TimeDelta between two Dates d1 and d2 as (d1-d2).
  *
- * Routine getTimeDeltaFromDate 'subtracts' two Dates and returns the TimeDelta between
+ * Routine getTimeDeltaFromDate 'substracts' two Dates and returns the TimeDelta between
  * them. Internally, Dates are converted to DateTimes and then delta is calculated using 
  * getTimeDeltaFromDateTime().
  * 
@@ -1260,7 +1341,7 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime
  *         A pointer to struct _timedelta. Copy the result of (d1 - d2) in td_return.
  *
  * @return td_return
- *         A pointer to TimeDelta containing the result of subtraction.
+ *         A pointer to TimeDelta containing the result of substraction.
  */
 
 struct _timedelta*
@@ -1269,14 +1350,25 @@ getTimeDeltaFromDate(struct _date* d1, struct _date* d2, struct _timedelta* td_r
   if ((d1 != NULL )&& (d2 != NULL) && (td_return != NULL) ){
 
   /* Convert Date to datetime and resuse the DateTime interface to calculate time delta. */
-  struct _datetime dt1;
-  convertDateToDateTime(d1, &dt1);
+  struct _datetime *dt1 = newDateTime(initDummyDTString);
+  if (dt1 == NULL)
+    return NULL;
+  dt1 = convertDateToDateTime(d1, dt1);
 
-  struct _datetime dt2;
-  convertDateToDateTime(d2, &dt2);
+  struct _datetime *dt2 = newDateTime(initDummyDTString);
+  if ( dt2 == NULL )
+    {
+      deallocateDateTime(dt1);
+      return NULL;
+    }
+  dt2 = convertDateToDateTime(d2, dt2);
 
   /* Call the Datetime function to get TD. dt1 - dt2 */
-  td_return = getTimeDeltaFromDateTime(&dt1, &dt2, td_return);
+  td_return = getTimeDeltaFromDateTime(dt1,dt2,td_return);
+
+  /* Cleanup. */
+  deallocateDateTime(dt1);
+  deallocateDateTime(dt2);
 
   return td_return;
 }
@@ -1288,8 +1380,8 @@ else
 /**
  * @brief Get the TimeDelta between two DateTimes dt1 and dt2 as (dt1-dt2).
  *
- * Routine getTimeDeltaFromDateTime 'subtracts' two DateTime's and returns the TimeDelta between
- * them. Each datetime is converted to an equivalent Julian Date. Subtraction is then performed
+ * Routine getTimeDeltaFromDateTime 'substracts' two DateTime's and returns the TimeDelta between
+ * them. Each datetime is converted to an equivalent Julian Date. Substraction is then performed
  * on Julian axis. The "Julian delta" is finally converted back to normal calendar delta. 
  * 
  * This routine handles all supported Calendar types; i.e. the translation from Calendar date 
@@ -1309,7 +1401,7 @@ else
  *         A pointer to struct _timedelta. Copy the result of (dt1 - dt2) in td_return.
  *
  * @return td_return
- *        A pointer to TimeDelta containing the result of subtraction.
+ *        A pointer to TimeDelta containing the result of substraction.
  */
 
 struct _timedelta*
@@ -1318,21 +1410,39 @@ getTimeDeltaFromDateTime(struct _datetime* dt1, struct _datetime* dt2, struct _t
   if ((dt1 != NULL )&& (dt2 != NULL) && (td_return != NULL) ){
  
   /* Convert dt1 to Julian. */
-  struct _julianday jd1;
-  date2julian(dt1, &jd1);
+  struct _julianday* jd1 = newJulianDay(0, 0);
+  if (jd1 == NULL)
+    return NULL;
+  jd1 = date2julian(dt1, jd1);
 
   /* Convert dt2 to Julian. */
-  struct _julianday jd2;
-  date2julian(dt2, &jd2);
+  struct _julianday* jd2 = newJulianDay(0, 0);
+  if (jd2 == NULL)
+    {
+      deallocateJulianDay(jd1);
+      return NULL;
+    }
+  jd2 = date2julian(dt2, jd2);
 
-  /* Calculate Delta on Julian axis. "RULE: A - B = Delta". If A > B, Delta is positive. */
-  struct _juliandelta jd;
+  /* Calculat Delta on Julian axis. "RULE: A - B = Delta". If A > B, Delta is positive. */
+  struct _juliandelta* jd = newJulianDelta('+', 0, 0);
+  if (jd == NULL)
+    {
+      deallocateJulianDay(jd1);
+      deallocateJulianDay(jd2);
+      return NULL;
+    }
 
-  /* Subtract the 2 dates on julian axis. */
-  subtractJulianDay(&jd1, &jd2, &jd);
+  /* Substract the 2 dates on julian axis. */
+  jd = substractJulianDay(jd1, jd2, jd);
 
   /* Convert Julian-delta to TimeDelta. */
-  td_return = julianDeltaToTimeDelta(&jd, dt2, td_return);
+  td_return = julianDeltaToTimeDelta(jd, dt2, td_return);
+
+  /* Cleanup. */
+  deallocateJulianDay(jd1);
+  deallocateJulianDay(jd2);
+  deallocateJulianDelta(jd);
 
   return td_return;
 }
@@ -1356,22 +1466,35 @@ else
  *         A pointer to struct _datetime. Reference Datetime for the TD.
  *
  * @return totalmilliSeconds
- *         Integer value of totalmilliSeconds. 0 indicates error. TODO
- *         on Luis: Is this ok?
+ *         Integer value of totalmilliSeconds. 0 indicates error. TODO on Luis: Is this ok?
  */
 
 int64_t
 getTotalMilliSecondsTimeDelta(struct _timedelta* td, struct _datetime* base_dt)
 {
-  int64_t totalmilliSeconds = 0;
   if ((td != NULL )&& (base_dt != NULL) ){
-    struct _juliandelta jd, *pjd;
-    pjd = timeDeltaToJulianDelta(td, base_dt, &jd);
-    if ( pjd != NULL )
-      totalmilliSeconds = jd.day * NO_OF_MS_IN_A_DAY + jd.ms;
-  }
+
+  int64_t totalmilliSeconds = 0;
+
+  struct _juliandelta* jd = newJulianDelta('+', 0, 0);
+  if ( jd == NULL )
+    return 0;
+  jd = timeDeltaToJulianDelta(td, base_dt, jd);
+  if ( jd == NULL )
+    {
+      deallocateJulianDelta(jd);
+      return 0;
+    }
+
+  totalmilliSeconds = jd->day * NO_OF_MS_IN_A_DAY + jd->ms;
+
+  deallocateJulianDelta(jd);
+
   return totalmilliSeconds;
 }
+else
+  return 0;
+}
 
 
 /**
@@ -1420,52 +1543,64 @@ getTotalSecondsTimeDelta(struct _timedelta* td, struct _datetime* base_dt)
 char *
 timedeltaToString(struct _timedelta* td, char* toStr)
 {
-  if ((td != NULL )&& (toStr != NULL) && (td->sign == '+' || td->sign == '-')){
+  if ((td != NULL )&& (toStr != NULL) ){
+
   memset(toStr,'\0',MAX_TIMEDELTA_STR_LEN);
 
-  int pos = 0;
   if (td->sign == '-')
-    toStr[pos++] = '-';
-  toStr[pos++] = 'P';
-
-  if (td->second > 59)
-    {
-      /* generate string with seconds only */
-      toStr[pos++] = 'T';
-      sprintf(toStr+pos,"%d.%03dS",td->second, td->ms);
-      return toStr;
-    }
-
+    sprintf(toStr,"%cP",td->sign);
+  else if (td->sign == '+')
+    strcpy (toStr,"P");
+  else
+    return NULL; /* ERROR: TD sign not set. Should never happen. */
+  
   if (td->year != 0)
-    pos += sprintf(toStr+pos,"%" PRIi64 "Y",td->year);
+    sprintf(&(toStr[strlen(toStr)]),"%" PRIi64 "Y",td->year);
 
   if (td->month != 0)
-    pos += sprintf(toStr+pos,"%02dM",td->month);
+    sprintf(&(toStr[strlen(toStr)]),"%02dM",td->month);
 
   if (td->day != 0)
-    pos += sprintf(toStr+pos,"%02dD",td->day);
+    sprintf(&(toStr[strlen(toStr)]),"%02dD",td->day);
 
-  toStr[pos++] = 'T';
+  sprintf(&(toStr[strlen(toStr)]),"T");
 
   if (td->hour != 0)
-    pos += sprintf(toStr+pos,"%02dH",td->hour);
+    sprintf(&(toStr[strlen(toStr)]),"%02dH",td->hour);
 
   if (td->minute != 0)
-    pos += sprintf(toStr+pos,"%02dM",td->minute);
+    sprintf(&(toStr[strlen(toStr)]),"%02dM",td->minute);
 
   if ((td->second != 0) || (td->ms != 0))
     {
-      pos += sprintf(toStr+pos,"%02d.%03dS",td->second,td->ms);
+      if (td->second > 59)
+        {
+          /* reset and generate string with seconds only */
+          memset(toStr,'\0',MAX_TIMEDELTA_STR_LEN);
+
+          if (td->sign == '-')
+            sprintf(toStr,"%cPT",td->sign);
+          else if (td->sign == '+')
+            strcpy (toStr,"PT");
+          else
+            return NULL; /*ERROR: TD sign not set. Should never happen. */
+
+          sprintf(&(toStr[strlen(toStr)]),"%d.%03dS",td->second, td->ms);
+        }
+      else
+        {
+          sprintf(&(toStr[strlen(toStr)]),"%02d.%03dS",td->second,td->ms);
+        }
     }
 
 
   //Discard T if all time values are 0.
-  if(toStr[pos-1] == 'T')
-    toStr[--pos] = '\0';
+  if(toStr[strlen(toStr)-1] == 'T')
+    toStr[strlen(toStr)-1] = '\0';
 
   //Return PT00.000S if all delta values are 0.
-  if(toStr[pos-1] == 'P')
-    strcpy(toStr+pos,"T00.000S");
+  if(toStr[strlen(toStr)-1] == 'P')
+    strcat(toStr,"T00.000S");
 
   return toStr;
 }
@@ -1508,17 +1643,28 @@ addTimeDeltaToDate(struct _date* d, struct _timedelta* td, struct _date* d_retur
   if ((d != NULL )&& (td != NULL) && (d_return != NULL) ){
 
   /* Convert Date to Datetime and reuse the DateTime interface for Calculating the sum.*/
-  struct _datetime dt;
+  struct _datetime *dt = newDateTime(initDummyDTString);
+  if ( dt == NULL )
+    return NULL;
 
-  convertDateToDateTime(d, &dt);
+  dt = convertDateToDateTime(d, dt);
 
-  struct _datetime dt_return;
+  struct _datetime *dt_return = newDateTime(initDummyDTString);
+  if ( dt_return == NULL )
+  {
+    deallocateDateTime(dt);
+    return NULL;
+  }
 
   /* Call the DateTime interface to calculate the new Datetime. */
-  addTimeDeltaToDateTime(&dt,td, &dt_return);
+  dt_return = addTimeDeltaToDateTime(dt,td, dt_return);
 
   /* Get Date from Datetime. */
-  d_return = convertDateTimeToDate(&dt_return, d_return);
+  d_return = convertDateTimeToDate(dt_return, d_return);
+
+  deallocateDateTime(dt);
+  deallocateDateTime(dt_return);
+
   return d_return;
   }
   else
@@ -1560,29 +1706,45 @@ addTimeDeltaToDateTime(struct _datetime* dt, struct _timedelta* td, struct _date
   if ((dt != NULL ) && (td != NULL) && (dt_return != NULL)) {
 
     /* Convert base datetime to Julian. */
-    struct _julianday jday;
-    if (!date2julian(dt, &jday))
+    struct _julianday* jd1 = newJulianDay(0, 0);
+    if ( jd1 == NULL)
       return NULL;
+    jd1 = date2julian(dt, jd1);
 
     /* Get julian delta. */
-    struct _juliandelta jdelt;
-    timeDeltaToJulianDelta(td, dt, &jdelt);
+    struct _juliandelta* jd2 = newJulianDelta('+', 0, 0);
+    if ( jd2 == NULL )
+      {
+        deallocateJulianDay(jd1);
+        return NULL;
+      }
+    jd2 = timeDeltaToJulianDelta(td, dt, jd2);
 
-    struct _julianday jd;
+    struct _julianday* jd = newJulianDay(0, 0);
+    if ( jd == NULL )
+      {
+        deallocateJulianDay(jd1);
+        deallocateJulianDelta(jd2);
+        return NULL;
+      }
 
     if ( td->sign == '+' )
       {
-        addJulianDeltaToJulianDay(&jday, &jdelt, &jd);
+        jd = addJulianDeltaToJulianDay(jd1, jd2, jd);
       }
     else if ( td->sign == '-' )
       {
-        subtractJulianDeltaFromJulianDay(&jday, &jdelt, &jd);
+        jd = substractJulianDeltaFromJulianDay(jd1, jd2, jd);
       }
     else
       return NULL; /* ERROR: Sign of timedelta is not defined. Should never happen. */
 
     /* Get the Datetime */
-    dt_return = julian2date(&jd, dt_return);
+    dt_return = julian2date(jd, dt_return);
+
+    deallocateJulianDay(jd1);
+    deallocateJulianDelta(jd2);
+    deallocateJulianDay(jd);
 
     return dt_return;
   }
@@ -1623,24 +1785,26 @@ moduloTimeDeltaFromDateTime(struct _datetime* start_dt, struct _timedelta* times
 {
   if ((start_dt != NULL )&& (timestep != NULL) && (current_dt != NULL) && (modulo_td != NULL) ){
 
-  struct _datetime dt_tmp, *base_dt;
+  struct _datetime* dt_tmp = newDateTime(initDummyDTString);
+  if ( dt_tmp == NULL )
+    return NULL;
 
   if (compareDatetime(start_dt,current_dt)==(less_than))
     {
       /* Loop over */
-      addTimeDeltaToDateTime(start_dt,timestep,&dt_tmp);
-      while(compareDatetime(&dt_tmp,current_dt) == less_than)
-        addTimeDeltaToDateTime(&dt_tmp,timestep,&dt_tmp);
+      replaceDatetime(start_dt,dt_tmp);
+      while(compareDatetime((dt_tmp = addTimeDeltaToDateTime(dt_tmp,timestep,dt_tmp)),current_dt) == less_than);
 
-      /* Return n*timestep+start_dt - current_dt */
-      base_dt = &dt_tmp;
+      /* Return n*dt_tmp - current_dt */
+      modulo_td = getTimeDeltaFromDateTime(dt_tmp,current_dt,modulo_td);
     }
   else
     {
       /* Start time is in the future, return start_time - current_time. */
-      base_dt = start_dt;
+      modulo_td = getTimeDeltaFromDateTime(start_dt,current_dt,modulo_td);
     }
-  modulo_td = getTimeDeltaFromDateTime(base_dt,current_dt,modulo_td);
+
+  deallocateDateTime(dt_tmp);
 
   return modulo_td;
   }
@@ -1688,26 +1852,41 @@ elementwiseScalarMultiplyTimeDelta(struct _timedelta* base_td, int64_t lambda, s
         scaled_td->sign = '+';
 
       /* Sign already handled above. Make lambda positive. */
-      lambda = (int64_t)(llabs(lambda));
+      if (lambda < 0)
+        lambda *= -1;
 
-      /* Multiply each element by scalar. */
-      int64_t ms_temp = lambda * base_td->ms;
-      scaled_td->ms = (int)(ms_temp % NO_OF_MS_IN_A_SECOND);
-      int64_t s_temp = lambda*base_td->second + ms_temp / NO_OF_MS_IN_A_SECOND;
-      scaled_td->second = (int)(s_temp % 60);
 
-      int64_t m_temp = lambda*base_td->minute + s_temp / 60;
-      scaled_td->minute = (int)(m_temp % 60);
-
-      int64_t h_temp = lambda*base_td->hour + m_temp / 60;
-      scaled_td->hour = (int)(h_temp % NO_OF_HOURS_IN_A_DAY);
+      /* Multiply each element by scalar. */
 
-      /* Scalar multiplication must not give a value in excess of 24 hours. */
-      if ( h_temp >= NO_OF_HOURS_IN_A_DAY )
+      scaled_td->ms += (int) lambda*base_td->ms;
+      while ( scaled_td->ms >= NO_OF_MS_IN_A_SECOND )
         {
-          /* ERROR: Return on NULL. */
-          return NULL;
+          scaled_td->ms -= NO_OF_MS_IN_A_SECOND;
+          scaled_td->second += 1;
         }
+ 
+      scaled_td->second += (int) lambda*base_td->second;
+      while ( scaled_td->second >= 60 )
+        {       
+          scaled_td->second -= 60;
+          scaled_td->minute += 1;
+        }
+   
+      scaled_td->minute += (int) lambda*base_td->minute;
+      while ( scaled_td->minute >= 60 )
+        {
+          scaled_td->minute -= 60;
+          scaled_td->hour += 1;
+        }
+
+      scaled_td->hour += (int) lambda*base_td->hour;
+
+     /* Scalar multiplication can not give a value in excess of 24 hours. */
+     if ( scaled_td->hour >= NO_OF_HOURS_IN_A_DAY )
+       {
+         /* ERROR: Return on NULL. */
+         return NULL;
+       }
 
       scaled_td->day    = 0;
       scaled_td->month  = 0;
@@ -1760,7 +1939,8 @@ elementwiseScalarMultiplyTimeDeltaDP(struct _timedelta* base_td, double lambda,
       else
         scaled_td->sign = '+';
       /* Sign already handled above. Make lambda positive. */
-      lambda = fabs(lambda);
+      if (lambda < 0.)
+        lambda *= -1.;
 
       /* Multiply each element by scalar. */
 
@@ -1791,7 +1971,7 @@ elementwiseScalarMultiplyTimeDeltaDP(struct _timedelta* base_td, double lambda,
  * @brief Return the element-wise sum of two timedeltas.
  *
  * elementwiseAddTimeDeltatoTimeDelta adds two timedeltas elementwise and returns the result.
- * Timedeltas being added must be of the same sign; Subtraction is not supported. 
+ * Timedeltas being added must be of the same sign; Substraction is not supported. 
  * The timedelta can not have days,months or years however: Only Timedeltas upto hours should call this routine. 
  * Also td_return->hour >= 24 will lead to an error.
  *
@@ -1865,7 +2045,7 @@ elementwiseAddTimeDeltatoTimeDelta(struct _timedelta* td1, struct _timedelta* td
         } 
       else
         {
-          /* Subtraction not supported. */
+          /* Substraction not supported. */
           return NULL; 
         }
 
@@ -1901,17 +2081,20 @@ moduloTimedelta(struct _timedelta *a, struct _timedelta *p, int64_t *quot)
 {
   struct _datetime *dt = newDateTime("0001-01-01");
     
-  struct _juliandelta jdd1, jdd2;
+  struct _juliandelta *jdd1 = newJulianDelta('+', (int64_t) 0, (int64_t) 0);
+  struct _juliandelta *jdd2 = newJulianDelta('+', (int64_t) 0, (int64_t) 0);
         
-  timeDeltaToJulianDelta(a, dt, &jdd1);
-  timeDeltaToJulianDelta(p, dt, &jdd2);
+  jdd1 = timeDeltaToJulianDelta(a, dt, jdd1);
+  jdd2 = timeDeltaToJulianDelta(p, dt, jdd2);
 
   int64_t d1, d2;
   
-  d1 = (int64_t) 86400000 * jdd1.day + jdd1.ms;
-  d2 = (int64_t) 86400000 * jdd2.day + jdd2.ms;
+  d1 = (int64_t) 86400000 * jdd1->day + jdd1->ms;
+  d2 = (int64_t) 86400000 * jdd2->day + jdd2->ms;
 
   ldiv_t d = ldiv(d1, d2);
+
+  int64_t remainder = d.rem;
   *quot = d.quot;
 
   return d.rem;
@@ -1946,16 +2129,20 @@ getPTStringFromMS(int64_t _ms, char* PTstr)
    /*     return NULL; */
    /*   } */
 
-   jd = newJulianDelta(_ms >= 0 ? '+' : '-', 0, _ms);
+   if (_ms >= 0)
+     jd = newJulianDelta('+', 0, _ms); 
+   else
+     jd = newJulianDelta('-', 0, _ms);
 
    /* Create dummy variables for julianDeltaToTimeDelta() */
    struct _datetime* dumm_base_dt       = newDateTime(initDummyDTString);
-   struct _timedelta dummy_td;
+   struct _timedelta* dummy_td_return   = newTimeDelta(initDummyTDString);
    
    /* Get the translated TimeDelta and return the corresponding string. */
-   PTstr = timedeltaToString(julianDeltaToTimeDelta(jd, dumm_base_dt, &dummy_td), PTstr);
+   PTstr = timedeltaToString(julianDeltaToTimeDelta(jd, dumm_base_dt, dummy_td_return), PTstr);
      
    deallocateDateTime(dumm_base_dt);
+   deallocateTimeDelta(dummy_td_return);
    if(jd)
      deallocateJulianDelta(jd);
 
diff --git a/test/mtime_julianDay_test.c b/test/mtime_julianDay_test.c
index 0ca71dd0..b87b9c95 100644
--- a/test/mtime_julianDay_test.c
+++ b/test/mtime_julianDay_test.c
@@ -150,50 +150,50 @@ START_TEST(test_addJulianDelta_ProlepticGregorian)
 }
 END_TEST
 
-START_TEST(test_subtractJulianDelta_ProlepticGregorian)
+START_TEST(test_substractJulianDelta_ProlepticGregorian)
 {
-	assertSubtractJulianDelta(0, 40000000, 0, -40000000, 0, 0);
-	assertSubtractJulianDelta(0, 0, 0, -86400000 + 1, -1, 1);
-	assertSubtractJulianDelta(0, 0, 0, -86400000, -1, 0);
-	assertSubtractJulianDelta(0, 20000000, 0, -60000000, -1, 46400000);
-	assertSubtractJulianDelta(0, 20000000, -42, -60000000, -43, 46400000);
-	assertSubtractJulianDelta(789643, 20000000, -42, -60000000, 789600, 46400000);
-	assertSubtractJulianDelta(-789557, 20000000, -42, -60000000, -789600, 46400000);
-	assertSubtractJulianDelta(0, 0, -773094113281, 43200000, -773094113281, 43200000);
-	assertSubtractJulianDelta(-386547056640, 43200000, -386547056640, -86400000, -773094113281, 43200000);
-	assertSubtractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000, -1, 86400000 - 1);
-	assertSubtractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000 + 1, 0, 0);
-	assertSubtractJulianDelta(784354017364, 43200000 - 1, -1557448130644, -86400000 + 1, -773094113281, 43200000);
+	assertSubstractJulianDelta(0, 40000000, 0, -40000000, 0, 0);
+	assertSubstractJulianDelta(0, 0, 0, -86400000 + 1, -1, 1);
+	assertSubstractJulianDelta(0, 0, 0, -86400000, -1, 0);
+	assertSubstractJulianDelta(0, 20000000, 0, -60000000, -1, 46400000);
+	assertSubstractJulianDelta(0, 20000000, -42, -60000000, -43, 46400000);
+	assertSubstractJulianDelta(789643, 20000000, -42, -60000000, 789600, 46400000);
+	assertSubstractJulianDelta(-789557, 20000000, -42, -60000000, -789600, 46400000);
+	assertSubstractJulianDelta(0, 0, -773094113281, 43200000, -773094113281, 43200000);
+	assertSubstractJulianDelta(-386547056640, 43200000, -386547056640, -86400000, -773094113281, 43200000);
+	assertSubstractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000, -1, 86400000 - 1);
+	assertSubstractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000 + 1, 0, 0);
+	assertSubstractJulianDelta(784354017364, 43200000 - 1, -1557448130644, -86400000 + 1, -773094113281, 43200000);
 }
 END_TEST
 
-START_TEST(test_subtractJulianDay_ProlepticGregorian)
+START_TEST(test_substractJulianDay_ProlepticGregorian)
 {
-	assertSubtractJulianDay(0, 40000000, 0, 0, '+', 0, 40000000);
-	assertSubtractJulianDay(0, 0, -1, 1, '+', 0, 86400000 - 1);
-	assertSubtractJulianDay(0, 0, -1, 0, '+', 1, 0);
-	assertSubtractJulianDay(0, 20000000, -1, 46400000, '+', 0, 60000000);
-	assertSubtractJulianDay(0, 20000000, -43, 46400000, '+', 42, 60000000);
-	assertSubtractJulianDay(789643, 20000000, 789600, 46400000, '+', 42, 60000000);
-	assertSubtractJulianDay(-789557, 20000000, -789600, 46400000, '+', 42, 60000000);
-	assertSubtractJulianDay(0, 0, -773094113281, 43200000, '+', 773094113280, 43200000);
-	assertSubtractJulianDay(-386547056640, 43200000, -773094113281, 43200000, '+', 386547056641, 0);
-	assertSubtractJulianDay(784354017364, 43200000 - 1, -1, 86400000 - 1, '+', 784354017364, 43200000);
-	assertSubtractJulianDay(784354017364, 43200000 - 1, 0, 0, '+', 784354017364, 43200000 - 1);
-	assertSubtractJulianDay(784354017364, 43200000 - 1, -773094113281, 43200000, '+', 1557448130644, 86400000 - 1);
-
-	assertSubtractJulianDay(0, 40000000, 0, 80000000, '-', 0, -40000000);
-	assertSubtractJulianDay(0, 0, 0, 86400000 - 1, '-', 0, -86400000 + 1);
-	assertSubtractJulianDay(0, 0, 1, 0, '-', -1, 0);
-	assertSubtractJulianDay(0, 60000000, 1, 33600000, '-', 0, -60000000);
-	assertSubtractJulianDay(0, 60000000, 43, 33600000, '-', -42, -60000000);
-	assertSubtractJulianDay(-789643, 60000000, -789600, 33600000, '-', -42, -60000000);
-	assertSubtractJulianDay(789557, 60000000, 789600, 33600000, '-', -42, -60000000);
-	assertSubtractJulianDay(0, 0, 773094113279, 43200000 - 1, '-', -773094113279, -43200000 + 1);
-	assertSubtractJulianDay(386547056640, 43200000 - 1, 773094113279, 43200000 - 1, '-', -386547056639, 0);
-	assertSubtractJulianDay(-773094113281, 43200000, 0, 86400000 - 1, '-', -773094113281, -43200000 + 1);
-	assertSubtractJulianDay(-773094113281, 43200000, 0, 0, '-', -773094113280, -43200000);
-	assertSubtractJulianDay(-773094113281, 43200000, 784354017364, 43200000 - 1, '-', -1557448130644, -86400000 + 1);
+	assertSubstractJulianDay(0, 40000000, 0, 0, '+', 0, 40000000);
+	assertSubstractJulianDay(0, 0, -1, 1, '+', 0, 86400000 - 1);
+	assertSubstractJulianDay(0, 0, -1, 0, '+', 1, 0);
+	assertSubstractJulianDay(0, 20000000, -1, 46400000, '+', 0, 60000000);
+	assertSubstractJulianDay(0, 20000000, -43, 46400000, '+', 42, 60000000);
+	assertSubstractJulianDay(789643, 20000000, 789600, 46400000, '+', 42, 60000000);
+	assertSubstractJulianDay(-789557, 20000000, -789600, 46400000, '+', 42, 60000000);
+	assertSubstractJulianDay(0, 0, -773094113281, 43200000, '+', 773094113280, 43200000);
+	assertSubstractJulianDay(-386547056640, 43200000, -773094113281, 43200000, '+', 386547056641, 0);
+	assertSubstractJulianDay(784354017364, 43200000 - 1, -1, 86400000 - 1, '+', 784354017364, 43200000);
+	assertSubstractJulianDay(784354017364, 43200000 - 1, 0, 0, '+', 784354017364, 43200000 - 1);
+	assertSubstractJulianDay(784354017364, 43200000 - 1, -773094113281, 43200000, '+', 1557448130644, 86400000 - 1);
+
+	assertSubstractJulianDay(0, 40000000, 0, 80000000, '-', 0, -40000000);
+	assertSubstractJulianDay(0, 0, 0, 86400000 - 1, '-', 0, -86400000 + 1);
+	assertSubstractJulianDay(0, 0, 1, 0, '-', -1, 0);
+	assertSubstractJulianDay(0, 60000000, 1, 33600000, '-', 0, -60000000);
+	assertSubstractJulianDay(0, 60000000, 43, 33600000, '-', -42, -60000000);
+	assertSubstractJulianDay(-789643, 60000000, -789600, 33600000, '-', -42, -60000000);
+	assertSubstractJulianDay(789557, 60000000, 789600, 33600000, '-', -42, -60000000);
+	assertSubstractJulianDay(0, 0, 773094113279, 43200000 - 1, '-', -773094113279, -43200000 + 1);
+	assertSubstractJulianDay(386547056640, 43200000 - 1, 773094113279, 43200000 - 1, '-', -386547056639, 0);
+	assertSubstractJulianDay(-773094113281, 43200000, 0, 86400000 - 1, '-', -773094113281, -43200000 + 1);
+	assertSubstractJulianDay(-773094113281, 43200000, 0, 0, '-', -773094113280, -43200000);
+	assertSubstractJulianDay(-773094113281, 43200000, 784354017364, 43200000 - 1, '-', -1557448130644, -86400000 + 1);
 }
 END_TEST
 
@@ -226,8 +226,8 @@ void add_mtime_julianDay_test_to_suite(Suite* suite)
 	tcase_add_test(tcase_ProlepticGregorian, test_create_julianDay_ProlepticGregorian);
 	tcase_add_test(tcase_ProlepticGregorian, test_create_julianDelta_ProlepticGregorian);
 	tcase_add_test(tcase_ProlepticGregorian, test_addJulianDelta_ProlepticGregorian);
-	tcase_add_test(tcase_ProlepticGregorian, test_subtractJulianDelta_ProlepticGregorian);
-	tcase_add_test(tcase_ProlepticGregorian, test_subtractJulianDay_ProlepticGregorian);
+	tcase_add_test(tcase_ProlepticGregorian, test_substractJulianDelta_ProlepticGregorian);
+	tcase_add_test(tcase_ProlepticGregorian, test_substractJulianDay_ProlepticGregorian);
 
 	TCase *tcase_YearOf365Days = tcase_create("mtime_julianDay_test_YearOf365Days");
 	suite_add_tcase(suite, tcase_YearOf365Days);
@@ -305,10 +305,10 @@ void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t del
 	JulianDelta delta = newJulianDelta('+', delta_day, delta_ms);
 	ck_assert(delta != NULL);
 
-	JulianDay resultday = addJulianDeltaToJulianDay(originalday, delta, newJulianDay(0, 0));
+	JulianDay resultday = addJulianDelta(originalday, delta, newJulianDay(0, 0));
 	ck_assert(delta != NULL);
 
-	const char* format = "addJulianDeltaToJulianDay failed: expected:(%lld, %lld) actual:(%lld, %lld).";
+	const char* format = "addJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld).";
 	size_t length = snprintf(NULL, 0, format, expected_day, expected_ms, resultday->day, resultday->ms) + 1;
 	char* msg = malloc(length);
 	snprintf(msg, length, format, expected_day, expected_ms, resultday->day, resultday->ms);
@@ -322,7 +322,7 @@ void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t del
 	free(msg);
 }
 
-void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms)
+void assertSubstractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms)
 {
 	JulianDay originalday = newJulianDay(original_day, original_ms);
 	ck_assert(originalday != NULL);
@@ -330,10 +330,10 @@ void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_
 	JulianDelta delta = newJulianDelta('-', delta_day, delta_ms);
 	ck_assert(delta != NULL);
 
-	JulianDay resultday = subtractJulianDeltaFromJulianDay(originalday, delta, newJulianDay(0, 0));
+	JulianDay resultday = substractJulianDelta(originalday, delta, newJulianDay(0, 0));
 	ck_assert(delta != NULL);
 
-	const char* format = "subtractJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld).";
+	const char* format = "substractJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld).";
 	size_t length = snprintf(NULL, 0, format, expected_day, expected_ms, resultday->day, resultday->ms) + 1;
 	char* msg = malloc(length);
 	snprintf(msg, length, format, expected_day, expected_ms, resultday->day, resultday->ms);
@@ -347,7 +347,7 @@ void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_
 	free(msg);
 }
 
-void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms)
+void assertSubstractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms)
 {
 	JulianDay julianday1 = newJulianDay(day1, ms1);
 	ck_assert(julianday1 != NULL);
@@ -355,10 +355,10 @@ void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms
 	JulianDay julianday2 = newJulianDay(day2, ms2);
 	ck_assert(julianday2 != NULL);
 
-	JulianDelta delta = subtractJulianDay(julianday1, julianday2, newJulianDelta('+', 0, 0));
+	JulianDelta delta = substractJulianDay(julianday1, julianday2, newJulianDelta('+', 0, 0));
 	ck_assert(delta != NULL);
 
-	const char* format = "subtractJulianDay failed: expected:(%c, %lld, %lld) actual:(%c, %lld, %lld).";
+	const char* format = "substractJulianDay failed: expected:(%c, %lld, %lld) actual:(%c, %lld, %lld).";
 	size_t length = snprintf(NULL, 0, format, expected_delta_sign, expected_delta_day, expected_delta_ms, delta->sign, delta->day, delta->ms) + 1;
 	char* msg = malloc(length);
 	snprintf(msg, length, format, expected_delta_sign, expected_delta_day, expected_delta_ms, delta->sign, delta->day, delta->ms);
diff --git a/test/mtime_julianDay_test.h b/test/mtime_julianDay_test.h
index 82a52aa1..beb21deb 100644
--- a/test/mtime_julianDay_test.h
+++ b/test/mtime_julianDay_test.h
@@ -15,7 +15,7 @@ void add_mtime_julianDay_test_to_suite(Suite* suite);
 void assertJulianDay(int64_t day, int64_t ms, const char* expected_string);
 void assertJulianDelta(char sign, int64_t day, int64_t ms, char expected_sign, int64_t expected_day, int64_t expected_ms);
 void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms);
-void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms);
-void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms);
+void assertSubstractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms);
+void assertSubstractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms);
 
 #endif
-- 
GitLab