diff --git a/beat/web/backend/tests.py b/beat/web/backend/tests.py
index 66b8677a019a6465cfc563c4b83b73994f03b06c..5e1eb8d55851b7cd8ce5d30a6251ea2710e52ad9 100644
--- a/beat/web/backend/tests.py
+++ b/beat/web/backend/tests.py
@@ -1289,4 +1289,123 @@ class Scheduling(BaseBackendTestCase):
         # time and we'll optimise correctly and only run one of them. The other
         # is updated as the blocking experiment is executed.
 
-        pass
+        current_stats = HourlyStatistics.objects.count()
+
+        fullname = 'user/user/single/1/single'
+        xp = Experiment.objects.get(name=fullname.split(os.sep)[-1])
+
+        xpc = xp.fork(name='single_copy')
+
+        # schedules the experiment and check it
+        xp.schedule()
+        xpc.schedule()
+
+        # schedules the first runnable block
+        assert xp.blocks.first().job.runnable_date is not None
+        assert xp.blocks.last().job.runnable_date is None
+        assert xpc.blocks.first().job.runnable_date is None
+        assert xpc.blocks.last().job.runnable_date is None
+
+        schedule()
+
+        assigned_splits = JobSplit.objects.filter(worker__isnull=False)
+        worker = Worker.objects.get()
+
+        self.assertEqual(assigned_splits.count(), 1)
+        split = assigned_splits.first()
+        self.assertEqual(split.job.block.experiment, xp)
+        self.assertEqual(split.job.block.name, 'echo')
+        self.assertEqual(split.worker, worker)
+        self.assertEqual(worker.name, qsetup.HOSTNAME)
+        self.assertEqual(worker.available_cores(), qsetup.CORES)
+
+        # checks the jobs are connected one to the other across experiments
+        self.assertEqual(xp.blocks.first().job.child.block.experiment, xpc)
+        self.assertEqual(xp.blocks.last().job.child.block.experiment, xpc)
+
+        # simulate job start on worker
+        split.start()
+        self.assertEqual(split.job.status, Job.PROCESSING)
+        self.assertEqual(split.job.block.status, Block.PROCESSING)
+        self.assertEqual(split.job.block.experiment.status, Experiment.RUNNING)
+
+        self.assertEqual(worker.available_cores(), qsetup.CORES-1)
+
+        # check child
+        self.assertEqual(xpc.blocks.first().job.status, Job.PROCESSING)
+        self.assertEqual(xpc.blocks.first().status, Block.PROCESSING)
+        '''
+        self.assertEqual(xpc.blocks.first().experiment.status, Experiment.RUNNING)
+
+        # no job can be run right now
+        schedule()
+        assigned_splits = JobSplit.objects.filter(worker__isnull=False,
+            status=Job.QUEUED)
+        self.assertEqual(assigned_splits.count(), 0)
+
+        # simulate end job signal
+        split.end(Result(status=0))
+        self.assertEqual(split.job.status, Job.COMPLETED)
+        self.assertEqual(split.job.block.status, Block.CACHED)
+        self.assertEqual(split.job.block.experiment.status, Experiment.RUNNING)
+
+        # checks the number of statistics objects has increased by 1
+        self.assertEqual(HourlyStatistics.objects.count(), current_stats + 1)
+
+        self.check_stats_success(split)
+
+        # assert we have no database traces after the block is done
+        self.assertEqual(Job.objects.filter(block=split.job.block).count(), 0)
+        self.assertEqual(JobSplit.objects.filter(job=split.job).count(), 0)
+        self.assertEqual(Result.objects.filter(job__isnull=True).count(), 0)
+
+        self.assertEqual(worker.available_cores(), qsetup.CORES)
+
+        # since this job was successful, the next one should be ready to run
+
+        # schedules the last block of the experiment
+        assert xp.blocks.last().job.runnable_date is not None
+        schedule()
+
+        assigned_splits = JobSplit.objects.filter(worker__isnull=False)
+        self.assertEqual(assigned_splits.count(), 1)
+        split = assigned_splits.first()
+        self.assertEqual(split.job.block.experiment, xp)
+        self.assertEqual(split.job.block.name, 'analysis')
+        self.assertEqual(split.worker, worker)
+        self.assertEqual(worker.name, qsetup.HOSTNAME)
+        self.assertEqual(worker.available_cores(), qsetup.CORES)
+
+        # simulate job start on worker
+        split.start()
+        self.assertEqual(split.job.status, Job.PROCESSING)
+        self.assertEqual(split.job.block.status, Block.PROCESSING)
+        self.assertEqual(split.job.block.experiment.status, Experiment.RUNNING)
+
+        self.assertEqual(worker.available_cores(), qsetup.CORES-1)
+
+        # no job can be run right now
+        schedule()
+        assigned_splits = JobSplit.objects.filter(worker__isnull=False,
+            status=Job.QUEUED)
+        self.assertEqual(assigned_splits.count(), 0)
+
+        # simulate end job signal
+        split.end(Result(status=0))
+
+        # checks the number of statistics objects has increased by 1
+        self.assertEqual(HourlyStatistics.objects.count(), current_stats + 1)
+
+        self.assertEqual(split.job.status, Job.COMPLETED)
+        self.assertEqual(split.job.block.status, Block.CACHED)
+        self.assertEqual(split.job.block.experiment.status, Experiment.DONE)
+
+        self.check_stats_success(split)
+
+        # assert we have no database traces after the last block is done
+        self.assertEqual(Job.objects.count(), 0)
+        self.assertEqual(JobSplit.objects.count(), 0)
+        self.assertEqual(Result.objects.count(), 0)
+
+        self.assertEqual(worker.available_cores(), qsetup.CORES)
+        '''