diff --git a/db/fixtures.js b/db/fixtures.js
index fd4a9492c2627c450048d16499bfe92e2f5fd3c1..421bcb83257526cb43d98733d410c8c43626fa84 100644
--- a/db/fixtures.js
+++ b/db/fixtures.js
@@ -1,16 +1,25 @@
 function convertToSymptoFormat(val) {
   const sympto = { date: val.date }
+  if (val.bleeding) sympto.bleeding = {
+    value: val.bleeding,
+    exclude: false
+  }
   if (val.temperature) sympto.temperature = {
     value: val.temperature,
+    time: '08:00',
     exclude: false
   }
   if (val.mucus) sympto.mucus = {
     value: val.mucus,
-    exclude: false,
     feeling: val.mucus,
-    texture: val.mucus
+    texture: val.mucus,
+    exclude: false
+  }
+  if (val.cervix && typeof val.cervix.opening === 'number' && typeof val.cervix.firmness === 'number') sympto.cervix = {
+    opening: val.cervix.opening,
+    firmness: val.cervix.firmness,
+    exclude: false
   }
-  if (val.bleeding) sympto.bleeding = { value: val.bleeding, exclude: false }
   return sympto
 }
 
@@ -75,7 +84,7 @@ export const cycleWithTempAndNoMucusShift = [
   { date: '2018-05-27', temperature: 36.9, mucus: 4 }
 ].map(convertToSymptoFormat).reverse()
 
