diff --git a/lib/sympto/index.js b/lib/sympto/index.js
index 92f513dd67d87b5c6a9a725add311659ed0e8bee..3fd01021925ecffb8a78b5c8a2d264d60b0830d8 100644
--- a/lib/sympto/index.js
+++ b/lib/sympto/index.js
@@ -4,4 +4,9 @@ import getMucusStatus from './mucus'
 export default function (cycleDays) {
   const temperatureStatus = getTemperatureStatus(cycleDays)
   const mucusStatus = getMucusStatus(cycleDays)
+  return {
+    assumeFertility: true,
+    temperatureStatus,
+    mucusStatus
+  }
 }
\ No newline at end of file
diff --git a/lib/sympto/mucus.js b/lib/sympto/mucus.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9c0d821628168baba2cdc7d93270bee92424ad3
--- /dev/null
+++ b/lib/sympto/mucus.js
@@ -0,0 +1,19 @@
+export default function (cycleDays) {
+  const mucusDays = cycleDays.filter(day => day.mucus && !day.mucus.exclude)
+  const bestQuality = Math.max(...mucusDays.map(day => day.mucus.value))
+  const mucusPeak = mucusDays.find((day, i) => {
+    if (day.mucus.value !== bestQuality) return false
+
+    const threeFollowingDays = cycleDays.slice(i + 1, i + 4)
+    if (threeFollowingDays.length < 3) return false
+
+    return threeFollowingDays.every(day => day.mucus.value < bestQuality)
+  })
+
+  if (!mucusPeak) return { detected: false }
+
+  return {
+    detected: true,
+    mucusPeak
+  }
+}
diff --git a/test/sympto/mucus.spec.js b/test/sympto/mucus.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0fd2da48ca9c5c37655cbc456f113b30d587442
--- /dev/null
+++ b/test/sympto/mucus.spec.js
@@ -0,0 +1,49 @@
+import chai from 'chai'
+import getMucusStatus from '../../lib/sympto/mucus'
+
+const expect = chai.expect
+
+function turnIntoCycleDayObject(value, fakeDate) {
+  return {
+    mucus : { value },
+    date: fakeDate
+  }
+}
+
+describe('sympto', () => {
+  describe('detect mucus shift', () => {
+    describe('regular rule', () => {
+      it('detects mucus shift correctly', function () {
+        const values = [0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 2, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0]
+          .map(turnIntoCycleDayObject)
+        const status = getMucusStatus(values)
+        expect(status).to.eql({
+          detected: true,
+          mucusPeak: {
+            date: 10,
+            mucus: { value: 3 }
+          }
+        })
+      })
+
+      it('detects no mucus shift when there are less than 3 days of lower quality', function () {
+        const values = [0, 1, 1, 2, 0, 0, 1, 2, 3, 2, 3, 3, 3, 2, 2]
+          .map(turnIntoCycleDayObject)
+        const status = getMucusStatus(values)
+        expect(status).to.eql({ detected: false })
+      })
+
+      it('detects no mucus shift when there are no mucus values', function () {
+        const status = getMucusStatus(Array(10).fill({date: 1, temperature: { value: 35}}))
+        expect(status).to.eql({ detected: false })
+      })
+
+      it('detects no mucus shift when the mucus values are all the same', function () {
+        const values = [2, 2, 2, 2, 2, 2, 2, 2]
+          .map(turnIntoCycleDayObject)
+        const status = getMucusStatus(values)
+        expect(status).to.eql({ detected: false })
+      })
+    })
+  })
+})
\ No newline at end of file