diff --git a/doc/suiterc.tex b/doc/suiterc.tex
index f9f4d405932..e2b6da30c60 100644
--- a/doc/suiterc.tex
+++ b/doc/suiterc.tex
@@ -451,7 +451,8 @@ \subsection{[scheduling]}
\begin{myitemize}
\item {\em type:} ISO 8601 date/time point representation (e.g.
- \lstinline=CCYYMMDDThhmm=, 19951231T1230)
+ \lstinline=CCYYMMDDThhmm=, 19951231T1230) or ISO 8601 date/time offset
+ (e.g. +P1D)
\item {\em default:} (none)
\end{myitemize}
diff --git a/lib/cylc/cfgspec/suite.py b/lib/cylc/cfgspec/suite.py
index e6ef96a65ba..26b9d1cda37 100644
--- a/lib/cylc/cfgspec/suite.py
+++ b/lib/cylc/cfgspec/suite.py
@@ -119,6 +119,12 @@ def _coerce_cycletime_time_zone( value, keys, args ):
return value
+def _coerce_final_cycletime( value, keys, args ):
+ """Coerce final cycle point."""
+ value = _strip_and_unquote( keys, value )
+ return value
+
+
def _coerce_interval( value, keys, args, back_comp_unit_factor=1 ):
"""Coerce an ISO 8601 interval (or number: back-comp) into seconds."""
value = _strip_and_unquote( keys, value )
@@ -152,6 +158,7 @@ def _coerce_interval_list( value, keys, args, back_comp_unit_factor=1 ):
coercers['cycletime_format'] = _coerce_cycletime_format
coercers['cycletime_time_zone'] = _coerce_cycletime_time_zone
coercers['cycleinterval'] = _coerce_cycleinterval
+coercers['final_cycletime'] = _coerce_final_cycletime
coercers['interval'] = _coerce_interval
coercers['interval_minutes'] = lambda *a: _coerce_interval(
*a, back_comp_unit_factor=60)
@@ -207,7 +214,7 @@ def _coerce_interval_list( value, keys, args, back_comp_unit_factor=1 ):
},
'scheduling' : {
'initial cycle point' : vdr(vtype='cycletime'),
- 'final cycle point' : vdr(vtype='cycletime'),
+ 'final cycle point' : vdr(vtype='final_cycletime'),
'cycling mode' : vdr(vtype='string', default=Calendar.MODE_GREGORIAN, options=Calendar.MODES.keys() + ["integer"] ),
'runahead limit' : vdr(vtype='cycleinterval' ),
'max active cycle points' : vdr(vtype='integer', default=3),
@@ -317,7 +324,7 @@ def _coerce_interval_list( value, keys, args, back_comp_unit_factor=1 ):
},
'visualization' : {
'initial cycle point' : vdr( vtype='cycletime' ),
- 'final cycle point' : vdr( vtype='cycletime' ),
+ 'final cycle point' : vdr( vtype='final_cycletime' ),
'collapsed families' : vdr( vtype='string_list', default=[] ),
'use node color for edges' : vdr( vtype='boolean', default=True ),
'use node color for labels' : vdr( vtype='boolean', default=False ),
diff --git a/lib/cylc/config.py b/lib/cylc/config.py
index 3d61ab81e32..37bd9bdcd8b 100644
--- a/lib/cylc/config.py
+++ b/lib/cylc/config.py
@@ -25,6 +25,7 @@
init_cyclers, INTEGER_CYCLING_TYPE,
ISO8601_CYCLING_TYPE,
get_backwards_compat_mode)
+from cylc.cycling.iso8601 import get_point_relative
from isodatetime.data import Calendar
from envvar import check_varnames, expandvars
from copy import deepcopy, copy
@@ -236,8 +237,13 @@ def __init__( self, suite, fpath, template_vars=[],
self.cfg['scheduling']['initial cycle point'] = str(initial_point)
if self.cfg['scheduling']['final cycle point'] is not None:
- final_point = get_point(
- self.cfg['scheduling']['final cycle point']).standardise()
+ try:
+ final_point = get_point_relative(
+ self.cfg['scheduling']['final cycle point'],
+ initial_point).standardise()
+ except ValueError:
+ final_point = get_point(
+ self.cfg['scheduling']['final cycle point']).standardise()
self.cfg['scheduling']['final cycle point'] = str(final_point)
self.cli_initial_point = get_point(self._cli_initial_point_string)
diff --git a/tests/offset/00-final-simple.t b/tests/offset/00-final-simple.t
new file mode 100644
index 00000000000..d12060337e2
--- /dev/null
+++ b/tests/offset/00-final-simple.t
@@ -0,0 +1,31 @@
+#!/bin/bash
+#C: THIS FILE IS PART OF THE CYLC SUITE ENGINE.
+#C: Copyright (C) 2008-2014 Hilary Oliver, NIWA
+#C:
+#C: This program is free software: you can redistribute it and/or modify
+#C: it under the terms of the GNU General Public License as published by
+#C: the Free Software Foundation, either version 3 of the License, or
+#C: (at your option) any later version.
+#C:
+#C: This program is distributed in the hope that it will be useful,
+#C: but WITHOUT ANY WARRANTY; without even the implied warranty of
+#C: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#C: GNU General Public License for more details.
+#C:
+#C: You should have received a copy of the GNU General Public License
+#C: along with this program. If not, see .
+#-------------------------------------------------------------------------------
+# Test specifying final cycle as an offset
+. $(dirname $0)/test_header
+#-------------------------------------------------------------------------------
+set_test_number 2
+#-------------------------------------------------------------------------------
+install_suite $TEST_NAME_BASE $TEST_NAME_BASE
+#-------------------------------------------------------------------------------
+TEST_NAME=$TEST_NAME_BASE-validate
+run_ok $TEST_NAME cylc validate $SUITE_NAME
+#-------------------------------------------------------------------------------
+TEST_NAME=$TEST_NAME_BASE-run
+suite_run_ok $TEST_NAME cylc run --reference-test --debug $SUITE_NAME
+#-------------------------------------------------------------------------------
+purge_suite $SUITE_NAME
diff --git a/tests/offset/00-final-simple/reference.log b/tests/offset/00-final-simple/reference.log
new file mode 100644
index 00000000000..1323875e05c
--- /dev/null
+++ b/tests/offset/00-final-simple/reference.log
@@ -0,0 +1,151 @@
+2014-08-05T12:04:31+01 DEBUG - Initializing process pool, size 8
+2014-08-05T12:04:31+01 INFO - port:7781
+2014-08-05T12:04:31+01 INFO - Suite starting at 2014-08-05T12:04:31+01
+2014-08-05T12:04:31+01 INFO - Log event clock: real time
+2014-08-05T12:04:31+01 INFO - Run mode: live
+2014-08-05T12:04:31+01 INFO - Initial point: 20100101T0000+01
+2014-08-05T12:04:31+01 INFO - Final point: 20100106T0000+01
+2014-08-05T12:04:31+01 DEBUG - request handling thread starting
+2014-08-05T12:04:31+01 INFO - Cold Start 20100101T0000+01
+2014-08-05T12:04:31+01 DEBUG - [foo.20100101T0000+01] -released to the task pool
+2014-08-05T12:04:31+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:31+01 DEBUG - [foo.20100101T0000+01] -(setting:queued)
+2014-08-05T12:04:31+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:31+01 DEBUG - [foo.20100101T0000+01] -(setting:ready)
+2014-08-05T12:04:31+01 DEBUG - [foo.20100101T0000+01] -incrementing submit number
+2014-08-05T12:04:31+01 INFO - [foo.20100101T0000+01] -triggered off []
+2014-08-05T12:04:31+01 DEBUG - END TASK PROCESSING (took 0.0146241188049 sec)
+2014-08-05T12:04:32+01 INFO - [foo.20100101T0000+01] -submit_method_id=28482
+2014-08-05T12:04:32+01 INFO - [foo.20100101T0000+01] -submission succeeded
+2014-08-05T12:04:32+01 DEBUG - [foo.20100101T0000+01] -(setting:submitted)
+2014-08-05T12:04:32+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:32+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:32+01 DEBUG - [foo.20100101T0000+01] -forced spawning
+2014-08-05T12:04:32+01 DEBUG - END TASK PROCESSING (took 0.0114269256592 sec)
+2014-08-05T12:04:33+01 DEBUG - [foo.20100102T0000+01] -released to the task pool
+2014-08-05T12:04:33+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:33+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:33+01 DEBUG - END TASK PROCESSING (took 0.00534605979919 sec)
+2014-08-05T12:04:33+01 INFO - [foo.20100101T0000+01] -(current:submitted)> foo.20100101T0000+01 started at 2014-08-05T12:04:32+01
+2014-08-05T12:04:33+01 DEBUG - [foo.20100101T0000+01] -(setting:running)
+2014-08-05T12:04:33+01 INFO - [foo.20100101T0000+01] -(current:running)> foo.20100101T0000+01 succeeded at 2014-08-05T12:04:33+01
+2014-08-05T12:04:33+01 DEBUG - [foo.20100101T0000+01] -(setting:succeeded)
+2014-08-05T12:04:34+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:34+01 DEBUG - [foo.20100102T0000+01] -(setting:queued)
+2014-08-05T12:04:34+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:34+01 DEBUG - [foo.20100102T0000+01] -(setting:ready)
+2014-08-05T12:04:34+01 DEBUG - [foo.20100102T0000+01] -incrementing submit number
+2014-08-05T12:04:34+01 INFO - [foo.20100102T0000+01] -triggered off ['foo.20100101T0000+01']
+2014-08-05T12:04:34+01 DEBUG - [foo.20100101T0000+01] -task proxy removed
+2014-08-05T12:04:34+01 DEBUG - END TASK PROCESSING (took 0.018651008606 sec)
+2014-08-05T12:04:35+01 INFO - [foo.20100102T0000+01] -submit_method_id=28621
+2014-08-05T12:04:35+01 INFO - [foo.20100102T0000+01] -submission succeeded
+2014-08-05T12:04:35+01 DEBUG - [foo.20100102T0000+01] -(setting:submitted)
+2014-08-05T12:04:36+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:36+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:36+01 DEBUG - [foo.20100102T0000+01] -forced spawning
+2014-08-05T12:04:36+01 DEBUG - END TASK PROCESSING (took 0.0133910179138 sec)
+2014-08-05T12:04:36+01 INFO - [foo.20100102T0000+01] -(current:submitted)> foo.20100102T0000+01 started at 2014-08-05T12:04:35+01
+2014-08-05T12:04:36+01 DEBUG - [foo.20100102T0000+01] -(setting:running)
+2014-08-05T12:04:37+01 DEBUG - [foo.20100103T0000+01] -released to the task pool
+2014-08-05T12:04:37+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:37+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:37+01 DEBUG - END TASK PROCESSING (took 0.00515794754028 sec)
+2014-08-05T12:04:37+01 INFO - [foo.20100102T0000+01] -(current:running)> foo.20100102T0000+01 succeeded at 2014-08-05T12:04:36+01
+2014-08-05T12:04:37+01 DEBUG - [foo.20100102T0000+01] -(setting:succeeded)
+2014-08-05T12:04:38+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:38+01 DEBUG - [foo.20100103T0000+01] -(setting:queued)
+2014-08-05T12:04:38+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:38+01 DEBUG - [foo.20100103T0000+01] -(setting:ready)
+2014-08-05T12:04:38+01 DEBUG - [foo.20100103T0000+01] -incrementing submit number
+2014-08-05T12:04:38+01 INFO - [foo.20100103T0000+01] -triggered off ['foo.20100102T0000+01']
+2014-08-05T12:04:38+01 DEBUG - [foo.20100102T0000+01] -task proxy removed
+2014-08-05T12:04:38+01 DEBUG - END TASK PROCESSING (took 0.0154209136963 sec)
+2014-08-05T12:04:39+01 INFO - [foo.20100103T0000+01] -submit_method_id=28763
+2014-08-05T12:04:39+01 INFO - [foo.20100103T0000+01] -submission succeeded
+2014-08-05T12:04:39+01 DEBUG - [foo.20100103T0000+01] -(setting:submitted)
+2014-08-05T12:04:39+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:39+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:39+01 DEBUG - [foo.20100103T0000+01] -forced spawning
+2014-08-05T12:04:39+01 DEBUG - END TASK PROCESSING (took 0.0126049518585 sec)
+2014-08-05T12:04:39+01 INFO - [foo.20100103T0000+01] -(current:submitted)> foo.20100103T0000+01 started at 2014-08-05T12:04:38+01
+2014-08-05T12:04:39+01 DEBUG - [foo.20100103T0000+01] -(setting:running)
+2014-08-05T12:04:40+01 DEBUG - [foo.20100104T0000+01] -released to the task pool
+2014-08-05T12:04:40+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:40+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:40+01 DEBUG - END TASK PROCESSING (took 0.00577998161316 sec)
+2014-08-05T12:04:40+01 INFO - [foo.20100103T0000+01] -(current:running)> foo.20100103T0000+01 succeeded at 2014-08-05T12:04:39+01
+2014-08-05T12:04:40+01 DEBUG - [foo.20100103T0000+01] -(setting:succeeded)
+2014-08-05T12:04:41+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:41+01 DEBUG - [foo.20100104T0000+01] -(setting:queued)
+2014-08-05T12:04:41+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:41+01 DEBUG - [foo.20100104T0000+01] -(setting:ready)
+2014-08-05T12:04:41+01 DEBUG - [foo.20100104T0000+01] -incrementing submit number
+2014-08-05T12:04:41+01 INFO - [foo.20100104T0000+01] -triggered off ['foo.20100103T0000+01']
+2014-08-05T12:04:41+01 DEBUG - [foo.20100103T0000+01] -task proxy removed
+2014-08-05T12:04:41+01 DEBUG - END TASK PROCESSING (took 0.0161001682281 sec)
+2014-08-05T12:04:42+01 INFO - [foo.20100104T0000+01] -submit_method_id=28904
+2014-08-05T12:04:42+01 INFO - [foo.20100104T0000+01] -submission succeeded
+2014-08-05T12:04:42+01 DEBUG - [foo.20100104T0000+01] -(setting:submitted)
+2014-08-05T12:04:42+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:42+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:42+01 DEBUG - [foo.20100104T0000+01] -forced spawning
+2014-08-05T12:04:42+01 DEBUG - END TASK PROCESSING (took 0.0274260044098 sec)
+2014-08-05T12:04:42+01 INFO - [foo.20100104T0000+01] -(current:submitted)> foo.20100104T0000+01 started at 2014-08-05T12:04:41+01
+2014-08-05T12:04:42+01 DEBUG - [foo.20100104T0000+01] -(setting:running)
+2014-08-05T12:04:43+01 DEBUG - [foo.20100105T0000+01] -released to the task pool
+2014-08-05T12:04:43+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:43+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:43+01 DEBUG - END TASK PROCESSING (took 0.0056037902832 sec)
+2014-08-05T12:04:43+01 INFO - [foo.20100104T0000+01] -(current:running)> foo.20100104T0000+01 succeeded at 2014-08-05T12:04:42+01
+2014-08-05T12:04:43+01 DEBUG - [foo.20100104T0000+01] -(setting:succeeded)
+2014-08-05T12:04:44+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:44+01 DEBUG - [foo.20100105T0000+01] -(setting:queued)
+2014-08-05T12:04:44+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:44+01 DEBUG - [foo.20100105T0000+01] -(setting:ready)
+2014-08-05T12:04:44+01 DEBUG - [foo.20100105T0000+01] -incrementing submit number
+2014-08-05T12:04:44+01 INFO - [foo.20100105T0000+01] -triggered off ['foo.20100104T0000+01']
+2014-08-05T12:04:44+01 DEBUG - [foo.20100104T0000+01] -task proxy removed
+2014-08-05T12:04:44+01 DEBUG - END TASK PROCESSING (took 0.0160040855408 sec)
+2014-08-05T12:04:45+01 INFO - [foo.20100105T0000+01] -submit_method_id=29049
+2014-08-05T12:04:45+01 INFO - [foo.20100105T0000+01] -submission succeeded
+2014-08-05T12:04:45+01 DEBUG - [foo.20100105T0000+01] -(setting:submitted)
+2014-08-05T12:04:45+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:45+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:45+01 DEBUG - [foo.20100105T0000+01] -forced spawning
+2014-08-05T12:04:45+01 DEBUG - END TASK PROCESSING (took 0.0133059024811 sec)
+2014-08-05T12:04:45+01 INFO - [foo.20100105T0000+01] -(current:submitted)> foo.20100105T0000+01 started at 2014-08-05T12:04:44+01
+2014-08-05T12:04:45+01 DEBUG - [foo.20100105T0000+01] -(setting:running)
+2014-08-05T12:04:46+01 DEBUG - [foo.20100106T0000+01] -released to the task pool
+2014-08-05T12:04:46+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:46+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:46+01 DEBUG - END TASK PROCESSING (took 0.00688409805298 sec)
+2014-08-05T12:04:46+01 INFO - [foo.20100105T0000+01] -(current:running)> foo.20100105T0000+01 succeeded at 2014-08-05T12:04:45+01
+2014-08-05T12:04:46+01 DEBUG - [foo.20100105T0000+01] -(setting:succeeded)
+2014-08-05T12:04:47+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:47+01 DEBUG - [foo.20100106T0000+01] -(setting:queued)
+2014-08-05T12:04:47+01 DEBUG - 1 task(s) ready
+2014-08-05T12:04:47+01 DEBUG - [foo.20100106T0000+01] -(setting:ready)
+2014-08-05T12:04:47+01 DEBUG - [foo.20100106T0000+01] -incrementing submit number
+2014-08-05T12:04:47+01 INFO - [foo.20100106T0000+01] -triggered off ['foo.20100105T0000+01']
+2014-08-05T12:04:47+01 DEBUG - [foo.20100105T0000+01] -task proxy removed
+2014-08-05T12:04:47+01 DEBUG - END TASK PROCESSING (took 0.0164649486542 sec)
+2014-08-05T12:04:48+01 INFO - [foo.20100106T0000+01] -submit_method_id=29187
+2014-08-05T12:04:48+01 INFO - [foo.20100106T0000+01] -submission succeeded
+2014-08-05T12:04:48+01 DEBUG - [foo.20100106T0000+01] -(setting:submitted)
+2014-08-05T12:04:48+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:48+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:48+01 DEBUG - [foo.20100106T0000+01] -forced spawning
+2014-08-05T12:04:48+01 INFO - [foo.20100107T0000+01] -holding (beyond suite stop point) 20100106T0000+01
+2014-08-05T12:04:48+01 DEBUG - [foo.20100107T0000+01] -(setting:held)
+2014-08-05T12:04:48+01 DEBUG - END TASK PROCESSING (took 0.0190420150757 sec)
+2014-08-05T12:04:48+01 INFO - [foo.20100106T0000+01] -(current:submitted)> foo.20100106T0000+01 started at 2014-08-05T12:04:47+01
+2014-08-05T12:04:48+01 DEBUG - [foo.20100106T0000+01] -(setting:running)
+2014-08-05T12:04:49+01 DEBUG - [foo.20100107T0000+01] -released to the task pool
+2014-08-05T12:04:49+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:04:49+01 DEBUG - 0 task(s) ready
+2014-08-05T12:04:49+01 DEBUG - END TASK PROCESSING (took 0.00570511817932 sec)
+2014-08-05T12:04:49+01 INFO - [foo.20100106T0000+01] -(current:running)> foo.20100106T0000+01 succeeded at 2014-08-05T12:04:48+01
+2014-08-05T12:04:49+01 DEBUG - [foo.20100106T0000+01] -(setting:succeeded)
+2014-08-05T12:04:49+01 DEBUG - Closing process pool
+2014-08-05T12:04:50+01 INFO - Suite shutting down at 2014-08-05T12:04:50+01
diff --git a/tests/offset/00-final-simple/suite.rc b/tests/offset/00-final-simple/suite.rc
new file mode 100644
index 00000000000..85ecd054c00
--- /dev/null
+++ b/tests/offset/00-final-simple/suite.rc
@@ -0,0 +1,14 @@
+[cylc]
+ cycle point time zone = +01
+ [[reference test]]
+ required run mode = live
+ live mode suite timeout = 1.0 # minutes
+[scheduling]
+ initial cycle point = 20100101T00
+ final cycle point = +P5D
+ [[dependencies]]
+ [[[T00]]]
+ graph = "foo[-P1D] => foo"
+[runtime]
+ [[foo]]
+ command scripting = true
diff --git a/tests/offset/01-final-next.t b/tests/offset/01-final-next.t
new file mode 100644
index 00000000000..4cf82d46405
--- /dev/null
+++ b/tests/offset/01-final-next.t
@@ -0,0 +1,31 @@
+#!/bin/bash
+#C: THIS FILE IS PART OF THE CYLC SUITE ENGINE.
+#C: Copyright (C) 2008-2014 Hilary Oliver, NIWA
+#C:
+#C: This program is free software: you can redistribute it and/or modify
+#C: it under the terms of the GNU General Public License as published by
+#C: the Free Software Foundation, either version 3 of the License, or
+#C: (at your option) any later version.
+#C:
+#C: This program is distributed in the hope that it will be useful,
+#C: but WITHOUT ANY WARRANTY; without even the implied warranty of
+#C: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#C: GNU General Public License for more details.
+#C:
+#C: You should have received a copy of the GNU General Public License
+#C: along with this program. If not, see .
+#-------------------------------------------------------------------------------
+# Test specifying final cycle as the next instance of T06
+. $(dirname $0)/test_header
+#-------------------------------------------------------------------------------
+set_test_number 2
+#-------------------------------------------------------------------------------
+install_suite $TEST_NAME_BASE $TEST_NAME_BASE
+#-------------------------------------------------------------------------------
+TEST_NAME=$TEST_NAME_BASE-validate
+run_ok $TEST_NAME cylc validate $SUITE_NAME
+#-------------------------------------------------------------------------------
+TEST_NAME=$TEST_NAME_BASE-run
+suite_run_ok $TEST_NAME cylc run --reference-test --debug $SUITE_NAME
+#-------------------------------------------------------------------------------
+purge_suite $SUITE_NAME
diff --git a/tests/offset/01-final-next/reference.log b/tests/offset/01-final-next/reference.log
new file mode 100644
index 00000000000..6e295474926
--- /dev/null
+++ b/tests/offset/01-final-next/reference.log
@@ -0,0 +1,59 @@
+2014-08-05T12:25:57+01 DEBUG - Initializing process pool, size 8
+2014-08-05T12:25:57+01 INFO - port:7781
+2014-08-05T12:25:57+01 INFO - Suite starting at 2014-08-05T12:25:57+01
+2014-08-05T12:25:57+01 INFO - Log event clock: real time
+2014-08-05T12:25:57+01 INFO - Run mode: live
+2014-08-05T12:25:57+01 INFO - Initial point: 20100101T0000+01
+2014-08-05T12:25:57+01 INFO - Final point: 20100101T0600+01
+2014-08-05T12:25:57+01 DEBUG - request handling thread starting
+2014-08-05T12:25:57+01 INFO - Cold Start 20100101T0000+01
+2014-08-05T12:25:57+01 DEBUG - [foo.20100101T0000+01] -released to the task pool
+2014-08-05T12:25:57+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:25:57+01 DEBUG - [foo.20100101T0000+01] -(setting:queued)
+2014-08-05T12:25:57+01 DEBUG - 1 task(s) ready
+2014-08-05T12:25:57+01 DEBUG - [foo.20100101T0000+01] -(setting:ready)
+2014-08-05T12:25:57+01 DEBUG - [foo.20100101T0000+01] -incrementing submit number
+2014-08-05T12:25:57+01 INFO - [foo.20100101T0000+01] -triggered off []
+2014-08-05T12:25:57+01 DEBUG - END TASK PROCESSING (took 0.0153090953827 sec)
+2014-08-05T12:25:58+01 INFO - [foo.20100101T0000+01] -submit_method_id=20753
+2014-08-05T12:25:58+01 INFO - [foo.20100101T0000+01] -submission succeeded
+2014-08-05T12:25:58+01 DEBUG - [foo.20100101T0000+01] -(setting:submitted)
+2014-08-05T12:25:58+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:25:58+01 DEBUG - 0 task(s) ready
+2014-08-05T12:25:58+01 DEBUG - [foo.20100101T0000+01] -forced spawning
+2014-08-05T12:25:58+01 DEBUG - END TASK PROCESSING (took 0.0804049968719 sec)
+2014-08-05T12:25:58+01 INFO - [foo.20100101T0000+01] -(current:submitted)> foo.20100101T0000+01 started at 2014-08-05T12:25:58+01
+2014-08-05T12:25:58+01 DEBUG - [foo.20100101T0000+01] -(setting:running)
+2014-08-05T12:25:59+01 DEBUG - [foo.20100101T0600+01] -released to the task pool
+2014-08-05T12:25:59+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:25:59+01 DEBUG - 0 task(s) ready
+2014-08-05T12:25:59+01 DEBUG - END TASK PROCESSING (took 0.0044469833374 sec)
+2014-08-05T12:25:59+01 INFO - [foo.20100101T0000+01] -(current:running)> foo.20100101T0000+01 succeeded at 2014-08-05T12:25:58+01
+2014-08-05T12:25:59+01 DEBUG - [foo.20100101T0000+01] -(setting:succeeded)
+2014-08-05T12:26:00+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:26:00+01 DEBUG - [foo.20100101T0600+01] -(setting:queued)
+2014-08-05T12:26:00+01 DEBUG - 1 task(s) ready
+2014-08-05T12:26:00+01 DEBUG - [foo.20100101T0600+01] -(setting:ready)
+2014-08-05T12:26:00+01 DEBUG - [foo.20100101T0600+01] -incrementing submit number
+2014-08-05T12:26:00+01 INFO - [foo.20100101T0600+01] -triggered off ['foo.20100101T0000+01']
+2014-08-05T12:26:00+01 DEBUG - [foo.20100101T0000+01] -task proxy removed
+2014-08-05T12:26:00+01 DEBUG - END TASK PROCESSING (took 0.0179350376129 sec)
+2014-08-05T12:26:01+01 INFO - [foo.20100101T0600+01] -submit_method_id=20898
+2014-08-05T12:26:01+01 INFO - [foo.20100101T0600+01] -submission succeeded
+2014-08-05T12:26:01+01 DEBUG - [foo.20100101T0600+01] -(setting:submitted)
+2014-08-05T12:26:01+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:26:01+01 DEBUG - 0 task(s) ready
+2014-08-05T12:26:01+01 DEBUG - [foo.20100101T0600+01] -forced spawning
+2014-08-05T12:26:01+01 INFO - [foo.20100102T0000+01] -holding (beyond suite stop point) 20100101T0600+01
+2014-08-05T12:26:01+01 DEBUG - [foo.20100102T0000+01] -(setting:held)
+2014-08-05T12:26:01+01 DEBUG - END TASK PROCESSING (took 0.0131738185883 sec)
+2014-08-05T12:26:01+01 INFO - [foo.20100101T0600+01] -(current:submitted)> foo.20100101T0600+01 started at 2014-08-05T12:26:01+01
+2014-08-05T12:26:01+01 DEBUG - [foo.20100101T0600+01] -(setting:running)
+2014-08-05T12:26:02+01 DEBUG - [foo.20100102T0000+01] -released to the task pool
+2014-08-05T12:26:02+01 DEBUG - BEGIN TASK PROCESSING
+2014-08-05T12:26:02+01 DEBUG - 0 task(s) ready
+2014-08-05T12:26:02+01 DEBUG - END TASK PROCESSING (took 0.00601005554199 sec)
+2014-08-05T12:26:02+01 INFO - [foo.20100101T0600+01] -(current:running)> foo.20100101T0600+01 succeeded at 2014-08-05T12:26:01+01
+2014-08-05T12:26:02+01 DEBUG - [foo.20100101T0600+01] -(setting:succeeded)
+2014-08-05T12:26:02+01 DEBUG - Closing process pool
+2014-08-05T12:26:03+01 INFO - Suite shutting down at 2014-08-05T12:26:03+01
diff --git a/tests/offset/01-final-next/suite.rc b/tests/offset/01-final-next/suite.rc
new file mode 100644
index 00000000000..55a6bdc11e4
--- /dev/null
+++ b/tests/offset/01-final-next/suite.rc
@@ -0,0 +1,16 @@
+[cylc]
+ cycle point time zone = +01
+ [[reference test]]
+ required run mode = live
+ live mode suite timeout = 1.0 # minutes
+[scheduling]
+ initial cycle point = 20100101T00
+ final cycle point = T06
+ [[dependencies]]
+ [[[T00]]]
+ graph = "foo[-PT6H] => foo"
+ [[[T06]]]
+ graph = "foo[-PT6H] => foo"
+[runtime]
+ [[foo]]
+ command scripting = true
diff --git a/tests/offset/test_header b/tests/offset/test_header
new file mode 120000
index 00000000000..90bd5a36f92
--- /dev/null
+++ b/tests/offset/test_header
@@ -0,0 +1 @@
+../lib/bash/test_header
\ No newline at end of file
diff --git a/tests/reload/final-cycle/suite.rc b/tests/reload/final-cycle/suite.rc
index 80534028f57..cd2e8757fa3 100644
--- a/tests/reload/final-cycle/suite.rc
+++ b/tests/reload/final-cycle/suite.rc
@@ -19,7 +19,7 @@ description = """change final cycle."""
[[reloader]]
command scripting = """
# change the final cycle:
-perl -pi -e 's/(final cycle time = )20100102T00( # marker)/\1 2010010112\2/' $CYLC_SUITE_DEF_PATH/suite.rc
+perl -pi -e 's/(final cycle time = )20100102T00( # marker)/\1 20100101T12\2/' $CYLC_SUITE_DEF_PATH/suite.rc
# reload
cylc reload -f $CYLC_SUITE_NAME
sleep 5