--- a/trac/util/datefmt.py
+++ b/trac/util/datefmt.py
@@ -269,6 +269,12 @@
     return dt
 
 
+_REL_FUTURE_RE = re.compile(
+    r'(?:(?:(?:in)|(?:\+))\s*(\d+\.?\d*)\s*'
+    r'(second|minute|hour|day|week|month|year|[hdwmy])s?\s*$)|'
+    r'(?:(\d+\.?\d*)\s*'
+    r'(second|minute|hour|day|week|month|year|[hdwmy])s?\s*'
+    r'(?:ahead))')
 _REL_TIME_RE = re.compile(
     r'(\d+\.?\d*)\s*'
     r'(second|minute|hour|day|week|month|year|[hdwmy])s?\s*'
@@ -287,7 +293,7 @@
     m=lambda v: timedelta(days=30 * v),
     y=lambda v: timedelta(days=365 * v),
 )
-_TIME_START_RE = re.compile(r'(this|last)\s*'
+_TIME_START_RE = re.compile(r'(next|this|last)\s*'
                             r'(second|minute|hour|day|week|month|year)$')
 _time_starts = dict(
     second=lambda now: now.replace(microsecond=0),
@@ -308,12 +314,21 @@
         return now
     if text == 'today':
         return now.replace(second=0, minute=0, hour=0)
+    if text == 'tomorrow':
+        return now.replace(second=0, minute=0, hour=0) + timedelta(days=1)
     if text == 'yesterday':
         return now.replace(second=0, minute=0, hour=0) - timedelta(days=1)
-    match = _REL_TIME_RE.match(text)
+    match = _REL_FUTURE_RE.match(text)
     if match:
-        (value, interval) = match.groups()
-        return now - _time_intervals[interval](float(value))
+        value = match.group(1) or match.group(3)
+        interval = match.group(2) or match.group(4)
+        return now + _time_intervals[interval](float(value))
+    else:
+        # relative time is past, if not matching future expression
+        match = _REL_TIME_RE.match(text)
+        if match:
+            (value, interval) = match.groups()
+            return now - _time_intervals[interval](float(value))
     match = _TIME_START_RE.match(text)
     if match:
         (which, start) = match.groups()
@@ -326,6 +341,14 @@
                     dt = dt.replace(year=dt.year - 1, month=12)
             else:
                 dt -= _time_intervals[start](1)
+        elif which == 'next':
+            if start == 'month':
+                if dt.month < 12:
+                    dt = dt.replace(month=dt.month + 1)
+                else:
+                    dt = dt.replace(year=dt.year + 1, month=1)
+            else:
+                dt += _time_intervals[start](1)
         return dt
     return None
 

