diff --git a/kernel/AnsiDates.st b/kernel/AnsiDates.st
index 9c72cdb..dd8b73c 100644
--- a/kernel/AnsiDates.st
+++ b/kernel/AnsiDates.st
@@ -111,15 +111,21 @@ Date subclass: DateTime [
 	"Parse an instance of the receiver from aStream"
 
 	<category: 'instance creation'>
-        | date time ofs ch |
+        | date time ofs ch pos|
         date := super readFrom: aStream.
+        pos := aStream position.
         (aStream peekFor: $T) ifFalse: [aStream skipSeparators].
         time := (aStream atEnd or: [aStream peek isDigit])
             ifTrue: [Duration readFrom: aStream]
-            ifFalse: [Duration zero].
+            ifFalse: [aStream position: pos.
+                      Duration zero].
+
+        pos := aStream position.
         aStream skipSeparators.
         ch := aStream peek.
-        (ch = $+ or: [ch = $-]) ifFalse: [^date + time].
+        (ch = $+ or: [ch = $-]) ifFalse: [
+            aStream position: pos.
+            ^date + time].
         ofs := Duration readFrom: aStream.
         ^(date + time) setOffset: ofs
     ]
@@ -542,8 +548,6 @@ Date subclass: DateTime [
     ]
 ]
 
