Index: Include/Classes/System/DateTime.ab
===================================================================
--- Include/Classes/System/DateTime.ab	(revision 103)
+++ Include/Classes/System/DateTime.ab	(revision 107)
@@ -27,5 +27,5 @@
 		End If
 		DateTime(316224000000000)
-		AddYears(year - 1)
+		This = AddYears(year - 1)
 
 		Dim days As Long
@@ -35,5 +35,5 @@
 		Next
 		days += day
-		AddDays(days - 1)
+		This = AddDays(days - 1)
 	End Sub
 
@@ -49,7 +49,7 @@
 		End If
 		DateTime(year, month, day)
-		AddHours(hour)
-		AddMinutes(minute)
-		AddSeconds(second)
+		This = AddHours(hour)
+		This = AddMinutes(minute)
+		This = AddSeconds(second)
 	End Sub
 
@@ -61,5 +61,5 @@
 	Sub DateTime(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long, millisecond As Long)
 		DateTime(year, month, day, hour, minute, second)
-		AddMilliseconds(millisecond)
+		This = AddMilliseconds(millisecond)
 	End Sub
 
@@ -84,4 +84,18 @@
 	Sub ~DateTime()
 	End Sub
+
+	Function Operator+ (ByRef value As TimeSpan) As DateTime
+		Dim date As DateTime(Ticks + value.Ticks)
+		Return date
+	End Function
+
+	Function Operator- (ByRef value As DateTime) As TimeSpan
+		Return TimeSpan.FromTicks(Ticks - value.Ticks)
+	End Function
+
+	Function Operator- (ByRef value As TimeSpan) As DateTime
+		Dim date As DateTime(Ticks - value.Ticks)
+		Return date
+	End Function
 
 	Function Operator == (ByRef value As DateTime) As Boolean
@@ -131,17 +145,17 @@
 
 	Function Millisecond() As Long
-		Return (Ticks \ 10000 Mod 1000) As Long
+		Return (Ticks \ TimeSpan.TicksPerMillisecond Mod 1000) As Long
 	End Function
 
 	Function Second() As Long
-		Return (Ticks \ 10000000 Mod 60) As Long
+		Return (Ticks \ TimeSpan.TicksPerSecond Mod 60) As Long
 	End Function
 
 	Function Minute() As Long
-		Return (Ticks \ 600000000 Mod 60) As Long
+		Return (Ticks \ TimeSpan.TicksPerMinute Mod 60) As Long
 	End Function
 
 	Function Hour() As Long
-		Return (Ticks \ 36000000000 Mod 24) As Long
+		Return (Ticks \ TimeSpan.TicksPerHour Mod 24) As Long
 	End Function
 
@@ -177,5 +191,5 @@
 	End Function
 
-	Function DayOfWeek() As DayOfWeek
+	Function DayOfWeek() As Long
 		Return totalDays() Mod 7 - 1
 	End Function
@@ -238,52 +252,70 @@
 	End Function
 
-	Sub AddTicks(value As Int64)
+	Function Add(ByRef value As TimeSpan) As DateTime
+		Return This + value
+	End Function
+
+	Function AddTicks(value As Int64) As DateTime
 		Dim ticks As Int64
 		ticks = Ticks
-		If (ticks > DateTime.MaxValue - value) Or (ticks < DateTime.MinValue - value) Then
+		If (ticks > MaxValue - value) Or (ticks < MinValue - value) Then
 			'ArgumentOutOfRangeException
 			debug
 		End If
-		Ticks = ticks + value
-	End Sub
-
-	Sub AddMilliseconds(value As Double)
-		AddTicks((value * 10000) As Int64)
-	End Sub
-
-	Sub AddSeconds(value As Double)
-		AddTicks((value * 10000000) As Int64)
-	End Sub
-
-	Sub AddMinutes(value As Double)
-		AddTicks((value * 600000000) As Int64)
-	End Sub
-
-	Sub AddHours(value As Double)
-		AddTicks((value * 36000000000) As Int64)
-	End Sub
-
-	Sub AddDays(value As Double)
-		AddTicks((value * 864000000000) As Int64)
-	End Sub
-
-	Sub AddYears(value As Double)
+
+		AddTicks.Ticks = ticks + value
+		AddTicks.Kind = Kind
+	End Function
+
+	Function AddMilliseconds(value As Double) As DateTime
+		Return AddTicks((value * TimeSpan.TicksPerMillisecond) As Int64)
+	End Function
+
+	Function AddSeconds(value As Double) As DateTime
+		Return AddTicks((value * TimeSpan.TicksPerSecond) As Int64)
+	End Function
+
+	Function AddMinutes(value As Double) As DateTime
+		Return AddTicks((value * TimeSpan.TicksPerMinute) As Int64)
+	End Function
+
+	Function AddHours(value As Double) As DateTime
+		Return AddTicks((value * TimeSpan.TicksPerHour) As Int64)
+	End Function
+
+	Function AddDays(value As Double) As DateTime
+		Return AddTicks((value * TimeSpan.TicksPerDay) As Int64)
+	End Function
+
+	Function AddYears(value As Double) As DateTime
 		Dim year As Long
 		Dim intValue As Long
+		Dim ticks As Int64
 		year = Year
 		intValue = Int(value)
-		AddTicks(intValue * 315360000000000 + 864000000000 * ((year Mod 4 + intValue) \ 4 - (year Mod 100 + intValue) \ 100 + (year Mod 400 + intValue) \ 400))
+		ticks = Ticks + intValue * 315360000000000 + 864000000000 * ((year Mod 4 + intValue) \ 4 - (year Mod 100 + intValue) \ 100 + (year Mod 400 + intValue) \ 400)
+
 		If value < 0 Then
 			If (year Mod 4 + intValue <= 0 And year Mod 100 > 4) Or (year Mod 400 <= 4) Then
-				AddTicks(-864000000000)
+				ticks -= 864000000000
 			End If
 		End If
-
 		If IsLeapYear(year) = TRUE Then
-			AddTicks(((value - intValue) * 316224000000000) As Int64)
-		Else
-			AddTicks(((value - intValue) * 315360000000000) As Int64)
-		End If
-	End Sub
+			ticks += (value - intValue) * 316224000000000
+		Else
+			ticks += (value - intValue) * 315360000000000
+		End If
+		
+		AddYears.Ticks = ticks
+		AddYears.Kind = Kind
+	End Function
+
+	Function Subtract(ByRef value As DateTime) As TimeSpan
+		Return This - value
+	End Function
+
+	Function Subtract(ByRef value As TimeSpan) As DateTime
+		Return This - value
+	End Function
 
 	Static Function DaysInMonth(year As Long, month As Long) As Long
@@ -430,5 +462,5 @@
 
 	Function totalDays() As Long
-		Return (Ticks \ 864000000000) As Long
+		Return (Ticks \ TimeSpan.TicksPerDay) As Long
 	End Function
 
