diff --git a/src/qcronfield.cpp b/src/qcronfield.cpp
index 48d120e..cd202d9 100644
--- a/src/qcronfield.cpp
+++ b/src/qcronfield.cpp
@@ -140,7 +140,8 @@ _parseNode(QString & str)
         }
         else if ('f' == c)
         {
-
+            str.remove(0, 1);
+            node = new QCronNotHolidayNode();
         }
     }
     if (NULL == node)
diff --git a/src/qcronnode.cpp b/src/qcronnode.cpp
index 652d9ab..6e3f23d 100644
--- a/src/qcronnode.cpp
+++ b/src/qcronnode.cpp
@@ -335,7 +335,6 @@ QCronHolidayNode::
 next(int t) const
 {
     Q_UNUSED(t)
-    //return Holiday::next(t);
     return -1;
 }
 
@@ -374,3 +373,43 @@ match(const QDateTime & dt) const
 
 /******************************************************************************/
 /******************************************************************************/
+
+int
+QCronNotHolidayNode::
+next(int t) const
+{
+    Q_UNUSED(t)
+    return -1;
+}
+
+/******************************************************************************/
+
+void
+QCronNotHolidayNode::
+process(QCron * cron,
+        QDateTime & dt,
+        EField field)
+{
+    Q_UNUSED(cron);
+    if (DOM != field)
+    {
+        qFatal("Should not be in a NotHoliday node.");
+    }
+    if (Holiday::isHoliday(dt.date()))
+    {
+        dt = dt.addDays(1);
+        dt.setTime(QTime(0, 0, 0));
+    }
+}
+
+/******************************************************************************/
+
+bool
+QCronNotHolidayNode::
+match(const QDateTime & dt) const
+{
+    return !Holiday::isHoliday(dt.date());
+}
+
+/******************************************************************************/
+/******************************************************************************/
diff --git a/src/qcronnode.hpp b/src/qcronnode.hpp
index ce44c89..df01696 100644
--- a/src/qcronnode.hpp
+++ b/src/qcronnode.hpp
@@ -151,4 +151,18 @@ public:
 
 /******************************************************************************/
 
+class QCronNotHolidayNode : public QCronNode
+{
+public:
+    virtual int next(int t) const;
+
+    virtual bool match(const QDateTime & dt) const;
+    virtual void process(QCron * cron,
+                         QDateTime & dt,
+                         EField field);
+};
+
+/******************************************************************************/
+
+
 #endif
diff --git a/test/qcron_test.cpp b/test/qcron_test.cpp
index 4af055e..fa7e4f6 100644
--- a/test/qcron_test.cpp
+++ b/test/qcron_test.cpp
@@ -376,8 +376,18 @@ holidays()
     QCOMPARE(actual(pattern), now().addSecs(3600 * 2));
     _tnow.setHMS(23, 59, 59);
     QCOMPARE(actual(pattern), QDateTime(QDate(2017, 1, 1), QTime(2, 0, 0)));
+}
 
+/******************************************************************************/
 
+void
+QCronTest::
+excludeHolidays()
+{
+    QString pattern = "* 2 f * * *";
+    _dnow.setDate(2016, 12, 24);
+    _tnow.setHMS(3, 0, 0);
+    QCOMPARE(actual(pattern), QDateTime(QDate(2016, 12, 26), QTime(2, 0, 0)));
 }
 
 /******************************************************************************/
diff --git a/test/qcron_test.hpp b/test/qcron_test.hpp
index 516d864..8c87eec 100644
--- a/test/qcron_test.hpp
+++ b/test/qcron_test.hpp
@@ -16,6 +16,7 @@ private slots:
     void minutes();
     void realLife();
     void holidays();
+    void excludeHolidays();
 
 private:
     QDate _dnow;