diff --git a/Doc/lib/libdatetime.tex b/Doc/lib/libdatetime.tex
index 60fa678..d251e0f 100644
--- a/Doc/lib/libdatetime.tex
+++ b/Doc/lib/libdatetime.tex
@@ -231,18 +231,19 @@
           {(1)}
   \lineiii{\var{t1} = \var{t2} // \var{i}}
           {The floor is computed and the remainder (if any) is thrown away.}
-          {(2)}
+          {(3)}
   \lineiii{+\var{t1}}
           {Returns a \class{timedelta} object with the same value.}
-          {}
+          {(2)}
   \lineiii{-\var{t1}}
           {equivalent to \class{timedelta}(-\var{t1.days}, -\var{t1.seconds},
            -\var{t1.microseconds}),and to \var{t1}* -1.}
-          {(1)(3)}
+          {(1)(4)}
   \lineiii{abs(\var{t})}
           {equivalent to +\var{t} when \code{t.days >= 0}, and to
-           -\var{t} when \code{t.days < 0}.}
-          {(1)}
+           -\var{t} when \code{t.days < 0}.
+           overflow.}
+          {(2)}
 \end{tableiii}
 \noindent
 Notes:
@@ -252,9 +253,12 @@
   This is exact, but may overflow.
 
 \item[(2)]
-  Division by 0 raises \exception{ZeroDivisionError}.
+  This is exact, and cannot overflow.
 
 \item[(3)]
+  Division by 0 raises \exception{ZeroDivisionError}.
+
+\item[(4)]
   -\var{timedelta.max} is not representable as a \class{timedelta} object.
 \end{description}
 
@@ -883,11 +887,10 @@
   \class{tzinfo} object represents both time zone and DST adjustments,
   \method{utcoffset()} should return their sum.  If the UTC offset
   isn't known, return \code{None}.  Else the value returned must be
-  an integer, in the range -1439 to 1439 inclusive (1440 = 24*60;
-  the magnitude of the offset must be less than one day), or a
-  \class{timedelta} object representing a whole number of minutes
-  in the same range.  Most implementations of \method{utcoffset()}
-  will probably look like one of these two:
+  a \class{timedelta} object specifying a whole number of minutes in the
+  range -1439 to 1439 inclusive (1440 = 24*60; the magnitude of the offset
+  must be less than one day).  Most implementations of
+  \method{utcoffset()} will probably look like one of these two:
 
 \begin{verbatim}
     return CONSTANT                 # fixed-offset class
@@ -896,8 +899,6 @@
 
     If \method{utcoffset()} does not return \code{None},
     \method{dst()} should not return \code{None} either.
-
-
 \end{methoddesc}
 
 
@@ -905,7 +906,7 @@
   Return the daylight savings time (DST) adjustment, in minutes east of
   UTC, or \code{None} if DST information isn't known.  Return \code{0} if
   DST is not in effect.
-  If DST is in effect, return the offset as an integer or
+  If DST is in effect, return the offset as a
   \class{timedelta} object (see \method{utcoffset()} for details).
   Note that DST offset, if applicable, has
   already been added to the UTC offset returned by
diff --git a/Doc/lib/tzinfo-examples.py b/Doc/lib/tzinfo-examples.py
index 1d3b3c4..868755a 100644
--- a/Doc/lib/tzinfo-examples.py
+++ b/Doc/lib/tzinfo-examples.py
@@ -1,16 +1,18 @@
-from datetime import tzinfo
+from datetime import tzinfo, timedelta
+
+ZERO = timedelta(0)
 
 class UTC(tzinfo):
     """UTC"""
 
     def utcoffset(self, dt):
-        return 0
+        return ZERO
 
     def tzname(self, dt):
         return "UTC"
 
     def dst(self, dt):
-        return 0
+        return ZERO
 
 class FixedOffset(tzinfo):
     """Fixed offset in minutes east from UTC."""
@@ -26,8 +28,7 @@
         return self.__name
 
     def dst(self, dt):
-        # It depends on more than we know in an example.
-        return None # Indicate we don't know
+        return ZERO
 
 import time
 
@@ -43,9 +44,9 @@
 
     def utcoffset(self, dt):
         if self._isdst(dt):
-            return -time.timezone/60
+            return timedelta(seconds=-time.timezone)
         else:
-            return -time.altzone/60
+            return timedelta(seconds=-time.altzone)
 
     def tzname(self, dt):
         return time.tzname[self._isdst(dt)]
diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py
index 29f81f1..c9f7674 100644
--- a/Lib/test/test_datetime.py
+++ b/Lib/test/test_datetime.py
@@ -26,6 +26,10 @@
 
 class FixedOffset(tzinfo):
     def __init__(self, offset, name, dstoffset=42):
+        if isinstance(offset, int):
+            offset = timedelta(minutes=offset)
+        if isinstance(dstoffset, int):
+            dstoffset = timedelta(minutes=dstoffset)
         self.__offset = offset
         self.__name = name
         self.__dstoffset = dstoffset
@@ -72,9 +76,9 @@
         fo = FixedOffset(3, "Three")
         self.failUnless(isinstance(fo, tzinfo))
         for dt in datetime.now(), None:
-            self.assertEqual(fo.utcoffset(dt), 3)
+            self.assertEqual(fo.utcoffset(dt), timedelta(minutes=3))
             self.assertEqual(fo.tzname(dt), "Three")
-            self.assertEqual(fo.dst(dt), 42)
+            self.assertEqual(fo.dst(dt), timedelta(minutes=42))
 
     def test_pickling_base(self):
         import pickle, cPickle
@@ -94,10 +98,11 @@
         import pickle, cPickle
 
         # Make sure we can pickle/unpickle an instance of a subclass.
-        orig = PicklableFixedOffset(-300, 'cookie')
+        offset = timedelta(minutes=-300)
+        orig = PicklableFixedOffset(offset, 'cookie')
         self.failUnless(isinstance(orig, tzinfo))
         self.failUnless(type(orig) is PicklableFixedOffset)
-        self.assertEqual(orig.utcoffset(None), -300)
+        self.assertEqual(orig.utcoffset(None), offset)
         self.assertEqual(orig.tzname(None), 'cookie')
         for pickler in pickle, cPickle:
             for binary in 0, 1:
@@ -105,7 +110,7 @@
                 derived = pickler.loads(green)
                 self.failUnless(isinstance(derived, tzinfo))
                 self.failUnless(type(derived) is PicklableFixedOffset)
-                self.assertEqual(derived.utcoffset(None), -300)
+                self.assertEqual(derived.utcoffset(None), offset)
                 self.assertEqual(derived.tzname(None), 'cookie')
 
 #############################################################################
@@ -1562,7 +1567,8 @@
         # A datetimetz passes itself on, a timetz passes None.
         class introspective(tzinfo):
             def tzname(self, dt):    return dt and "real" or "none"
-            def utcoffset(self, dt): return dt and 42 or -42
+            def utcoffset(self, dt):
+                return timedelta(minutes = dt and 42 or -42)
             dst = utcoffset
 
         obj = cls(1, 2, 3, tzinfo=introspective())
@@ -1593,7 +1599,7 @@
     def test_utc_offset_out_of_bounds(self):
         class Edgy(tzinfo):
             def __init__(self, offset):
-                self.offset = offset
+                self.offset = timedelta(minutes=offset)
             def utcoffset(self, dt):
                 return self.offset
 
@@ -1629,23 +1635,19 @@
             self.failUnless(t.dst() is None)
             self.failUnless(t.tzname() is None)
 
-        class C2(tzinfo):
-            def utcoffset(self, dt): return -1439
-            def dst(self, dt): return 1439
-            def tzname(self, dt): return "aname"
         class C3(tzinfo):
             def utcoffset(self, dt): return timedelta(minutes=-1439)
             def dst(self, dt): return timedelta(minutes=1439)
             def tzname(self, dt): return "aname"
-        for t in cls(1, 1, 1, tzinfo=C2()), cls(1, 1, 1, tzinfo=C3()):
-            self.assertEqual(t.utcoffset(), timedelta(minutes=-1439))
-            self.assertEqual(t.dst(), timedelta(minutes=1439))
-            self.assertEqual(t.tzname(), "aname")
+        t = cls(1, 1, 1, tzinfo=C3())
+        self.assertEqual(t.utcoffset(), timedelta(minutes=-1439))
+        self.assertEqual(t.dst(), timedelta(minutes=1439))
+        self.assertEqual(t.tzname(), "aname")
 
         # Wrong types.
         class C4(tzinfo):
             def utcoffset(self, dt): return "aname"
-            def dst(self, dt): return ()
+            def dst(self, dt): return 7
             def tzname(self, dt): return 0
         t = cls(1, 1, 1, tzinfo=C4())
         self.assertRaises(TypeError, t.utcoffset)