-
-
 Time subclass: Duration [
     
     <category: 'Language-Data types'>
@@ -601,10 +605,15 @@ Time subclass: Duration [
             ifFalse: [aStream peekFor: $+. 1].
         i := 1.
         ch := $:.
-        [aStream atEnd not and: [ch isSeparator not and: [
+        [aStream atEnd not and: [ i<= 4 and: [ch isSeparator not and: [
              ch ~= $+ and: [ch ~= $- and: [
                  i > 1 ifTrue: [aStream next].
-                 i <= 4 and: [(ch := aStream peek) isDigit]]]]]] whileTrue: [
+                 (aStream atEnd not and: [(ch := aStream peek) isDigit]) ifFalse: [
+                    aStream position: (aStream position - 1).
+                 ].
+                 (ch := aStream peek) isDigit.
+            ]]
+        ]]]] whileTrue: [
             ws := WriteStream on: (String new: 10).
             [ws nextPut: aStream next.
              aStream atEnd not and: [(ch := aStream peek) isDigit]] whileTrue.
@@ -617,6 +626,7 @@ Time subclass: Duration [
                 ifFalse: [
                     hms at: i put: ws contents asNumber].
 	    i := i + 1].
+
         sec := ((hms at: 1) * 3600 + ((hms at: 2) * 60) + (hms at: 3)) * sign.
         ^self fromSeconds: sec
     ]
diff --git a/kernel/Date.st b/kernel/Date.st
index 29bcd02..6bf8b56 100644
--- a/kernel/Date.st
+++ b/kernel/Date.st
@@ -253,20 +253,23 @@ method.'>
 	    do: 
 		[:i | 
 		ws := WriteStream on: (String new: 10).
-		[aStream atEnd not and: [(ch := aStream peek) isAlphaNumeric not
-                       and: [ch ~= $-]]] 
+
+		[aStream atEnd not and: [(ch := aStream peek) isAlphaNumeric not]] 
 		    whileTrue: [aStream next].
-                aStream atEnd ifFalse: [
-		    aStream next.
-                    ch isLetter
+
+        aStream atEnd ifFalse: [
+            ch isLetter
 		        ifTrue: 
-			    [[ws nextPut: ch.
-			    aStream atEnd not and: [(ch := aStream next) isLetter]] 
-				    whileTrue]
-                        ifFalse:
-			    [[ws nextPut: ch.
-			        aStream atEnd not and: [(ch := aStream next) isDigit]] 
-				    whileTrue]].
+			        [[aStream next.
+                    ws nextPut: ch.
+			        aStream atEnd not and: [(ch := aStream peek) isLetter]] 
+				        whileTrue]
+                ifFalse:
+			        [[aStream next.
+                    ws nextPut: ch.
+			        aStream atEnd not and: [(ch := aStream peek) isDigit]] 
+				        whileTrue]].
+
 		t1 := t2.
 		t2 := t3.
 		t3 := ws contents.
diff --git a/kernel/Time.st b/kernel/Time.st
index 00c19eb..e5ac084 100644
--- a/kernel/Time.st
+++ b/kernel/Time.st
@@ -256,12 +256,18 @@ time value, and a block execution timing facility.'>
         hms := {0. 0. 0}.
         i := 1.
         ch := $:.
-        [i <= 3 and: [aStream atEnd not and: [ch isSeparator not]]] whileTrue: [
+        [i <= 3 and: [aStream atEnd not and: [ch = $: and: [(aStream peek) isDigit]]]] whileTrue: [
             ws := WriteStream on: (String new: 10).
             [aStream atEnd not and: [(ch := aStream next) isDigit]]
                 whileTrue: [ws nextPut: ch].
             hms at: i put: ws contents asNumber.
             i := i + 1].
+
+        (ch isDigit) ifFalse: [
+            (aStream position > 0) ifTrue: [
+                aStream position: (aStream position - 1)].
+        ].
+
         ^self fromSeconds: (hms at: 1) * 3600 + ((hms at: 2) * 60) + (hms at: 3)
     ]
 
diff --git a/tests/dates.ok b/tests/dates.ok
index 1bbfbd6..3e064d1 100644
--- a/tests/dates.ok
+++ b/tests/dates.ok
@@ -830,10 +830,10 @@ Execution begins...
 1-Feb-2011->'2011-02-01'
 1-Feb-2011->'Feb 1 2011'
 1-Feb-2011->'Feb 1 2011'
-1-Feb--2011->'-2011-02-01'
-1-Feb--2011->'-2011-02-01'
-1-Feb--2011->'Feb 1 -2011'
-1-Feb--2011->'Feb 1 -2011'
+1-Feb-2011->'-2011-02-01'
+1-Feb-2011->'-2011-02-01'
+1-Feb-2011->'Feb 1 -2011'
+1-Feb-2011->'Feb 1 -2011'
 9:00:02->'09:00:02'
 9:00:02->'09:00:02'
 9:00:02->'09:00:02'
@@ -996,12 +996,12 @@ Execution begins...
  2011-02-01T00:00:00+00:00->'2011-02-01'
  2011-02-01T00:00:00+00:00->'Feb 1 2011'
  2011-02-01T00:00:00+00:00->'Feb 1 2011'
--2011-02-01T09:00:00+01:30->'-2011-02-01T09:00+01:30'
--2011-02-01T09:00:00+01:30->'-2011-02-01T09:00+01:30'
--2011-02-01T00:00:00+00:00->'-2011-02-01'
--2011-02-01T00:00:00+00:00->'-2011-02-01'
--2011-02-01T00:00:00+00:00->'Feb 1 -2011'
--2011-02-01T00:00:00+00:00->'Feb 1 -2011'
+ 2011-02-01T09:00:00+01:30->'-2011-02-01T09:00+01:30'
+ 2011-02-01T09:00:00+01:30->'-2011-02-01T09:00+01:30'
+ 2011-02-01T00:00:00+00:00->'-2011-02-01'
+ 2011-02-01T00:00:00+00:00->'-2011-02-01'
+ 2011-02-01T00:00:00+00:00->'Feb 1 -2011'
+ 2011-02-01T00:00:00+00:00->'Feb 1 -2011'
  2011-02-01T09:00:00+01:30->'Feb 1 2011 09:00  +01:30'
  2011-02-01T09:00:00+01:30->'Feb 1 2011 09:00  +01:30'
  2011-02-01T09:00:00+01:30->'Feb 1 2011 09:00  +01:30'
diff --git a/tests/dates.st b/tests/dates.st
index 8a5efe6..393c874 100644
--- a/tests/dates.st
+++ b/tests/dates.st
@@ -118,12 +118,19 @@ Eval [ Date test3 ]
 
 String extend [
     suffix: suffix testReading: aClass [
-        | stream result |
+        | stream suffixedResult result |
+
+        "Check if the suffix is left in the stream after parsing (self,suffix)"
         stream := (self, suffix) readStream.
-        result := aClass readFrom: (self, suffix) readStream.
-        (stream upToEnd endsWith: suffix trimSeparators) ifFalse: [^nil].
-        result = (aClass readFrom: self readStream) ifFalse: [^nil].
-        ^result->self
+        suffixedResult := aClass readFrom: stream.
+
+        (stream upToEnd = suffix) ifFalse: [^nil].
+
+        "Check if the results parsed from the string with and without the suffix are the same"
+        result := aClass readFrom: self readStream.
+        (suffixedResult = result) ifFalse: [^nil].
+
+        ^suffixedResult->self
     ]
 ]
 
