diff --git a/src/mtime_iso8601.c b/src/mtime_iso8601.c
index 6e5f4cbb1705beb15f3c81a019b54e4672493fe7..bf7397199dfe95ffdcb1bc6f91623e32ad63b50a 100644
--- a/src/mtime_iso8601.c
+++ b/src/mtime_iso8601.c
@@ -633,35 +633,44 @@ _match:
 	    char* _du_ms;
 	    int _ms;
             int _seconds;            
-	    
+            div_t _split;
+            
+            if (strstr(_du_second,"."))
+	      {
+		_du_ms = (strstr(_du_second,".")+1);
+		if (_du_ms[0] == '-')
+		  _du_ms = _du_ms + 1;
+
+		_ms = atoi(_du_ms);
+
+		if (strlen(_du_ms) == 1)
+		  duObj->ms += _ms*100;
+		else if (strlen(_du_ms) == 2)
+		  duObj->ms += _ms*10;
+		else
+		  duObj->ms += _ms;
+              }               
+
+            if (duObj->ms > 999)
+              {             
+                _split = div(duObj->ms, 1000);
+                duObj->second += _split.quot;
+                duObj->ms = _split.rem;
+              }
+
 	    strncpy( _du_second, ts, (size_t)(te-ts));
 	    _du_second[MAX_BUFFER_LENGTH-1] = '\0';
             _seconds = atoi(_du_second);
+            _seconds += duObj->day * 86400 + duObj->hour * 3600 + duObj->minute * 60 + duObj->second; 
             duObj->day = _seconds / 86400;
             _seconds -= duObj->day * 86400;
             duObj->hour = _seconds / 3600;
             _seconds -= duObj->hour * 3600;
             duObj->minute = _seconds / 60;
-            duObj->second = _seconds - duObj->minute * 60; 
-
-	    if(strstr(_du_second,"."))
-	      {
-		_du_ms = (strstr(_du_second,".")+1);
-		if(_du_ms[0] == '-')
-		  _du_ms = _du_ms + 1;
-
-		_ms = atoi(_du_ms);
-
-		if(strlen(_du_ms) == 1)
-		  duObj->ms = _ms*100;
-		else if(strlen(_du_ms) == 2)
-		  duObj->ms = _ms*10;
-		else
-		  duObj->ms = _ms;        
-	      }               
+            duObj->second = _seconds - duObj->minute * 60;
 	  }
 	break;
-#line 665 "mtime_iso8601.c"
+#line 674 "mtime_iso8601.c"
 		}
 	}
 
@@ -674,7 +683,7 @@ _again:
 	_out: {}
 	}
 
-#line 548 "mtime_iso8601.rl"
+#line 557 "mtime_iso8601.rl"
 
     
 }
diff --git a/src/mtime_iso8601.rl b/src/mtime_iso8601.rl
index 94a1207eb69d32919433461f32b524cb6f258894..9bade13a607a0d03bc174c7e3ed8ffcfd6170f3b 100644
--- a/src/mtime_iso8601.rl
+++ b/src/mtime_iso8601.rl
@@ -281,32 +281,41 @@ date_machine( char *str, ISO8601_STATUS* stat, struct internal_datetime* dtObj,
 	    char* _du_ms;
 	    int _ms;
             int _seconds;            
-	    
+            div_t _split;
+            
+            if (strstr(_du_second,"."))
+	      {
+		_du_ms = (strstr(_du_second,".")+1);
+		if (_du_ms[0] == '-')
+		  _du_ms = _du_ms + 1;
+
+		_ms = atoi(_du_ms);
+
+		if (strlen(_du_ms) == 1)
+		  duObj->ms += _ms*100;
+		else if (strlen(_du_ms) == 2)
+		  duObj->ms += _ms*10;
+		else
+		  duObj->ms += _ms;
+              }               
+
+            if (duObj->ms > 999)
+              {             
+                _split = div(duObj->ms, 1000);
+                duObj->second += _split.quot;
+                duObj->ms = _split.rem;
+              }
+
 	    strncpy( _du_second, ts, (size_t)(te-ts));
 	    _du_second[MAX_BUFFER_LENGTH-1] = '\0';
             _seconds = atoi(_du_second);
+            _seconds += duObj->day * 86400 + duObj->hour * 3600 + duObj->minute * 60 + duObj->second; 
             duObj->day = _seconds / 86400;
             _seconds -= duObj->day * 86400;
             duObj->hour = _seconds / 3600;
             _seconds -= duObj->hour * 3600;
             duObj->minute = _seconds / 60;
-            duObj->second = _seconds - duObj->minute * 60; 
-
-	    if(strstr(_du_second,"."))
-	      {
-		_du_ms = (strstr(_du_second,".")+1);
-		if(_du_ms[0] == '-')
-		  _du_ms = _du_ms + 1;
-
-		_ms = atoi(_du_ms);
-
-		if(strlen(_du_ms) == 1)
-		  duObj->ms = _ms*100;
-		else if(strlen(_du_ms) == 2)
-		  duObj->ms = _ms*10;
-		else
-		  duObj->ms = _ms;        
-	      }               
+            duObj->second = _seconds - duObj->minute * 60;
 	  }
 
 
diff --git a/test/duration.f90 b/test/duration.f90
index 4da39d97cd9e8ae4396759d1aae8f7a88de72b3c..66a5de0454ba54feec5e3567df3280090b72bc96 100644
--- a/test/duration.f90
+++ b/test/duration.f90
@@ -21,8 +21,30 @@ program duration
   call testTimedelta('P2DT6H', 'P02DT06H')
   call testTimedelta('P200D', 'P200D')
 
+  call testTimedeltaComp('PT24M', 'PT06H00M00S', '<', .TRUE.) 
+
 contains
 
+  subroutine testTimedeltaComp(td_A, td_B, op, expected)
+    character(len=*), intent(in) :: td_a
+    character(len=*), intent(in) :: td_b
+    character(len=*), intent(in) :: op
+    logical, intent(in) :: expected
+
+    TYPE(timedelta),     POINTER   :: mtime_A, mtime_B
+
+    mtime_A => newTimedelta(td_a)
+    mtime_B => newTimedelta(td_b)
+
+    select case (op)
+    case ('<')
+      print *, td_a, ' < ', td_b, ' ? ', mtime_A < mtime_B, ' expected ', expected      
+    case default
+      print *, 'Unknown comparison operator.'
+    end select
+    
+  end subroutine testTimedeltaComp
+  
   subroutine testTimedelta(interval, expected)
     character(len=*), intent(in) :: interval, expected
     character(len=max_timedelta_str_len) :: dstring