@@ -1653,15 +1655,12 @@
         self.assertRaises(TypeError, t.tzname)
 
         # Offset out of range.
-        class C5(tzinfo):
-            def utcoffset(self, dt): return -1440
-            def dst(self, dt): return 1440
         class C6(tzinfo):
             def utcoffset(self, dt): return timedelta(hours=-24)
             def dst(self, dt): return timedelta(hours=24)
-        for t in cls(1, 1, 1, tzinfo=C5()), cls(1, 1, 1, tzinfo=C6()):
-            self.assertRaises(ValueError, t.utcoffset)
-            self.assertRaises(ValueError, t.dst)
+        t = cls(1, 1, 1, tzinfo=C6())
+        self.assertRaises(ValueError, t.utcoffset)
+        self.assertRaises(ValueError, t.dst)
 
         # Not a whole number of minutes.
         class C7(tzinfo):
@@ -1679,9 +1678,11 @@
         class OperandDependentOffset(tzinfo):
             def utcoffset(self, t):
                 if t.minute < 10:
-                    return t.minute # d0 and d1 equal after adjustment
+                    # d0 and d1 equal after adjustment
+                    return timedelta(minutes=t.minute)
                 else:
-                    return 59       # d2 off in the weeds
+                    # d2 off in the weeds
+                    return timedelta(minutes=59)
 
         base = cls(8, 9, 10, tzinfo=OperandDependentOffset())
         d0 = base.replace(minute=3)
@@ -1937,9 +1938,9 @@
         # In timetz w/ identical tzinfo objects, utcoffset is ignored.
         class Varies(tzinfo):
             def __init__(self):
-                self.offset = 22
+                self.offset = timedelta(minutes=22)
             def utcoffset(self, t):
-                self.offset += 1
+                self.offset += timedelta(minutes=1)
                 return self.offset
 
         v = Varies()
@@ -2028,7 +2029,8 @@
 
         # Try a bogus uctoffset.
         class Bogus(tzinfo):
-            def utcoffset(self, dt): return 1440 # out of bounds
+            def utcoffset(self, dt):
+                return timedelta(minutes=1440) # out of bounds
         t1 = self.theclass(2, 2, 2, tzinfo=Bogus())
         t2 = self.theclass(2, 2, 2, tzinfo=FixedOffset(0, ""))
         self.assertRaises(ValueError, lambda: t1 == t2)
@@ -2259,6 +2261,8 @@
         # DST flag.
         class DST(tzinfo):
             def __init__(self, dstvalue):
+                if isinstance(dstvalue, int):
+                    dstvalue = timedelta(minutes=dstvalue)
                 self.dstvalue = dstvalue
             def dst(self, dt):
                 return self.dstvalue
@@ -2291,6 +2295,8 @@
     def test_utctimetuple(self):
         class DST(tzinfo):
             def __init__(self, dstvalue):
+                if isinstance(dstvalue, int):
+                    dstvalue = timedelta(minutes=dstvalue)
                 self.dstvalue = dstvalue
             def dst(self, dt):
                 return self.dstvalue
@@ -2303,7 +2309,7 @@
         class UOFS(DST):
             def __init__(self, uofs, dofs=None):
                 DST.__init__(self, dofs)
-                self.uofs = uofs
+                self.uofs = timedelta(minutes=uofs)
             def utcoffset(self, dt):
                 return self.uofs
 
@@ -2454,9 +2460,11 @@
         class OperandDependentOffset(tzinfo):
             def utcoffset(self, t):
                 if t.minute < 10:
-                    return t.minute # d0 and d1 equal after adjustment
+                    # d0 and d1 equal after adjustment
+                    return timedelta(minutes=t.minute)
                 else:
-                    return 59       # d2 off in the weeds
+                    # d2 off in the weeds
+                    return timedelta(minutes=59)
 
         base = cls(8, 9, 10, 11, 12, 13, 14, tzinfo=OperandDependentOffset())
         d0 = base.replace(minute=3)
@@ -2502,9 +2510,9 @@
         # In datetimetz w/ identical tzinfo objects, utcoffset is ignored.
         class Varies(tzinfo):
             def __init__(self):
-                self.offset = 22
+                self.offset = timedelta(minutes=22)
             def utcoffset(self, t):
-                self.offset += 1
+                self.offset += timedelta(minutes=1)
                 return self.offset
 
         v = Varies()