-export const cycleWithFhmCervix = [
+export const cervixShiftAndFhmOnSameDay = [
   { date: '2018-08-01', bleeding: 2 },
   { date: '2018-08-02', bleeding: 1 },
   { date: '2018-08-03', bleeding: 0 },
diff --git a/db/index.js b/db/index.js
index 6dc4feb537bd72e5839e76079d743aba01f0854c..0b0c15dbcc2b735e502cc32c7e887156049724c7 100644
--- a/db/index.js
+++ b/db/index.js
@@ -7,7 +7,7 @@ import {
   cycleWithFhmMucus,
   longAndComplicatedCycleWithMucus,
   cycleWithTempAndNoMucusShift,
-  cycleWithFhmCervix,
+  cervixShiftAndFhmOnSameDay,
   longAndComplicatedCycleWithCervix,
   cycleWithTempAndNoCervixShift
 } from './fixtures'
@@ -77,7 +77,7 @@ export function fillWithMucusDummyData() {
 
 export function fillWithCervixDummyData() {
   const dummyCycles = [
-    cycleWithFhmCervix,
+    cervixShiftAndFhmOnSameDay,
     longAndComplicatedCycleWithCervix,
     cycleWithTempAndNoCervixShift
   ]
diff --git a/lib/sympto/index.js b/lib/sympto/index.js
index 575b608ea0a28f4235053d93839b607a9df5b737..96e2b49151ab9ae68130d1d969571694bce3a689 100644
--- a/lib/sympto/index.js
+++ b/lib/sympto/index.js
@@ -23,7 +23,8 @@ export default function getSymptoThermalStatus(cycleInfo) {
     if (statusForLast.temperatureShift) {
       const preOvuPhase = getPreOvulatoryPhase(
         cycle,
-        [previousCycle, ...earlierCycles]
+        [previousCycle, ...earlierCycles],
+        secondarySymptom
       )
       if (preOvuPhase) {
         status.phases.preOvulatory = preOvuPhase
diff --git a/lib/sympto/minus-8-day-rule.js b/lib/sympto/minus-8-day-rule.js
index 2964b373b518fcbe5030d38558d601e73ce3cbe8..5a07d765b9a0852e725f0b06c58f621698f83d52 100644
--- a/lib/sympto/minus-8-day-rule.js
+++ b/lib/sympto/minus-8-day-rule.js
@@ -1,10 +1,10 @@
 import { LocalDate } from 'js-joda'
 import getNfpStatus from './index'
 
-export default function (previousCycles) {
+export default function (previousCycles, secondarySymptom) {
   const fhms = previousCycles
     .map(cycle => {
-      const status = getNfpStatus({ cycle })
+      const status = getNfpStatus({ cycle, secondarySymptom })
       if (status.temperatureShift) {
         const day = status.temperatureShift.firstHighMeasurementDay
         const firstCycleDayDate = LocalDate.parse(cycle[0].date)
diff --git a/lib/sympto/pre-ovulatory.js b/lib/sympto/pre-ovulatory.js
index 874e2bc911958ca72137ebac1319866991c623ce..236eefdc0a283e604dde03e410c4a17ff91e67d0 100644
--- a/lib/sympto/pre-ovulatory.js
+++ b/lib/sympto/pre-ovulatory.js
@@ -1,10 +1,10 @@
 import { LocalDate } from "js-joda"
 import apply8DayRule from './minus-8-day-rule'
 
-export default function(cycle, previousCycles) {
+export default function(cycle, previousCycles, secondarySymptom) {
   let preOvuPhaseLength = 5
 
-  const minus8DayRuleResult = apply8DayRule(previousCycles)
+  const minus8DayRuleResult = apply8DayRule(previousCycles, secondarySymptom)
   if (minus8DayRuleResult) preOvuPhaseLength = minus8DayRuleResult
 
   const startDate = LocalDate.parse(cycle[0].date)
@@ -12,7 +12,7 @@ export default function(cycle, previousCycles) {
   const maybePreOvuDays = cycle.slice(0, preOvuPhaseLength).filter(d => {
     return d.date <= preOvuEndDate
   })
-  const preOvulatoryDays = getDaysUntilFertileSecondarySymptom(maybePreOvuDays)
+  const preOvulatoryDays = getDaysUntilFertileSecondarySymptom(maybePreOvuDays, secondarySymptom)
   // if fertile mucus or cervix occurs on the 1st cycle day, there is no pre-ovu phase
   if (!preOvulatoryDays.length) return null
 
@@ -39,7 +39,8 @@ function getDaysUntilFertileSecondarySymptom(days, secondarySymptom = 'mucus') {
     if (secondarySymptom === 'mucus') {
       return day.mucus && day.mucus.value > 1
     } else if (secondarySymptom === 'cervix') {
-      return day.cervix && !day.cervix.isClosedAndHard
+      return day.cervix && day.cervix.opening > 0
+        || day.cervix && day.cervix.firmness > 0
     }
   })
 
diff --git a/test/sympto/cervix-temp-fixtures.js b/test/sympto/cervix-temp-fixtures.js
index 58ff6954b52b6bc2b792bf939018869c0883e30e..18adfe63c38a37fff5ddf9750117591475a3838c 100644
--- a/test/sympto/cervix-temp-fixtures.js
+++ b/test/sympto/cervix-temp-fixtures.js
@@ -2,9 +2,9 @@ function convertToSymptoFormat(val) {
   const sympto = { date: val.date }
   if (val.temperature) sympto.temperature = {
     value: val.temperature,
+    time: '08:00',
     exclude: false
   }
-
   if (val.cervix && typeof val.cervix.opening === 'number' && typeof val.cervix.firmness === 'number') sympto.cervix = {
     opening: val.cervix.opening,
     firmness: val.cervix.firmness,
@@ -18,11 +18,11 @@ function convertToSymptoFormat(val) {
 }
 
 export const cervixShiftAndFhmOnSameDay = [
-  { date: '2018-08-01', bleeding: 1, cervix: { opening: 1, firmness: 1 } },
-  { date: '2018-08-02', bleeding: 2, cervix: { opening: 1, firmness: 1 } },
-  { date: '2018-08-03', temperature: 36.6, bleeding: 2, cervix: { opening: 2, firmness: 1 } },
-  { date: '2018-08-04', temperature: 36.55, bleeding: 1, cervix: { opening: 2, firmness: 0 } },
-  { date: '2018-08-05', temperature: 36.6, cervix: { opening: 0, firmness: 1 } },
+  { date: '2018-08-01', bleeding: 1 },
+  { date: '2018-08-02', bleeding: 2 },
+  { date: '2018-08-03', temperature: 36.6, bleeding: 2 },
+  { date: '2018-08-04', temperature: 36.55, bleeding: 1 },
+  { date: '2018-08-05', temperature: 36.6, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-08-06', temperature: 36.65, cervix: { opening: 0, firmness: 1 } },
   { date: '2018-08-07', temperature: 36.71, cervix: { opening: 1, firmness: 0 } },
   { date: '2018-08-08', temperature: 36.69, cervix: { opening: 1, firmness: 0 } },
@@ -99,6 +99,8 @@ export const longAndComplicatedCycle = [
   { date: '2018-06-04', temperature: 36.6 },
   { date: '2018-06-05', temperature: 36.55 },
   { date: '2018-06-06', temperature: 36.7, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-07', temperature: 36.5, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-08', temperature: 36.52, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-06-09', temperature: 36.5, cervix: { opening: 2, firmness: 1 } },
   { date: '2018-06-10', temperature: 36.4, cervix: { opening: 2, firmness: 1 } },
   { date: '2018-06-13', temperature: 36.45, cervix: { opening: 1, firmness: 1 } },
@@ -110,7 +112,7 @@ export const longAndComplicatedCycle = [
   { date: '2018-06-19', temperature: 36.8, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-06-20', temperature: 36.85, cervix: { opening: 1, firmness: 1 } },
   { date: '2018-06-21', temperature: 36.8, cervix: { opening: 1, firmness: 1 } },
-  { date: '2018-06-22', temperature: 36.9, cervix: { opening: 2, firmness: 1 } },
+  { date: '2018-06-22', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-06-25', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-06-26', temperature: 36.8, cervix: { opening: 0, firmness: 0 } },
   { date: '2018-06-27', temperature: 36.9, cervix: { opening: 0, firmness: 0 } }
@@ -186,3 +188,80 @@ export const fiveDayCycle = [
   { date: '2018-08-01', bleeding: 2 },
   { date: '2018-08-03', bleeding: 3 }
 ].map(convertToSymptoFormat)
+
+export const fhmOnDay12 = [
+  { date: '2018-06-01', temperature: 36.6, bleeding: 2 },
+  { date: '2018-06-02', temperature: 36.65 },
+  { date: '2018-06-04', temperature: 36.6 },
+  { date: '2018-06-05', temperature: 36.55 },
+  { date: '2018-06-06', temperature: 36.7, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-09', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-10', temperature: 36.4, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-12', temperature: 36.8, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-14', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-17', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-18', temperature: 36.9, cervix: { opening: 0, firmness: 0 } }
+].map(convertToSymptoFormat)
+
+export const fhmOnDay15 = [
+  { date: '2018-06-01', temperature: 36.6, bleeding: 2 },
+  { date: '2018-06-02', temperature: 36.65 },
+  { date: '2018-06-04', temperature: 36.6 },
+  { date: '2018-06-05', temperature: 36.55 },
+  { date: '2018-06-06', temperature: 36.7, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-09', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-10', temperature: 36.4, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-11', temperature: 36.4, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-12', temperature: 36.4, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-14', temperature: 36.4, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-15', temperature: 36.8, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-16', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-17', temperature: 36.9, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-18', temperature: 36.9, cervix: { opening: 0, firmness: 0 } }
+].map(convertToSymptoFormat)
+
+export const cycleWithEarlyCervix = [
+  { date: '2018-06-01', temperature: 36.6, bleeding: 2 },
+  { date: '2018-06-02', temperature: 36.65, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-05', temperature: 36.55 },
+  { date: '2018-06-06', temperature: 36.7, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-08', temperature: 36.45, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-09', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-10', temperature: 36.4, cervix: { opening: 2, firmness: 0 } },
+  { date: '2018-06-11', temperature: 36.5, cervix: { opening: 2, firmness: 1 } },
+  { date: '2018-06-13', temperature: 36.45, cervix: { opening: 2, firmness: 1 } },
+  { date: '2018-06-14', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-15', temperature: 36.55, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-16', temperature: 36.7, cervix: { opening: 1, firmness: 0 } },
+  { date: '2018-06-17', temperature: 36.65, cervix: { opening: 0, firmness: 1 } },
+  { date: '2018-06-18', temperature: 36.75, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-19', temperature: 36.8, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-20', temperature: 36.85, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-23', temperature: 36.9, cervix: { opening: 0, firmness: 1 } },
+  { date: '2018-06-24', temperature: 36.85, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-26', temperature: 36.8, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-27', temperature: 36.9, cervix: { opening: 1, firmness: 1 } }
+].map(convertToSymptoFormat)
+
+export const cycleWithCervixOnFirstDay = [
+  { date: '2018-06-01', temperature: 36.6, bleeding: 2, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-02', temperature: 36.65 },
+  { date: '2018-06-05', temperature: 36.55 },
+  { date: '2018-06-06', temperature: 36.7, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-08', temperature: 36.45, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-09', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-10', temperature: 36.4, cervix: { opening: 2, firmness: 0 } },
+  { date: '2018-06-11', temperature: 36.5, cervix: { opening: 2, firmness: 1 } },
+  { date: '2018-06-13', temperature: 36.45, cervix: { opening: 2, firmness: 1 } },
+  { date: '2018-06-14', temperature: 36.5, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-15', temperature: 36.55, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-16', temperature: 36.7, cervix: { opening: 1, firmness: 0 } },
+  { date: '2018-06-17', temperature: 36.65, cervix: { opening: 0, firmness: 1 } },
+  { date: '2018-06-18', temperature: 36.75, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-19', temperature: 36.8, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-20', temperature: 36.85, cervix: { opening: 0, firmness: 0 } },
+  { date: '2018-06-23', temperature: 36.9, cervix: { opening: 0, firmness: 1 } },
+  { date: '2018-06-24', temperature: 36.85, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-26', temperature: 36.8, cervix: { opening: 1, firmness: 1 } },
+  { date: '2018-06-27', temperature: 36.9, cervix: { opening: 1, firmness: 1 } }
+].map(convertToSymptoFormat)
diff --git a/test/sympto/cervix-temp.spec.js b/test/sympto/cervix-temp.spec.js
index e2d8fa04126a0a3c57dbc59f2fc02b15bf886cf2..964b1d6d007dc1fd455ec0a68aa6e4bf2450933b 100644
--- a/test/sympto/cervix-temp.spec.js
+++ b/test/sympto/cervix-temp.spec.js
@@ -1,14 +1,20 @@
 import chai from 'chai'
 import getSensiplanStatus from '../../lib/sympto'
+import { AssertionError } from 'assert'
 import {
   cervixShiftAndFhmOnSameDay,
   cycleWithFhmNoCervixShift,
-  cycleWithoutFhm,
+  cycleWithoutFhmNoCervixShift,
   longCycleWithoutAnyShifts,
+  longAndComplicatedCycle,
   tempShift3DaysAfterCervixShift,
   cervixShift2DaysAfterTempShift,
   noOvulationDetected,
-  fiveDayCycle
+  fiveDayCycle,
+  fhmOnDay12,
+  fhmOnDay15,
+  cycleWithEarlyCervix,
+  cycleWithCervixOnFirstDay
 } from './cervix-temp-fixtures'
 
 const expect = chai.expect
@@ -19,7 +25,7 @@ describe('sympto', () => {
       it('with no temp or cervix shifts detects only peri-ovulatory', () => {
         const status = getSensiplanStatus({
           cycle: longCycleWithoutAnyShifts,
-          previousCycle: cycleWithoutFhm,
+          previousCycle: cycleWithoutFhmNoCervixShift,
           secondarySymptom: 'cervix'
         })
         expect(Object.keys(status.phases).length).to.eql(1)
@@ -35,7 +41,7 @@ describe('sympto', () => {
       it('with temp but no cervix shift detects only peri-ovulatory', () => {
         const status = getSensiplanStatus({
           cycle: cycleWithFhmNoCervixShift,
-          previousCycle: cycleWithoutFhm,
+          previousCycle: cycleWithoutFhmNoCervixShift,
           secondarySymptom: 'cervix'
         })
         expect(Object.keys(status.phases).length).to.eql(1)
@@ -217,5 +223,286 @@ describe('sympto', () => {
         })
       })
     })
+    describe('applying the minus-8 rule', () => {
+      it('shortens the pre-ovu phase if there is a previous < 13 fhm', () => {
+        const status = getSensiplanStatus({
+          cycle:  longAndComplicatedCycle,
+          previousCycle: fhmOnDay15,
+          earlierCycles: [fhmOnDay12, ...Array(10).fill(fhmOnDay15)],
+          secondarySymptom: 'cervix'
+        })
+        expect(status.temperatureShift).to.be.an('object')
+        expect(status.cervixShift).to.be.an('object')
+
+        expect(Object.keys(status.phases).length).to.eql(3)
+        expect(status.phases.preOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-04' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date <= '2018-06-04')
+        })
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-05' },
+          end: { date: '2018-06-26', time: '18:00' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => {
+              return date > '2018-06-04' && date <= '2018-06-26'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: {
+            date: '2018-06-26',
+            time: '18:00'
+          },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date >= '2018-06-26')
+        })
+      })
+      it('shortens pre-ovu phase with prev < 13 fhm even with < 12 cycles', () => {
+        const status = getSensiplanStatus({
+          cycle:  longAndComplicatedCycle,
+          previousCycle: fhmOnDay12,
+          earlierCycles: Array(10).fill(fhmOnDay12),
+          secondarySymptom: 'cervix'
+        })
+
+        expect(status.temperatureShift).to.be.an('object')
+        expect(status.cervixShift).to.be.an('object')
+
+        expect(Object.keys(status.phases).length).to.eql(3)
+        expect(status.phases.preOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-04' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date <= '2018-06-04')
+        })
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-05' },
+          end: { date: '2018-06-26', time: '18:00' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => {
+              return date > '2018-06-04' && date <= '2018-06-26'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: {
+            date: '2018-06-26',
+            time: '18:00'
+          },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date >= '2018-06-26')
+        })
+      })
+      it('shortens the pre-ovu phase if early fertile cervix occurs', () => {
+        const status = getSensiplanStatus({
+          cycle: cycleWithEarlyCervix,
+          previousCycle: fhmOnDay12,
+          earlierCycles: Array(10).fill(fhmOnDay12),
+          secondarySymptom: 'cervix'
+        })
+
+        expect(status.temperatureShift).to.be.an('object')
+        expect(status.cervixShift).to.be.an('object')
+
+        expect(Object.keys(status.phases).length).to.eql(3)
+        expect(status.phases.preOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-01' },
+          cycleDays: cycleWithEarlyCervix
+            .filter(({date}) => date <= '2018-06-01')
+        })
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-02' },
+          end: { date: '2018-06-20', time: '18:00'},
+          cycleDays: cycleWithEarlyCervix
+            .filter(({date}) => {
+              return date > '2018-06-01' && date <= '2018-06-20'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: { date: '2018-06-20', time: '18:00' },
+          cycleDays: cycleWithEarlyCervix
+            .filter(({date}) => date >= '2018-06-20')
+        })
+      })
+      it('shortens the pre-ovu phase if cervix occurs even on the first day', () => {
+        const status = getSensiplanStatus({
+          cycle: cycleWithCervixOnFirstDay,
+          previousCycle: fhmOnDay12,
+          earlierCycles: Array(10).fill(fhmOnDay12),
+          secondarySymptom: 'cervix'
+        })
+
+        expect(Object.keys(status.phases).length).to.eql(2)
+        expect(status.temperatureShift).to.be.an('object')
+        expect(status.cervixShift).to.be.an('object')
+
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-20', time: '18:00'},
+          cycleDays: cycleWithCervixOnFirstDay
+            .filter(({date}) => {
+              return date >= '2018-06-01' && date <= '2018-06-20'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: { date: '2018-06-20', time: '18:00' },
+          cycleDays: cycleWithCervixOnFirstDay
+            .filter(({date}) => date >= '2018-06-20')
+        })
+      })
+      it('lengthens the pre-ovu phase if >= 12 cycles with fhm > 13', () => {
+        const status = getSensiplanStatus({
+          cycle: longAndComplicatedCycle,
+          previousCycle: fhmOnDay15,
+          earlierCycles: Array(11).fill(fhmOnDay15),
+          secondarySymptom: 'cervix'
+        })
+        expect(status.temperatureShift).to.be.an('object')
+        expect(status.cervixShift).to.be.an('object')
+
+        expect(Object.keys(status.phases).length).to.eql(3)
+        expect(status.phases.preOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-07' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date <= '2018-06-07')
+        })
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-08' },
+          end: { date: '2018-06-26', time: '18:00'},
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => {
+              return date >= '2018-06-08' && date <= '2018-06-26'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: { date: '2018-06-26', time: '18:00' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date >= '2018-06-26')
+        })
+      })
+      it('does not lengthen the pre-ovu phase if < 12 cycles', () => {
+        const status = getSensiplanStatus({
+          cycle: longAndComplicatedCycle,
+          previousCycle: fhmOnDay15,
+          earlierCycles: Array(10).fill(fhmOnDay15),
+          secondarySymptom: 'cervix'
+        })
+        expect(Object.keys(status.phases).length).to.eql(3)
+        expect(status.phases.preOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-05' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date <= '2018-06-05')
+        })
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-06' },
+          end: { date: '2018-06-26', time: '18:00' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => {
+              return date > '2018-06-05' && date <= '2018-06-26'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: {
+            date: '2018-06-26',
+            time: '18:00'
+          },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date >= '2018-06-26')
+        })
+      })
+      it('does not detect any pre-ovu phase if prev cycle had no fhm', () => {
+        const status = getSensiplanStatus({
+          cycle: longAndComplicatedCycle,
+          previousCycle: cycleWithoutFhmNoCervixShift,
+          earlierCycles: [...Array(12).fill(fhmOnDay15)],
+          secondarySymptom: 'cervix'
+        })
+
+        expect(Object.keys(status.phases).length).to.eql(2)
+        expect(status.phases.periOvulatory).to.eql({
+          start: { date: '2018-06-01' },
+          end: { date: '2018-06-26', time: '18:00' },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => {
+              return date >= '2018-06-01' && date <= '2018-06-26'
+            })
+        })
+        expect(status.phases.postOvulatory).to.eql({
+          start: {
+            date: '2018-06-26',
+            time: '18:00'
+          },
+          cycleDays: longAndComplicatedCycle
+            .filter(({date}) => date >= '2018-06-26')
+        })
+      })
+    })
+    describe('when args are wrong', () => {
+      it('throws when arg object is not in right format', () => {
+        const wrongObject = { ada: 'lovelace' }
+        expect(() => getSensiplanStatus(wrongObject)).to.throw(AssertionError)
+      })
+      it('throws if cycle array is empty', () => {
+        expect(() => getSensiplanStatus({cycle: []})).to.throw(AssertionError)
+      })
+      it('throws if cycle days are not in right format', () => {
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            Ilike: "you"
+          }],
+        })).to.throw(AssertionError)
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '01.09.2018',
+            bleeding: { value: 0 },
+            cervix: {opening: 0, firmness: 0}
+          }],
+        })).to.throw(AssertionError)
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '2018-01-01',
+            bleeding: { value: 'medium' },
+            temperature: { value: 36.6 }
+          }],
+        })).to.throw(AssertionError)
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '2018-09-01',
+            bleeding: { value: 0 },
+            temperature: { value: '36.6' }
+          }],
+        })).to.throw(AssertionError)
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '2018-09-01',
+            bleeding: { value: 0 },
+            temperature: { value: 36.6 },
+            cervix: {opening: 4, firmness: 18}
+          }],
+        })).to.throw(AssertionError)
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '2018-09-01',
+            bleeding: { value: 0 },
+            temperature: 37.9
+          }],
+        })).to.throw(AssertionError)
+      })
+      it('throws if first cycle day does not have valid bleeding value', () => {
+        expect(() => getSensiplanStatus({
+          cycle: [{
+            date: '2018-09-01',
+            bleeding: { value: 0 }
+          }],
+          earlierCycles: [[{
+            date: '2017-09-23',
+            bleeding: { value: '1' }
+          }]]
+        })).to.throw(AssertionError)
+      })
+    })
   })
 })