diff --git a/Misc/NEWS b/Misc/NEWS
index b9c076d..246d171 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,9 +27,14 @@
   microsecond <http://www.python.org/sf/661086>.
 
   In dt.asdatetime(tz), if tz.utcoffset(dt) returns a duration,
-  ValueError is raised of tz.dst(dt) returns None (2.3a1 treated it
+  ValueError is raised if tz.dst(dt) returns None (2.3a1 treated it
   as 0 instead).
-  
+
+  The tzinfo methods utcoffset() and dst() must return a timedelta object 
+  (or None) now.  In 2.3a1 they could also return an int or long, but that 
+  was an unhelpfully redundant leftover from an earlier version wherein 
+  they couldn't return a timedelta.  TOOWTDI.
+
 Library
 -------
 
diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c
index 96c3e6d..4f53ece 100644
--- a/Modules/datetimemodule.c
+++ b/Modules/datetimemodule.c
@@ -629,11 +629,9 @@
 /* Call getattr(tzinfo, name)(tzinfoarg), and extract an int from the
  * result.  tzinfo must be an instance of the tzinfo class.  If the method
  * returns None, this returns 0 and sets *none to 1.  If the method doesn't
- * return a Python int or long or timedelta, TypeError is raised and this
- * returns -1.  If it returns an int or long, but is outside the valid
- * range for a UTC minute offset, or it returns a timedelta and the value is
- * out of range or isn't a whole number of minutes, ValueError is raised and
- * this returns -1.
+ * return None or timedelta, TypeError is raised and this returns -1.  If it
+ * returnsa timedelta and the value is out of range or isn't a whole number
+ * of minutes, ValueError is raised and this returns -1.
  * Else *none is set to 0 and the integer method result is returned.
  */
 static int
@@ -641,7 +639,7 @@
 		       int *none)
 {
 	PyObject *u;
-	long result = -1;	/* Py{Int,Long}_AsLong return long */
+	int result = -1;
 
 	assert(tzinfo != NULL);
 	assert(PyTZInfo_Check(tzinfo));
@@ -656,12 +654,6 @@
 		result = 0;
 		*none = 1;
 	}
-	else if (PyInt_Check(u))
-		result = PyInt_AS_LONG(u);
-
-	else if (PyLong_Check(u))
-		result = PyLong_AsLong(u);
-
 	else if (PyDelta_Check(u)) {
 		const int days = GET_TD_DAYS(u);
 		if (days < -1 || days > 0)
@@ -683,7 +675,7 @@
 	}
 	else {
 		PyErr_Format(PyExc_TypeError,
-			     "tzinfo.%s() must return None, integer or "
+			     "tzinfo.%s() must return None or "
 			     "timedelta, not '%s'",
 			     name, u->ob_type->tp_name);
 	}
@@ -696,16 +688,16 @@
 			     name, result);
 		result = -1;
 	}
-	return (int)result;
+	return result;
 }
 
 /* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the
  * result.  tzinfo must be an instance of the tzinfo class.  If utcoffset()
  * returns None, call_utcoffset returns 0 and sets *none to 1.  If uctoffset()
- & doesn't return a Python int or long, TypeError is raised and this
- * returns -1.  If utcoffset() returns an int outside the legitimate range
- * for a UTC offset, ValueError is raised and this returns -1.  Else
- * *none is set to 0 and the offset is returned.
+ * doesn't return None or timedelta, TypeError is raised and this returns -1.
+ * If utcoffset() returns an invalid timedelta (out of range, or not a whole
+ * # of minutes), ValueError is raised and this returns -1.  Else *none is
+ * set to 0 and the offset is returned (as int # of minutes east of UTC).
  */
 static int
 call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg, int *none)
@@ -745,10 +737,10 @@
 /* Call tzinfo.dst(tzinfoarg), and extract an integer from the
  * result.  tzinfo must be an instance of the tzinfo class.  If dst()
  * returns None, call_dst returns 0 and sets *none to 1.  If dst()
- & doesn't return a Python int or long, TypeError is raised and this
- * returns -1.  If dst() returns an int outside the legitimate range
- * for a UTC offset, ValueError is raised and this returns -1.  Else
- * *none is set to 0 and the offset is returned.
+ & doesn't return None or timedelta, TypeError is raised and this
+ * returns -1.  If dst() returns an invalid timedelta for for a UTC offset,
+ * ValueError is raised and this returns -1.  Else *none is set to 0 and
+ * the offset is returned (as an int # of minutes east of UTC).
  */
 static int
 call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none)
