Branch 'kolab/integration/4.13.0' - 114 commits - akonadi/calendar akonadi/CMakeLists.txt akonadi/collectioncombobox.cpp akonadi/collection.cpp akonadi/collectioncreatejob.cpp akonadi/collectionfetchjob.cpp akonadi/collectionfetchscope.cpp akonadi/collectionfetchscope.h akonadi/collection.h akonadi/collectionidentificationattribute.cpp akonadi/collectionidentificationattribute.h akonadi/collectionmodifyjob.cpp akonadi/collectionpathresolver.cpp akonadi/collectionpathresolver_p.h akonadi/collection_p.h akonadi/collectionrequester.cpp akonadi/collectionrequester.h akonadi/collectionsync.cpp akonadi/contact akonadi/entity.cpp akonadi/entitytreemodel.cpp akonadi/entitytreemodel.h akonadi/entitytreemodel_p.cpp akonadi/entitytreemodel_p.h akonadi/item.cpp akonadi/itemcreatejob.cpp akonadi/itemfetchscope.cpp akonadi/itemfetchscope.h akonadi/itemfetchscope_p.h akonadi/item.h akonadi/itemmodifyjob.cpp akonadi/itemmodifyjob_p.h akonadi/item_p.h akonadi/itemserializer.cpp akonadi/itemsync.cpp akonadi/kmime akonadi/pastehelper.cpp akonadi/protocolhelper.cpp akonadi/protocolhelper_p.h akonadi/resourcebase.cpp akonadi/resourcescheduler.cpp akonadi/resourcescheduler_p.h akonadi/session.cpp akonadi/session_p.h akonadi/socialutils akonadi/standardactionmanager.cpp akonadi/tagcreatejob.h akonadi/tagdeletejob.h akonadi/tagfetchjob.cpp akonadi/tagfetchjob.h akonadi/tagfetchscope.cpp akonadi/tagfetchscope.h akonadi/tagmanagementdialog.cpp akonadi/tagmodifyjob.h akonadi/tests akonadi/xml kabc/plugins kabc/vcardparser kcalcore/tests kholidays/holidayregion.cpp kholidays/holidays kholidays/parsers kholidays/tests kimap/fetchjob.cpp kimap/fetchjob.h kimap/getmetadatajob.cpp kimap/getmetadatajob.h kimap/loginjob.cpp kimap/loginjob.h kimap/storejob.cpp kimap/storejob.h kimap/tests kldap/ldapconfigwidget.cpp kresources/kresources.desktop kresources/kresources_manager.desktop mailtransport/smtpconfigwidget.cpp mailtransport/tests

Christian Mollekopf mollekopf at kolabsys.com
Mon Aug 11 11:06:32 CEST 2014


 akonadi/CMakeLists.txt                                                   |    7 
 akonadi/calendar/etmcalendar.cpp                                         |    8 
 akonadi/calendar/itiphandlerhelper_p.cpp                                 |    2 
 akonadi/calendar/mailclient_p.cpp                                        |   12 
 akonadi/collection.cpp                                                   |   80 
 akonadi/collection.h                                                     |  109 
 akonadi/collection_p.h                                                   |   27 
 akonadi/collectioncombobox.cpp                                           |    1 
 akonadi/collectioncreatejob.cpp                                          |    4 
 akonadi/collectionfetchjob.cpp                                           |   52 
 akonadi/collectionfetchscope.cpp                                         |   43 
 akonadi/collectionfetchscope.h                                           |   65 
 akonadi/collectionidentificationattribute.cpp                            |   97 
 akonadi/collectionidentificationattribute.h                              |   67 
 akonadi/collectionmodifyjob.cpp                                          |   11 
 akonadi/collectionpathresolver.cpp                                       |   39 
 akonadi/collectionpathresolver_p.h                                       |   16 
 akonadi/collectionrequester.cpp                                          |   16 
 akonadi/collectionrequester.h                                            |    3 
 akonadi/collectionsync.cpp                                               |   29 
 akonadi/contact/editor/im/protocols/googletalkprotocol.desktop           |    2 
 akonadi/contact/emailaddressselectionwidget.cpp                          |   26 
 akonadi/contact/emailaddressselectionwidget.h                            |    8 
 akonadi/contact/kcm/akonadicontact_actions.desktop                       |    3 
 akonadi/entity.cpp                                                       |    5 
 akonadi/entitytreemodel.cpp                                              |   62 
 akonadi/entitytreemodel.h                                                |   66 
 akonadi/entitytreemodel_p.cpp                                            |  538 +-
 akonadi/entitytreemodel_p.h                                              |   38 
 akonadi/item.cpp                                                         |   10 
 akonadi/item.h                                                           |   23 
 akonadi/item_p.h                                                         |    1 
 akonadi/itemcreatejob.cpp                                                |   30 
 akonadi/itemfetchscope.cpp                                               |   27 
 akonadi/itemfetchscope.h                                                 |   60 
 akonadi/itemfetchscope_p.h                                               |    7 
 akonadi/itemmodifyjob.cpp                                                |   58 
 akonadi/itemmodifyjob_p.h                                                |    1 
 akonadi/itemserializer.cpp                                               |   17 
 akonadi/itemsync.cpp                                                     |    3 
 akonadi/kmime/specialmailcollectionstesting.cpp                          |    3 
 akonadi/kmime/tests/CMakeLists.txt                                       |   11 
 akonadi/kmime/tests/localfolderstest.cpp                                 |   12 
 akonadi/kmime/tests/unittestenv/config.xml                               |    2 
 akonadi/kmime/tests/unittestenv/xdgconfig/akonadi/akonadiserverrc        |    3 
 akonadi/pastehelper.cpp                                                  |  222 -
 akonadi/protocolhelper.cpp                                               |  186 
 akonadi/protocolhelper_p.h                                               |   13 
 akonadi/resourcebase.cpp                                                 |   45 
 akonadi/resourcescheduler.cpp                                            |    3 
 akonadi/resourcescheduler_p.h                                            |    8 
 akonadi/session.cpp                                                      |    4 
 akonadi/session_p.h                                                      |    2 
 akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop |    2 
 akonadi/standardactionmanager.cpp                                        |    6 
 akonadi/tagcreatejob.h                                                   |    2 
 akonadi/tagdeletejob.h                                                   |    4 
 akonadi/tagfetchjob.cpp                                                  |    6 
 akonadi/tagfetchjob.h                                                    |   70 
 akonadi/tagfetchscope.cpp                                                |   19 
 akonadi/tagfetchscope.h                                                  |   17 
 akonadi/tagmanagementdialog.cpp                                          |    2 
 akonadi/tagmodifyjob.h                                                   |    2 
 akonadi/tests/CMakeLists.txt                                             |   10 
 akonadi/tests/collectionattributetest.cpp                                |   17 
 akonadi/tests/collectionattributetest.h                                  |    1 
 akonadi/tests/collectionjobtest.cpp                                      |  270 +
 akonadi/tests/collectionjobtest.h                                        |    6 
 akonadi/tests/collectionsynctest.cpp                                     |    5 
 akonadi/tests/entitytreemodeltest.cpp                                    |   80 
 akonadi/tests/etmpopulationtest.cpp                                      |  402 ++
 akonadi/tests/fakeakonadiservercommand.cpp                               |    4 
 akonadi/tests/fakeakonadiservercommand.h                                 |    7 
 akonadi/tests/itemdeletetest.cpp                                         |    1 
 akonadi/tests/itemsynctest.cpp                                           |   24 
 akonadi/tests/itemtest.cpp                                               |   28 
 akonadi/tests/itemtest.h                                                 |    3 
 akonadi/tests/monitortest.cpp                                            |   77 
 akonadi/tests/resourceschedulertest.cpp                                  |    8 
 akonadi/tests/tagtest.cpp                                                |  246 +
 akonadi/tests/testresource/CMakeLists.txt                                |   27 
 akonadi/tests/testresource/knutresource.cpp                              |    6 
 akonadi/tests/testresource/knutresource.desktop                          |    4 
 akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop           |    4 
 akonadi/tests/unittestenv/kdehome/testdata-res1.xml                      |    2 
 akonadi/xml/akonadi-xml.xsd                                              |   18 
 akonadi/xml/format_p.h                                                   |    4 
 akonadi/xml/xmldocument.cpp                                              |    5 
 akonadi/xml/xmldocument.h                                                |    5 
 akonadi/xml/xmlreader.cpp                                                |   44 
 akonadi/xml/xmlreader.h                                                  |   10 
 kabc/plugins/dir/dir.desktop                                             |    2 
 kabc/plugins/file/file.desktop                                           |    2 
 kabc/plugins/ldapkio/resourceldapkioconfig.cpp                           |   18 
 kabc/plugins/ldapkio/resourceldapkioconfig.h                             |    3 
 kabc/plugins/net/net.desktop                                             |    2 
 kabc/vcardparser/testread2.cpp                                           |    2 
 kcalcore/tests/testicaltimezones.cpp                                     |    8 
 kholidays/holidayregion.cpp                                              |   33 
 kholidays/holidays/plan2/holiday_ar_es                                   |  118 
 kholidays/holidays/plan2/holiday_at_de                                   |   82 
 kholidays/holidays/plan2/holiday_au-act_en-gb                            |   28 
 kholidays/holidays/plan2/holiday_au-nsw_en-gb                            |   24 
 kholidays/holidays/plan2/holiday_au-nt_en-gb                             |   30 
 kholidays/holidays/plan2/holiday_au-qld_en-gb                            |   20 
 kholidays/holidays/plan2/holiday_au-sa_en-gb                             |   26 
 kholidays/holidays/plan2/holiday_au-tas_en-gb                            |   28 
 kholidays/holidays/plan2/holiday_au-vic_en-gb                            |   26 
 kholidays/holidays/plan2/holiday_au-wa_en-gb                             |   26 
 kholidays/holidays/plan2/holiday_ba-srp_sr                               |   58 
 kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavian                     |   58 
 kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavianlatin                |   58 
 kholidays/holidays/plan2/holiday_ba-srp_sr at latin                         |   58 
 kholidays/holidays/plan2/holiday_bb_en-gb                                |   66 
 kholidays/holidays/plan2/holiday_be_fr                                   |   56 
 kholidays/holidays/plan2/holiday_be_nl                                   |   56 
 kholidays/holidays/plan2/holiday_be_wa                                   |   56 
 kholidays/holidays/plan2/holiday_bg_bg                                   |   26 
 kholidays/holidays/plan2/holiday_br_pt-br                                |  194 
 kholidays/holidays/plan2/holiday_by_be                                   |  178 
 kholidays/holidays/plan2/holiday_ca-qc_fr                                |   28 
 kholidays/holidays/plan2/holiday_ca_en-gb                                |   32 
 kholidays/holidays/plan2/holiday_ch_de                                   |   22 
 kholidays/holidays/plan2/holiday_ch_fr                                   |   22 
 kholidays/holidays/plan2/holiday_ch_it                                   |   30 
 kholidays/holidays/plan2/holiday_cl_es                                   |   59 
 kholidays/holidays/plan2/holiday_cn_zh-cn                                |   57 
 kholidays/holidays/plan2/holiday_co_es                                   |   40 
 kholidays/holidays/plan2/holiday_cr_en                                   |   26 
 kholidays/holidays/plan2/holiday_cr_es                                   |   26 
 kholidays/holidays/plan2/holiday_cz_cs                                   |   32 
 kholidays/holidays/plan2/holiday_de-by_de                                |   90 
 kholidays/holidays/plan2/holiday_de_de                                   |   50 
 kholidays/holidays/plan2/holiday_dk_da                                   |  104 
 kholidays/holidays/plan2/holiday_dz_ar                                   |   26 
 kholidays/holidays/plan2/holiday_dz_fr                                   |   26 
 kholidays/holidays/plan2/holiday_ee_et                                   |   83 
 kholidays/holidays/plan2/holiday_eg_ar                                   |   20 
 kholidays/holidays/plan2/holiday_es-ct_ca                                |   38 
 kholidays/holidays/plan2/holiday_es_es                                   |   80 
 kholidays/holidays/plan2/holiday_fi_fi                                   |  104 
 kholidays/holidays/plan2/holiday_fr_fr                                   |   82 
 kholidays/holidays/plan2/holiday_gb-eaw_en-gb                            |   30 
 kholidays/holidays/plan2/holiday_gb-nir_en-gb                            |   38 
 kholidays/holidays/plan2/holiday_gb-sct_en-gb                            |   40 
 kholidays/holidays/plan2/holiday_gf_fr                                   |   76 
 kholidays/holidays/plan2/holiday_gp_fr                                   |   78 
 kholidays/holidays/plan2/holiday_gr_el                                   |  339 -
 kholidays/holidays/plan2/holiday_gr_el_nameday                           |  274 +
 kholidays/holidays/plan2/holiday_gt_es                                   |   46 
 kholidays/holidays/plan2/holiday_hk_en-gb                                |  288 -
 kholidays/holidays/plan2/holiday_hk_zh-cn                                |  288 -
 kholidays/holidays/plan2/holiday_hr_hr                                   |   96 
 kholidays/holidays/plan2/holiday_hu_hu                                   |   62 
 kholidays/holidays/plan2/holiday_id_en-us                                |  118 
 kholidays/holidays/plan2/holiday_id_id                                   |  118 
 kholidays/holidays/plan2/holiday_ie_en-gb                                |   22 
 kholidays/holidays/plan2/holiday_ie_ga                                   |   64 
 kholidays/holidays/plan2/holiday_il_en-us                                |   60 
 kholidays/holidays/plan2/holiday_il_he                                   |   50 
 kholidays/holidays/plan2/holiday_in_en-gb                                |   11 
 kholidays/holidays/plan2/holiday_ir_en-us                                |   44 
 kholidays/holidays/plan2/holiday_ir_fa                                   |   44 
 kholidays/holidays/plan2/holiday_is_is                                   |   84 
 kholidays/holidays/plan2/holiday_it-bz_de                                |   54 
 kholidays/holidays/plan2/holiday_it_it                                   |   82 
 kholidays/holidays/plan2/holiday_jm_en-gb                                |   28 
 kholidays/holidays/plan2/holiday_jp_en-us                                |   74 
 kholidays/holidays/plan2/holiday_jp_ja                                   |   74 
 kholidays/holidays/plan2/holiday_kr_ko                                   |   94 
 kholidays/holidays/plan2/holiday_kz_kk                                   |  134 
 kholidays/holidays/plan2/holiday_kz_ru                                   |  134 
 kholidays/holidays/plan2/holiday_lt_lt                                   |   44 
 kholidays/holidays/plan2/holiday_lu_fr                                   |   24 
 kholidays/holidays/plan2/holiday_lu_lb                                   |   24 
 kholidays/holidays/plan2/holiday_lv_lv                                   |   80 
 kholidays/holidays/plan2/holiday_ma_ar                                   |   26 
 kholidays/holidays/plan2/holiday_ma_fr                                   |   26 
 kholidays/holidays/plan2/holiday_mq_fr                                   |   78 
 kholidays/holidays/plan2/holiday_mx_es                                   |   48 
 kholidays/holidays/plan2/holiday_na_en-gb                                |   28 
 kholidays/holidays/plan2/holiday_nc_fr                                   |   76 
 kholidays/holidays/plan2/holiday_nl_nl                                   |   95 
 kholidays/holidays/plan2/holiday_no_nb                                   |  101 
 kholidays/holidays/plan2/holiday_no_nn                                   |  100 
 kholidays/holidays/plan2/holiday_nz_en-gb                                |  116 
 kholidays/holidays/plan2/holiday_pa_en                                   |   68 
 kholidays/holidays/plan2/holiday_pa_es                                   |   68 
 kholidays/holidays/plan2/holiday_pe_es                                   |   26 
 kholidays/holidays/plan2/holiday_pf_fr                                   |   76 
 kholidays/holidays/plan2/holiday_pl_pl                                   |   66 
 kholidays/holidays/plan2/holiday_pt_pt                                   |   44 
 kholidays/holidays/plan2/holiday_py_es                                   |   22 
 kholidays/holidays/plan2/holiday_re_fr                                   |   76 
 kholidays/holidays/plan2/holiday_ro_ro                                   |   26 
 kholidays/holidays/plan2/holiday_rs_sr                                   |   62 
 kholidays/holidays/plan2/holiday_rs_sr at ijekavian                         |   62 
 kholidays/holidays/plan2/holiday_rs_sr at ijekavianlatin                    |   62 
 kholidays/holidays/plan2/holiday_rs_sr at latin                             |   62 
 kholidays/holidays/plan2/holiday_ru_ru                                   |  198 
 kholidays/holidays/plan2/holiday_se_sv                                   |   64 
 kholidays/holidays/plan2/holiday_sg_en-gb                                |   40 
 kholidays/holidays/plan2/holiday_si_sl                                   |   38 
 kholidays/holidays/plan2/holiday_sk_sk                                   |   46 
 kholidays/holidays/plan2/holiday_sm_it                                   |   92 
 kholidays/holidays/plan2/holiday_th_en-gb                                |   36 
 kholidays/holidays/plan2/holiday_tr_en-gb                                |  142 
 kholidays/holidays/plan2/holiday_tr_tr                                   |  142 
 kholidays/holidays/plan2/holiday_ua_uk                                   |  308 -
 kholidays/holidays/plan2/holiday_us_en-us                                |   74 
 kholidays/holidays/plan2/holiday_uy_es                                   |   32 
 kholidays/holidays/plan2/holiday_wf_fr                                   |   78 
 kholidays/holidays/plan2/holiday_yt_fr                                   |   78 
 kholidays/holidays/plan2/holiday_za_en-gb                                |   24 
 kholidays/parsers/plan2/holidayparserdriverplan.cpp                      |   15 
 kholidays/parsers/plan2/holidayparserdriverplan_p.h                      |    6 
 kholidays/parsers/plan2/holidayparserplan.cpp                            | 1067 +++--
 kholidays/parsers/plan2/holidayparserplan.hpp                            |  159 
 kholidays/parsers/plan2/holidayparserplan.ypp                            |   27 
 kholidays/parsers/plan2/holidayscannerplan.cpp                           | 1994 +++++-----
 kholidays/parsers/plan2/holidayscannerplan.lpp                           |   23 
 kholidays/parsers/plan2/location.hh                                      |   58 
 kholidays/parsers/plan2/position.hh                                      |   75 
 kholidays/parsers/plan2/stack.hh                                         |   48 
 kholidays/tests/holiday_gb-eaw_en-gb_Test                                |   68 
 kholidays/tests/testholidayregion.h                                      |    2 
 kimap/fetchjob.cpp                                                       |   67 
 kimap/fetchjob.h                                                         |   95 
 kimap/getmetadatajob.cpp                                                 |   18 
 kimap/getmetadatajob.h                                                   |   24 
 kimap/loginjob.cpp                                                       |    2 
 kimap/loginjob.h                                                         |    3 
 kimap/storejob.cpp                                                       |   66 
 kimap/storejob.h                                                         |    3 
 kimap/tests/fetchjobtest.cpp                                             |   71 
 kimap/tests/kimaptest/fakeserver.cpp                                     |    9 
 kimap/tests/kimaptest/fakeserver.h                                       |    7 
 kldap/ldapconfigwidget.cpp                                               |    6 
 kresources/kresources.desktop                                            |    3 
 kresources/kresources_manager.desktop                                    |    4 
 mailtransport/smtpconfigwidget.cpp                                       |   18 
 mailtransport/tests/CMakeLists.txt                                       |    4 
 mailtransport/tests/transportmgr.cpp                                     |    5 
 243 files changed, 9586 insertions(+), 6337 deletions(-)

New commits:
commit 4d4a185b4433835e592422ff695744b2547ed133
Merge: ea947bb 4435bcb
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Aug 11 11:00:11 2014 +0200

    Add dialog box when we don't find capabilities
    
    (cherry picked from commit 1a04ba54247c37620f651c974614744c4217cbc9)

diff --cc akonadi/calendar/itiphandlerhelper_p.cpp
index ba7e2c2,2af8f3f..b9f1036
--- a/akonadi/calendar/itiphandlerhelper_p.cpp
+++ b/akonadi/calendar/itiphandlerhelper_p.cpp
@@@ -179,10 -219,12 +219,12 @@@ void ITIPHandlerHelper::sendIncidenceCr
      /// When we created the incidence, we *must* be the organizer.
  
      if (!weAreOrganizerOf(incidence)) {
 -        kError() << "We should be the organizer of this incidence!"
 +        kWarning() << "Creating incidence which has another organizer! Will skip sending invitations."
                   << "; email= "       << incidence->organizer()->email()
                   << "; thatIsMe() = " << Akonadi::CalendarUtils::thatIsMe(incidence->organizer()->email());
-         return ITIPHandlerHelper::ResultFailAbortUpdate;
+         emit sendIncidenceCreatedMessageFinished(ITIPHandlerHelper::ResultFailAbortUpdate, method, incidence);
+         emit finished(ITIPHandlerHelper::ResultFailAbortUpdate, QString());
+         return;
      }
  
      if (!weNeedToSendMailFor(incidence)) {


commit ea947bbfd763ab4b2ce12648f23bed7532a200a9
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sun Aug 10 14:02:25 2014 +0200

    ResourceBase: Sync referenced collections.

diff --git a/akonadi/resourcebase.cpp b/akonadi/resourcebase.cpp
index 9dbc187..d11f216 100644
--- a/akonadi/resourcebase.cpp
+++ b/akonadi/resourcebase.cpp
@@ -1100,7 +1100,7 @@ void ResourceBasePrivate::slotCollectionListDone(KJob *job)
         const Collection::List list = static_cast<CollectionFetchJob *>(job)->collections();
         Q_FOREACH (const Collection &collection, list) {
             //We also get collections that should not be synced but are part of the tree.
-            if (collection.shouldList(Collection::ListSync)) {
+            if (collection.shouldList(Collection::ListSync) || collection.referenced()) {
                 scheduler->scheduleSync(collection);
             }
         }


commit bba53c16dd74055a760035f6033799e30c838331
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sat Aug 9 16:39:31 2014 +0200

    CollectionFetchJob: Support for fetching ancestor attributes.

diff --git a/akonadi/collectionfetchjob.cpp b/akonadi/collectionfetchjob.cpp
index 0d70dea..4223c90 100644
--- a/akonadi/collectionfetchjob.cpp
+++ b/akonadi/collectionfetchjob.cpp
@@ -302,6 +302,10 @@ void CollectionFetchJob::doStart()
             Q_ASSERT(false);
         }
     }
+    Q_FOREACH (const QByteArray &ancestorAttributes, d->mScope.ancestorAttributes()) {
+        options.append("ANCESTORATTR");
+        options.append(ancestorAttributes);
+    }
 
     command += ImapParser::join(filter, " ") + ") (" + ImapParser::join(options, " ") + ")\n";
     d->writeData(command);
diff --git a/akonadi/collectionfetchscope.cpp b/akonadi/collectionfetchscope.cpp
index 18c6509..2b71309 100644
--- a/akonadi/collectionfetchscope.cpp
+++ b/akonadi/collectionfetchscope.cpp
@@ -43,6 +43,7 @@ public:
         ancestorDepth = other.ancestorDepth;
         statistics = other.statistics;
         listFilter = other.listFilter;
+        ancestorAttributes = other.ancestorAttributes;
     }
 
 public:
@@ -51,6 +52,7 @@ public:
     CollectionFetchScope::AncestorRetrieval ancestorDepth;
     bool statistics;
     CollectionFetchScope::ListFilter listFilter;
+    QSet<QByteArray> ancestorAttributes;
 };
 
 CollectionFetchScope::CollectionFetchScope()
@@ -150,5 +152,19 @@ void CollectionFetchScope::setListFilter(CollectionFetchScope::ListFilter listFi
     d->listFilter = listFilter;
 }
 
+QSet<QByteArray> CollectionFetchScope::ancestorAttributes() const
+{
+    return d->ancestorAttributes;
+}
+
+void CollectionFetchScope::fetchAncestorAttribute(const QByteArray &type, bool fetch)
+{
+    if (fetch) {
+        d->ancestorAttributes.insert(type);
+    } else {
+        d->ancestorAttributes.remove(type);
+    }
+}
+
 
 }
diff --git a/akonadi/collectionfetchscope.h b/akonadi/collectionfetchscope.h
index a857930..5acd591 100644
--- a/akonadi/collectionfetchscope.h
+++ b/akonadi/collectionfetchscope.h
@@ -24,6 +24,7 @@
 #include "akonadi_export.h"
 
 #include <QtCore/QSharedDataPointer>
+#include <QtCore/QSet>
 
 class QStringList;
 
@@ -217,6 +218,34 @@ public:
     AncestorRetrieval ancestorRetrieval() const;
 
     /**
+     * Returns all explicitly fetched attributes.
+     *
+     * Undefined if fetchAllAttributes() returns true.
+     *
+     * @see fetchAttribute()
+     */
+    QSet<QByteArray> ancestorAttributes() const;
+
+    /**
+     * Sets whether the attribute of the given @p type should be fetched.
+     *
+     * @param type The attribute type to fetch.
+     * @param fetch @c true if the attribute should be fetched, @c false otherwise.
+     */
+    void fetchAncestorAttribute(const QByteArray &type, bool fetch = true);
+
+    /**
+     * Sets whether the attribute of the requested type should be fetched.
+     *
+     * @param fetch @c true if the attribute should be fetched, @c false otherwise.
+     */
+    template <typename T> inline void fetchAncestorAttribute(bool fetch = true)
+    {
+        T dummy;
+        fetchAncestorAttribute(dummy.type(), fetch);
+    }
+
+    /**
      * Returns @c true if there is nothing to fetch.
      */
     bool isEmpty() const;
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index 3d49666..82b70d5 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -116,7 +116,7 @@ void ProtocolHelper::parseAncestors( const QByteArray &data, Entity *entity, int
   for ( int i = 0; i < ancestors.count(); ++i ) {
     parentIds.clear();
     ImapParser::parseParenthesizedList( ancestors[ i ], parentIds );
-    if ( parentIds.size() != 2 )
+    if ( parentIds.size() < 2 )
       break;
 
     const Collection::Id uid = parentIds[ 0 ].toLongLong();
@@ -127,6 +127,15 @@ void ProtocolHelper::parseAncestors( const QByteArray &data, Entity *entity, int
 
     current->parentCollection().setId( uid );
     current->parentCollection().setRemoteId( QString::fromUtf8( parentIds[ 1 ] ) );
+    for ( int q = 2; q < parentIds.count(); q += 2 ) {
+        const QByteArray &attrType = parentIds[q];
+        const QByteArray &attrValue = parentIds[q + 1];
+        Attribute* attr = AttributeFactory::createAttribute( attrType );
+        Q_ASSERT( attr );
+        attr->deserialize( attrValue );
+        current->parentCollection().addAttribute( attr );
+    }
+
     current = &current->parentCollection();
   }
 }
diff --git a/akonadi/tests/collectionjobtest.cpp b/akonadi/tests/collectionjobtest.cpp
index 59155dd..b6cb398 100644
--- a/akonadi/tests/collectionjobtest.cpp
+++ b/akonadi/tests/collectionjobtest.cpp
@@ -766,6 +766,37 @@ void CollectionJobTest::testAncestorRetrieval()
   QCOMPARE( col, col2 );
 }
 
+void CollectionJobTest::testAncestorAttributeRetrieval()
+{
+  Akonadi::Collection baseCol;
+  {
+    baseCol.setParentCollection(Akonadi::Collection(res1ColId));
+    baseCol.setName("base");
+    baseCol.attribute<TestAttribute>( Collection::AddIfMissing )->data = "new";
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(baseCol);
+    AKVERIFYEXEC(create);
+    baseCol = create->collection();
+  }
+  {
+    Akonadi::Collection col;
+    col.setParentCollection(baseCol);
+    col.setName("enabled");
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(col);
+    AKVERIFYEXEC(create);
+
+    CollectionFetchJob *job = new CollectionFetchJob(create->collection(), CollectionFetchJob::Base);
+    job->fetchScope().setAncestorRetrieval(CollectionFetchScope::All);
+    job->fetchScope().fetchAncestorAttribute<TestAttribute>(CollectionFetchScope::All);
+    AKVERIFYEXEC(job);
+    Akonadi::Collection result = job->collections().first();
+    QCOMPARE(result.parentCollection().hasAttribute<TestAttribute>(), true);
+  }
+
+  //Cleanup
+  CollectionDeleteJob *deleteJob = new CollectionDeleteJob(baseCol);
+  AKVERIFYEXEC(deleteJob);
+}
+
 void CollectionJobTest::testListPreference()
 {
   Akonadi::Collection baseCol;
diff --git a/akonadi/tests/collectionjobtest.h b/akonadi/tests/collectionjobtest.h
index 14b0fd0..cd71d3c 100644
--- a/akonadi/tests/collectionjobtest.h
+++ b/akonadi/tests/collectionjobtest.h
@@ -52,6 +52,7 @@ class CollectionJobTest : public QObject
     void testRidCreateDelete_data();
     void testRidCreateDelete();
     void testAncestorRetrieval();
+    void testAncestorAttributeRetrieval();
     void testListPreference();
     void testReference();
 };


commit d8d0f85a609dff818ef8812cbe0d57f934c89911
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sat Aug 9 16:38:17 2014 +0200

    CollectionComboBox: Set listfilter

diff --git a/akonadi/collectioncombobox.cpp b/akonadi/collectioncombobox.cpp
index 800d5e6..050e270 100644
--- a/akonadi/collectioncombobox.cpp
+++ b/akonadi/collectioncombobox.cpp
@@ -59,6 +59,7 @@ public:
 
             mModel = new EntityTreeModel(mMonitor, mParent);
             mModel->setItemPopulationStrategy(EntityTreeModel::NoItemPopulation);
+            mModel->setListFilter(CollectionFetchScope::Display);
 
             mBaseModel = mModel;
         }


commit fe08944c5f0097b77f8f986d2c14ce32159e0e22
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Aug 7 17:40:29 2014 +0200

    CollectionSync: Detect enabled changes.

diff --git a/akonadi/collectionsync.cpp b/akonadi/collectionsync.cpp
index c9afbfb..e516bd9 100644
--- a/akonadi/collectionsync.cpp
+++ b/akonadi/collectionsync.cpp
@@ -412,6 +412,9 @@ public:
         if (!(localCollection.cachePolicy() == remoteCollection.cachePolicy())) {
             return true;
         }
+        if (localCollection.enabled() != remoteCollection.enabled()) {
+            return true;
+        }
 
         // CollectionModifyJob adds the remote attributes to the local collection
         foreach (const Attribute *attr, remoteCollection.attributes()) {


commit ebf5c3f224bb420217ee400ea40429b37ec55374
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Aug 7 17:36:50 2014 +0200

    Collection: Always the changelog to changed when set.
    
    Otherwise setEnabled(true) will still not result in the value getting
    updated (since the default value is true as well).

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index 153e4bc..701fb6a 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -274,9 +274,7 @@ void Collection::setEnabled(bool enabled)
 {
     Q_D(Collection);
 
-    if (enabled != d->enabled) {
-        d->enabledChanged = true;
-    }
+    d->enabledChanged = true;
     d->enabled = enabled;
 }
 
@@ -341,9 +339,7 @@ void Collection::setReferenced(bool referenced)
 {
     Q_D(Collection);
 
-    if (d->referenced != referenced) {
-        d->referencedChanged = true;
-    }
+    d->referencedChanged = true;
     d->referenced = referenced;
 }
 


commit d6370e1784499da93142f282c3260084587e4efb
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Aug 6 22:05:28 2014 +0200

    ETM: Removed unnecessary debug output

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 8d24973..3a09ed9 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -482,7 +482,6 @@ void EntityTreeModelPrivate::collectionsFetched(const Akonadi::Collection::List
         collectionIt.next();
 
         const Collection::Id topCollectionId = collectionIt.key();
-        kDebug() << "Subtree: " << topCollectionId << collectionIt.value();
 
         Q_ASSERT(!m_collections.contains(topCollectionId));
         Collection topCollection = collectionsToInsert.value(topCollectionId);


commit 7b05455878771c6222f3dcecb47c9b832f35fff5
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Aug 6 19:36:05 2014 +0200

    KIMAP: API for multiple folders

diff --git a/kimap/getmetadatajob.cpp b/kimap/getmetadatajob.cpp
index 4cfc333..5d6d417 100644
--- a/kimap/getmetadatajob.cpp
+++ b/kimap/getmetadatajob.cpp
@@ -234,7 +234,13 @@ QMap<QByteArray, QMap<QByteArray, QByteArray> > GetMetaDataJob::allMetaData(cons
 QMap<QByteArray, QByteArray> GetMetaDataJob::allMetaData() const
 {
   Q_D( const GetMetaDataJob );
-  const QMap<QByteArray, QMap<QByteArray, QByteArray> > &entries = d->metadata[d->mailBox];
+  return allMetaDataForMailbox(d->mailBox);
+}
+
+QMap<QByteArray, QByteArray> GetMetaDataJob::allMetaDataForMailbox(const QString &mailbox) const
+{
+  Q_D( const GetMetaDataJob );
+  const QMap<QByteArray, QMap<QByteArray, QByteArray> > &entries = d->metadata[mailbox];
   QMap<QByteArray, QByteArray> map;
   foreach(const QByteArray &entry, entries.keys()) {
     const QMap<QByteArray, QByteArray> &values = entries[entry];
@@ -245,3 +251,13 @@ QMap<QByteArray, QByteArray> GetMetaDataJob::allMetaData() const
   return map;
 }
 
+QHash<QString, QMap<QByteArray, QByteArray> > GetMetaDataJob::allMetaDataForMailboxes() const
+{
+  Q_D( const GetMetaDataJob );
+  QHash<QString, QMap<QByteArray, QByteArray> > mailboxHash;
+  Q_FOREACH (const QString &mailbox, d->metadata.keys()) {
+    mailboxHash.insert(mailbox, allMetaDataForMailbox(mailbox));
+  }
+  return mailboxHash;
+}
+
diff --git a/kimap/getmetadatajob.h b/kimap/getmetadatajob.h
index 772e29e..cd0ad12 100644
--- a/kimap/getmetadatajob.h
+++ b/kimap/getmetadatajob.h
@@ -223,8 +223,8 @@ class KIMAP_EXPORT GetMetaDataJob : public MetaDataJobBase
     QMap<QByteArray, QMap<QByteArray, QByteArray> > allMetaData( const QString &mailBox ) const;
 
     /**
-     * Get all the metadata.
-     *
+     * Get all the metadata for the mailbox set with setMailBox().
+     * 
      * Note that the returned map uses METADATA style entries (with a /shared or /private prefix typically),
      * also in ANNOTATEMORE mode.
      *
@@ -232,6 +232,26 @@ class KIMAP_EXPORT GetMetaDataJob : public MetaDataJobBase
      */
      QMap<QByteArray, QByteArray> allMetaData() const;
 
+    /**
+     * Get all the metadata for the mailbox.
+     *
+     * Note that the returned map uses METADATA style entries (with a /shared or /private prefix typically),
+     * also in ANNOTATEMORE mode.
+     *
+     * @return a map from metadata entry names to values
+     */
+     QMap<QByteArray, QByteArray> allMetaDataForMailbox(const QString &mailbox) const;
+
+    /**
+     * Get all the metadata for for all mailboxes.
+     *
+     * Note that the returned map uses METADATA style entries (with a /shared or /private prefix typically),
+     * also in ANNOTATEMORE mode.
+     *
+     * @return a map in the form (mailbox, (entry, value))
+     */
+     QHash<QString, QMap<QByteArray, QByteArray> > allMetaDataForMailboxes() const;
+
   protected:
     virtual void doStart();
     virtual void handleResponse( const Message &response );


commit a2295b09e32d9e4748564482914727cbc31a4a08
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Aug 6 22:00:21 2014 +0200

    ETM: Fixed subtree algorithm in collectionsFetched.
    
    The implemented algorithm relied on specific listing order. It had two problems:
    * the subTreesToInsert were IMO never correctly built (the algorithm only works
    if children come first, and then it still inserted a parent-child pair to much).
    * collectionsToInsert would be overwritten with a dummy collection from the ancestor chain
    unless the actual collection comes last in the list (again, depends on listing order)
    
    With this patch the algorithm becomes order independent.
    
    Although the original patch inserted hidden collections in case it has non-hidden
    children, this patch removes this behaviour since isHidden recursively checks all ancestors.
    (so this scenario shouldn't be possible).
    isHidden is potentially broken though since the HIDDEN attribute is probably not
    available in the ancestor chain.
    
    REVIEW: 119628

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 3212ade..8d24973 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -380,6 +380,18 @@ void EntityTreeModelPrivate::collectionListFetched(const Akonadi::Collection::Li
     }
 }
 
+static QSet<Collection::Id> getChildren(Collection::Id parent, const QHash<Collection::Id, Collection::Id> &childParentMap)
+{
+    QSet<Collection::Id> children;
+    Q_FOREACH (Collection::Id c, childParentMap.keys()) {
+        if (childParentMap.value(c) == parent) {
+            children << c;
+            children += getChildren(c, childParentMap);
+        }
+    }
+    return children;
+}
+
 void EntityTreeModelPrivate::collectionsFetched(const Akonadi::Collection::List &collections)
 {
     Q_Q(EntityTreeModel);
@@ -389,22 +401,13 @@ void EntityTreeModelPrivate::collectionsFetched(const Akonadi::Collection::List
     QListIterator<Akonadi::Collection> it(collections);
 
     QHash<Collection::Id, Collection> collectionsToInsert;
-    QHash<Collection::Id, QVector<Collection::Id> > subTreesToInsert;
-    QHash<Collection::Id, Collection> parents;
 
     while (it.hasNext()) {
         const Collection collection = it.next();
 
         const Collection::Id collectionId = collection.id();
 
-        // If a collection is hidden, we still need to put it in the model if it has a
-        // non-hidden child. We rely on the fact that children will be returned
-        // first and will be in collectionsToInsert (if returned in this batch)
-        // or will already be in the model as a dummy node in m_collections
-        // if returned and processed in an earlier batch.
-        if (isHidden(collection) &&
-            !collectionsToInsert.contains(collectionId) &&
-            !m_collections.contains(collectionId)) {
+        if (isHidden(collection)) {
             continue;
         }
 
@@ -428,49 +431,69 @@ void EntityTreeModelPrivate::collectionsFetched(const Akonadi::Collection::List
             retrieveAncestors(collection, false);
         }
 
-        Collection parent = collection;
+        collectionsToInsert.insert(collectionId, collection);
+    }
+
+    //Build a list of subtrees to insert, with the root of the subtree on the left, and the complete subtree including root on the right
+    QHash<Collection::Id, QSet<Collection::Id> > subTreesToInsert;
+    {
+        //Build a child-parent map that allows us to build the subtrees afterwards
+        QHash<Collection::Id, Collection::Id> childParentMap;
+        Q_FOREACH (const Collection &col, collectionsToInsert) {
+            childParentMap.insert(col.id(), col.parentCollection().id());
 
-        while (!m_collections.contains(parent.parentCollection().id())) {
-            if (!subTreesToInsert[parent.parentCollection().id()].contains(parent.parentCollection().id())) {
-                subTreesToInsert[parent.parentCollection().id()].append(parent.parentCollection().id());
-                collectionsToInsert.insert(parent.parentCollection().id(), parent.parentCollection());
-            }
+            //Complete the subtree up to the last known parent
+            Collection parent = col.parentCollection();
+            while (parent.isValid() && parent != m_rootCollection && !m_collections.contains(parent.id())) {
+                childParentMap.insert(parent.id(), parent.parentCollection().id());
 
-            foreach (Collection::Id collectionId, subTreesToInsert.take(parent.id())) {
-                if (!subTreesToInsert[parent.parentCollection().id()].contains(collectionId)) {
-                    subTreesToInsert[parent.parentCollection().id()].append(collectionId);
+                if (!collectionsToInsert.contains(parent.id())) {
+                    collectionsToInsert.insert(parent.id(), parent);
                 }
+                parent = parent.parentCollection();
             }
-
-            parent = parent.parentCollection();
         }
 
-        if (!subTreesToInsert[parent.id()].contains(collectionId)) {
-            subTreesToInsert[parent.id()].append(collectionId);
+        QSet<Collection::Id> parents;
+
+        //Find toplevel parents of the subtrees
+        Q_FOREACH (Collection::Id c, childParentMap.keys()) {
+            //The child has a parent without parent (it's a toplevel node that is not yet in m_collections)
+            if (!childParentMap.contains(childParentMap.value(c))) {
+                Q_ASSERT(!m_collections.contains(c));
+                parents << c;
+            }
         }
 
-        collectionsToInsert.insert(collectionId, collection);
-        if (!parents.contains(parent.id())) {
-            parents.insert(parent.id(), parent.parentCollection());
+        //Find children of each subtree
+        Q_FOREACH (Collection::Id p, parents) {
+            QSet<Collection::Id> children;
+            //We add the parent itself as well so it can be inserted below as part of the same loop
+            children << p;
+            children += getChildren(p, childParentMap);
+            subTreesToInsert[p] = children;
         }
     }
 
     const int row = 0;
 
-    QHashIterator<Collection::Id, QVector<Collection::Id> > collectionIt(subTreesToInsert);
+    QHashIterator<Collection::Id, QSet<Collection::Id> > collectionIt(subTreesToInsert);
     while (collectionIt.hasNext()) {
         collectionIt.next();
 
         const Collection::Id topCollectionId = collectionIt.key();
+        kDebug() << "Subtree: " << topCollectionId << collectionIt.value();
 
         Q_ASSERT(!m_collections.contains(topCollectionId));
+        Collection topCollection = collectionsToInsert.value(topCollectionId);
+        Q_ASSERT(topCollection.isValid());
 
-        Q_ASSERT(parents.contains(topCollectionId));
-        const QModelIndex parentIndex = indexForCollection(parents.value(topCollectionId));
+        //The toplevels parent must already be part of the model
+        Q_ASSERT(m_collections.contains(topCollection.parentCollection().id()));
+        const QModelIndex parentIndex = indexForCollection(topCollection.parentCollection());
 
         q->beginInsertRows(parentIndex, row, row);
         Q_ASSERT(!collectionIt.value().isEmpty());
-        Q_ASSERT(m_collections.contains(parents.value(topCollectionId).id()));
 
         foreach (Collection::Id collectionId, collectionIt.value()) {
             const Collection collection = collectionsToInsert.take(collectionId);


commit d4038bafcbfebfbb9a156d656ee9f0fd7ca0ba76
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Tue Aug 5 18:39:27 2014 +0200

    Session: flush the logfile when server response is received, too

diff --git a/akonadi/session.cpp b/akonadi/session.cpp
index f91a880..ec6bc28 100644
--- a/akonadi/session.cpp
+++ b/akonadi/session.cpp
@@ -198,6 +198,7 @@ void SessionPrivate::dataReceived()
 
             if (logFile) {
                 logFile->write("S: " + parser->data());
+                logFile->flush();
             }
 
             // handle login response


commit 2fe7f5f4f20441e1e750d605da58d9776256c420
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Tue Aug 5 17:34:22 2014 +0200

    Adapt CollectionSyncTest to Akonadi changes
    
    Since the change in LIST implementation in Akonadi, the collections are returned
    in a different order. This adapts the test to that change.

diff --git a/akonadi/tests/collectionsynctest.cpp b/akonadi/tests/collectionsynctest.cpp
index f418228..9da0b28 100644
--- a/akonadi/tests/collectionsynctest.cpp
+++ b/akonadi/tests/collectionsynctest.cpp
@@ -164,8 +164,9 @@ class CollectionSyncTest : public QObject
       QCOMPARE( resultCols.count(), origCols.count() );
 
       Collection::List delCols;
-      delCols << resultCols.front();
-      resultCols.pop_front();
+      delCols << resultCols.last();
+      resultCols.pop_back();
+
 
       // ### not implemented yet I guess
 #if 0


commit db901360cff6b968ca8c4a24fafc38e2f5b15bfd
Author: Kevin Ottens <ervin at kde.org>
Date:   Tue Aug 5 16:07:15 2014 +0200

    Make it build
    
    Conflicts:
    	akonadi/resourcebase.cpp

diff --git a/akonadi/resourcebase.cpp b/akonadi/resourcebase.cpp
index c2b49f4..9dbc187 100644
--- a/akonadi/resourcebase.cpp
+++ b/akonadi/resourcebase.cpp
@@ -726,6 +726,9 @@ void ResourceBasePrivate::changeCommittedResult(KJob *job)
         }
         mChangeRecorder->d_ptr->invalidateCache(static_cast<CollectionModifyJob *>(job)->collection());
     } else {
+        if (job->error()) {
+            emit q->error(i18nc("@info", "Updating local items failed: %1.", job->errorText()));
+        }
         // Item and tag cache is invalidated by modify job
     }
 


commit 9bda5c2939aad818de5a4573da7b1bed3ec223e5
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Tue Aug 5 14:54:05 2014 +0200

    Don't mass-modify committed changes from ResourceBase
    
    The resource could have changed RIDs of the items, and mass-changing
    RIDs is not supported by the server, so the RID change would never be
    applied. Instead we run an ItemModifyJob for each item passed to
    changesCommitted() and wrap them into single TransactionSequence.
    
    This should fix some bugs with item moves on IMAP.
    
    Reviewed-by: Christian Mollekopf

diff --git a/akonadi/resourcebase.cpp b/akonadi/resourcebase.cpp
index 7a7b5f3..c2b49f4 100644
--- a/akonadi/resourcebase.cpp
+++ b/akonadi/resourcebase.cpp
@@ -693,12 +693,18 @@ void ResourceBase::changeCommitted(const Item &item)
 
 void ResourceBase::changesCommitted(const Item::List &items)
 {
-    ItemModifyJob *job = new ItemModifyJob(items);
-    job->d_func()->setClean();
-    job->disableRevisionCheck(); // TODO: remove, but where/how do we handle the error?
-    job->setIgnorePayload(true);   // we only want to reset the dirty flag and update the remote id
-    job->setUpdateGid(true);   // allow resources to update GID too
-    connect(job, SIGNAL(finished(KJob*)), this, SLOT(changeCommittedResult(KJob*)));
+    TransactionSequence *transaction = new TransactionSequence(this);
+    connect(transaction, SIGNAL(finished(KJob*)),
+            this, SLOT(changeCommittedResult(KJob*)));
+
+    // Modify the items one-by-one, because STORE does not support mass RID change
+    Q_FOREACH (const Item &item, items) {
+        ItemModifyJob *job = new ItemModifyJob(item, transaction);
+        job->d_func()->setClean();
+        job->disableRevisionCheck(); // TODO: remove, but where/how do we handle the error?
+        job->setIgnorePayload(true);   // we only want to reset the dirty flag and update the remote id
+        job->setUpdateGid(true);   // allow resources to update GID too
+    }
 }
 
 void ResourceBase::changeCommitted(const Collection &collection)
@@ -709,6 +715,10 @@ void ResourceBase::changeCommitted(const Collection &collection)
 
 void ResourceBasePrivate::changeCommittedResult(KJob *job)
 {
+    if (job->error()) {
+        kWarning() << job->errorText();
+    }
+
     Q_Q(ResourceBase);
     if (qobject_cast<CollectionModifyJob *>(job)) {
         if (job->error()) {
@@ -716,7 +726,6 @@ void ResourceBasePrivate::changeCommittedResult(KJob *job)
         }
         mChangeRecorder->d_ptr->invalidateCache(static_cast<CollectionModifyJob *>(job)->collection());
     } else {
-        // TODO: Error handling for item changes?
         // Item and tag cache is invalidated by modify job
     }
 


commit 02ec544bfc72d4a7cacef3f9a4a46fe795c71f77
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Aug 5 13:45:21 2014 +0200

    ItemSync: debug output

diff --git a/akonadi/itemsync.cpp b/akonadi/itemsync.cpp
index 9f833e6..d1ed81f 100644
--- a/akonadi/itemsync.cpp
+++ b/akonadi/itemsync.cpp
@@ -173,6 +173,7 @@ void ItemSyncPrivate::checkDone()
 
     if (allProcessed() && !mFinished) {
         // prevent double result emission, can happen since checkDone() is called from all over the place
+        kDebug() << "finished";
         mFinished = true;
         q->emitResult();
     }
@@ -493,6 +494,7 @@ void ItemSync::deliveryDone()
 void ItemSync::slotResult(KJob *job)
 {
     if (job->error()) {
+        kWarning() << "Error during ItemSync: " << job->errorString();
         // pretent there were no errors
         Akonadi::Job::removeSubjob(job);
         // propagate the first error we got but continue, we might still be fed with stuff from a resource
@@ -508,6 +510,7 @@ void ItemSync::slotResult(KJob *job)
 void ItemSync::rollback()
 {
     Q_D(ItemSync);
+    kWarning() << "The item sync is being rolled-back.";
     setError(UserCanceled);
     if (d->mCurrentTransaction) {
         d->mCurrentTransaction->rollback();


commit a93abf588d3551285d00e4816cca2ac66984d4a9
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jul 30 15:03:14 2014 +0200

    Fetch tags with items.
    
    This patch allows to fetch the full tags with the item instead of only
    id's.
    
    REVIEW: 119469

diff --git a/akonadi/itemfetchscope.cpp b/akonadi/itemfetchscope.cpp
index b5677df..3baaf1a 100644
--- a/akonadi/itemfetchscope.cpp
+++ b/akonadi/itemfetchscope.cpp
@@ -194,6 +194,21 @@ bool ItemFetchScope::fetchTags() const
     return d->mFetchTags;
 }
 
+void ItemFetchScope::setTagFetchScope(const TagFetchScope &tagFetchScope)
+{
+    d->mTagFetchScope = tagFetchScope;
+}
+
+TagFetchScope &ItemFetchScope::tagFetchScope()
+{
+    return d->mTagFetchScope;
+}
+
+TagFetchScope ItemFetchScope::tagFetchScope() const
+{
+    return d->mTagFetchScope;
+}
+
 void ItemFetchScope::setFetchVirtualReferences(bool fetchVRefs)
 {
     d->mFetchVRefs = fetchVRefs;
diff --git a/akonadi/itemfetchscope.h b/akonadi/itemfetchscope.h
index 7200ad9..bb01461 100644
--- a/akonadi/itemfetchscope.h
+++ b/akonadi/itemfetchscope.h
@@ -31,6 +31,7 @@ template <typename T> class QSet;
 namespace Akonadi {
 
 class ItemFetchScopePrivate;
+class TagFetchScope;
 
 /**
  * @short Specifies which parts of an item should be fetched from the Akonadi storage.
@@ -346,6 +347,49 @@ public:
     bool fetchTags() const;
 
     /**
+     * Sets the tag fetch scope.
+     *
+     * The TagFetchScope controls how much of an tags's data is fetched
+     * from the server.
+     *
+     * By default setFetchIdOnly is set to true on the tag fetch scope.
+     *
+     * @param fetchScope The new fetch scope for tag fetch operations.
+     * @see fetchScope()
+     * @since 4.15
+     */
+    void setTagFetchScope(const TagFetchScope &fetchScope);
+
+    /**
+     * Returns the tag fetch scope.
+     *
+     * Since this returns a reference it can be used to conveniently modify the
+     * current scope in-place, i.e. by calling a method on the returned reference
+     * without storing it in a local variable. See the TagFetchScope documentation
+     * for an example.
+     *
+     * By default setFetchIdOnly is set to true on the tag fetch scope.
+     *
+     * @return a reference to the current tag fetch scope
+     *
+     * @see setFetchScope() for replacing the current tag fetch scope
+     * @since 4.15
+     */
+    TagFetchScope &tagFetchScope();
+
+    /**
+     * Returns the tag fetch scope.
+     *
+     * By default setFetchIdOnly is set to true on the tag fetch scope.
+     *
+     * @return a reference to the current tag fetch scope
+     *
+     * @see setFetchScope() for replacing the current tag fetch scope
+     * @since 4.15
+     */
+    TagFetchScope tagFetchScope() const;
+
+    /**
      * Returns whether to fetch list of virtual collections the item is linked to
      *
      * @param fetchVRefs whether or not to fetch virtualc references
diff --git a/akonadi/itemfetchscope_p.h b/akonadi/itemfetchscope_p.h
index d3668d4..3dda8bf 100644
--- a/akonadi/itemfetchscope_p.h
+++ b/akonadi/itemfetchscope_p.h
@@ -24,6 +24,7 @@
 #include <QtCore/QString>
 #include <KDE/KDateTime>
 #include "itemfetchscope.h"
+#include "tagfetchscope.h"
 
 namespace Akonadi {
 
@@ -46,6 +47,7 @@ public:
         , mFetchTags(false)
         , mFetchVRefs(false)
     {
+        mTagFetchScope.setFetchIdOnly(true);
     }
 
     ItemFetchScopePrivate(const ItemFetchScopePrivate &other)
@@ -64,6 +66,7 @@ public:
         mFetchRid = other.mFetchRid;
         mFetchGid = other.mFetchGid;
         mFetchTags = other.mFetchTags;
+        mTagFetchScope = other.mTagFetchScope;
         mFetchVRefs = other.mFetchVRefs;
     }
 
@@ -81,6 +84,7 @@ public:
     bool mFetchRid;
     bool mFetchGid;
     bool mFetchTags;
+    TagFetchScope mTagFetchScope;
     bool mFetchVRefs;
 };
 
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index 53bb5a9..3d49666 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -26,6 +26,7 @@
 #include "itemserializer_p.h"
 #include "itemserializerplugin.h"
 #include "servermanager.h"
+#include "tagfetchscope.h"
 #include <akonadi/private/xdgbasedirs_p.h>
 
 #include <QtCore/QDateTime>
@@ -445,8 +446,12 @@ QByteArray ProtocolHelper::itemFetchScopeToByteArray( const ItemFetchScope &fetc
     command += " " AKONADI_PARAM_REMOTEID " " AKONADI_PARAM_REMOTEREVISION;
   if ( fetchScope.fetchGid() )
     command += " GID";
-  if ( fetchScope.fetchTags() )
+  if ( fetchScope.fetchTags() ) {
     command += " TAGS";
+    if ( !fetchScope.tagFetchScope().fetchIdOnly() ) {
+      command += " " + ProtocolHelper::tagFetchScopeToByteArray( fetchScope.tagFetchScope() );
+    }
+  }
   if ( fetchScope.fetchVirtualReferences() )
     command += " VIRTREF";
   if ( fetchScope.fetchModificationTime() )
@@ -460,6 +465,18 @@ QByteArray ProtocolHelper::itemFetchScopeToByteArray( const ItemFetchScope &fetc
   return command;
 }
 
+QByteArray ProtocolHelper::tagFetchScopeToByteArray( const TagFetchScope &fetchScope )
+{
+  QByteArray command;
+
+  command += "(UID";
+  Q_FOREACH (const QByteArray &part, fetchScope.attributes()) {
+    command += ' ' + ProtocolHelper::encodePartIdentifier(ProtocolHelper::PartAttribute, part);
+  }
+  command += ")";
+  return command;
+}
+
 void ProtocolHelper::parseItemFetchResult( const QList<QByteArray> &lineTokens, Item &item, ProtocolHelperValuePool *valuePool )
 {
   // create a new item object
@@ -536,15 +553,27 @@ void ProtocolHelper::parseItemFetchResult( const QList<QByteArray> &lineTokens,
         item.setFlags( convertedFlags );
       }
     } else if ( key == "TAGS" ) {
-      ImapSet set;
-      ImapParser::parseSequenceSet( lineTokens[i + 1], set );
       Tag::List tags;
-      Q_FOREACH ( const ImapInterval &interval, set.intervals() ) {
-        Q_ASSERT( interval.hasDefinedBegin() );
-        Q_ASSERT( interval.hasDefinedEnd() );
-        for ( qint64 i = interval.begin(); i <= interval.end(); i++ ) {
-          //TODO use value pool when tag is shared data
-          tags << Tag( i );
+      if ( lineTokens[i + 1].startsWith("(") ) {
+        QList<QByteArray> tagsData;
+        ImapParser::parseParenthesizedList( lineTokens[i + 1], tagsData );
+        Q_FOREACH (const QByteArray &t, tagsData) {
+          QList<QByteArray> tagParts;
+          ImapParser::parseParenthesizedList( t, tagParts );
+          Tag tag;
+          parseTagFetchResult(tagParts, tag);
+          tags << tag;
+        }
+      } else {
+        ImapSet set;
+        ImapParser::parseSequenceSet( lineTokens[i + 1], set );
+        Q_FOREACH ( const ImapInterval &interval, set.intervals() ) {
+          Q_ASSERT( interval.hasDefinedBegin() );
+          Q_ASSERT( interval.hasDefinedEnd() );
+          for ( qint64 i = interval.begin(); i <= interval.end(); i++ ) {
+            //TODO use value pool when tag is shared data
+            tags << Tag( i );
+          }
         }
       }
       item.setTags( tags );
diff --git a/akonadi/protocolhelper_p.h b/akonadi/protocolhelper_p.h
index 844d636..b25a0e3 100644
--- a/akonadi/protocolhelper_p.h
+++ b/akonadi/protocolhelper_p.h
@@ -224,6 +224,11 @@ public:
     static QByteArray itemFetchScopeToByteArray(const ItemFetchScope &fetchScope);
 
     /**
+      Converts a given TagFetchScope object into a protocol representation.
+    */
+    static QByteArray tagFetchScopeToByteArray( const TagFetchScope &fetchScope );
+
+    /**
       Parses a single line from an item fetch job result into an Item object.
      */
     static void parseItemFetchResult(const QList<QByteArray> &lineTokens, Item &item, ProtocolHelperValuePool *valuePool = 0);
diff --git a/akonadi/tagfetchjob.cpp b/akonadi/tagfetchjob.cpp
index ff518a8..e4fadab 100644
--- a/akonadi/tagfetchjob.cpp
+++ b/akonadi/tagfetchjob.cpp
@@ -134,11 +134,7 @@ void TagFetchJob::doStart()
             return;
         }
     }
-    command += " (UID";
-    Q_FOREACH (const QByteArray &part, d->mFetchScope.attributes()) {
-        command += ' ' + ProtocolHelper::encodePartIdentifier(ProtocolHelper::PartAttribute, part);
-    }
-    command += ")\n";
+    command += " " + ProtocolHelper::tagFetchScopeToByteArray(d->mFetchScope) + "\n";
 
     d->writeData(command);
 }
diff --git a/akonadi/tagfetchscope.cpp b/akonadi/tagfetchscope.cpp
index 5313f64..9f58db8 100644
--- a/akonadi/tagfetchscope.cpp
+++ b/akonadi/tagfetchscope.cpp
@@ -24,7 +24,13 @@ using namespace Akonadi;
 
 struct Akonadi::TagFetchScope::Private
 {
+    Private()
+    : mFetchIdOnly(false)
+    {
+    }
+
     QSet<QByteArray> mAttributes;
+    bool mFetchIdOnly;
 };
 
 TagFetchScope::TagFetchScope()
@@ -46,6 +52,7 @@ TagFetchScope::TagFetchScope(const TagFetchScope &other)
 TagFetchScope &TagFetchScope::operator=(const TagFetchScope &other)
 {
     d->mAttributes = other.d->mAttributes;
+    d->mFetchIdOnly = other.d->mFetchIdOnly;
     return *this;
 }
 
@@ -62,3 +69,15 @@ void TagFetchScope::fetchAttribute(const QByteArray &type, bool fetch)
         d->mAttributes.remove(type);
     }
 }
+
+void TagFetchScope::setFetchIdOnly(bool idOnly)
+{
+    d->mFetchIdOnly = idOnly;
+    d->mAttributes.clear();
+}
+
+bool TagFetchScope::fetchIdOnly() const
+{
+    return d->mFetchIdOnly;
+}
+
diff --git a/akonadi/tagfetchscope.h b/akonadi/tagfetchscope.h
index a63bfb3..25dd141 100644
--- a/akonadi/tagfetchscope.h
+++ b/akonadi/tagfetchscope.h
@@ -85,6 +85,23 @@ public:
         fetchAttribute(dummy.type(), fetch);
     }
 
+    /**
+     * Sets wether only the id or the complete tag should be fetched.
+     *
+     * The default is @c false.
+     *
+     * @since 4.15
+     */
+    void setFetchIdOnly(bool fetchIdOnly);
+
+    /**
+     * Sets wether only the id of the tags should be retieved or the complete tag.
+     *
+     * @see tagFetchScope()
+     * @since 4.15
+     */
+    bool fetchIdOnly() const;
+
 private:
     class Private;
     //@cond PRIVATE
diff --git a/akonadi/tests/tagtest.cpp b/akonadi/tests/tagtest.cpp
index 40fe12b..915237c 100644
--- a/akonadi/tests/tagtest.cpp
+++ b/akonadi/tests/tagtest.cpp
@@ -55,6 +55,8 @@ private Q_SLOTS:
     void testAttributes();
     void testTagItem();
     void testRIDIsolation();
+    void testFetchTagIdWithItem();
+    void testFetchFullTagWithItem();
     void testModifyItemWithTagByGID();
     void testModifyItemWithTagByRID();
     void testMonitor();
@@ -409,6 +411,79 @@ void TagTest::testTagItem()
     AKVERIFYEXEC(deleteJob);
 }
 
+void TagTest::testFetchTagIdWithItem()
+{
+    const Collection res3 = Collection( collectionIdFromPath( "res3" ) );
+    Tag tag;
+    {
+        TagCreateJob *createjob = new TagCreateJob(Tag("gid1"), this);
+        AKVERIFYEXEC(createjob);
+        tag = createjob->tag();
+    }
+
+    Item item1;
+    {
+        item1.setMimeType( "application/octet-stream" );
+        ItemCreateJob *append = new ItemCreateJob(item1, res3, this);
+        AKVERIFYEXEC(append);
+        item1 = append->item();
+
+        // FIXME This should also be possible with create, but isn't
+        item1.setTag(tag);
+
+        ItemModifyJob *modJob = new ItemModifyJob(item1, this);
+        AKVERIFYEXEC(modJob);
+    }
+
+    ItemFetchJob *fetchJob = new ItemFetchJob(item1, this);
+    fetchJob->fetchScope().setFetchTags(true);
+    fetchJob->fetchScope().tagFetchScope().setFetchIdOnly(true);
+    AKVERIFYEXEC(fetchJob);
+    QCOMPARE(fetchJob->items().first().tags().size(), 1);
+    Tag t = fetchJob->items().first().tags().first();
+    QCOMPARE(t.id(), tag.id());
+    QVERIFY(t.gid().isEmpty());
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(tag, this);
+    AKVERIFYEXEC(deleteJob);
+}
+
+void TagTest::testFetchFullTagWithItem()
+{
+    const Collection res3 = Collection( collectionIdFromPath( "res3" ) );
+    Tag tag;
+    {
+        TagCreateJob *createjob = new TagCreateJob(Tag("gid1"), this);
+        AKVERIFYEXEC(createjob);
+        tag = createjob->tag();
+    }
+
+    Item item1;
+    {
+        item1.setMimeType( "application/octet-stream" );
+        ItemCreateJob *append = new ItemCreateJob(item1, res3, this);
+        AKVERIFYEXEC(append);
+        item1 = append->item();
+        //FIXME This should also be possible with create, but isn't
+        item1.setTag(tag);
+    }
+
+    ItemModifyJob *modJob = new ItemModifyJob(item1, this);
+    AKVERIFYEXEC(modJob);
+
+    ItemFetchJob *fetchJob = new ItemFetchJob(item1, this);
+    fetchJob->fetchScope().setFetchTags(true);
+    fetchJob->fetchScope().tagFetchScope().setFetchIdOnly(false);
+    AKVERIFYEXEC(fetchJob);
+    QCOMPARE(fetchJob->items().first().tags().size(), 1);
+    Tag t = fetchJob->items().first().tags().first();
+    QCOMPARE(t, tag);
+    QVERIFY(!t.gid().isEmpty());
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(tag, this);
+    AKVERIFYEXEC(deleteJob);
+}
+
 void TagTest::testModifyItemWithTagByGID()
 {
     const Collection res3 = Collection( collectionIdFromPath( "res3" ) );
@@ -498,9 +573,10 @@ void TagTest::testMonitor()
   {
     QSignalSpy addedSpy(&monitor, SIGNAL(tagAdded(Akonadi::Tag)));
     QVERIFY(addedSpy.isValid());
-    Tag tag("gid2");
-    tag.attribute<Akonadi::TagAttribute>(AttributeEntity::AddIfMissing);
-    QVERIFY(tag.hasAttribute<Akonadi::TagAttribute>());
+    Tag tag;
+    tag.setGid("gid2");
+    tag.setName("name2");
+    tag.setType("type2");
     TagCreateJob *createjob = new TagCreateJob(tag, this);
     AKVERIFYEXEC(createjob);
     //We usually pick up signals from the previous tests as well (due to server-side notification caching)
@@ -511,6 +587,19 @@ void TagTest::testMonitor()
   }
 
   {
+    QSignalSpy modifedSpy(&monitor, SIGNAL(tagChanged(Akonadi::Tag)));
+    QVERIFY(modifedSpy.isValid());
+    createdTag.setName("name3");
+
+    TagModifyJob *modJob = new TagModifyJob(createdTag, this);
+    AKVERIFYEXEC(modJob);
+    //We usually pick up signals from the previous tests as well (due to server-side notification caching)
+    QTRY_VERIFY(modifedSpy.count() >= 1);
+    QTRY_COMPARE(modifedSpy.last().first().value<Akonadi::Tag>().id(), createdTag.id());
+    QVERIFY(modifedSpy.last().first().value<Akonadi::Tag>().hasAttribute<Akonadi::TagAttribute>());
+  }
+
+  {
     QSignalSpy removedSpy(&monitor, SIGNAL(tagRemoved(Akonadi::Tag)));
     QVERIFY(removedSpy.isValid());
     TagDeleteJob *deletejob = new TagDeleteJob(createdTag, this);


commit 334a7e40f334412aaec0b7aa74096b5aeb0b64ea
Author: l10n daemon script <scripty at kde.org>
Date:   Wed Jul 30 04:20:17 2014 +0000

    SVN_SILENT made messages (.desktop file)
    
    Conflicts:
    	akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop

diff --git a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
index e291d38..4c0a2a8 100644
--- a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
+++ b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
@@ -13,7 +13,7 @@ Name[et]=Akonadi otsingu testplugin
 Name[fi]=Akonadin hakuliitännäinen testaustarkoituksiin
 Name[fr]=Module externe de test pour les recherches Akonadi
 Name[hu]=Akonadi teszt keresés bővítmény
-Name[ia]=Plug-in de cerca de essayo de Akonadi
+Name[it]=Estensione di test per la ricerca di Akonadi
 Name[it]=Plugin di ricerca di test per Akonadi
 Name[ko]=Akonadi 테스트 검색 플러그인
 Name[nb]=Akonadi test-tillegg for søk


commit 1fff9ae12a23bab248168d7a7c035677bd614854
Author: Montel Laurent <montel at kde.org>
Date:   Tue Jul 29 13:19:28 2014 +0200

    Fix crash

diff --git a/kabc/vcardparser/testread2.cpp b/kabc/vcardparser/testread2.cpp
index a670392..fb17b87 100644
--- a/kabc/vcardparser/testread2.cpp
+++ b/kabc/vcardparser/testread2.cpp
@@ -43,7 +43,7 @@ int main()
   Addressee::List::iterator itr1;
   Addressee::List::iterator itr2;
   for ( itr1 = l.begin(), itr2 = parsed.begin();
-        itr1 != l.end(); ++itr1, ++itr2 ) {
+        itr1 != l.end() && itr2 != parsed.end(); ++itr1, ++itr2 ) {
     if ( ( *itr1 ).fullEmail() == ( *itr2 ).fullEmail() &&
          ( *itr1 ).organization() == ( *itr2 ).organization() &&
          ( *itr1 ).phoneNumbers() == ( *itr2 ).phoneNumbers()  &&


commit 5cdfbdcb3695e75fe492c2a9b075358049f83038
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Tue Jul 1 16:36:02 2014 +0200

    Make MailClient interceptable
    
    REVIEW: 119432

diff --git a/akonadi/calendar/freebusymanager.cpp b/akonadi/calendar/freebusymanager.cpp
index bf64dab..28359ac 100644
--- a/akonadi/calendar/freebusymanager.cpp
+++ b/akonadi/calendar/freebusymanager.cpp
@@ -913,7 +913,7 @@ void FreeBusyManager::mailFreeBusy(int daysToPublish, QWidget *parentWidget)
     QPointer<PublishDialog> publishdlg = new PublishDialog();
     if (publishdlg->exec() == QDialog::Accepted) {
         // Send the mail
-        MailScheduler *scheduler = new MailScheduler();
+        MailScheduler *scheduler = new MailScheduler(/*factory=*/0, this);
         connect(scheduler, SIGNAL(transactionFinished(Akonadi::Scheduler::Result,QString))
                 , d, SLOT(processMailSchedulerResult(Akonadi::Scheduler::Result,QString)));
         d->mParentWidgetForMailling = parentWidget;
diff --git a/akonadi/calendar/incidencechanger.cpp b/akonadi/calendar/incidencechanger.cpp
index aafa8d5..79d0f49 100644
--- a/akonadi/calendar/incidencechanger.cpp
+++ b/akonadi/calendar/incidencechanger.cpp
@@ -132,10 +132,11 @@ ConflictPreventer* ConflictPreventer::self()
     return &sConflictPreventerPrivate->instance;
 }
 
-IncidenceChanger::Private::Private(bool enableHistory, IncidenceChanger *qq) : q(qq)
+IncidenceChanger::Private::Private(bool enableHistory, ITIPHandlerComponentFactory *factory, IncidenceChanger *qq) : q(qq)
 {
     mLatestChangeId = 0;
     mShowDialogsOnError = true;
+    mFactory = factory ? factory : new ITIPHandlerComponentFactory(this);
     mHistory = enableHistory ? new History(this) : 0;
     mUseHistory = enableHistory;
     mDestinationPolicy = DestinationPolicyDefault;
@@ -423,7 +424,7 @@ bool IncidenceChanger::Private::handleInvitationsBeforeChange(const Change::Ptr
 {
     bool result = true;
     if (mGroupwareCommunication) {
-        ITIPHandlerHelper handler(change->parentWidget);    // TODO make async
+        ITIPHandlerHelper handler(mFactory, change->parentWidget); // TODO make async
 
         if (m_invitationPolicy == InvitationPolicySend) {
             handler.setDefaultAction(ITIPHandlerHelper::ActionSendMessage);
@@ -510,7 +511,7 @@ bool IncidenceChanger::Private::handleInvitationsBeforeChange(const Change::Ptr
 bool IncidenceChanger::Private::handleInvitationsAfterChange(const Change::Ptr &change)
 {
     if (change->useGroupwareCommunication) {
-        ITIPHandlerHelper handler(change->parentWidget);   // TODO make async
+        ITIPHandlerHelper handler(mFactory, change->parentWidget);   // TODO make async
 
         const bool alwaysSend = m_invitationPolicy == InvitationPolicySend;
         const bool neverSend = m_invitationPolicy == InvitationPolicyDontSend;
@@ -571,7 +572,7 @@ bool IncidenceChanger::Private::handleInvitationsAfterChange(const Change::Ptr &
                     }
 
                     if (notifyOrganizer) {
-                        MailScheduler scheduler; // TODO make async
+                        MailScheduler scheduler(mFactory, change->parentWidget); // TODO make async
                         scheduler.performTransaction(incidence, KCalCore::iTIPReply);
                     }
                 }
@@ -633,12 +634,18 @@ bool IncidenceChanger::Private::myAttendeeStatusChanged(const Incidence::Ptr &ne
 }
 
 IncidenceChanger::IncidenceChanger(QObject *parent) : QObject(parent)
-    , d(new Private(/**history=*/true, this))
+    , d(new Private(/**history=*/true, /*factory=*/0, this))
+{
+}
+
+
+IncidenceChanger::IncidenceChanger(ITIPHandlerComponentFactory *factory, QObject *parent) : QObject(parent)
+    , d(new Private(/**history=*/true, factory, this))
 {
 }
 
 IncidenceChanger::IncidenceChanger(bool enableHistory, QObject *parent) : QObject(parent)
-    , d(new Private(enableHistory, this))
+    , d(new Private(enableHistory, /*factory=*/0, this))
 {
 }
 
@@ -1030,7 +1037,7 @@ void IncidenceChanger::setHistoryEnabled(bool enable)
     if (d->mUseHistory != enable) {
         d->mUseHistory = enable;
         if (enable && !d->mHistory)
-            d->mHistory = new History(this);
+            d->mHistory = new History(d);
     }
 }
 
diff --git a/akonadi/calendar/incidencechanger.h b/akonadi/calendar/incidencechanger.h
index 858e487..da1a8e7 100644
--- a/akonadi/calendar/incidencechanger.h
+++ b/akonadi/calendar/incidencechanger.h
@@ -22,6 +22,8 @@
 
 #include "akonadi-calendar_export.h"
 
+#include "itiphandler.h"
+
 #include <akonadi/item.h>
 #include <akonadi/collection.h>
 #include <kcalcore/incidence.h>
@@ -134,11 +136,21 @@ public:
 
     /**
       * Creates a new IncidenceChanger instance.
+      * creates a default ITIPHandlerComponentFactory object.
       * @param parent parent QObject
       */
     explicit IncidenceChanger(QObject *parent = 0);
 
     /**
+     * Creates a new IncidenceChanger instance.
+     * @param factory factory for creating dialogs and the mail transport job. To create a default
+     * factory set factory == 0
+     * @param parent parent QObject
+     * @since 4.15
+     */
+    explicit IncidenceChanger(ITIPHandlerComponentFactory *factory, QObject *parent);
+
+    /**
       * Destroys this IncidenceChanger instance.
       */
     ~IncidenceChanger();
diff --git a/akonadi/calendar/incidencechanger_p.h b/akonadi/calendar/incidencechanger_p.h
index 82bdfa1..eb08eb1 100644
--- a/akonadi/calendar/incidencechanger_p.h
+++ b/akonadi/calendar/incidencechanger_p.h
@@ -250,7 +250,7 @@ class IncidenceChanger::Private : public QObject
 {
     Q_OBJECT
 public:
-    explicit Private(bool enableHistory, IncidenceChanger *mIncidenceChanger);
+    explicit Private(bool enableHistory, ITIPHandlerComponentFactory *factory, IncidenceChanger *mIncidenceChanger);
     ~Private();
 
     void loadCollections();  // async-loading of list of writable collections
@@ -350,6 +350,7 @@ public:
 
     IncidenceChanger::InvitationPolicy m_invitationPolicy;
 
+    ITIPHandlerComponentFactory *mFactory;
 private:
     IncidenceChanger *q;
 };
diff --git a/akonadi/calendar/itiphandler.cpp b/akonadi/calendar/itiphandler.cpp
index 2b72199..a4bc9f1 100644
--- a/akonadi/calendar/itiphandler.cpp
+++ b/akonadi/calendar/itiphandler.cpp
@@ -38,6 +38,7 @@
 #include <kcalutils/stringify.h>
 
 #include <kpimidentities/identitymanager.h>
+#include <mailtransport/messagequeuejob.h>
 #include <mailtransport/transportmanager.h>
 
 #include <KMessageBox>
@@ -59,8 +60,31 @@ GroupwareUiDelegate::~GroupwareUiDelegate()
 {
 }
 
+ITIPHandlerComponentFactory::ITIPHandlerComponentFactory(QObject *parent)
+  : QObject(parent)
+{
+}
+
+ITIPHandlerComponentFactory::~ITIPHandlerComponentFactory()
+{
+}
+
+MailTransport::MessageQueueJob *ITIPHandlerComponentFactory::createMessageQueueJob(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, QObject *parent)
+{
+    Q_UNUSED(incidence);
+    Q_UNUSED(identity);
+    return new MailTransport::MessageQueueJob(parent);
+}
+
 ITIPHandler::ITIPHandler(QObject *parent) : QObject(parent)
-    , d(new Private(this))
+    , d(new Private(/*factory=*/0, this))
+{
+    qRegisterMetaType<Akonadi::ITIPHandler::Result>("Akonadi::ITIPHandler::Result");
+}
+
+
+ITIPHandler::ITIPHandler(ITIPHandlerComponentFactory *factory, QObject *parent) : QObject(parent)
+    , d(new Private(factory, this))
 {
     qRegisterMetaType<Akonadi::ITIPHandler::Result>("Akonadi::ITIPHandler::Result");
 }
@@ -347,7 +371,7 @@ void ITIPHandler::sendAsICalendar(const KCalCore::Incidence::Ptr &originalIncide
         const QString from = Akonadi::CalendarUtils::email();
         const bool bccMe = Akonadi::CalendarSettings::self()->bcc();
         const QString messageText = format.createScheduleMessage(incidence, KCalCore::iTIPRequest);
-        MailClient *mailer = new MailClient();
+        MailClient *mailer = new MailClient(d->m_factory);
         d->m_queuedInvitation.incidence = incidence;
         connect(mailer, SIGNAL(finished(Akonadi::MailClient::Result,QString)),
                 d, SLOT(finishSendAsICalendar(Akonadi::MailScheduler::Result,QString)));
diff --git a/akonadi/calendar/itiphandler.h b/akonadi/calendar/itiphandler.h
index 5c581e7..dcbc6b6 100644
--- a/akonadi/calendar/itiphandler.h
+++ b/akonadi/calendar/itiphandler.h
@@ -35,6 +35,14 @@
 #include <QString>
 #include <QWidget>
 
+namespace MailTransport {
+    class MessageQueueJob;
+}
+
+namespace KPIMIdentities {
+    class Identity;
+}
+
 namespace Akonadi {
 
 /**
@@ -52,6 +60,33 @@ public:
 };
 
 /**
+ * @short Factory to create MailTransport::MessageQueueJob jobs.
+ * @since 4.15
+ */
+class AKONADI_CALENDAR_EXPORT ITIPHandlerComponentFactory : public QObject
+{
+    Q_OBJECT
+public:
+    /*
+     * Created a new ITIPHandlerComponentFactory object.
+     */
+    explicit ITIPHandlerComponentFactory(QObject *parent = 0);
+
+    /*
+     * deletes the object.
+     */
+    virtual ~ITIPHandlerComponentFactory();
+
+    /*
+     * @return A new MailTransport::MessageQueueJob object
+     * @param incidence related to the mail
+     * @param identity that is the mail sender
+     * @param parent of the MailTransport::MessageQueueJob object
+     */
+    virtual MailTransport::MessageQueueJob* createMessageQueueJob(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, QObject *parent = 0);
+};
+
+/**
  * @short Handles sending of iTip messages aswell as processing incoming ones.
  * @since 4.11
  */
@@ -67,10 +102,17 @@ public:
 
     /**
      * Creates a new ITIPHandler instance.
+     * creates a default ITIPHandlerComponentFactory object.
      */
     explicit ITIPHandler(QObject *parent = 0);
 
     /**
+     * Create a new ITIPHandler instance.
+     * @param factory is set to 0 a new factory is created.
+     * @since 4.15
+     */
+    explicit ITIPHandler(ITIPHandlerComponentFactory *factory, QObject *parent);
+    /**
      * Destroys this instance.
      */
     ~ITIPHandler();
diff --git a/akonadi/calendar/itiphandler_p.cpp b/akonadi/calendar/itiphandler_p.cpp
index e62b72b..db1de2f 100644
--- a/akonadi/calendar/itiphandler_p.cpp
+++ b/akonadi/calendar/itiphandler_p.cpp
@@ -25,15 +25,17 @@
 
 using namespace Akonadi;
 
-ITIPHandler::Private::Private(ITIPHandler *qq) : m_calendarLoadError(false)
-    , m_scheduler(new MailScheduler(qq))
+ITIPHandler::Private::Private(ITIPHandlerComponentFactory *factory, ITIPHandler *qq) : m_calendarLoadError(false)
+    , m_factory(factory ? factory : new ITIPHandlerComponentFactory(this))
+    , m_scheduler(new MailScheduler(m_factory, qq))
     , m_method(KCalCore::iTIPNoMethod)
-    , m_helper(new ITIPHandlerHelper())   //TODO parent
+    , m_helper(new ITIPHandlerHelper(m_factory))
     , m_currentOperation(OperationNone)
     , m_uiDelegate(0)
     , m_showDialogsOnError(true)
     , q(qq)
 {
+    m_helper->setParent(this);
     connect(m_scheduler, SIGNAL(transactionFinished(Akonadi::Scheduler::Result,QString)),
             SLOT(onSchedulerFinished(Akonadi::Scheduler::Result,QString)));
 
diff --git a/akonadi/calendar/itiphandler_p.h b/akonadi/calendar/itiphandler_p.h
index 35e895a..63040b2 100644
--- a/akonadi/calendar/itiphandler_p.h
+++ b/akonadi/calendar/itiphandler_p.h
@@ -58,7 +58,7 @@ class ITIPHandler::Private : public QObject
 {
     Q_OBJECT
 public:
-    Private(ITIPHandler *q);
+    Private(ITIPHandlerComponentFactory *factory, ITIPHandler *q);
 
     void finishProcessiTIPMessage(Akonadi::MailScheduler::Result, const QString &errorMessage);
     void finishSendiTIPMessage(Akonadi::MailScheduler::Result, const QString &errorMessage);
@@ -74,6 +74,7 @@ public:
     Invitation m_queuedInvitation;
     bool m_calendarLoadError;
     CalendarBase::Ptr m_calendar;
+    ITIPHandlerComponentFactory *m_factory;
     MailScheduler *m_scheduler;
     KCalCore::Incidence::Ptr m_incidence;
     KCalCore::iTIPMethod m_method; // METHOD field of ical rfc of incoming invitation
diff --git a/akonadi/calendar/itiphandlerhelper_p.cpp b/akonadi/calendar/itiphandlerhelper_p.cpp
index ee3b68a..ba7e2c2 100644
--- a/akonadi/calendar/itiphandlerhelper_p.cpp
+++ b/akonadi/calendar/itiphandlerhelper_p.cpp
@@ -148,10 +148,10 @@ bool ITIPHandlerHelper::weNeedToSendMailFor(const KCalCore::Incidence::Ptr &inci
         incidence->attendees().first()->email() != incidence->organizer()->email();
 }
 
-ITIPHandlerHelper::ITIPHandlerHelper(QWidget *parent)
+ITIPHandlerHelper::ITIPHandlerHelper(ITIPHandlerComponentFactory *factory, QWidget *parent)
     : mDefaultAction(ITIPHandlerHelper::ActionAsk)
     , mParent(parent)
-    , m_scheduler(new MailScheduler(parent))
+    , m_scheduler(new MailScheduler(factory, parent))
     , m_status(StatusNone)
 {
     connect(m_scheduler, SIGNAL(transactionFinished(Akonadi::Scheduler::Result,QString)),
diff --git a/akonadi/calendar/itiphandlerhelper_p.h b/akonadi/calendar/itiphandlerhelper_p.h
index 11bc6de..6b8ee6d 100644
--- a/akonadi/calendar/itiphandlerhelper_p.h
+++ b/akonadi/calendar/itiphandlerhelper_p.h
@@ -67,7 +67,7 @@ class ITIPHandlerHelper : public QObject
 {
     Q_OBJECT
 public:
-    explicit ITIPHandlerHelper(QWidget *parent = 0);   // TODO
+    explicit ITIPHandlerHelper(ITIPHandlerComponentFactory *factory, QWidget *parent = 0);
     ~ITIPHandlerHelper();
 
     enum SendResult {
diff --git a/akonadi/calendar/mailclient_p.cpp b/akonadi/calendar/mailclient_p.cpp
index c08e75e..0d71b78 100644
--- a/akonadi/calendar/mailclient_p.cpp
+++ b/akonadi/calendar/mailclient_p.cpp
@@ -45,10 +45,9 @@
 
 using namespace Akonadi;
 
-bool Akonadi::MailClient::sRunningUnitTests = false;
-UnitTestResult::List MailClient::sUnitTestResults;
 
-MailClient::MailClient(QObject *parent) : QObject(parent)
+MailClient::MailClient(ITIPHandlerComponentFactory *factory, QObject *parent) : QObject(parent)
+    , mFactory(factory ? factory : new ITIPHandlerComponentFactory(this))
 {
 }
 
@@ -124,7 +123,7 @@ void MailClient::mailAttendees(const KCalCore::IncidenceBase::Ptr &incidence,
     const QString body = KCalUtils::IncidenceFormatter::mailBodyStr(incidence,
                          KSystemTimeZones::local());
 
-    send(identity, from, to, cc, subject, body, false, bccMe, attachment, mailTransport);
+    send(incidence, identity, from, to, cc, subject, body, false, bccMe, attachment, mailTransport);
 }
 
 void MailClient::mailOrganizer(const KCalCore::IncidenceBase::Ptr &incidence,
@@ -148,7 +147,7 @@ void MailClient::mailOrganizer(const KCalCore::IncidenceBase::Ptr &incidence,
     const QString body = KCalUtils::IncidenceFormatter::mailBodyStr(incidence,
                          KSystemTimeZones::local());
 
-    send(identity, from, to, QString(), subject, body, false, bccMe, attachment, mailTransport);
+    send(incidence, identity, from, to, QString(), subject, body, false, bccMe, attachment, mailTransport);
 }
 
 void MailClient::mailTo(const KCalCore::IncidenceBase::Ptr &incidence,
@@ -169,7 +168,7 @@ void MailClient::mailTo(const KCalCore::IncidenceBase::Ptr &incidence,
     const QString body = KCalUtils::IncidenceFormatter::mailBodyStr(incidence,
                          KSystemTimeZones::local());
 
-    send(identity, from, recipients, QString(), subject, body, false,
+    send(incidence, identity, from, recipients, QString(), subject, body, false,
          bccMe, attachment, mailTransport);
 }
 
@@ -184,13 +183,13 @@ static QStringList extractEmailAndNormalize(const QString &email)
     return normalizedEmail;
 }
 
-void MailClient::send(const KPIMIdentities::Identity &identity,
+void MailClient::send(const KCalCore::IncidenceBase::Ptr &incidence,
+                      const KPIMIdentities::Identity &identity,
                       const QString &from, const QString &_to,
                       const QString &cc, const QString &subject,
                       const QString &body, bool hidden, bool bccMe,
                       const QString &attachment, const QString &mailTransport)
 {
-    Q_UNUSED(identity);
     Q_UNUSED(hidden);
 
     UnitTestResult unitTestResult;
@@ -215,9 +214,6 @@ void MailClient::send(const KPIMIdentities::Identity &identity,
              << "\nAttachment:\n" << attachment
              << "\nmailTransport: " << mailTransport;
 
-    QTime timer;
-    timer.start();
-
     MailTransport::Transport *transport =
         MailTransport::TransportManager::self()->transportByName(mailTransport);
 
@@ -327,7 +323,7 @@ void MailClient::send(const KPIMIdentities::Identity &identity,
     message->assemble();
 
     // Put the newly created item in the MessageQueueJob.
-    MailTransport::MessageQueueJob *qjob = new MailTransport::MessageQueueJob(this);
+    MailTransport::MessageQueueJob *qjob = mFactory->createMessageQueueJob(incidence, identity, this);
     qjob->transportAttribute().setTransportId(transportId);
     qjob->sentBehaviourAttribute().setSentBehaviour(
         MailTransport::SentBehaviourAttribute::MoveToDefaultSentCollection);
@@ -359,25 +355,9 @@ void MailClient::send(const KPIMIdentities::Identity &identity,
         qjob->addressAttribute().setBcc(bccStringList);
     }
 
-    if (sRunningUnitTests) {
-        unitTestResult.message     = message;
-        unitTestResult.from        = finalFrom;
-        unitTestResult.to          = toStringList;
-        unitTestResult.cc          = ccStringList;
-        unitTestResult.bcc         = bccStringList;
-        unitTestResult.transportId = transportId;
-        sUnitTestResults << unitTestResult;
-        qjob->deleteLater();
-
-        QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection,
-                                  Q_ARG(Akonadi::MailClient::Result, ResultSuccess),
-                                  Q_ARG(QString, QString()));
-
-    } else {
-        qjob->setMessage(message);
-        connect(qjob, SIGNAL(finished(KJob*)), SLOT(handleQueueJobFinished(KJob*)));
-        qjob->start();
-    }
+    qjob->setMessage(message);
+    connect(qjob, SIGNAL(finished(KJob*)), SLOT(handleQueueJobFinished(KJob*)));
+    qjob->start();
 }
 
 void MailClient::handleQueueJobFinished(KJob *job)
@@ -387,7 +367,6 @@ void MailClient::handleQueueJobFinished(KJob *job)
         emit finished(ResultQueueJobError, i18n("Error queuing message in outbox: %1",
                                                 job->errorText()));
     } else {
-        kDebug() << "Mail queued";
         emit finished(ResultSuccess, QString());
     }
 }
diff --git a/akonadi/calendar/mailclient_p.h b/akonadi/calendar/mailclient_p.h
index c284806..702a0e0 100644
--- a/akonadi/calendar/mailclient_p.h
+++ b/akonadi/calendar/mailclient_p.h
@@ -23,6 +23,7 @@
 #define AKONADI_MAILCLIENT_P_H
 
 #include "akonadi-calendar_export.h"
+#include "itiphandler.h"
 #include <kcalcore/incidencebase.h>
 #include <kmime/kmime_message.h>
 #include <QObject>
@@ -45,19 +46,19 @@ class Identity;
 class KJob;
 
 namespace Akonadi {
-
 #ifdef PLEASE_TEST_INVITATIONS
 #define EXPORT_MAILCLIENT AKONADI_CALENDAR_EXPORT
 #else
 #define EXPORT_MAILCLIENT
 #endif
 
+class ITIPHandlerComponentFactory;
+
 class EXPORT_MAILCLIENT MailClient : public QObject
 
 {
     Q_OBJECT
 public:
-
     enum Result {
         ResultSuccess,
         ResultNoAttendees,
@@ -67,29 +68,30 @@ public:
         ResultQueueJobError
     };
 
-    explicit MailClient(QObject *parent = 0);
+    explicit MailClient(ITIPHandlerComponentFactory *factory, QObject *parent = 0);
     ~MailClient();
 
-    void mailAttendees(const KCalCore::IncidenceBase::Ptr &,
+    void mailAttendees(const KCalCore::IncidenceBase::Ptr &incidence,
                        const KPIMIdentities::Identity &identity,
                        bool bccMe, const QString &attachment=QString(),
                        const QString &mailTransport = QString());
 
-    void mailOrganizer(const KCalCore::IncidenceBase::Ptr &,
+    void mailOrganizer(const KCalCore::IncidenceBase::Ptr &incidence,
                        const KPIMIdentities::Identity &identity,
                        const QString &from, bool bccMe,
                        const QString &attachment=QString(),
                        const QString &sub=QString(),
                        const QString &mailTransport = QString());
 
-    void mailTo(const KCalCore::IncidenceBase::Ptr &, const KPIMIdentities::Identity &identity,
+    void mailTo(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity,
                 const QString &from, bool bccMe, const QString &recipients,
-                const QString &attachment=QString(), const QString &mailTransport = QString());
+                const QString &attachment = QString(), const QString &mailTransport = QString());
 
     /**
       Sends mail with specified from, to and subject field and body as text.
       If bcc is set, send a blind carbon copy to the sender
 
+      @param incidence is the incidence, that is sended
       @param identity is the Identity of the sender
       @param from is the address of the sender of the message
       @param to a list of addresses to receive the message
@@ -103,7 +105,7 @@ public:
       @param mailTransport defines the mail transport method. See here the
       kdepimlibs/mailtransport library.
     */
-    void send(const KPIMIdentities::Identity &identity, const QString &from, const QString &to,
+    void send(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, const QString &from, const QString &to,
               const QString &cc, const QString &subject, const QString &body,
               bool hidden=false, bool bccMe=false, const QString &attachment=QString(),
               const QString &mailTransport = QString());
@@ -116,12 +118,11 @@ Q_SIGNALS:
 
 public:
     // For unit-test usage, since we can't depend on kdepim-runtime on jenkins
-    static UnitTestResult::List sUnitTestResults;
-    static bool sRunningUnitTests;
+    ITIPHandlerComponentFactory *mFactory;
 };
 
 }
 
 Q_DECLARE_METATYPE(Akonadi::MailClient::Result)
 
-#endif
+#endif
\ No newline at end of file
diff --git a/akonadi/calendar/mailscheduler_p.cpp b/akonadi/calendar/mailscheduler_p.cpp
index cfeebd0..907a11a 100644
--- a/akonadi/calendar/mailscheduler_p.cpp
+++ b/akonadi/calendar/mailscheduler_p.cpp
@@ -44,12 +44,12 @@ public:
     MailClient *m_mailer;
 };
 
-MailScheduler::MailScheduler(QObject *parent) : Scheduler(parent)
+MailScheduler::MailScheduler(ITIPHandlerComponentFactory *factory, QObject *parent) : Scheduler(parent)
     , d(new Private())
-
 {
     d->m_identityManager = new IdentityManager(/*ro=*/true, this);
-    d->m_mailer = new MailClient();
+    d->m_mailer = new MailClient(factory, parent);
+
     connect(d->m_mailer, SIGNAL(finished(Akonadi::MailClient::Result,QString)),
             SLOT(onMailerFinished(Akonadi::MailClient::Result,QString)));
 }
diff --git a/akonadi/calendar/mailscheduler_p.h b/akonadi/calendar/mailscheduler_p.h
index cdbdd87..58c8c4f 100644
--- a/akonadi/calendar/mailscheduler_p.h
+++ b/akonadi/calendar/mailscheduler_p.h
@@ -47,7 +47,7 @@ public:
     /**
      * @param calendar Must be a valid and loaded calendar.
      */
-    explicit MailScheduler(QObject *parent = 0);
+    explicit MailScheduler(ITIPHandlerComponentFactory *factory, QObject *parent = 0);
     ~MailScheduler();
 
     /** reimp */
@@ -63,6 +63,7 @@ public:
                             KCalCore::iTIPMethod method,
                             const QString &recipients);
 
+
     /** Returns the directory where the free-busy information is stored */
     /** reimp*/ QString freeBusyDir() const;
 
diff --git a/akonadi/calendar/tests/itiphandlertest.cpp b/akonadi/calendar/tests/itiphandlertest.cpp
index f1167e1..92c9e37 100644
--- a/akonadi/calendar/tests/itiphandlertest.cpp
+++ b/akonadi/calendar/tests/itiphandlertest.cpp
@@ -30,6 +30,7 @@
 #include <akonadi/collectionfetchscope.h>
 #include <akonadi/itemfetchscope.h>
 #include <akonadi/qtest_akonadi.h>
+#include <mailtransport/messagequeuejob.h>
 
 #include <kcalcore/event.h>
 
@@ -47,15 +48,61 @@ Q_DECLARE_METATYPE(QList<int>)
 static const char *s_ourEmail = "unittests at dev.nul"; // change also in kdepimlibs/akonadi/calendar/tests/unittestenv/kdehome/share/config
 static const char *s_outEmail2 = "identity2 at kde.org";
 
+class FakeMessageQueueJob : public MailTransport::MessageQueueJob
+{
+public:
+    explicit FakeMessageQueueJob(QObject *parent = 0) : MailTransport::MessageQueueJob(parent)
+    {
+    }
+
+    virtual void start()
+    {
+        UnitTestResult unitTestResult;
+        unitTestResult.message     = message();
+        unitTestResult.from        = addressAttribute().from();
+        unitTestResult.to          = addressAttribute().to();
+        unitTestResult.cc          = addressAttribute().cc();
+        unitTestResult.bcc         = addressAttribute().bcc();
+        unitTestResult.transportId = transportAttribute().transportId();
+        FakeMessageQueueJob::sUnitTestResults << unitTestResult;
+
+        setError(Akonadi::MailClient::ResultSuccess);
+        setErrorText(QString());
+
+        emitResult();
+    }
+
+    static UnitTestResult::List sUnitTestResults;
+};
+
+
+UnitTestResult::List FakeMessageQueueJob::sUnitTestResults;
+
+class FakeITIPHandlerComponentFactory : public ITIPHandlerComponentFactory
+{
+public:
+    FakeITIPHandlerComponentFactory(QObject *parent = 0) : ITIPHandlerComponentFactory(parent)
+    {
+    }
+
+    virtual MailTransport::MessageQueueJob *createMessageQueueJob(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, QObject *parent = 0)
+    {
+        Q_UNUSED(incidence);
+        Q_UNUSED(identity);
+        return new FakeMessageQueueJob(parent);
+    }
+};
+
+
+
 void ITIPHandlerTest::initTestCase()
 {
     AkonadiTest::checkTestIsIsolated();
     m_pendingItipMessageSignal = 0;
     m_pendingIncidenceChangerSignal = 0;
-    MailClient::sRunningUnitTests = true;
     m_itipHandler = 0;
     m_cancelExpected = false;
-    m_changer = new IncidenceChanger(this);
+    m_changer = new IncidenceChanger(new FakeITIPHandlerComponentFactory(this), this);
     m_changer->setHistoryEnabled(false);
     m_changer->setGroupwareCommunication(true);
     m_changer->setInvitationPolicy(IncidenceChanger::InvitationPolicySend); // don't show dialogs
@@ -190,7 +237,7 @@ void ITIPHandlerTest::testProcessITIPMessage()
     QFETCH(int, expectedNumIncidences);
     QFETCH(KCalCore::Attendee::PartStat, expectedPartStat);
 
-    MailClient::sUnitTestResults.clear();
+    FakeMessageQueueJob::sUnitTestResults.clear();
     createITIPHandler();
 
     m_expectedResult = expectedResult;
@@ -262,7 +309,7 @@ void ITIPHandlerTest::testProcessITIPMessages()
 
     const QString receiver = QLatin1String(s_ourEmail);
 
-    MailClient::sUnitTestResults.clear();
+    FakeMessageQueueJob::sUnitTestResults.clear();
     createITIPHandler();
 
     m_expectedResult = Akonadi::ITIPHandler::ResultSuccess;
@@ -319,7 +366,7 @@ void ITIPHandlerTest::testProcessITIPMessageCancel()
     QFETCH(QString, incidenceUid);
 
     const QString receiver = QLatin1String(s_ourEmail);
-    MailClient::sUnitTestResults.clear();
+    FakeMessageQueueJob::sUnitTestResults.clear();
     createITIPHandler();
 
     m_expectedResult = Akonadi::ITIPHandler::ResultSuccess;
@@ -476,7 +523,7 @@ void ITIPHandlerTest::testOutgoingInvitations()
     KCalCore::Incidence::Ptr incidence = item.payload<KCalCore::Incidence::Ptr>();
 
     m_pendingIncidenceChangerSignal = 1;
-    MailClient::sUnitTestResults.clear();
+    FakeMessageQueueJob::sUnitTestResults.clear();
     m_changer->setInvitationPolicy(invitationPolicy);
 
     m_cancelExpected = userCancels;
@@ -485,7 +532,7 @@ void ITIPHandlerTest::testOutgoingInvitations()
     case IncidenceChanger::ChangeTypeCreate:
         m_changer->createIncidence(incidence, mCollection);
         waitForIt();
-        QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
+        QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), expectedEmailCount);
         break;
     case IncidenceChanger::ChangeTypeModify: {
         // Create if first, so we have something to modify
@@ -493,7 +540,7 @@ void ITIPHandlerTest::testOutgoingInvitations()
         m_changer->createIncidence(incidence, mCollection);
         waitForIt();
         m_changer->setGroupwareCommunication(true);
-        QCOMPARE(MailClient::sUnitTestResults.count(), 0);
+        QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), 0);
         QVERIFY(mLastInsertedItem.isValid());
 
         m_pendingIncidenceChangerSignal = 1;
@@ -502,7 +549,7 @@ void ITIPHandlerTest::testOutgoingInvitations()
         int changeId = m_changer->modifyIncidence(mLastInsertedItem, oldIncidence);
         QVERIFY(changeId != 1);
         waitForIt();
-        QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
+        QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), expectedEmailCount);
     }
     break;
     case IncidenceChanger::ChangeTypeDelete:
@@ -511,13 +558,13 @@ void ITIPHandlerTest::testOutgoingInvitations()
         m_changer->createIncidence(incidence, mCollection);
         waitForIt();
         m_changer->setGroupwareCommunication(true);
-        QCOMPARE(MailClient::sUnitTestResults.count(), 0);
+        QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), 0);
 
         QVERIFY(mLastInsertedItem.isValid());
         m_pendingIncidenceChangerSignal = 1;
         m_changer->deleteIncidence(mLastInsertedItem);
         waitForIt();
-        QCOMPARE(MailClient::sUnitTestResults.count(), expectedEmailCount);
+        QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), expectedEmailCount);
         break;
     default:
         Q_ASSERT(false);
@@ -571,7 +618,7 @@ void ITIPHandlerTest::cleanup()
 
 void ITIPHandlerTest::createITIPHandler()
 {
-    m_itipHandler = new Akonadi::ITIPHandler();
+    m_itipHandler = new Akonadi::ITIPHandler(new FakeITIPHandlerComponentFactory(this), this);
     m_itipHandler->setShowDialogsOnError(false);
     connect(m_itipHandler, SIGNAL(iTipMessageProcessed(Akonadi::ITIPHandler::Result,QString)),
             SLOT(oniTipMessageProcessed(Akonadi::ITIPHandler::Result,QString)));
@@ -594,7 +641,7 @@ void ITIPHandlerTest::processItip(const QString &icaldata, const QString &receiv
 
     // 0 e-mails are sent because the status update e-mail is sent by
     // kmail's text_calendar.cpp.
-    QCOMPARE(MailClient::sUnitTestResults.count(), 0);
+    QCOMPARE(FakeMessageQueueJob::sUnitTestResults.count(), 0);
 
     items = calendarItems();
 
@@ -676,7 +723,6 @@ void ITIPHandlerTest::onModifyFinished(int changeId, const Item &item,
     if (m_pendingIncidenceChangerSignal == 0) {
         stopWaiting();
     }
-    kDebug() << "Got result " << resultCode << m_cancelExpected;
     QCOMPARE(resultCode, m_cancelExpected ? IncidenceChanger::ResultCodeUserCanceled
              : IncidenceChanger::ResultCodeSuccess);
 }
diff --git a/akonadi/calendar/tests/mailclienttest.cpp b/akonadi/calendar/tests/mailclienttest.cpp
index 8235b31..4417bfa 100644
--- a/akonadi/calendar/tests/mailclienttest.cpp
+++ b/akonadi/calendar/tests/mailclienttest.cpp
@@ -38,6 +38,50 @@ using namespace Akonadi;
 Q_DECLARE_METATYPE(KPIMIdentities::Identity)
 Q_DECLARE_METATYPE(KCalCore::Incidence::Ptr)
 
+class FakeMessageQueueJob : public MailTransport::MessageQueueJob
+{
+public:
+    explicit FakeMessageQueueJob(QObject *parent = 0) : MailTransport::MessageQueueJob(parent)
+    {
+    }
+
+    virtual void start()
+    {
+        UnitTestResult unitTestResult;
+        unitTestResult.message     = message();
+        unitTestResult.from        = addressAttribute().from();
+        unitTestResult.to          = addressAttribute().to();
+        unitTestResult.cc          = addressAttribute().cc();
+        unitTestResult.bcc         = addressAttribute().bcc();
+        unitTestResult.transportId = transportAttribute().transportId();
+        FakeMessageQueueJob::sUnitTestResults << unitTestResult;
+
+        setError(Akonadi::MailClient::ResultSuccess);
+        setErrorText(QString());
+
+        emitResult();
+    }
+
+    static UnitTestResult::List sUnitTestResults;
+};
+
+UnitTestResult::List FakeMessageQueueJob::sUnitTestResults;
+
+class FakeITIPHandlerComponentFactory : public ITIPHandlerComponentFactory
+{
+public:
+    explicit FakeITIPHandlerComponentFactory(QObject *parent = 0) : ITIPHandlerComponentFactory(parent)
+    {
+    }
+
+    virtual MailTransport::MessageQueueJob *createMessageQueueJob(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, QObject *parent = 0)
+    {
+        Q_UNUSED(incidence);
+        Q_UNUSED(identity);
+        return new FakeMessageQueueJob(parent);
+    }
+};
+
 class MailClientTest : public QObject
 {
     Q_OBJECT
@@ -55,8 +99,7 @@ private Q_SLOTS:
         AkonadiTest::checkTestIsIsolated();
 
         mPendingSignals = 0;
-        mMailClient = new MailClient(this);
-        mMailClient->sRunningUnitTests = true;
+        mMailClient = new MailClient(new FakeITIPHandlerComponentFactory(this), this);
         mLastResult = MailClient::ResultSuccess;
         connect(mMailClient, SIGNAL(finished(Akonadi::MailClient::Result,QString)),
                 SLOT(handleFinished(Akonadi::MailClient::Result,QString)));
@@ -193,7 +236,8 @@ private Q_SLOTS:
         QFETCH(QStringList, expectedToList);
         QFETCH(QStringList, expectedCcList);
         QFETCH(QStringList, expectedBccList);
-        mMailClient->sUnitTestResults.clear();
+
+        FakeMessageQueueJob::sUnitTestResults.clear();
 
         mPendingSignals = 1;
         mMailClient->mailAttendees(incidence, identity, bccMe, attachment, transport);
@@ -206,10 +250,10 @@ private Q_SLOTS:
         }
 
         UnitTestResult unitTestResult;
-        if (mMailClient->sUnitTestResults.isEmpty()) {
+        if (FakeMessageQueueJob::sUnitTestResults.isEmpty()) {
             qDebug() << "mail results are empty";
         } else {
-            unitTestResult = mMailClient->sUnitTestResults.first();
+            unitTestResult = FakeMessageQueueJob::sUnitTestResults.first();
         }
 
         if (expectedTransportId != -1 && unitTestResult.transportId != expectedTransportId) {
@@ -287,14 +331,14 @@ private Q_SLOTS:
         QFETCH(QStringList, expectedToList);
         QFETCH(QStringList, expectedBccList);
         QFETCH(QString, expectedSubject);
-        mMailClient->sUnitTestResults.clear();
+        FakeMessageQueueJob::sUnitTestResults.clear();
 
         mPendingSignals = 1;
         mMailClient->mailOrganizer(incidence, identity, from, bccMe, attachment, subject, transport);
         waitForSignals();
         QCOMPARE(mLastResult, expectedResult);
 
-        UnitTestResult unitTestResult = mMailClient->sUnitTestResults.first();
+        UnitTestResult unitTestResult = FakeMessageQueueJob::sUnitTestResults.first();
         if (expectedTransportId != -1)
             QCOMPARE(unitTestResult.transportId, expectedTransportId);
 
@@ -354,13 +398,13 @@ private Q_SLOTS:
         QFETCH(QString, expectedFrom);
         QFETCH(QStringList, expectedToList);
         QFETCH(QStringList, expectedBccList);
-        mMailClient->sUnitTestResults.clear();
+        FakeMessageQueueJob::sUnitTestResults.clear();
 
         mPendingSignals = 1;
         mMailClient->mailTo(incidence, identity, from, bccMe, recipients, attachment, transport);
         waitForSignals();
         QCOMPARE(mLastResult, expectedResult);
-        UnitTestResult unitTestResult = mMailClient->sUnitTestResults.first();
+        UnitTestResult unitTestResult = FakeMessageQueueJob::sUnitTestResults.first();
         if (expectedTransportId != -1)
             QCOMPARE(unitTestResult.transportId, expectedTransportId);
 


commit eccf06218235cebdafb53cd74ec97c98471f96f8
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Tue Jul 29 11:26:15 2014 +0200

    CollectionSync: split transaction into multiple smaller transactions
    
    The transaction actually starts a database transaction on Akonadi side and
    it turns out that DB backends don't handle transactions with thousands of
    INSERT statements very well (we noticed a big performance drop when executing
    the queries).
    
    This patch splits the one big transaction into smaller transactions of 100
    operations (CollectionCreateJob). As result, creating 100,000 collections
    takes much less time.
    
    REVIEW: 119491

diff --git a/akonadi/collectionsync.cpp b/akonadi/collectionsync.cpp
index 1a9f760..c9afbfb 100644
--- a/akonadi/collectionsync.cpp
+++ b/akonadi/collectionsync.cpp
@@ -503,6 +503,13 @@ public:
             create->setProperty(LOCAL_NODE, QVariant::fromValue(localParent));
             create->setProperty(REMOTE_NODE, QVariant::fromValue(remoteNode));
             connect(create, SIGNAL(result(KJob*)), q, SLOT(createLocalCollectionResult(KJob*)));
+
+            // Commit transaction after every 100 collections are created,
+            // otherwise it overlads database journal and things get veeery slow
+            if (pendingJobs % 100 == 0) {
+                currentTransaction->commit();
+                createTransaction();
+            }
         }
     }
 
@@ -618,6 +625,14 @@ public:
         checkDone();
     }
 
+    void createTransaction()
+    {
+        currentTransaction = new TransactionSequence(q);
+        currentTransaction->setAutomaticCommittingEnabled(false);
+        q->connect(currentTransaction, SIGNAL(finished(KJob*)),
+                   q, SLOT(transactionSequenceResult(KJob*)));
+    }
+
     /**
       Check update necessity.
     */
@@ -632,9 +647,7 @@ public:
 
         // Since there are differences with the remote collections we need to sync. Start a transaction here.
         Q_ASSERT(!currentTransaction);
-        currentTransaction = new TransactionSequence(q);
-        currentTransaction->setAutomaticCommittingEnabled(false);
-        q->connect(currentTransaction, SIGNAL(result(KJob*)), SLOT(transactionSequenceResult(KJob*)));
+        createTransaction();
 
         // Now that a transaction is started we need to fetch local collections again and do the update
         q->doStart();
@@ -647,7 +660,11 @@ public:
             return; // handled by the base class
         }
 
-        q->emitResult();
+        // If this was the last transaction, then finish, otherwise there's
+        // a new transaction in the queue already
+        if (job == currentTransaction) {
+            q->emitResult();
+        }
     }
 
     /**
@@ -814,6 +831,7 @@ void CollectionSync::setRemoteCollections(const Collection::List &changedCollect
 void CollectionSync::doStart()
 {
     d->resetNodeTree();
+    d->knownLocalCollections = 0;
     Job *parent = (d->currentTransaction ? static_cast<Job *>(d->currentTransaction) : static_cast<Job *>(this));
     CollectionFetchJob *job = new CollectionFetchJob(Collection::root(), CollectionFetchJob::Recursive, parent);
     job->fetchScope().setResource(d->resourceId);


commit 3380e815ee9a326f07bf18df42ea47e90657ced9
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Fri Jul 25 12:11:25 2014 +0200

    TagTest: add test to test RID isolation
    
    This case tests whether tags are correctly merged when created from
    two different resources with different RIDs, and whether the RID is
    only exposed to resource that owns it.

diff --git a/akonadi/tests/tagtest.cpp b/akonadi/tests/tagtest.cpp
index f3e2c96..40fe12b 100644
--- a/akonadi/tests/tagtest.cpp
+++ b/akonadi/tests/tagtest.cpp
@@ -54,6 +54,7 @@ private Q_SLOTS:
     void testCreateMerge();
     void testAttributes();
     void testTagItem();
+    void testRIDIsolation();
     void testModifyItemWithTagByGID();
     void testModifyItemWithTagByRID();
     void testMonitor();
@@ -135,6 +136,65 @@ void TagTest::testRID()
     }
 }
 
+void TagTest::testRIDIsolation()
+{
+    {
+        ResourceSelectJob *select = new ResourceSelectJob("akonadi_knut_resource_0");
+        AKVERIFYEXEC(select);
+    }
+
+    Tag tag;
+    tag.setGid("gid");
+    tag.setType("mytype");
+    tag.setRemoteId("rid_0");
+
+    TagCreateJob *createJob = new TagCreateJob(tag, this);
+    AKVERIFYEXEC(createJob);
+    QVERIFY(createJob->tag().isValid());
+
+    qint64 tagId;
+    {
+        TagFetchJob *fetchJob = new TagFetchJob(this);
+        AKVERIFYEXEC(fetchJob);
+        QCOMPARE(fetchJob->tags().count(), 1);
+        QCOMPARE(fetchJob->tags().first().gid(), QByteArray("gid"));
+        QCOMPARE(fetchJob->tags().first().type(), QByteArray("mytype"));
+        QCOMPARE(fetchJob->tags().first().remoteId(), QByteArray("rid_0"));
+        tagId = fetchJob->tags().first().id();
+    }
+
+    {
+        ResourceSelectJob *select = new ResourceSelectJob("akonadi_knut_resource_1");
+        AKVERIFYEXEC(select);
+    }
+
+    tag.setRemoteId("rid_1");
+    createJob = new TagCreateJob(tag, this);
+    createJob->setMergeIfExisting(true);
+    AKVERIFYEXEC(createJob);
+    QVERIFY(createJob->tag().isValid());
+
+    {
+        TagFetchJob *fetchJob = new TagFetchJob(this);
+        AKVERIFYEXEC(fetchJob);
+        QCOMPARE(fetchJob->tags().count(), 1);
+        QCOMPARE(fetchJob->tags().first().gid(), QByteArray("gid"));
+        QCOMPARE(fetchJob->tags().first().type(), QByteArray("mytype"));
+        QCOMPARE(fetchJob->tags().first().remoteId(), QByteArray("rid_1"));
+
+        QCOMPARE(fetchJob->tags().first().id(), tagId);
+
+    }
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(Tag(tagId), this);
+    AKVERIFYEXEC(deleteJob);
+
+    {
+        ResourceSelectJob *select = new ResourceSelectJob("");
+        AKVERIFYEXEC(select);
+    }
+}
+
 void TagTest::testDelete()
 {
     Tag tag1;
@@ -344,6 +404,9 @@ void TagTest::testTagItem()
     fetchJob->fetchScope().setFetchTags(true);
     AKVERIFYEXEC(fetchJob);
     QCOMPARE(fetchJob->items().first().tags().size(), 1);
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(tag, this);
+    AKVERIFYEXEC(deleteJob);
 }
 
 void TagTest::testModifyItemWithTagByGID()
@@ -375,6 +438,10 @@ void TagTest::testModifyItemWithTagByGID()
     fetchJob->fetchScope().setFetchTags(true);
     AKVERIFYEXEC(fetchJob);
     QCOMPARE(fetchJob->items().first().tags().size(), 1);
+
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(fetchJob->items().first().tags().first(), this);
+    AKVERIFYEXEC(deleteJob);
 }
 
 void TagTest::testModifyItemWithTagByRID()
@@ -411,6 +478,10 @@ void TagTest::testModifyItemWithTagByRID()
     fetchJob->fetchScope().setFetchTags(true);
     AKVERIFYEXEC(fetchJob);
     QCOMPARE(fetchJob->items().first().tags().size(), 1);
+
+    TagDeleteJob *deleteJob = new TagDeleteJob(fetchJob->items().first().tags().first(), this);
+    AKVERIFYEXEC(deleteJob);
+
     {
         ResourceSelectJob *select = new ResourceSelectJob("");
         AKVERIFYEXEC(select);


commit 9196e1fcde6d2fe0af7e3ea04f30b41d058f5a44
Author: Montel Laurent <montel at kde.org>
Date:   Fri Jul 25 13:40:23 2014 +0200

    Fix Bug 337625 - Cannot add email address to a contact without an email adress.
    
    FIXED-IN: 4.14
    BUG: 337625
    
    Conflicts:
    	CMakeLists.txt

diff --git a/akonadi/contact/emailaddressselectionwidget.cpp b/akonadi/contact/emailaddressselectionwidget.cpp
index aa8bd39..a58d9ad 100644
--- a/akonadi/contact/emailaddressselectionwidget.cpp
+++ b/akonadi/contact/emailaddressselectionwidget.cpp
@@ -81,8 +81,8 @@ class SearchLineEdit : public KLineEdit
 class EmailAddressSelectionWidget::Private
 {
   public:
-    Private( EmailAddressSelectionWidget *qq, QAbstractItemModel *model )
-      : q( qq ), mModel( model )
+    Private( bool showOnlyContactWithEmail, EmailAddressSelectionWidget *qq, QAbstractItemModel *model )
+      : q( qq ), mModel( model ), mShowOnlyContactWithEmail(showOnlyContactWithEmail)
     {
       init();
     }
@@ -95,6 +95,7 @@ class EmailAddressSelectionWidget::Private
     SearchLineEdit *mSearchLine;
     Akonadi::EntityTreeView *mView;
     EmailAddressSelectionProxyModel *mSelectionModel;
+    bool mShowOnlyContactWithEmail;
 };
 
 void EmailAddressSelectionWidget::Private::init()
@@ -146,7 +147,8 @@ void EmailAddressSelectionWidget::Private::init()
   layout->addWidget( mView );
 
   Akonadi::ContactsFilterProxyModel *filter = new Akonadi::ContactsFilterProxyModel( q );
-  filter->setFilterFlags( ContactsFilterProxyModel::HasEmail );
+  if (mShowOnlyContactWithEmail)
+      filter->setFilterFlags( ContactsFilterProxyModel::HasEmail );
   filter->setExcludeVirtualCollections( true );
   filter->setSourceModel( mModel );
 
@@ -170,13 +172,19 @@ void EmailAddressSelectionWidget::Private::init()
 
 EmailAddressSelectionWidget::EmailAddressSelectionWidget( QWidget * parent )
   : QWidget( parent ),
-    d( new Private( this, 0 ) )
+    d( new Private( true, this, 0 ) )
 {
 }
 
 EmailAddressSelectionWidget::EmailAddressSelectionWidget( QAbstractItemModel *model, QWidget * parent )
   : QWidget( parent ),
-    d( new Private( this, model ) )
+    d( new Private( true, this, model ) )
+{
+}
+
+EmailAddressSelectionWidget::EmailAddressSelectionWidget( bool showOnlyContactWithEmail, QAbstractItemModel *model, QWidget * parent )
+  : QWidget( parent ),
+    d( new Private( showOnlyContactWithEmail ,this, model ) )
 {
 }
 
@@ -200,8 +208,12 @@ EmailAddressSelection::List EmailAddressSelectionWidget::selectedAddresses() con
     selection.d->mEmailAddress = index.data( EmailAddressSelectionProxyModel::EmailAddressRole ).toString();
     selection.d->mItem = index.data( ContactsTreeModel::ItemRole ).value<Akonadi::Item>();
 
-    if ( !selection.d->mEmailAddress.isEmpty() ) {
-      selections << selection;
+    if ( d->mShowOnlyContactWithEmail ) {
+        if ( !selection.d->mEmailAddress.isEmpty() ) {
+            selections << selection;
+        }
+    } else {
+        selections << selection;
     }
   }
 
diff --git a/akonadi/contact/emailaddressselectionwidget.h b/akonadi/contact/emailaddressselectionwidget.h
index b8a6bff..ca35905 100644
--- a/akonadi/contact/emailaddressselectionwidget.h
+++ b/akonadi/contact/emailaddressselectionwidget.h
@@ -84,6 +84,14 @@ class AKONADI_CONTACT_EXPORT EmailAddressSelectionWidget : public QWidget
     explicit EmailAddressSelectionWidget( QAbstractItemModel *model, QWidget *parent = 0 );
 
     /**
+     * @brief Creates a new email address selection widget.
+     * @param showOnlyContactWithEmail Allow to specify if you want to see only contact with email (by default yes in other constructor)
+     * @param model A custom ContactsTreeModel based model to use.
+     * @param parent The parent widget.
+     */
+    explicit EmailAddressSelectionWidget( bool showOnlyContactWithEmail, QAbstractItemModel *model = 0, QWidget *parent = 0 );
+
+    /**
      * Destroys the email address selection widget.
      */
     ~EmailAddressSelectionWidget();


commit 4d2596e7c49acb6c03442d7b5325bcaa10db3b4c
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Fri Jul 25 12:08:50 2014 +0200

    Fix TagTest
    
    After adding support for Tags into Knut, the database is now pre-populated
    with a single tag. This tag is however interfering with this test, so we
    remove it from Akonadi when starting the testcase.

diff --git a/akonadi/tests/tagtest.cpp b/akonadi/tests/tagtest.cpp
index 137f733..f3e2c96 100644
--- a/akonadi/tests/tagtest.cpp
+++ b/akonadi/tests/tagtest.cpp
@@ -67,6 +67,13 @@ void TagTest::initTestCase()
     qRegisterMetaType<Akonadi::Tag>();
     qRegisterMetaType<QSet<Akonadi::Tag> >();
     qRegisterMetaType<Akonadi::Item::List>();
+
+    // Delete the default Knut tag - it's interfering with this test
+    TagFetchJob *fetchJob = new TagFetchJob(this);
+    AKVERIFYEXEC(fetchJob);
+    QCOMPARE(fetchJob->tags().size(), 1);
+    TagDeleteJob *deleteJob = new TagDeleteJob(fetchJob->tags().first(), this);
+    AKVERIFYEXEC(deleteJob);
 }
 
 void TagTest::testCreateFetch()


commit 1dee3a0e83e91802a99553788b865b26773c22ae
Author: l10n daemon script <scripty at kde.org>
Date:   Fri Jul 25 05:41:04 2014 +0000

    SVN_SILENT made messages (.desktop file)

diff --git a/akonadi/contact/editor/im/kaddressbookimprotocol.desktop b/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
index 27907c6..4425d5d 100644
--- a/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
+++ b/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
@@ -13,6 +13,7 @@ Name[el]=Πρωτόκολλο στιγμιαίων μηνυμάτων KAddressbo
 Name[en_GB]=KAddressbook Instant Messaging Protocol
 Name[eo]=KAddressbook Rapidmesaĝila Protokolo
 Name[es]=Protocolo de mensajería instantánea de KAddressbook
+Name[et]=KDE aadressiraamatu kiirsuhtlusprotokoll
 Name[fi]=KAddressbookin pikaviestinyhteyskäytäntö
 Name[fr]=Protocole de messagerie instantanée KAddressBook
 Name[ga]=Prótacal Teachtaireachtaí Meandaracha KAddressbook
diff --git a/akonadi/contact/editor/im/protocols/aimprotocol.desktop b/akonadi/contact/editor/im/protocols/aimprotocol.desktop
index 104ef5d..075a1ef 100644
--- a/akonadi/contact/editor/im/protocols/aimprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/aimprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο AIM
 Comment[en_GB]=AIM Protocol
 Comment[eo]=AIM-Protokolo
 Comment[es]=Protocolo AIM
+Comment[et]=AIM protokoll
 Comment[fi]=AIM-yhteyskäytäntö
 Comment[fr]=Protocole AIM
 Comment[ga]=Prótacal AIM
@@ -62,6 +63,7 @@ Name[el]=AIM
 Name[en_GB]=AIM
 Name[eo]=AIM
 Name[es]=AIM
+Name[et]=AIM
 Name[fi]=AIM
 Name[fr]=AIM
 Name[ga]=AIM
diff --git a/akonadi/contact/editor/im/protocols/gaduprotocol.desktop b/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
index 37f898e..2bf46b8 100644
--- a/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο Gadu-Gadu
 Comment[en_GB]=Gadu-Gadu Protocol
 Comment[eo]=Gadu-Gadu Protokolo
 Comment[es]=Protocolo Gadu-Gadu
+Comment[et]=Gadu-Gadu protokoll
 Comment[fi]=Gadu-Gadu-yhteyskäytäntö
 Comment[fr]=Protocole Gadu-Gadu
 Comment[ga]=Prótacal Gadu-Gadu
@@ -62,6 +63,7 @@ Name[el]=Gadu-Gadu
 Name[en_GB]=Gadu-Gadu
 Name[eo]=Gadu-Gadu
 Name[es]=Gadu-Gadu
+Name[et]=Gadu-Gadu
 Name[fi]=Gadu-Gadu
 Name[fr]=Gadu-Gadu
 Name[ga]=Gadu-Gadu
diff --git a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
index 71febbc..3e81a6d 100644
--- a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
@@ -13,6 +13,7 @@ Comment[de]=Google Talk
 Comment[el]=Google Talk
 Comment[en_GB]=Google Talk
 Comment[es]=Google Talk
+Comment[et]=Google Talk
 Comment[fi]=Google Talk
 Comment[fr]=Google Talk
 Comment[gl]=Google Talk
@@ -52,6 +53,7 @@ Name[de]=Google Talk
 Name[el]=Google Talk
 Name[en_GB]=Google Talk
 Name[es]=Google Talk
+Name[et]=Google Talk
 Name[fi]=Google Talk
 Name[fr]=Google Talk
 Name[gl]=Google Talk
diff --git a/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop b/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
index 431fbef..b283236 100644
--- a/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Αποστολέας μηνυμάτων Novell GroupWise
 Comment[en_GB]=Novell GroupWise Messenger
 Comment[eo]=Novell GroupWise mesaĝilo
 Comment[es]=Mensajería de Novell GroupWise
+Comment[et]=Novell GroupWise Messenger
 Comment[fi]=Novell Groupwise -pikaviestin
 Comment[fr]=Messagerie « GroupWise Novell »
 Comment[ga]=Teachtaire Novell GroupWise
@@ -62,6 +63,7 @@ Name[el]=GroupWise
 Name[en_GB]=GroupWise
 Name[eo]=GroupWise
 Name[es]=GroupWise
+Name[et]=GroupWise
 Name[fi]=GroupWise
 Name[fr]=GroupWise
 Name[ga]=GroupWise
diff --git a/akonadi/contact/editor/im/protocols/icqprotocol.desktop b/akonadi/contact/editor/im/protocols/icqprotocol.desktop
index 2082ecc..f0c1f56 100644
--- a/akonadi/contact/editor/im/protocols/icqprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/icqprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο ICQ
 Comment[en_GB]=ICQ Protocol
 Comment[eo]=ICQ Protokolo
 Comment[es]=Protocolo ICQ
+Comment[et]=ICQ protokoll
 Comment[fi]=ICQ-yhteyskäytäntö
 Comment[fr]=Protocole ICQ
 Comment[ga]=Prótacal ICQ
@@ -62,6 +63,7 @@ Name[el]=ICQ
 Name[en_GB]=ICQ
 Name[eo]=ICQ
 Name[es]=ICQ
+Name[et]=ICQ
 Name[fi]=ICQ
 Name[fr]=ICQ
 Name[ga]=ICQ
diff --git a/akonadi/contact/editor/im/protocols/ircprotocol.desktop b/akonadi/contact/editor/im/protocols/ircprotocol.desktop
index cbdf5d2..ff47cf5 100644
--- a/akonadi/contact/editor/im/protocols/ircprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/ircprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Διαδικτυακή συνομιλία
 Comment[en_GB]=Internet Relay Chat
 Comment[eo]=Interreta plusenda babilado
 Comment[es]=Internet Relay Chat
+Comment[et]=Rühmadiskussioon internetis
 Comment[fi]=Internet Relay Chat
 Comment[fr]=Internet Relay Chat
 Comment[ga]=Internet Relay Chat
@@ -61,6 +62,7 @@ Name[el]=IRC
 Name[en_GB]=IRC
 Name[eo]=IRC
 Name[es]=IRC
+Name[et]=IRC
 Name[fi]=IRC
 Name[fr]=IRC
 Name[ga]=IRC
diff --git a/akonadi/contact/editor/im/protocols/jabberprotocol.desktop b/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
index 26caa2c..f493947 100644
--- a/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο Jabber
 Comment[en_GB]=Jabber Protocol
 Comment[eo]=Jabber Protokolo
 Comment[es]=Protocolo Jabber
+Comment[et]=Jabberi protokoll
 Comment[fi]=Jabber-yhteyskäytäntö
 Comment[fr]=Protocole Jabber
 Comment[ga]=Prótacal Jabber
@@ -62,6 +63,7 @@ Name[el]=Jabber
 Name[en_GB]=Jabber
 Name[eo]=Jabber
 Name[es]=Jabber
+Name[et]=Jabber
 Name[fi]=Jabber
 Name[fr]=Jabber
 Name[ga]=Jabber
diff --git a/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop b/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
index a5f736a..9b69f00 100644
--- a/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο Meanwhile
 Comment[en_GB]=Meanwhile Protocol
 Comment[eo]=Meanwhile Protokolo
 Comment[es]=Protocolo Meanwhile
+Comment[et]=Meanwhile'i protokoll
 Comment[fi]=Meanwhile-yhteyskäytäntö
 Comment[fr]=Protocole Meanwhile
 Comment[ga]=Prótacal Meanwhile
@@ -62,6 +63,7 @@ Name[el]=Meanwhile
 Name[en_GB]=Meanwhile
 Name[eo]=Meanwhile
 Name[es]=Meanwhile
+Name[et]=Meanwhile
 Name[fi]=Meanwhile
 Name[fr]=Meanwhile
 Name[ga]=Meanwhile
diff --git a/akonadi/contact/editor/im/protocols/msnprotocol.desktop b/akonadi/contact/editor/im/protocols/msnprotocol.desktop
index ce8f44f..354460a 100644
--- a/akonadi/contact/editor/im/protocols/msnprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/msnprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Αποστολέας μηνυμάτων MSN
 Comment[en_GB]=MSN Messenger
 Comment[eo]=MSN Mesaĝilo
 Comment[es]=MSN Messenger
+Comment[et]=MSN Messenger
 Comment[fi]=MSN Messenger
 Comment[fr]=Messagerie MSN
 Comment[ga]=MSN Messenger
@@ -62,6 +63,7 @@ Name[el]=Αποστολέας μηνυμάτων MSN
 Name[en_GB]=MSN Messenger
 Name[eo]=MSN mesaĝilo
 Name[es]=MSN Messenger
+Name[et]=MSN Messenger
 Name[fi]=MSN Messenger
 Name[fr]=Messagerie MSN
 Name[ga]=MSN Messenger
diff --git a/akonadi/contact/editor/im/protocols/skypeprotocol.desktop b/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
index a2c81a6..f6ad208 100644
--- a/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Διαδικτυακή τηλεφωνία Skype
 Comment[en_GB]=Skype Internet Telephony
 Comment[eo]=Skype Interreta Telefonado
 Comment[es]=Telefonía por Internet de Skype
+Comment[et]=Internetitelefon Skype
 Comment[fi]=Skype-internetpuhelin
 Comment[fr]=Téléphonie Internet Skype
 Comment[ga]=Teileafónaíocht Idirlín Skype
@@ -61,6 +62,7 @@ Name[el]=Skype
 Name[en_GB]=Skype
 Name[eo]=kype
 Name[es]=Skype
+Name[et]=Skype
 Name[fi]=Skype
 Name[fr]=Skype
 Name[ga]=Skype
diff --git a/akonadi/contact/editor/im/protocols/smsprotocol.desktop b/akonadi/contact/editor/im/protocols/smsprotocol.desktop
index d5fa38c..20e0f0b 100644
--- a/akonadi/contact/editor/im/protocols/smsprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/smsprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο SMS
 Comment[en_GB]=SMS Protocol
 Comment[eo]=SMS Protokolo
 Comment[es]=Protocolo SMS
+Comment[et]=SMS protokoll
 Comment[fi]=Tekstiviestiyhteyskäytäntö
 Comment[fr]=Protocole SMS
 Comment[ga]=Prótacal SMS
@@ -62,6 +63,7 @@ Name[el]=SMS
 Name[en_GB]=SMS
 Name[eo]=SMS
 Name[es]=SMS
+Name[et]=SMS
 Name[fi]=Tekstiviesti
 Name[fr]=SMS
 Name[ga]=SMS
diff --git a/akonadi/contact/editor/im/protocols/yahooprotocol.desktop b/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
index b400057..f259e53 100644
--- a/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
@@ -14,6 +14,7 @@ Comment[el]=Πρωτόκολλο Yahoo
 Comment[en_GB]=Yahoo Protocol
 Comment[eo]=Yahoo Protokolo
 Comment[es]=Protocolo Yahoo
+Comment[et]=Yahoo protokoll
 Comment[fi]=Yahoo-yhteyskäytäntö
 Comment[fr]=Protocole Yahoo
 Comment[ga]=Prótacal Yahoo
@@ -62,6 +63,7 @@ Name[el]=Yahoo
 Name[en_GB]=Yahoo
 Name[eo]=Yahoo
 Name[es]=Yahoo
+Name[et]=Yahoo
 Name[fi]=Yahoo
 Name[fr]=Yahoo
 Name[ga]=Yahoo
diff --git a/akonadi/contact/kcm/akonadicontact_actions.desktop b/akonadi/contact/kcm/akonadicontact_actions.desktop
index e06de2d..0718189 100644
--- a/akonadi/contact/kcm/akonadicontact_actions.desktop
+++ b/akonadi/contact/kcm/akonadicontact_actions.desktop
@@ -19,6 +19,7 @@ Name[de]=Kontakt-Aktionen
 Name[el]=Ενέργειες επαφών
 Name[en_GB]=Contact Actions
 Name[es]=Acciones de contactos
+Name[et]=Kontaktitoimingud
 Name[fi]=Yhteystietotoiminnot
 Name[fr]=Actions sur les contacts
 Name[ga]=Gníomhartha Teagmhála
@@ -69,6 +70,7 @@ Comment[de]=Kontakt-Aktionen einrichten
 Comment[el]=Διαμόρφωση των ενεργειών των επαφών
 Comment[en_GB]=Configure the Contact Actions
 Comment[es]=Configurar las acciones de contactos
+Comment[et]=Kontaktitoimingute seadistamine
 Comment[fi]=Yhteystietotoimintojen asetukset
 Comment[fr]=Configurer les actions sur les contacts
 Comment[ga]=Cumraigh na Gníomhartha Teagmhála
@@ -117,6 +119,7 @@ X-KDE-Keywords[de]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[el]=kaddressbook, διαμόρφωση, ρυθμίσεις, επαφή, ενέργειες
 X-KDE-Keywords[en_GB]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[es]=kaddressbook, configurar, preferencias, contacto, acciones
+X-KDE-Keywords[et]=kde aadressiraamat, seadistamine, seadistused, kontakt, toimingud
 X-KDE-Keywords[fi]=kaddressbook, asetukset, yhteystieto, toiminnot
 X-KDE-Keywords[fr]=KAddressBook, configuration, paramètres, contacts, actions
 X-KDE-Keywords[ga]=kaddressbook, cumraigh, cumraíocht, socruithe, teagmháil, gníomhartha
diff --git a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
index 242dfd0..dfce256 100644
--- a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
+++ b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
@@ -8,6 +8,7 @@ Name[de]=SocialFeedItem-Serialisierung
 Name[el]=Πρόγραμμα γραμμικής διάταξης SocialFeedItem
 Name[en_GB]=SocialFeedItem Serializer
 Name[es]=Serializador SocialFeedItem
+Name[et]=SocialFeedItemi jadasti
 Name[fi]=SocialFeedItem-serialisoija
 Name[fr]=Sérialiseur « SocialFeedItem »
 Name[gl]=Serializador SocialFeedItem
@@ -45,6 +46,7 @@ Comment[de]=Akonadi-Modul zur Serialisierung für SocialFeedItem
 Comment[el]=ένα πρόσθετο γραμμικής διάταξης του Akonadi για το SocialFeedItem
 Comment[en_GB]=An Akonadi serializer plugin for SocialFeedItem
 Comment[es]=Un complemento de serializador Akonadi para SocialFeedItem
+Comment[et]=Akonadi SocialFeedItemi jadastamisplugin
 Comment[fi]=Akonadi-serialisoijaliitännäinen SocialFeedItemille
 Comment[fr]=Un module externe de sérialisation Akonadi pour « SocialFeedItem »
 Comment[gl]=Un complemento serializador de Akonadi para SocialFeedItem.
diff --git a/akonadi/tests/testresource/knutresource.desktop b/akonadi/tests/testresource/knutresource.desktop
index c6277a6..286511d 100644
--- a/akonadi/tests/testresource/knutresource.desktop
+++ b/akonadi/tests/testresource/knutresource.desktop
@@ -9,6 +9,7 @@ Name[de]=Knut
 Name[el]=Knut
 Name[en_GB]=Knut
 Name[es]=Knut
+Name[et]=Knut
 Name[fi]=Knut
 Name[fr]=Knut
 Name[gl]=Knut
@@ -45,6 +46,7 @@ Comment[de]=Agent für die Fehlersuche
 Comment[el]=Πράκτορας για αποσφαλμάτωση
 Comment[en_GB]=An agent for debugging purpose
 Comment[es]=Un agente para el propósito de depuración
+Comment[et]=Silumiseks mõeldud agent
 Comment[fi]=Vianjäljitykseen tarkoitettu agentti
 Comment[fr]=Un agent à des fins de débogage
 Comment[gl]=Un axente de depuración
diff --git a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
index c9085ce..e291d38 100644
--- a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
+++ b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
@@ -9,6 +9,7 @@ Name[de]=Akonadi-Testsuchmodul
 Name[el]=Πρόσθετο δοκιμαστικής αναζήτησης Akonadi
 Name[en_GB]=Akonadi Test Search Plugin
 Name[es]=Complemento de prueba de búsqueda de Akonadi
+Name[et]=Akonadi otsingu testplugin
 Name[fi]=Akonadin hakuliitännäinen testaustarkoituksiin
 Name[fr]=Module externe de test pour les recherches Akonadi
 Name[hu]=Akonadi teszt keresés bővítmény
diff --git a/kabc/formats/binary.desktop b/kabc/formats/binary.desktop
index 67b83f8..2f31b04 100644
--- a/kabc/formats/binary.desktop
+++ b/kabc/formats/binary.desktop
@@ -10,6 +10,7 @@ Name[de]=Binär
 Name[el]=Δυαδικό
 Name[en_GB]=Binary
 Name[es]=Binario
+Name[et]=Binaar
 Name[fi]=Binaari
 Name[fr]=Binaire
 Name[ga]=Dénártha
diff --git a/kabc/kabc_manager.desktop b/kabc/kabc_manager.desktop
index d908940..c9c8790 100644
--- a/kabc/kabc_manager.desktop
+++ b/kabc/kabc_manager.desktop
@@ -12,6 +12,7 @@ Name[el]=Επαφές
 Name[en_GB]=Contacts
 Name[eo]=Kontaktoj
 Name[es]=Contactos
+Name[et]=Kontaktid
 Name[fi]=Yhteystiedot
 Name[fr]=Contacts
 Name[ga]=Teagmhálacha
diff --git a/kabc/plugins/dir/dir.desktop b/kabc/plugins/dir/dir.desktop
index ed99365..131dd36 100644
--- a/kabc/plugins/dir/dir.desktop
+++ b/kabc/plugins/dir/dir.desktop
@@ -10,6 +10,7 @@ Name[el]=Φάκελος
 Name[en_GB]=Folder
 Name[eo]=Dosierujo
 Name[es]=Carpeta
+Name[et]=Kataloog
 Name[fi]=Kansio
 Name[fr]=Dossier
 Name[ga]=Fillteán
@@ -60,6 +61,7 @@ Comment[de]=Ermöglicht Zugriff auf Kontakte, die in einzelnen Dateien in einem
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε ξεχωριστά αρχεία, σε ένα δοσμένο φάκελο. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
 Comment[en_GB]=Provides access to contacts, each stored in a single file, in a given folder. Supports standard vCard file and other formats depending on availability of plugins.
 Comment[es]=Proporciona acceso a los contactos, cada uno almacenado en un archivo diferente, dentro de una carpeta determinada. Admite archivos vCard estándar y otros formatos dependiendo de la disponibilidad de los complementos.
+Comment[et]=Võimaldab kasutada eraldi failidesse salvestatud kontakte määratud kataloogis. Toetab standardseid vCard-faile ja teisi vorminguid sõltuvalt pluginate olemasolust.
 Comment[fi]=Tarjoaa pääsyn annetun kansion yksittäisiin tiedostoihin tallennettuihin yhteystietoihin. Tukee vakiomuotoista vCard-tiedostoa sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts dont chacun est enregistré dans un fichier, dans le dossier indiqué. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
 Comment[gl]=Fornece acceso aos contactos, cada un gardado nun ficheiro nun cartafol dado. Admite ficheiros vCard estándar e outros formatos, en función da dispoñibilidade de engadidos.
diff --git a/kabc/plugins/file/file.desktop b/kabc/plugins/file/file.desktop
index 2df65ae..55f75ea 100644
--- a/kabc/plugins/file/file.desktop
+++ b/kabc/plugins/file/file.desktop
@@ -11,6 +11,7 @@ Name[el]=Αρχείο
 Name[en_GB]=File
 Name[eo]=Dosiero
 Name[es]=Archivo
+Name[et]=Fail
 Name[fi]=Tiedosto
 Name[fr]=Fichier
 Name[ga]=Comhad
@@ -65,6 +66,7 @@ Comment[de]=Ermöglicht Zugriff auf Kontakte, die in einer einzigen Datei lokal
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε ένα τοπικό αρχείο. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
 Comment[en_GB]=Provides access to contacts stored in a single local file. Supports standard vCard files and other formats depending on available plugins.
 Comment[es]=Proporciona acceso a los contactos almacenados en un único archivo local. Admite archivos vCard estándar y otros formatos dependiendo de la disponibilidad de los complementos.
+Comment[et]=Võimaldab kasutada kohalikku faili salvestatud kontakte. Toetab standardseid vCard-faile ja teisi vorminguid sõltuvalt pluginate olemasolust.
 Comment[fi]=Tarjoaa pääsyn yksittäiseen paikalliseen tiedostoon tallennettuihin yhteystietoihin. Tukee vakiomuotoisia vCard-tiedostoja sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts enregistrés dans un unique fichier local. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
 Comment[gl]=Fornece acceso a contactos gardados nun único ficheiro local. Admite ficheiros vCard estándar e outros formatos en función dos engadidos dispoñíbeis.
diff --git a/kabc/plugins/ldapkio/ldapkio.desktop b/kabc/plugins/ldapkio/ldapkio.desktop
index 25255c9..112cf90 100644
--- a/kabc/plugins/ldapkio/ldapkio.desktop
+++ b/kabc/plugins/ldapkio/ldapkio.desktop
@@ -11,6 +11,7 @@ Name[el]=LDAP
 Name[en_GB]=LDAP
 Name[eo]=LDAP
 Name[es]=LDAP
+Name[et]=LDAP
 Name[fi]=LDAP
 Name[fr]=LDAP
 Name[ga]=LDAP
@@ -65,6 +66,7 @@ Comment[de]=Ermöglicht Zugriff auf Kontakte, die auf einem LDAP-Server gespeich
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε έναν εξυπηρετητή καταλόγου LDAP
 Comment[en_GB]=Provides access to contacts stored on a LDAP directory server
 Comment[es]=Provee acceso a los contactos almacenados en un servidor de directorios LDAP
+Comment[et]=Võimaldab kasutada LDAP kataloogiserverisse salvestatud kontakte
 Comment[fi]=Tarjoaa pääsyn LDAP-hakemistopalvelimelle tallennettuihin yhteystietoihin
 Comment[fr]=Fournit un accès aux contacts enregistrés dans un annuaire LDAP
 Comment[ga]=Soláthraíonn sé seo rochtain ar theagmhálacha atá stóráilte in eolaire LDAP
diff --git a/kabc/plugins/net/net.desktop b/kabc/plugins/net/net.desktop
index 1aa3aec..bb17087 100644
--- a/kabc/plugins/net/net.desktop
+++ b/kabc/plugins/net/net.desktop
@@ -11,6 +11,7 @@ Name[el]=Δίκτυο
 Name[en_GB]=Network
 Name[eo]=Reto
 Name[es]=Red
+Name[et]=Võrk
 Name[fi]=Verkko
 Name[fr]=Réseau
 Name[ga]=Líonra
@@ -65,6 +66,7 @@ Comment[de]=Ermöglicht Zugriff auf Kontakte in entfernten Dateien durch das KIO
 Comment[el]=Προσφέρει πρόσβαση σε επαφές σε απομακρυσμένα αρχεία με τη χρήση του συστήματος KIO του KDE. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
 Comment[en_GB]=Provides access to contacts in remote files using KDE's network framework KIO. Supports standard vCard files and other formats depending on available plugins.
 Comment[es]=Proporciona acceso a los contactos en un archivo remoto utilizando la infraestructura de red KIO de KDE. Admite archivos vCard estándar y otros formatos dependiendo en la disponibilidad de los complementos.
+Comment[et]=Võimaldab kasutada võrgufaile KDE võrguraamistiku KIO abil. Toetab standardseid vCard-faile ja teisi vorminguid sõltuvalt pluginate olemasolust.
 Comment[fi]=Tarjoaa pääsyn etätiedostoissa oleviin yhteystietoihin KDE:n verkkokehyksen KIOn välityksellä. Tukee vakiomuotoisia vCard-tiedostoja sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts enregistrés dans des fichiers distants en utilisant le mécanisme réseau KIO de KDE. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
 Comment[gl]=Fornece acceso a contactos gardados en ficheiros remotos mediante a infraestrutura de rede KIO, de KDE. Admite ficheiros vCard estándar e outros formatos en función dos engadidos dispoñíbeis.
diff --git a/kcal/kcal_manager.desktop b/kcal/kcal_manager.desktop
index dd9573e..282549e 100644
--- a/kcal/kcal_manager.desktop
+++ b/kcal/kcal_manager.desktop
@@ -12,6 +12,7 @@ Name[el]=Ημερολόγιο
 Name[en_GB]=Calendar
 Name[eo]=Kalendaro
 Name[es]=Calendario
+Name[et]=Kalender
 Name[fi]=Kalenteri
 Name[fr]=Calendrier
 Name[ga]=Féilire
diff --git a/kcal/localdir.desktop b/kcal/localdir.desktop
index 4c73f76..664adb2 100644
--- a/kcal/localdir.desktop
+++ b/kcal/localdir.desktop
@@ -10,6 +10,7 @@ Name[de]=Kalender in lokalem Ordner
 Name[el]=Ημερολόγιο σε τοπικό κατάλογο
 Name[en_GB]=Calendar in Local Directory
 Name[es]=Calendario en directorio local
+Name[et]=Kalender kohalikus kataloogis
 Name[fi]=Kalenteri paikallisessa kansiossa
 Name[fr]=Calendrier dans un dossier local
 Name[ga]=Féilire i gComhadlann Logánta
@@ -61,6 +62,7 @@ Comment[de]=Ermöglicht Zugriff auf Kalender, die jeweils in einzelnen Dateien i
 Comment[el]=Προσφέρει πρόσβαση σε αντικείμενα ημερολογίου, αποθηκευμένα σε ξεχωριστά αρχεία, σε ένα δοσμένο κατάλογο
 Comment[en_GB]=Provides access to calendar items, each stored in a single file, in a given directory
 Comment[es]=Provee acceso a elementos de un calendario, cada uno almacenado en un archivo diferente, dentro de un directorio determinado
+Comment[et]=Võimaldab kasutada eraldi failidesse salvestatud kalendrielemente määratud kataloogis
 Comment[fi]=Tarjoaa pääsyn annetun kansion erillisiin tiedostoihin tallennettuihin kalenteritietueisiin
 Comment[fr]=Fournit un accès à des entrées d'agenda, chaque élément étant enregistré dans un fichier unique, dans le dossier indiqué
 Comment[ga]=Soláthraíonn sé seo rochtain ar mhíreanna féilire, gach ceann stóráilte i gcomhad aonair, i gcomhadlann sonraithe
diff --git a/kioslave/sieve/sieve.protocol b/kioslave/sieve/sieve.protocol
index ce62b67..6333da2 100644
--- a/kioslave/sieve/sieve.protocol
+++ b/kioslave/sieve/sieve.protocol
@@ -22,6 +22,7 @@ Description[de]=Ein Ein-/Ausgabemodul für das Mailfilter-Protokoll Sieve
 Description[el]=Ένα ioslave για το πρωτόκολλο φιλτραρίσματος αλληλογραφίας Sieve
 Description[en_GB]=An ioslave for the Sieve mail filtering protocol
 Description[es]=Un esclavo de E/S para el protocolo de filtrado de correo Sieve
+Description[et]=Sieve kirjade filtreerimise protokolli IO-moodul
 Description[fi]=I/O-asiakas Sieve-postinsuodatusyhteyskäytännölle
 Description[fr]=Un module d'entrées / sorties pour le protocole de filtrage de messagerie « Sieve »
 Description[ga]=Sclábhaí I/A le haghaidh prótacail scagtha ríomhphoist Sieve
diff --git a/kontactinterface/kontactplugin.desktop b/kontactinterface/kontactplugin.desktop
index a33a0c1..5ebe951 100644
--- a/kontactinterface/kontactplugin.desktop
+++ b/kontactinterface/kontactplugin.desktop
@@ -11,6 +11,7 @@ Name[de]=Kontact-Modul
 Name[el]=Πρόσθετο Kontact
 Name[en_GB]=Kontact Plugin
 Name[es]=Complemento de Kontact
+Name[et]=Kontacti plugin
 Name[fi]=Kontact-liitännäinen
 Name[fr]=Module externe pour Kontact
 Name[ga]=Breiseán Kontact
diff --git a/kresources/kresources.desktop b/kresources/kresources.desktop
index 33b5da1..6f36326 100644
--- a/kresources/kresources.desktop
+++ b/kresources/kresources.desktop
@@ -19,6 +19,7 @@ Name[de]=KDE-Ressourcen
 Name[el]=Πόροι του KDE
 Name[en_GB]=KDE Resources
 Name[es]=Recursos KDE
+Name[et]=KDE ressursid
 Name[fi]=KDE-resurssit
 Name[fr]=Ressources KDE
 Name[ga]=Acmhainní KDE
@@ -73,6 +74,7 @@ Comment[de]=KDE-Ressourcen einrichten
 Comment[el]=Διαμόρφωση πόρων του KDE
 Comment[en_GB]=Configure KDE Resources
 Comment[es]=Configurar recursos de KDE
+Comment[et]=KDE ressursside seadistamine
 Comment[fi]=KDE-resurssien asetukset
 Comment[fr]=Configurer les ressources KDE
 Comment[ga]=Cumraigh Acmhainní KDE
@@ -124,6 +126,7 @@ X-KDE-Keywords[de]=resources,konnector resource,contact resource,calendar resour
 X-KDE-Keywords[el]=πόροι,πόρος konnector,επαφή,πόρος,πόρος ημερολογίου,πόρος σημειώσεων,πόρος ειδοποιήσεων,imap
 X-KDE-Keywords[en_GB]=resources,connector resource,contact resource,calendar resource,notes resource,alarm resource,imap
 X-KDE-Keywords[es]=recursos,recurso de conector,recurso de contacto,recurso de calendario,recurso de notas,recurso de alarma,imap
+X-KDE-Keywords[et]=ressursid,konnektor,ressurss,kontaktiressurss,kalendriressurss,märkmeressurss,häireressurss,imap
 X-KDE-Keywords[fi]=resurssit,konnector-resurssi,yhteystietoresurssi,kalenteriresurssi,muistiinpanoresurssi,hälytysresurssi,imap
 X-KDE-Keywords[fr]=ressources, ressource connecteur, ressource contact, ressource agenda, ressource notes, ressource alarme, imap
 X-KDE-Keywords[ga]=acmhainní,acmhainn konnector,acmhainn teagmhála,acmhainn fhéilire,acmhainn nótaí,acmhainn aláraim,imap
diff --git a/kresources/kresources_manager.desktop b/kresources/kresources_manager.desktop
index b1a5e25..8dfa587 100644
--- a/kresources/kresources_manager.desktop
+++ b/kresources/kresources_manager.desktop
@@ -9,6 +9,7 @@ Name[de]=Ressourcenverwaltung
 Name[el]=Διαχειριστής KResources
 Name[en_GB]=KResources Manager
 Name[es]=Gestor de KResources
+Name[et]=KDE ressursside haldur
 Name[fi]=KResources-hallinta
 Name[fr]=Gestionnaire de ressources
 Name[ga]=Bainisteoir KResources
@@ -64,6 +65,7 @@ Comment[de]=Ressourcenverwaltung
 Comment[el]=Διαχειριστής KResources
 Comment[en_GB]=KResources Manager
 Comment[es]=Gestor de KResources
+Comment[et]=KDE ressursside haldur
 Comment[fi]=KResources-hallinta
 Comment[fr]=Gestionnaire KResources
 Comment[ga]=Bainisteoir KResources
diff --git a/kresources/kresources_plugin.desktop b/kresources/kresources_plugin.desktop
index 628769c..5aae84c 100644
--- a/kresources/kresources_plugin.desktop
+++ b/kresources/kresources_plugin.desktop
@@ -9,6 +9,7 @@ Name[de]=KRessourcen-Modul
 Name[el]=Πρόσθετο KResources
 Name[en_GB]=KResources Plugin
 Name[es]=Complemento de KResources
+Name[et]=KDE ressursside plugin
 Name[fi]=KResources-liitännäinen
 Name[fr]=Module externe KResources
 Name[ga]=Breiseán KResources
@@ -63,6 +64,7 @@ Comment[de]=Modul für KRessourcen-Grundgerüst
 Comment[el]=Πρόσθετο πλαισίου εργασίας του KResource
 Comment[en_GB]=KResources Framework Plugin
 Comment[es]=Complemento de infraestructura de KResources
+Comment[et]=KDE ressursside raamistiku plugin
 Comment[fi]=KResources-kehysliitännäinen
 Comment[fr]=Module externe d'environnement KResources
 Comment[ga]=Breiseán Creatlaí KResources
diff --git a/mailtransport/kcm_mailtransport.desktop b/mailtransport/kcm_mailtransport.desktop
index f0587b3..cd91956 100644
--- a/mailtransport/kcm_mailtransport.desktop
+++ b/mailtransport/kcm_mailtransport.desktop
@@ -22,6 +22,7 @@ Name[de]=Versandart
 Name[el]=Κύριος μεταφορέας
 Name[en_GB]=Mail Transport
 Name[es]=Transporte de correo
+Name[et]=Kirja saatmise viis
 Name[fi]=Postinvälitys
 Name[fr]=Transport de courrier électronique
 Name[ga]=Iompar Ríomhphoist


commit f0c55b0e2e83f2db73c2d728dcdada4f5bc5ade2
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Sun Jul 20 13:04:37 2014 +0200

    Use fullName instead of own building the same logic
    
    REVIEW: 119433

diff --git a/akonadi/calendar/mailclient_p.cpp b/akonadi/calendar/mailclient_p.cpp
index 94accce..c08e75e 100644
--- a/akonadi/calendar/mailclient_p.cpp
+++ b/akonadi/calendar/mailclient_p.cpp
@@ -90,20 +90,12 @@ void MailClient::mailAttendees(const KCalCore::IncidenceBase::Ptr &incidence,
             continue;
         }
 
-        // Build a nice address for this attendee including the CN.
-        QString tname, temail;
-        const QString username = KPIMUtils::quoteNameIfNecessary(a->name());
-        // ignore the return value from extractEmailAddressAndName() because
-        // it will always be false since tusername does not contain "@domain".
-        KPIMUtils::extractEmailAddressAndName(username, temail/*byref*/, tname/*byref*/);
-        tname += QLatin1String(" <") + email + QLatin1Char('>');
-
         // Optional Participants and Non-Participants are copied on the email
         if (a->role() == KCalCore::Attendee::OptParticipant ||
                 a->role() == KCalCore::Attendee::NonParticipant) {
-            ccList << tname;
+            ccList << a->fullName();
         } else {
-            toList << tname;
+            toList << a->fullName();
         }
     }
     if (toList.isEmpty() && ccList.isEmpty()) {


commit 2509b4f3b372f11ba9af379203ff01645ad4c583
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Jul 24 11:30:55 2014 +0200

    ETM: Don't ignore itemChanged of items in virtual collections
    
    It can happen that storage collection of an item is not in the ETM, but
    only virtual collections containing items from that collection (see Gmail
    resource for example). In that case ETM will only receive itemChanged
    notifications for the virtual collections, but not for the storage one,
    so the item won't be updated, because ETM does not update the original
    item when the notification is detined for a virtual collection.
    
    This change makes ETM not to ignore itemChange notifications when the
    collection is virtual, but perserves the orignal parent collection.
    
    BUG: 337665
    Approved-By: Christian Mollekopf

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 15ee48c..3212ade 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -1167,8 +1167,15 @@ void EntityTreeModelPrivate::monitoredItemChanged(const Akonadi::Item &item, con
         return;
     }
 
-    //otherwise this overwrites the copy of the real collection with one of the virtual collectoin
-    if (!item.parentCollection().isVirtual()) {
+    // Notifications about itemChange are always dispatched for real collection
+    // and also all virtual collections the item belongs to. In order to preserve
+    // the original storage collection when we need to have special handling for
+    // notifications for virtual collections
+    if (item.parentCollection().isVirtual()) {
+        const Collection originalParent = m_items[item.id()].parentCollection();
+        m_items[item.id()].apply(item);
+        m_items[item.id()].setParentCollection(originalParent);
+    } else {
         m_items[item.id()].apply(item);
     }
 


commit 5046b8eb6ffd53e22d91fa8a30daecf091f9db8f
Author: l10n daemon script <scripty at kde.org>
Date:   Thu Jul 24 04:53:50 2014 +0000

    SVN_SILENT made messages (.desktop file)

diff --git a/akonadi/contact/editor/im/kaddressbookimprotocol.desktop b/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
index 4425d5d..27907c6 100644
--- a/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
+++ b/akonadi/contact/editor/im/kaddressbookimprotocol.desktop
@@ -13,7 +13,6 @@ Name[el]=Πρωτόκολλο στιγμιαίων μηνυμάτων KAddressbo
 Name[en_GB]=KAddressbook Instant Messaging Protocol
 Name[eo]=KAddressbook Rapidmesaĝila Protokolo
 Name[es]=Protocolo de mensajería instantánea de KAddressbook
-Name[et]=KDE aadressiraamatu kiirsuhtlusprotokoll
 Name[fi]=KAddressbookin pikaviestinyhteyskäytäntö
 Name[fr]=Protocole de messagerie instantanée KAddressBook
 Name[ga]=Prótacal Teachtaireachtaí Meandaracha KAddressbook
diff --git a/akonadi/contact/editor/im/protocols/aimprotocol.desktop b/akonadi/contact/editor/im/protocols/aimprotocol.desktop
index 075a1ef..104ef5d 100644
--- a/akonadi/contact/editor/im/protocols/aimprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/aimprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο AIM
 Comment[en_GB]=AIM Protocol
 Comment[eo]=AIM-Protokolo
 Comment[es]=Protocolo AIM
-Comment[et]=AIM protokoll
 Comment[fi]=AIM-yhteyskäytäntö
 Comment[fr]=Protocole AIM
 Comment[ga]=Prótacal AIM
@@ -63,7 +62,6 @@ Name[el]=AIM
 Name[en_GB]=AIM
 Name[eo]=AIM
 Name[es]=AIM
-Name[et]=AIM
 Name[fi]=AIM
 Name[fr]=AIM
 Name[ga]=AIM
diff --git a/akonadi/contact/editor/im/protocols/gaduprotocol.desktop b/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
index 2bf46b8..37f898e 100644
--- a/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/gaduprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο Gadu-Gadu
 Comment[en_GB]=Gadu-Gadu Protocol
 Comment[eo]=Gadu-Gadu Protokolo
 Comment[es]=Protocolo Gadu-Gadu
-Comment[et]=Gadu-Gadu protokoll
 Comment[fi]=Gadu-Gadu-yhteyskäytäntö
 Comment[fr]=Protocole Gadu-Gadu
 Comment[ga]=Prótacal Gadu-Gadu
@@ -63,7 +62,6 @@ Name[el]=Gadu-Gadu
 Name[en_GB]=Gadu-Gadu
 Name[eo]=Gadu-Gadu
 Name[es]=Gadu-Gadu
-Name[et]=Gadu-Gadu
 Name[fi]=Gadu-Gadu
 Name[fr]=Gadu-Gadu
 Name[ga]=Gadu-Gadu
diff --git a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
index 3e81a6d..71febbc 100644
--- a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
@@ -13,7 +13,6 @@ Comment[de]=Google Talk
 Comment[el]=Google Talk
 Comment[en_GB]=Google Talk
 Comment[es]=Google Talk
-Comment[et]=Google Talk
 Comment[fi]=Google Talk
 Comment[fr]=Google Talk
 Comment[gl]=Google Talk
@@ -53,7 +52,6 @@ Name[de]=Google Talk
 Name[el]=Google Talk
 Name[en_GB]=Google Talk
 Name[es]=Google Talk
-Name[et]=Google Talk
 Name[fi]=Google Talk
 Name[fr]=Google Talk
 Name[gl]=Google Talk
diff --git a/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop b/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
index b283236..431fbef 100644
--- a/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/groupwiseprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Αποστολέας μηνυμάτων Novell GroupWise
 Comment[en_GB]=Novell GroupWise Messenger
 Comment[eo]=Novell GroupWise mesaĝilo
 Comment[es]=Mensajería de Novell GroupWise
-Comment[et]=Novell GroupWise Messenger
 Comment[fi]=Novell Groupwise -pikaviestin
 Comment[fr]=Messagerie « GroupWise Novell »
 Comment[ga]=Teachtaire Novell GroupWise
@@ -63,7 +62,6 @@ Name[el]=GroupWise
 Name[en_GB]=GroupWise
 Name[eo]=GroupWise
 Name[es]=GroupWise
-Name[et]=GroupWise
 Name[fi]=GroupWise
 Name[fr]=GroupWise
 Name[ga]=GroupWise
diff --git a/akonadi/contact/editor/im/protocols/icqprotocol.desktop b/akonadi/contact/editor/im/protocols/icqprotocol.desktop
index f0c1f56..2082ecc 100644
--- a/akonadi/contact/editor/im/protocols/icqprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/icqprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο ICQ
 Comment[en_GB]=ICQ Protocol
 Comment[eo]=ICQ Protokolo
 Comment[es]=Protocolo ICQ
-Comment[et]=ICQ protokoll
 Comment[fi]=ICQ-yhteyskäytäntö
 Comment[fr]=Protocole ICQ
 Comment[ga]=Prótacal ICQ
@@ -63,7 +62,6 @@ Name[el]=ICQ
 Name[en_GB]=ICQ
 Name[eo]=ICQ
 Name[es]=ICQ
-Name[et]=ICQ
 Name[fi]=ICQ
 Name[fr]=ICQ
 Name[ga]=ICQ
diff --git a/akonadi/contact/editor/im/protocols/ircprotocol.desktop b/akonadi/contact/editor/im/protocols/ircprotocol.desktop
index ff47cf5..cbdf5d2 100644
--- a/akonadi/contact/editor/im/protocols/ircprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/ircprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Διαδικτυακή συνομιλία
 Comment[en_GB]=Internet Relay Chat
 Comment[eo]=Interreta plusenda babilado
 Comment[es]=Internet Relay Chat
-Comment[et]=Rühmadiskussioon internetis
 Comment[fi]=Internet Relay Chat
 Comment[fr]=Internet Relay Chat
 Comment[ga]=Internet Relay Chat
@@ -62,7 +61,6 @@ Name[el]=IRC
 Name[en_GB]=IRC
 Name[eo]=IRC
 Name[es]=IRC
-Name[et]=IRC
 Name[fi]=IRC
 Name[fr]=IRC
 Name[ga]=IRC
diff --git a/akonadi/contact/editor/im/protocols/jabberprotocol.desktop b/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
index f493947..26caa2c 100644
--- a/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/jabberprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο Jabber
 Comment[en_GB]=Jabber Protocol
 Comment[eo]=Jabber Protokolo
 Comment[es]=Protocolo Jabber
-Comment[et]=Jabberi protokoll
 Comment[fi]=Jabber-yhteyskäytäntö
 Comment[fr]=Protocole Jabber
 Comment[ga]=Prótacal Jabber
@@ -63,7 +62,6 @@ Name[el]=Jabber
 Name[en_GB]=Jabber
 Name[eo]=Jabber
 Name[es]=Jabber
-Name[et]=Jabber
 Name[fi]=Jabber
 Name[fr]=Jabber
 Name[ga]=Jabber
diff --git a/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop b/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
index 9b69f00..a5f736a 100644
--- a/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/meanwhileprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο Meanwhile
 Comment[en_GB]=Meanwhile Protocol
 Comment[eo]=Meanwhile Protokolo
 Comment[es]=Protocolo Meanwhile
-Comment[et]=Meanwhile'i protokoll
 Comment[fi]=Meanwhile-yhteyskäytäntö
 Comment[fr]=Protocole Meanwhile
 Comment[ga]=Prótacal Meanwhile
@@ -63,7 +62,6 @@ Name[el]=Meanwhile
 Name[en_GB]=Meanwhile
 Name[eo]=Meanwhile
 Name[es]=Meanwhile
-Name[et]=Meanwhile
 Name[fi]=Meanwhile
 Name[fr]=Meanwhile
 Name[ga]=Meanwhile
diff --git a/akonadi/contact/editor/im/protocols/msnprotocol.desktop b/akonadi/contact/editor/im/protocols/msnprotocol.desktop
index 354460a..ce8f44f 100644
--- a/akonadi/contact/editor/im/protocols/msnprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/msnprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Αποστολέας μηνυμάτων MSN
 Comment[en_GB]=MSN Messenger
 Comment[eo]=MSN Mesaĝilo
 Comment[es]=MSN Messenger
-Comment[et]=MSN Messenger
 Comment[fi]=MSN Messenger
 Comment[fr]=Messagerie MSN
 Comment[ga]=MSN Messenger
@@ -63,7 +62,6 @@ Name[el]=Αποστολέας μηνυμάτων MSN
 Name[en_GB]=MSN Messenger
 Name[eo]=MSN mesaĝilo
 Name[es]=MSN Messenger
-Name[et]=MSN Messenger
 Name[fi]=MSN Messenger
 Name[fr]=Messagerie MSN
 Name[ga]=MSN Messenger
diff --git a/akonadi/contact/editor/im/protocols/skypeprotocol.desktop b/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
index f6ad208..a2c81a6 100644
--- a/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/skypeprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Διαδικτυακή τηλεφωνία Skype
 Comment[en_GB]=Skype Internet Telephony
 Comment[eo]=Skype Interreta Telefonado
 Comment[es]=Telefonía por Internet de Skype
-Comment[et]=Internetitelefon Skype
 Comment[fi]=Skype-internetpuhelin
 Comment[fr]=Téléphonie Internet Skype
 Comment[ga]=Teileafónaíocht Idirlín Skype
@@ -62,7 +61,6 @@ Name[el]=Skype
 Name[en_GB]=Skype
 Name[eo]=kype
 Name[es]=Skype
-Name[et]=Skype
 Name[fi]=Skype
 Name[fr]=Skype
 Name[ga]=Skype
diff --git a/akonadi/contact/editor/im/protocols/smsprotocol.desktop b/akonadi/contact/editor/im/protocols/smsprotocol.desktop
index 20e0f0b..d5fa38c 100644
--- a/akonadi/contact/editor/im/protocols/smsprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/smsprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο SMS
 Comment[en_GB]=SMS Protocol
 Comment[eo]=SMS Protokolo
 Comment[es]=Protocolo SMS
-Comment[et]=SMS protokoll
 Comment[fi]=Tekstiviestiyhteyskäytäntö
 Comment[fr]=Protocole SMS
 Comment[ga]=Prótacal SMS
@@ -63,7 +62,6 @@ Name[el]=SMS
 Name[en_GB]=SMS
 Name[eo]=SMS
 Name[es]=SMS
-Name[et]=SMS
 Name[fi]=Tekstiviesti
 Name[fr]=SMS
 Name[ga]=SMS
diff --git a/akonadi/contact/editor/im/protocols/yahooprotocol.desktop b/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
index f259e53..b400057 100644
--- a/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/yahooprotocol.desktop
@@ -14,7 +14,6 @@ Comment[el]=Πρωτόκολλο Yahoo
 Comment[en_GB]=Yahoo Protocol
 Comment[eo]=Yahoo Protokolo
 Comment[es]=Protocolo Yahoo
-Comment[et]=Yahoo protokoll
 Comment[fi]=Yahoo-yhteyskäytäntö
 Comment[fr]=Protocole Yahoo
 Comment[ga]=Prótacal Yahoo
@@ -63,7 +62,6 @@ Name[el]=Yahoo
 Name[en_GB]=Yahoo
 Name[eo]=Yahoo
 Name[es]=Yahoo
-Name[et]=Yahoo
 Name[fi]=Yahoo
 Name[fr]=Yahoo
 Name[ga]=Yahoo
diff --git a/akonadi/contact/kcm/akonadicontact_actions.desktop b/akonadi/contact/kcm/akonadicontact_actions.desktop
index 0718189..e06de2d 100644
--- a/akonadi/contact/kcm/akonadicontact_actions.desktop
+++ b/akonadi/contact/kcm/akonadicontact_actions.desktop
@@ -19,7 +19,6 @@ Name[de]=Kontakt-Aktionen
 Name[el]=Ενέργειες επαφών
 Name[en_GB]=Contact Actions
 Name[es]=Acciones de contactos
-Name[et]=Kontaktitoimingud
 Name[fi]=Yhteystietotoiminnot
 Name[fr]=Actions sur les contacts
 Name[ga]=Gníomhartha Teagmhála
@@ -70,7 +69,6 @@ Comment[de]=Kontakt-Aktionen einrichten
 Comment[el]=Διαμόρφωση των ενεργειών των επαφών
 Comment[en_GB]=Configure the Contact Actions
 Comment[es]=Configurar las acciones de contactos
-Comment[et]=Kontaktitoimingute seadistamine
 Comment[fi]=Yhteystietotoimintojen asetukset
 Comment[fr]=Configurer les actions sur les contacts
 Comment[ga]=Cumraigh na Gníomhartha Teagmhála
@@ -119,7 +117,6 @@ X-KDE-Keywords[de]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[el]=kaddressbook, διαμόρφωση, ρυθμίσεις, επαφή, ενέργειες
 X-KDE-Keywords[en_GB]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[es]=kaddressbook, configurar, preferencias, contacto, acciones
-X-KDE-Keywords[et]=kde aadressiraamat, seadistamine, seadistused, kontakt, toimingud
 X-KDE-Keywords[fi]=kaddressbook, asetukset, yhteystieto, toiminnot
 X-KDE-Keywords[fr]=KAddressBook, configuration, paramètres, contacts, actions
 X-KDE-Keywords[ga]=kaddressbook, cumraigh, cumraíocht, socruithe, teagmháil, gníomhartha
diff --git a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
index dfce256..242dfd0 100644
--- a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
+++ b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
@@ -8,7 +8,6 @@ Name[de]=SocialFeedItem-Serialisierung
 Name[el]=Πρόγραμμα γραμμικής διάταξης SocialFeedItem
 Name[en_GB]=SocialFeedItem Serializer
 Name[es]=Serializador SocialFeedItem
-Name[et]=SocialFeedItemi jadasti
 Name[fi]=SocialFeedItem-serialisoija
 Name[fr]=Sérialiseur « SocialFeedItem »
 Name[gl]=Serializador SocialFeedItem
@@ -46,7 +45,6 @@ Comment[de]=Akonadi-Modul zur Serialisierung für SocialFeedItem
 Comment[el]=ένα πρόσθετο γραμμικής διάταξης του Akonadi για το SocialFeedItem
 Comment[en_GB]=An Akonadi serializer plugin for SocialFeedItem
 Comment[es]=Un complemento de serializador Akonadi para SocialFeedItem
-Comment[et]=Akonadi SocialFeedItemi jadastamisplugin
 Comment[fi]=Akonadi-serialisoijaliitännäinen SocialFeedItemille
 Comment[fr]=Un module externe de sérialisation Akonadi pour « SocialFeedItem »
 Comment[gl]=Un complemento serializador de Akonadi para SocialFeedItem.
diff --git a/kabc/formats/binary.desktop b/kabc/formats/binary.desktop
index 2f31b04..67b83f8 100644
--- a/kabc/formats/binary.desktop
+++ b/kabc/formats/binary.desktop
@@ -10,7 +10,6 @@ Name[de]=Binär
 Name[el]=Δυαδικό
 Name[en_GB]=Binary
 Name[es]=Binario
-Name[et]=Binaar
 Name[fi]=Binaari
 Name[fr]=Binaire
 Name[ga]=Dénártha
diff --git a/kabc/kabc_manager.desktop b/kabc/kabc_manager.desktop
index c9c8790..d908940 100644
--- a/kabc/kabc_manager.desktop
+++ b/kabc/kabc_manager.desktop
@@ -12,7 +12,6 @@ Name[el]=Επαφές
 Name[en_GB]=Contacts
 Name[eo]=Kontaktoj
 Name[es]=Contactos
-Name[et]=Kontaktid
 Name[fi]=Yhteystiedot
 Name[fr]=Contacts
 Name[ga]=Teagmhálacha
diff --git a/kabc/plugins/dir/dir.desktop b/kabc/plugins/dir/dir.desktop
index 6338a2e..ed99365 100644
--- a/kabc/plugins/dir/dir.desktop
+++ b/kabc/plugins/dir/dir.desktop
@@ -10,7 +10,6 @@ Name[el]=Φάκελος
 Name[en_GB]=Folder
 Name[eo]=Dosierujo
 Name[es]=Carpeta
-Name[et]=Kataloog
 Name[fi]=Kansio
 Name[fr]=Dossier
 Name[ga]=Fillteán
diff --git a/kabc/plugins/file/file.desktop b/kabc/plugins/file/file.desktop
index 553f017..2df65ae 100644
--- a/kabc/plugins/file/file.desktop
+++ b/kabc/plugins/file/file.desktop
@@ -11,7 +11,6 @@ Name[el]=Αρχείο
 Name[en_GB]=File
 Name[eo]=Dosiero
 Name[es]=Archivo
-Name[et]=Fail
 Name[fi]=Tiedosto
 Name[fr]=Fichier
 Name[ga]=Comhad
diff --git a/kabc/plugins/ldapkio/ldapkio.desktop b/kabc/plugins/ldapkio/ldapkio.desktop
index 112cf90..25255c9 100644
--- a/kabc/plugins/ldapkio/ldapkio.desktop
+++ b/kabc/plugins/ldapkio/ldapkio.desktop
@@ -11,7 +11,6 @@ Name[el]=LDAP
 Name[en_GB]=LDAP
 Name[eo]=LDAP
 Name[es]=LDAP
-Name[et]=LDAP
 Name[fi]=LDAP
 Name[fr]=LDAP
 Name[ga]=LDAP
@@ -66,7 +65,6 @@ Comment[de]=Ermöglicht Zugriff auf Kontakte, die auf einem LDAP-Server gespeich
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε έναν εξυπηρετητή καταλόγου LDAP
 Comment[en_GB]=Provides access to contacts stored on a LDAP directory server
 Comment[es]=Provee acceso a los contactos almacenados en un servidor de directorios LDAP
-Comment[et]=Võimaldab kasutada LDAP kataloogiserverisse salvestatud kontakte
 Comment[fi]=Tarjoaa pääsyn LDAP-hakemistopalvelimelle tallennettuihin yhteystietoihin
 Comment[fr]=Fournit un accès aux contacts enregistrés dans un annuaire LDAP
 Comment[ga]=Soláthraíonn sé seo rochtain ar theagmhálacha atá stóráilte in eolaire LDAP
diff --git a/kabc/plugins/net/net.desktop b/kabc/plugins/net/net.desktop
index 54a3df3..1aa3aec 100644
--- a/kabc/plugins/net/net.desktop
+++ b/kabc/plugins/net/net.desktop
@@ -11,7 +11,6 @@ Name[el]=Δίκτυο
 Name[en_GB]=Network
 Name[eo]=Reto
 Name[es]=Red
-Name[et]=Võrk
 Name[fi]=Verkko
 Name[fr]=Réseau
 Name[ga]=Líonra
diff --git a/kcal/kcal_manager.desktop b/kcal/kcal_manager.desktop
index 282549e..dd9573e 100644
--- a/kcal/kcal_manager.desktop
+++ b/kcal/kcal_manager.desktop
@@ -12,7 +12,6 @@ Name[el]=Ημερολόγιο
 Name[en_GB]=Calendar
 Name[eo]=Kalendaro
 Name[es]=Calendario
-Name[et]=Kalender
 Name[fi]=Kalenteri
 Name[fr]=Calendrier
 Name[ga]=Féilire
diff --git a/kcal/localdir.desktop b/kcal/localdir.desktop
index 664adb2..4c73f76 100644
--- a/kcal/localdir.desktop
+++ b/kcal/localdir.desktop
@@ -10,7 +10,6 @@ Name[de]=Kalender in lokalem Ordner
 Name[el]=Ημερολόγιο σε τοπικό κατάλογο
 Name[en_GB]=Calendar in Local Directory
 Name[es]=Calendario en directorio local
-Name[et]=Kalender kohalikus kataloogis
 Name[fi]=Kalenteri paikallisessa kansiossa
 Name[fr]=Calendrier dans un dossier local
 Name[ga]=Féilire i gComhadlann Logánta
@@ -62,7 +61,6 @@ Comment[de]=Ermöglicht Zugriff auf Kalender, die jeweils in einzelnen Dateien i
 Comment[el]=Προσφέρει πρόσβαση σε αντικείμενα ημερολογίου, αποθηκευμένα σε ξεχωριστά αρχεία, σε ένα δοσμένο κατάλογο
 Comment[en_GB]=Provides access to calendar items, each stored in a single file, in a given directory
 Comment[es]=Provee acceso a elementos de un calendario, cada uno almacenado en un archivo diferente, dentro de un directorio determinado
-Comment[et]=Võimaldab kasutada eraldi failidesse salvestatud kalendrielemente määratud kataloogis
 Comment[fi]=Tarjoaa pääsyn annetun kansion erillisiin tiedostoihin tallennettuihin kalenteritietueisiin
 Comment[fr]=Fournit un accès à des entrées d'agenda, chaque élément étant enregistré dans un fichier unique, dans le dossier indiqué
 Comment[ga]=Soláthraíonn sé seo rochtain ar mhíreanna féilire, gach ceann stóráilte i gcomhad aonair, i gcomhadlann sonraithe
diff --git a/kioslave/sieve/sieve.protocol b/kioslave/sieve/sieve.protocol
index 6333da2..ce62b67 100644
--- a/kioslave/sieve/sieve.protocol
+++ b/kioslave/sieve/sieve.protocol
@@ -22,7 +22,6 @@ Description[de]=Ein Ein-/Ausgabemodul für das Mailfilter-Protokoll Sieve
 Description[el]=Ένα ioslave για το πρωτόκολλο φιλτραρίσματος αλληλογραφίας Sieve
 Description[en_GB]=An ioslave for the Sieve mail filtering protocol
 Description[es]=Un esclavo de E/S para el protocolo de filtrado de correo Sieve
-Description[et]=Sieve kirjade filtreerimise protokolli IO-moodul
 Description[fi]=I/O-asiakas Sieve-postinsuodatusyhteyskäytännölle
 Description[fr]=Un module d'entrées / sorties pour le protocole de filtrage de messagerie « Sieve »
 Description[ga]=Sclábhaí I/A le haghaidh prótacail scagtha ríomhphoist Sieve
diff --git a/kontactinterface/kontactplugin.desktop b/kontactinterface/kontactplugin.desktop
index 5ebe951..a33a0c1 100644
--- a/kontactinterface/kontactplugin.desktop
+++ b/kontactinterface/kontactplugin.desktop
@@ -11,7 +11,6 @@ Name[de]=Kontact-Modul
 Name[el]=Πρόσθετο Kontact
 Name[en_GB]=Kontact Plugin
 Name[es]=Complemento de Kontact
-Name[et]=Kontacti plugin
 Name[fi]=Kontact-liitännäinen
 Name[fr]=Module externe pour Kontact
 Name[ga]=Breiseán Kontact
diff --git a/kresources/kresources.desktop b/kresources/kresources.desktop
index 6f36326..33b5da1 100644
--- a/kresources/kresources.desktop
+++ b/kresources/kresources.desktop
@@ -19,7 +19,6 @@ Name[de]=KDE-Ressourcen
 Name[el]=Πόροι του KDE
 Name[en_GB]=KDE Resources
 Name[es]=Recursos KDE
-Name[et]=KDE ressursid
 Name[fi]=KDE-resurssit
 Name[fr]=Ressources KDE
 Name[ga]=Acmhainní KDE
@@ -74,7 +73,6 @@ Comment[de]=KDE-Ressourcen einrichten
 Comment[el]=Διαμόρφωση πόρων του KDE
 Comment[en_GB]=Configure KDE Resources
 Comment[es]=Configurar recursos de KDE
-Comment[et]=KDE ressursside seadistamine
 Comment[fi]=KDE-resurssien asetukset
 Comment[fr]=Configurer les ressources KDE
 Comment[ga]=Cumraigh Acmhainní KDE
@@ -126,7 +124,6 @@ X-KDE-Keywords[de]=resources,konnector resource,contact resource,calendar resour
 X-KDE-Keywords[el]=πόροι,πόρος konnector,επαφή,πόρος,πόρος ημερολογίου,πόρος σημειώσεων,πόρος ειδοποιήσεων,imap
 X-KDE-Keywords[en_GB]=resources,connector resource,contact resource,calendar resource,notes resource,alarm resource,imap
 X-KDE-Keywords[es]=recursos,recurso de conector,recurso de contacto,recurso de calendario,recurso de notas,recurso de alarma,imap
-X-KDE-Keywords[et]=ressursid,konnektor,ressurss,kontaktiressurss,kalendriressurss,märkmeressurss,häireressurss,imap
 X-KDE-Keywords[fi]=resurssit,konnector-resurssi,yhteystietoresurssi,kalenteriresurssi,muistiinpanoresurssi,hälytysresurssi,imap
 X-KDE-Keywords[fr]=ressources, ressource connecteur, ressource contact, ressource agenda, ressource notes, ressource alarme, imap
 X-KDE-Keywords[ga]=acmhainní,acmhainn konnector,acmhainn teagmhála,acmhainn fhéilire,acmhainn nótaí,acmhainn aláraim,imap
diff --git a/kresources/kresources_manager.desktop b/kresources/kresources_manager.desktop
index 8dfa587..b1a5e25 100644
--- a/kresources/kresources_manager.desktop
+++ b/kresources/kresources_manager.desktop
@@ -9,7 +9,6 @@ Name[de]=Ressourcenverwaltung
 Name[el]=Διαχειριστής KResources
 Name[en_GB]=KResources Manager
 Name[es]=Gestor de KResources
-Name[et]=KDE ressursside haldur
 Name[fi]=KResources-hallinta
 Name[fr]=Gestionnaire de ressources
 Name[ga]=Bainisteoir KResources
@@ -65,7 +64,6 @@ Comment[de]=Ressourcenverwaltung
 Comment[el]=Διαχειριστής KResources
 Comment[en_GB]=KResources Manager
 Comment[es]=Gestor de KResources
-Comment[et]=KDE ressursside haldur
 Comment[fi]=KResources-hallinta
 Comment[fr]=Gestionnaire KResources
 Comment[ga]=Bainisteoir KResources
diff --git a/kresources/kresources_plugin.desktop b/kresources/kresources_plugin.desktop
index 5aae84c..628769c 100644
--- a/kresources/kresources_plugin.desktop
+++ b/kresources/kresources_plugin.desktop
@@ -9,7 +9,6 @@ Name[de]=KRessourcen-Modul
 Name[el]=Πρόσθετο KResources
 Name[en_GB]=KResources Plugin
 Name[es]=Complemento de KResources
-Name[et]=KDE ressursside plugin
 Name[fi]=KResources-liitännäinen
 Name[fr]=Module externe KResources
 Name[ga]=Breiseán KResources
@@ -64,7 +63,6 @@ Comment[de]=Modul für KRessourcen-Grundgerüst
 Comment[el]=Πρόσθετο πλαισίου εργασίας του KResource
 Comment[en_GB]=KResources Framework Plugin
 Comment[es]=Complemento de infraestructura de KResources
-Comment[et]=KDE ressursside raamistiku plugin
 Comment[fi]=KResources-kehysliitännäinen
 Comment[fr]=Module externe d'environnement KResources
 Comment[ga]=Breiseán Creatlaí KResources
diff --git a/mailtransport/kcm_mailtransport.desktop b/mailtransport/kcm_mailtransport.desktop
index cd91956..f0587b3 100644
--- a/mailtransport/kcm_mailtransport.desktop
+++ b/mailtransport/kcm_mailtransport.desktop
@@ -22,7 +22,6 @@ Name[de]=Versandart
 Name[el]=Κύριος μεταφορέας
 Name[en_GB]=Mail Transport
 Name[es]=Transporte de correo
-Name[et]=Kirja saatmise viis
 Name[fi]=Postinvälitys
 Name[fr]=Transport de courrier électronique
 Name[ga]=Iompar Ríomhphoist


commit 8604cff4d7c5971c6d84af71763cb2eee729f32a
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jul 23 15:41:26 2014 +0200

    ETMCalendar: Iterate over the different collections.
    
    REVIEW: 119423

diff --git a/akonadi/calendar/etmcalendar.cpp b/akonadi/calendar/etmcalendar.cpp
index 29d51eb..9bb16d4 100644
--- a/akonadi/calendar/etmcalendar.cpp
+++ b/akonadi/calendar/etmcalendar.cpp
@@ -346,10 +346,8 @@ void ETMCalendarPrivate::onDataChanged(const QModelIndex &topLeft,
     // We only update collections, because items are handled in the filtered model
     Q_ASSERT(topLeft.row() <= bottomRight.row());
     const int endRow = bottomRight.row();
-    QModelIndex i(topLeft);
-    int row = i.row();
-    while (row <= endRow) {
-        const Akonadi::Collection col = collectionFromIndex(i);
+    for (int row = topLeft.row(); row <= endRow; row++) {
+        const Akonadi::Collection col = collectionFromIndex(topLeft.sibling(row, 0));
         if (col.isValid()) {
             // Attributes might have changed, store the new collection and discard the old one
             mCollectionMap.insert(col.id(), col);


commit b0ddb3436600d2c264674fdbadbe34dcd0fffac0
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jul 23 14:46:50 2014 +0200

    ETMCalendar: Use listfilter to hide non-enabled collections

diff --git a/akonadi/calendar/etmcalendar.cpp b/akonadi/calendar/etmcalendar.cpp
index f0003e4..29d51eb 100644
--- a/akonadi/calendar/etmcalendar.cpp
+++ b/akonadi/calendar/etmcalendar.cpp
@@ -73,6 +73,7 @@ void ETMCalendarPrivate::init()
         monitor->setCollectionMonitored(Akonadi::Collection::root());
         monitor->fetchCollection(true);
         monitor->setItemFetchScope(scope);
+        monitor->setAllMonitored(true);
 
         QStringList allMimeTypes;
         allMimeTypes << KCalCore::Event::eventMimeType() << KCalCore::Todo::todoMimeType()
@@ -84,6 +85,7 @@ void ETMCalendarPrivate::init()
 
         mETM = CalendarModel::create(monitor);
         mETM->setObjectName("ETM");
+        mETM->setListFilter(Akonadi::CollectionFetchScope::Display);
     }
 
     setupFilteredETM();


commit 4a447ae4f3899cf51e450ab2ca3fe95bcfa67b86
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jul 23 13:57:48 2014 +0200

    added CollectionIdentificationAttribute

diff --git a/akonadi/CMakeLists.txt b/akonadi/CMakeLists.txt
index a6fc0aa..5b748c3 100644
--- a/akonadi/CMakeLists.txt
+++ b/akonadi/CMakeLists.txt
@@ -87,6 +87,7 @@ set( akonadikde_LIB_SRC
   collectionfilterproxymodel.cpp
   collectionfetchjob.cpp
   collectionfetchscope.cpp
+  collectionidentificationattribute.cpp
   collectionmodel.cpp
   collectionmodel_p.cpp
   collectionmodifyjob.cpp
@@ -338,6 +339,7 @@ install( FILES
   collectionfilterproxymodel.h
   collectionfetchjob.h
   collectionfetchscope.h
+  collectionidentificationattribute.h
   collectionmodel.h
   collectionmodifyjob.h
   collectionmovejob.h
diff --git a/akonadi/collectionidentificationattribute.cpp b/akonadi/collectionidentificationattribute.cpp
new file mode 100644
index 0000000..ae3908d
--- /dev/null
+++ b/akonadi/collectionidentificationattribute.cpp
@@ -0,0 +1,97 @@
+/*
+    Copyright (c) 2014 Christian Mollekopf <mollekopf at kolabsys.com>
+
+    This library is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Library General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    This library is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+    License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to the
+    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA.
+*/
+
+#include "collectionidentificationattribute.h"
+
+#include "imapparser_p.h"
+
+#include <QByteArray>
+#include <QList>
+
+class CollectionIdentificationAttribute::Private
+{
+public:
+    Private() {}
+    QByteArray mFolderNamespace;
+    QByteArray mIdentifier;
+};
+
+CollectionIdentificationAttribute::CollectionIdentificationAttribute(const QByteArray &identifier, const QByteArray &folderNamespace)
+    :d(new Private)
+{
+    d->mIdentifier = identifier;
+    d->mFolderNamespace = folderNamespace;
+}
+
+CollectionIdentificationAttribute::~CollectionIdentificationAttribute()
+{
+    delete d;
+}
+
+void CollectionIdentificationAttribute::setIdentifier(const QByteArray &identifier)
+{
+    d->mIdentifier = identifier;
+}
+
+QByteArray CollectionIdentificationAttribute::identifier() const
+{
+    return d->mIdentifier;
+}
+
+void CollectionIdentificationAttribute::setCollectionNamespace(const QByteArray &ns)
+{
+    d->mFolderNamespace = ns;
+}
+
+QByteArray CollectionIdentificationAttribute::collectionNamespace() const
+{
+    return d->mFolderNamespace;
+}
+
+QByteArray CollectionIdentificationAttribute::type() const
+{
+    return "collectionidentification";
+}
+
+Akonadi::Attribute* CollectionIdentificationAttribute::clone() const
+{
+    return new CollectionIdentificationAttribute(d->mIdentifier, d->mFolderNamespace);
+}
+
+QByteArray CollectionIdentificationAttribute::serialized() const
+{
+    QList<QByteArray> l;
+    l << Akonadi::ImapParser::quote(d->mIdentifier);
+    l << Akonadi::ImapParser::quote(d->mFolderNamespace);
+    return '(' + Akonadi::ImapParser::join(l, " ") + ')';
+}
+
+void CollectionIdentificationAttribute::deserialize(const QByteArray &data)
+{
+    QList<QByteArray> l;
+    Akonadi::ImapParser::parseParenthesizedList(data, l);
+    const int size = l.size();
+    Q_ASSERT(size >= 2);
+    if (size < 2) {
+        return;
+    }
+    d->mIdentifier = l[0];
+    d->mFolderNamespace = l[1];
+}
+
diff --git a/akonadi/collectionidentificationattribute.h b/akonadi/collectionidentificationattribute.h
new file mode 100644
index 0000000..c0204c0
--- /dev/null
+++ b/akonadi/collectionidentificationattribute.h
@@ -0,0 +1,67 @@
+/*
+    Copyright (c) 2014 Christian Mollekopf <mollekopf at kolabsys.com>
+
+    This library is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Library General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    This library is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+    License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to the
+    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA.
+*/
+
+#ifndef COLLECTIONIDENTIFICATIONATTRIBUTE_H
+#define COLLECTIONIDENTIFICATIONATTRIBUTE_H
+
+#include <akonadi/attribute.h>
+#include <QByteArray>
+
+/**
+ * @short Attribute that stores additional information on a collection that can be used for searching.
+ *
+ * Additional indexed properties that can be used for searching.
+ *
+ * @author Christian Mollekopf <mollekopf at kolabsys.com>
+ * @since 4.15
+ */
+class AKONADI_EXPORT CollectionIdentificationAttribute : public Akonadi::Attribute
+{
+public:
+    explicit CollectionIdentificationAttribute(const QByteArray &identifier = QByteArray(), const QByteArray &folderNamespace = QByteArray());
+    ~CollectionIdentificationAttribute();
+
+    /**
+     * Sets an identifier for the collection.
+     */
+    void setIdentifier(const QByteArray &);
+    QByteArray identifier() const;
+
+    /**
+     * Sets a namespace the collection is in.
+     *
+     * Initially used are:
+     * * "person" for a collection shared by a person.
+     * * "shared" for a collection shared by a person.
+     */
+    void setCollectionNamespace(const QByteArray &);
+    QByteArray collectionNamespace() const;
+    virtual QByteArray type() const;
+    virtual Attribute* clone() const;
+    virtual QByteArray serialized() const;
+    virtual void deserialize(const QByteArray &data);
+
+private:
+    //@cond PRIVATE
+    class Private;
+    Private* const d;
+    //@endcond
+};
+
+#endif
diff --git a/akonadi/tests/collectionattributetest.cpp b/akonadi/tests/collectionattributetest.cpp
index f0de6b7..92ac7e7 100644
--- a/akonadi/tests/collectionattributetest.cpp
+++ b/akonadi/tests/collectionattributetest.cpp
@@ -28,6 +28,7 @@
 #include <akonadi/collectionmodifyjob.h>
 #include <akonadi/collectionrightsattribute_p.h>
 #include <akonadi/control.h>
+#include <akonadi/collectionidentificationattribute.h>
 
 #include <qtest_akonadi.h>
 
@@ -191,3 +192,19 @@ void CollectionAttributeTest::testCollectionRightsAttribute()
     QCOMPARE( attribute.rights(), rights );
   }
 }
+
+void CollectionAttributeTest::testCollectionIdentifcationAttribute()
+{
+  QByteArray id("identifier");
+  QByteArray ns("namespace");
+  CollectionIdentificationAttribute attribute(id, ns);
+  QCOMPARE(attribute.identifier(), id);
+  QCOMPARE(attribute.collectionNamespace(), ns);
+
+  QByteArray result = attribute.serialized();
+  CollectionIdentificationAttribute parsed;
+  parsed.deserialize(result);
+  kDebug() << parsed.identifier() << parsed.collectionNamespace() << result;;
+  QCOMPARE(parsed.identifier(), id);
+  QCOMPARE(parsed.collectionNamespace(), ns);
+}
diff --git a/akonadi/tests/collectionattributetest.h b/akonadi/tests/collectionattributetest.h
index 118857d..b78dd74 100644
--- a/akonadi/tests/collectionattributetest.h
+++ b/akonadi/tests/collectionattributetest.h
@@ -31,6 +31,7 @@ class CollectionAttributeTest : public QObject
     void testAttributes();
     void testDefaultAttributes();
     void testCollectionRightsAttribute();
+    void testCollectionIdentifcationAttribute();
 };
 
 #endif


commit 9c2537e2078c1c74dab01f3181e5f3143d11c862
Author: Montel Laurent <montel at kde.org>
Date:   Tue Jul 22 21:14:25 2014 +0200

    Fix crash

diff --git a/mailtransport/tests/transportmgr.cpp b/mailtransport/tests/transportmgr.cpp
index cdb2de5..23d7031 100644
--- a/mailtransport/tests/transportmgr.cpp
+++ b/mailtransport/tests/transportmgr.cpp
@@ -79,9 +79,12 @@ void TransportMgr::editBtnClicked()
 {
   // NOTE: Using deprecated TransportConfigDialog here for testing purposes.
   // The TransportManagementWidget uses the non-deprecated method instead.
+  const int index = mComboBox->currentTransportId();
+  if (index < 0)
+      return;
   TransportConfigDialog *t =
     new TransportConfigDialog(
-      TransportManager::self()->transportById( mComboBox->currentTransportId() ), this );
+      TransportManager::self()->transportById( index ), this );
   t->exec();
   delete t;
 }


commit 5ad11287fca3fc49b00fda1e362e0057c44db2bd
Author: Montel Laurent <montel at kde.org>
Date:   Thu Jul 17 07:47:49 2014 +0200

    Fix enable/disable. Fix change windowTitle

diff --git a/akonadi/collectionrequester.cpp b/akonadi/collectionrequester.cpp
index 02f913d..79bc982 100644
--- a/akonadi/collectionrequester.cpp
+++ b/akonadi/collectionrequester.cpp
@@ -239,4 +239,18 @@ void CollectionRequester::changeCollectionDialogOptions(CollectionDialog::Collec
     }
 }
 
+void CollectionRequester::changeEvent(QEvent *event)
+{
+    if (event->type() == QEvent::WindowTitleChange) {
+        if (d->collectionDialog) {
+            d->collectionDialog->setCaption(windowTitle());
+        }
+    } else if (event->type() == QEvent::EnabledChange) {
+        if (d->collectionDialog) {
+            d->collectionDialog->setEnabled(true);
+        }
+    }
+    KHBox::changeEvent(event);
+}
+
 #include "moc_collectionrequester.cpp"
diff --git a/akonadi/collectionrequester.h b/akonadi/collectionrequester.h
index e79ac88..42e5e51 100644
--- a/akonadi/collectionrequester.h
+++ b/akonadi/collectionrequester.h
@@ -115,6 +115,9 @@ public:
      */
     void changeCollectionDialogOptions(CollectionDialog::CollectionDialogOptions options);
 
+protected:
+    void changeEvent(QEvent * event);
+
 public Q_SLOTS:
     /**
      * Sets the @p collection of the requester.


commit 48e222adc1fc27fbd6e63675f6a21475a68796dc
Author: l10n daemon script <scripty at kde.org>
Date:   Wed Jul 16 05:00:57 2014 +0000

    SVN_SILENT made messages (.desktop file)

diff --git a/akonadi/contact/kcm/akonadicontact_actions.desktop b/akonadi/contact/kcm/akonadicontact_actions.desktop
index 9e31c5b..0718189 100644
--- a/akonadi/contact/kcm/akonadicontact_actions.desktop
+++ b/akonadi/contact/kcm/akonadicontact_actions.desktop
@@ -91,7 +91,7 @@ Comment[nds]=Kontakt-Akschonen instellen
 Comment[nl]=De contactpersoon-actie configureren
 Comment[nn]=Set opp kontakthandlingar
 Comment[pa]=ਸੰਪਰਕ ਐਕਸ਼ਨ ਸੰਰਚਨਾ
-Comment[pl]=Konfiguruj działania kontaktu
+Comment[pl]=Ustaw działania kontaktu
 Comment[pt]=Configurar as Acções do Contacto
 Comment[pt_BR]=Configura as ações do contato
 Comment[ro]=Configurează acțiunile contact
diff --git a/kresources/kresources.desktop b/kresources/kresources.desktop
index 5ebe021..6f36326 100644
--- a/kresources/kresources.desktop
+++ b/kresources/kresources.desktop
@@ -96,7 +96,7 @@ Comment[nds]=KDE Ressourcen instellen
 Comment[nl]=KDE-hulpbronnen instellen
 Comment[nn]=Set opp KDE-ressursar
 Comment[pa]=KDE ਸਰੋਤ ਸੰਰਚਨਾ
-Comment[pl]=Konfiguruj zasoby KDE
+Comment[pl]=Ustaw zasoby KDE
 Comment[pt]=Configurar os Recursos do KDE
 Comment[pt_BR]=Configura as fontes de dados do KDE
 Comment[ro]=Configurare resurse KDE
diff --git a/kresources/kresources_manager.desktop b/kresources/kresources_manager.desktop
index 07f0b34..8dfa587 100644
--- a/kresources/kresources_manager.desktop
+++ b/kresources/kresources_manager.desktop
@@ -31,7 +31,7 @@ Name[nds]=KResources-Pleger
 Name[nl]=KResource-beheerder
 Name[nn]=KResources-handsaming
 Name[pa]=ਕੇ-ਰੀਸੋਰਸ ਮੈਨੇਜਰ
-Name[pl]=Menadżer zasobów KDE (KResource)
+Name[pl]=ZarzÄ…dzanie zasobami KDE (KResource)
 Name[pt]=Gestor do KResources
 Name[pt_BR]=Gerenciador do KResource
 Name[ro]=Gestionar KResurse
@@ -87,7 +87,7 @@ Comment[nds]=KDE-Ressourcenpleger
 Comment[nl]=KResource-beheerder
 Comment[nn]=KResource-handsaming
 Comment[pa]=ਕੇ-ਰੀਸੋਰਸ ਮੈਨੇਜਰ
-Comment[pl]=Menadżer zasobów KDE (KResource)
+Comment[pl]=ZarzÄ…dzanie zasobami KDE (KResource)
 Comment[pt]=Gestor do KResources
 Comment[pt_BR]=Gerenciador do KResource
 Comment[ro]=Gestionar KResurse


commit 811371038c2db0a06e7a31d1bd45d322617d0cb6
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Jun 24 09:36:30 2014 +0200

    Tagsupport for knutresource
    
    REVIEW: 119236

diff --git a/akonadi/tests/testresource/knutresource.cpp b/akonadi/tests/testresource/knutresource.cpp
index 2e61dc7..3522409 100644
--- a/akonadi/tests/testresource/knutresource.cpp
+++ b/akonadi/tests/testresource/knutresource.cpp
@@ -31,6 +31,7 @@
 #include <akonadi/dbusconnectionpool.h>
 #include <akonadi/item.h>
 #include <akonadi/itemfetchscope.h>
+#include <akonadi/tagcreatejob.h>
 
 #include <kfiledialog.h>
 #include <klocale.h>
@@ -131,6 +132,11 @@ void KnutResource::retrieveCollections()
 {
   const Collection::List collections = mDocument.collections();
   collectionsRetrieved( collections );
+  const Tag::List tags = mDocument.tags();
+  Q_FOREACH ( const Tag &tag, tags ) {
+      TagCreateJob *createjob = new TagCreateJob(tag);
+      createjob->setMergeIfExisting(true);
+  }
 }
 
 void KnutResource::retrieveItems( const Akonadi::Collection &collection )
diff --git a/akonadi/tests/unittestenv/kdehome/testdata-res1.xml b/akonadi/tests/unittestenv/kdehome/testdata-res1.xml
index 638904c..db51834 100644
--- a/akonadi/tests/unittestenv/kdehome/testdata-res1.xml
+++ b/akonadi/tests/unittestenv/kdehome/testdata-res1.xml
@@ -18,6 +18,7 @@
     <payload>testmailbody1</payload>
     <attribute type="HEAD">From: <test1 at user.tst></attribute>
     <flag>\FLAGGED</flag>
+    <tag>tagrid</tag>
    </item>
    <item rid="C" mimetype="application/octet-stream">
     <payload>testmailbody2</payload>
@@ -73,4 +74,5 @@
    </item>
   </collection>
  </collection>
+ <tag name="name" type="type" gid="taggid" rid="tagrid"></tag>
 </knut>
diff --git a/akonadi/xml/akonadi-xml.xsd b/akonadi/xml/akonadi-xml.xsd
index 4dba490..661b4ff 100644
--- a/akonadi/xml/akonadi-xml.xsd
+++ b/akonadi/xml/akonadi-xml.xsd
@@ -26,6 +26,7 @@
      <xsd:sequence>
        <xsd:element name="collection" type="collectionType" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="item"       type="itemType"       minOccurs="0" maxOccurs="unbounded"/>
+       <xsd:element name="tag"        type="tagType"        minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
   </xsd:element>
@@ -46,11 +47,22 @@
       <xsd:element name="payload"    type="payloadType"   minOccurs="0" maxOccurs="1"/>
       <xsd:element name="attribute"  type="attributeType" minOccurs="0" maxOccurs="unbounded"/>
       <xsd:element name="flag"       type="flagType"      minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="tag"        type="tagRIDRefType"    minOccurs="0" maxOccurs="unbounded"/>
     </xsd:sequence>
     <xsd:attribute name="rid"        type="xsd:string" use="required"/>
     <xsd:attribute name="mimetype"   type="xsd:string" use="required"/>
   </xsd:complexType>
 
+  <xsd:complexType name="tagType">
+    <xsd:sequence>
+      <xsd:element name="tag"        type="tagType"       minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="rid"        type="xsd:string" use="required"/>
+    <xsd:attribute name="type"       type="xsd:string" use="required"/>
+    <xsd:attribute name="gid"        type="xsd:string" use="required"/>
+    <xsd:attribute name="name"       type="xsd:string" use="required"/>
+  </xsd:complexType>
+
   <xsd:complexType name="payloadType">
     <xsd:simpleContent>
       <xsd:extension base="xsd:string"/>
@@ -71,4 +83,10 @@
     </xsd:simpleContent>
   </xsd:complexType>
 
+  <xsd:complexType name="tagRIDRefType">
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string"/>
+    </xsd:simpleContent>
+  </xsd:complexType>
+
 </xsd:schema>
diff --git a/akonadi/xml/format_p.h b/akonadi/xml/format_p.h
index 9144797..8e9e3b4 100644
--- a/akonadi/xml/format_p.h
+++ b/akonadi/xml/format_p.h
@@ -33,6 +33,7 @@ namespace Tag {
   inline QString item() { return QString::fromLatin1( "item" ); }
   inline QString attribute() { return QString::fromLatin1( "attribute" ); }
   inline QString flag() { return QString::fromLatin1( "flag" ); }
+  inline QString tag() { return QString::fromLatin1( "tag" ); }
   inline QString payload() { return QString::fromLatin1( "payload" ); }
 
 }
@@ -44,6 +45,9 @@ namespace Attr {
   inline QString collectionName() { return QString::fromLatin1( "name" ); }
   inline QString collectionContentTypes() { return QString::fromLatin1( "content" ); }
   inline QString itemMimeType() { return QString::fromLatin1( "mimetype" ); }
+  inline QString name() { return QString::fromLatin1( "name" ); }
+  inline QString gid() { return QString::fromLatin1( "gid" ); }
+  inline QString type() { return QString::fromLatin1( "type" ); }
 
 }
 
diff --git a/akonadi/xml/xmldocument.cpp b/akonadi/xml/xmldocument.cpp
index 0c30086..a8f7f64 100644
--- a/akonadi/xml/xmldocument.cpp
+++ b/akonadi/xml/xmldocument.cpp
@@ -271,6 +271,11 @@ Collection::List XmlDocument::collections() const
   return XmlReader::readCollections( d->document.documentElement() );
 }
 
+Tag::List XmlDocument::tags() const
+{
+  return XmlReader::readTags( d->document.documentElement() );
+}
+
 Collection::List XmlDocument::childCollections(const QString& parentCollectionRid) const
 {
   Collection c;
diff --git a/akonadi/xml/xmldocument.h b/akonadi/xml/xmldocument.h
index 0f768cc..4e20704 100644
--- a/akonadi/xml/xmldocument.h
+++ b/akonadi/xml/xmldocument.h
@@ -114,6 +114,11 @@ class AKONADI_XML_EXPORT XmlDocument
     Collection::List collections() const;
 
     /**
+      Returns the tags defined in this document.
+    */
+    Tag::List tags() const;
+
+    /**
       Returns immediate child collections of the specified parent collection.
       @deprecated Not HRID aware, use childCollections( Akonadi::Collection ) instead
     */
diff --git a/akonadi/xml/xmlreader.cpp b/akonadi/xml/xmlreader.cpp
index cdd91f7..a9fe516 100644
--- a/akonadi/xml/xmlreader.cpp
+++ b/akonadi/xml/xmlreader.cpp
@@ -22,6 +22,7 @@
 #include "format_p.h"
 
 #include <akonadi/attributefactory.h>
+#include <akonadi/tag.h>
 
 #include <QStringList>
 
@@ -85,6 +86,45 @@ Collection::List XmlReader::readCollections(const QDomElement& elem)
   return rv;
 }
 
+Tag XmlReader::elementToTag(const QDomElement& elem)
+{
+  if ( elem.isNull() || elem.tagName() != Format::Tag::tag() )
+    return Tag();
+
+  Tag t;
+  t.setRemoteId( elem.attribute( Format::Attr::remoteId() ).toUtf8() );
+  t.setName( elem.attribute( Format::Attr::name() ) );
+  t.setGid( elem.attribute( Format::Attr::gid() ).toUtf8() );
+  t.setType( elem.attribute( Format::Attr::type() ).toUtf8() );
+
+  //TODO Implement rid parent support in TagCreateJob first
+  // const QDomElement parentElem = elem.parentNode().toElement();
+  // if ( !parentElem.isNull() && parentElem.tagName() == Format::Tag::tag() ) {
+  //   Tag parent;
+  //   parent.setRemoteId( parentElem.attribute( Format::Attr::remoteId() ).toLatin1() );
+  //   t.setParent( parent );
+  // }
+
+  return t;
+}
+
+Tag::List XmlReader::readTags(const QDomElement& elem)
+{
+  Tag::List rv;
+  if ( elem.isNull() )
+    return rv;
+  if ( elem.tagName() == Format::Tag::tag() )
+    rv += elementToTag( elem );
+  const QDomNodeList children = elem.childNodes();
+  for ( int i = 0; i < children.count(); i++ ) {
+    const QDomElement child = children.at( i ).toElement();
+    if ( child.isNull() || child.tagName() != Format::Tag::tag() )
+      continue;
+    rv += readTags( child );
+  }
+  return rv;
+}
+
 Item XmlReader::elementToItem(const QDomElement& elem, bool includePayload)
 {
   Item item( elem.attribute( Format::Attr::itemMimeType(), QLatin1String("application/octet-stream") ) );
@@ -98,6 +138,10 @@ Item XmlReader::elementToItem(const QDomElement& elem, bool includePayload)
       continue;
     if ( subElem.tagName() == Format::Tag::flag() ) {
       item.setFlag( subElem.text().toUtf8() );
+    } else if ( subElem.tagName() == Format::Tag::tag() ) {
+      Tag tag;
+      tag.setRemoteId( subElem.text().toUtf8() );
+      item.setTag( tag );
     } else if ( includePayload && subElem.tagName() == Format::Tag::payload() ) {
       const QByteArray payloadData = subElem.text().toUtf8();
       item.setPayloadFromData( payloadData );
diff --git a/akonadi/xml/xmlreader.h b/akonadi/xml/xmlreader.h
index 98d3473..1b3a920 100644
--- a/akonadi/xml/xmlreader.h
+++ b/akonadi/xml/xmlreader.h
@@ -60,6 +60,16 @@ namespace XmlReader
   AKONADI_XML_EXPORT Collection::List readCollections( const QDomElement &elem );
 
   /**
+    Converts a tag element.
+  */
+  AKONADI_XML_EXPORT Tag elementToTag( const QDomElement &elem );
+
+  /**
+    Reads recursively all tags starting from the given DOM element.
+  */
+  AKONADI_XML_EXPORT Tag::List readTags( const QDomElement &elem );
+
+  /**
     Converts an item element.
   */
   AKONADI_XML_EXPORT Item elementToItem( const QDomElement &elem, bool includePayload = true );


commit 18f37d111710d4eeb8d9f30551123e6ee1b51a7c
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Jul 11 22:47:53 2014 +0200

    ItemModifyJob: Allow modifying items tags via Tag RID or GID
    
    This is required for resources to provide tags with requested items.

diff --git a/akonadi/itemmodifyjob.cpp b/akonadi/itemmodifyjob.cpp
index 994047f..4d52cdf 100644
--- a/akonadi/itemmodifyjob.cpp
+++ b/akonadi/itemmodifyjob.cpp
@@ -116,6 +116,45 @@ void ItemModifyJobPrivate::setSilent( bool silent )
   mSilent = silent;
 }
 
+QByteArray ItemModifyJobPrivate::tagsToCommandParameter(const Tag::List &tags) const
+{
+    QByteArray c;
+    if (tags.first().id() >= 0) {
+        c += "TAGS";
+        c += ' ' + ProtocolHelper::tagSetToImapSequenceSet(tags);
+    } else if (std::find_if(tags.constBegin(), tags.constEnd(),
+                        boost::bind(&QByteArray::isEmpty, boost::bind(&Tag::remoteId, _1)))
+        == tags.constEnd()) {
+        //All items have a remoteId
+        c += "RTAGS";
+        QList<QByteArray> rids;
+        Q_FOREACH (const Tag &object, tags) {
+            rids << ImapParser::quote(object.remoteId());
+        }
+
+        c += '(';
+        c += ImapParser::join(rids, " ");
+        c += ')';
+
+    } else if (std::find_if(tags.constBegin(), tags.constEnd(),
+                        boost::bind(&QByteArray::isEmpty, boost::bind(&Tag::gid, _1)))
+        == tags.constEnd()) {
+        //All items have a gid
+        c += "GTAGS";
+        QList<QByteArray> gids;
+        Q_FOREACH (const Tag &object, tags) {
+            gids << ImapParser::quote(object.gid());
+        }
+
+        c += '(';
+        c += ImapParser::join(gids, " ");
+        c += ')';
+    } else {
+        throw Exception("Cannot identify all tags");
+    }
+    return c;
+}
+
 ItemModifyJob::ItemModifyJob(const Item &item, QObject *parent)
     : Job(new ItemModifyJobPrivate(this), parent)
 {
@@ -205,16 +244,13 @@ QByteArray ItemModifyJobPrivate::fullCommand() const
     }
 
     if (item.d_func()->mTagsOverwritten) {
-        changes << "TAGS";
-        changes << ' ' + ProtocolHelper::tagSetToImapSequenceSet(item.tags());
+        changes << tagsToCommandParameter(item.tags());
     } else {
         if (!item.d_func()->mAddedTags.isEmpty()) {
-            changes << "+TAGS";
-            changes << ' ' + ProtocolHelper::tagSetToImapSequenceSet(item.d_func()->mAddedTags);
+            changes << "+" + tagsToCommandParameter(item.d_func()->mAddedTags);
         }
         if (!item.d_func()->mDeletedTags.isEmpty()) {
-            changes << "-TAGS";
-            changes << ' ' + ProtocolHelper::tagSetToImapSequenceSet(item.d_func()->mDeletedTags);
+            changes << "-" + tagsToCommandParameter(item.d_func()->mDeletedTags);
         }
     }
 
diff --git a/akonadi/itemmodifyjob_p.h b/akonadi/itemmodifyjob_p.h
index 63fb2a9..ff30b7b 100644
--- a/akonadi/itemmodifyjob_p.h
+++ b/akonadi/itemmodifyjob_p.h
@@ -49,6 +49,7 @@ public:
 
     QString jobDebuggingString() const /*Q_DECL_OVERRIDE*/;
     QByteArray fullCommand() const;
+    QByteArray tagsToCommandParameter(const Tag::List &tags) const;
 
     void setSilent( bool silent );
 
diff --git a/akonadi/tests/tagtest.cpp b/akonadi/tests/tagtest.cpp
index 6595464..137f733 100644
--- a/akonadi/tests/tagtest.cpp
+++ b/akonadi/tests/tagtest.cpp
@@ -54,6 +54,8 @@ private Q_SLOTS:
     void testCreateMerge();
     void testAttributes();
     void testTagItem();
+    void testModifyItemWithTagByGID();
+    void testModifyItemWithTagByRID();
     void testMonitor();
 };
 
@@ -337,6 +339,77 @@ void TagTest::testTagItem()
     QCOMPARE(fetchJob->items().first().tags().size(), 1);
 }
 
+void TagTest::testModifyItemWithTagByGID()
+{
+    const Collection res3 = Collection( collectionIdFromPath( "res3" ) );
+    {
+        Tag tag;
+        tag.setGid("gid2");
+        TagCreateJob *createjob = new TagCreateJob(tag, this);
+        AKVERIFYEXEC(createjob);
+    }
+
+    Item item1;
+    {
+        item1.setMimeType( "application/octet-stream" );
+        ItemCreateJob *append = new ItemCreateJob(item1, res3, this);
+        AKVERIFYEXEC(append);
+        item1 = append->item();
+    }
+
+    Tag tag;
+    tag.setGid("gid2");
+    item1.setTag(tag);
+
+    ItemModifyJob *modJob = new ItemModifyJob(item1, this);
+    AKVERIFYEXEC(modJob);
+
+    ItemFetchJob *fetchJob = new ItemFetchJob(item1, this);
+    fetchJob->fetchScope().setFetchTags(true);
+    AKVERIFYEXEC(fetchJob);
+    QCOMPARE(fetchJob->items().first().tags().size(), 1);
+}
+
+void TagTest::testModifyItemWithTagByRID()
+{
+    {
+        ResourceSelectJob *select = new ResourceSelectJob("akonadi_knut_resource_0");
+        AKVERIFYEXEC(select);
+    }
+    const Collection res3 = Collection( collectionIdFromPath( "res3" ) );
+    {
+        Tag tag;
+        tag.setGid("gid3");
+        tag.setRemoteId("rid3");
+        TagCreateJob *createjob = new TagCreateJob(tag, this);
+        AKVERIFYEXEC(createjob);
+    }
+
+    Item item1;
+    {
+        item1.setMimeType( "application/octet-stream" );
+        ItemCreateJob *append = new ItemCreateJob(item1, res3, this);
+        AKVERIFYEXEC(append);
+        item1 = append->item();
+    }
+
+    Tag tag;
+    tag.setRemoteId("rid2");
+    item1.setTag(tag);
+
+    ItemModifyJob *modJob = new ItemModifyJob(item1, this);
+    AKVERIFYEXEC(modJob);
+
+    ItemFetchJob *fetchJob = new ItemFetchJob(item1, this);
+    fetchJob->fetchScope().setFetchTags(true);
+    AKVERIFYEXEC(fetchJob);
+    QCOMPARE(fetchJob->items().first().tags().size(), 1);
+    {
+        ResourceSelectJob *select = new ResourceSelectJob("");
+        AKVERIFYEXEC(select);
+    }
+}
+
 void TagTest::testMonitor()
 {
   Akonadi::Monitor monitor;


commit 48bd0104496c6399ca04ccd34229c722734396f2
Author: Montel Laurent <montel at kde.org>
Date:   Thu Jul 10 13:17:43 2014 +0200

    Show port when we found specific capabilities

diff --git a/mailtransport/smtpconfigwidget.cpp b/mailtransport/smtpconfigwidget.cpp
index 7d15bac..ac0dca7 100644
--- a/mailtransport/smtpconfigwidget.cpp
+++ b/mailtransport/smtpconfigwidget.cpp
@@ -302,6 +302,7 @@ void SMTPConfigWidget::slotFinished( QList<int> results )
   if ( results.isEmpty() ) {
     KMessageBox::error(this, i18n("Failed to check capabilities. Please verify port and authentication mode."), i18n("Check Capabilities Failed"));
     d->serverTestFailed = true;
+    d->serverTest->deleteLater();
     return;
   }
 
@@ -319,6 +320,15 @@ void SMTPConfigWidget::slotFinished( QList<int> results )
   }
   d->sslCapa = d->serverTest->secureProtocols();
   d->updateAuthCapbilities();
+  //Show correct port from capabilities.
+  if (d->ui.ssl->isEnabled()) {
+      const int portValue = d->serverTest->port(Transport::EnumEncryption::SSL);
+      d->ui.kcfg_port->setValue(portValue == -1 ? SMTPS_PORT : portValue);
+  } else if (d->ui.none->isEnabled()) {
+      const int portValue = d->serverTest->port(Transport::EnumEncryption::None);
+      d->ui.kcfg_port->setValue(portValue == -1 ? SMTP_PORT : portValue);
+  }
+  d->serverTest->deleteLater();
 }
 
 void SMTPConfigWidget::hostNameChanged( const QString &text )


commit f87bddc01ed4144fe843b6bb4ee5d7341b520cda
Author: Montel Laurent <montel at kde.org>
Date:   Thu Jul 10 09:52:06 2014 +0200

    Add dialog box when we don't find capabilities

diff --git a/mailtransport/smtpconfigwidget.cpp b/mailtransport/smtpconfigwidget.cpp
index 93b1e35..7d15bac 100644
--- a/mailtransport/smtpconfigwidget.cpp
+++ b/mailtransport/smtpconfigwidget.cpp
@@ -42,6 +42,7 @@
 
 #include <KProtocolInfo>
 #include <KDebug>
+#include <KMessageBox>
 
 namespace {
 
@@ -299,6 +300,7 @@ void SMTPConfigWidget::slotFinished( QList<int> results )
   // If the servertest did not find any useable authentication modes, assume the
   // connection failed and don't disable any of the radioboxes.
   if ( results.isEmpty() ) {
+    KMessageBox::error(this, i18n("Failed to check capabilities. Please verify port and authentication mode."), i18n("Check Capabilities Failed"));
     d->serverTestFailed = true;
     return;
   }


commit e1694078e0b2c266571a0302ff3b05f09b7a9360
Author: Montel Laurent <montel at kde.org>
Date:   Thu Jul 10 09:36:41 2014 +0200

    Fix Bug 337291 - Auto detect server settings feature doesn't use selected port when creating an SMTP account
    
    Try to port that user added.
    FIXED-IN: 4.13.3
    BUG: 337291

diff --git a/mailtransport/smtpconfigwidget.cpp b/mailtransport/smtpconfigwidget.cpp
index be7e49d..93b1e35 100644
--- a/mailtransport/smtpconfigwidget.cpp
+++ b/mailtransport/smtpconfigwidget.cpp
@@ -239,6 +239,12 @@ void SMTPConfigWidget::checkSmtpCapabilities()
   if ( d->ui.kcfg_specifyHostname->isChecked() ) {
     d->serverTest->setFakeHostname( d->ui.kcfg_localHostname->text() );
   }
+  QAbstractButton *encryptionChecked = d->encryptionGroup->checkedButton();
+  if (encryptionChecked == d->ui.none) {
+      d->serverTest->setPort( Transport::EnumEncryption::None, d->ui.kcfg_port->value());
+  } else if (encryptionChecked == d->ui.ssl) {
+      d->serverTest->setPort( Transport::EnumEncryption::SSL, d->ui.kcfg_port->value());
+  }
   d->serverTest->setProgressBar( d->ui.checkCapabilitiesProgress );
   d->ui.checkCapabilitiesStack->setCurrentIndex( 1 );
   BusyCursorHelper *busyCursorHelper = new BusyCursorHelper( d->serverTest );


commit 9846d3de0c5cb026d9bfa868db822da979fe97a5
Author: Montel Laurent <montel at kde.org>
Date:   Mon Jun 30 08:26:31 2014 +0200

    normalize signal/slots

diff --git a/akonadi/collectionrequester.cpp b/akonadi/collectionrequester.cpp
index 228a2ec..02f913d 100644
--- a/akonadi/collectionrequester.cpp
+++ b/akonadi/collectionrequester.cpp
@@ -89,7 +89,7 @@ void CollectionRequester::Private::_k_collectionReceived(KJob *job)
         namesFetch->setProperty("OriginalCollectionId", job->property("OriginalCollectionId"));
         namesFetch->fetchScope().setAncestorRetrieval(CollectionFetchScope::Parent);
         connect(namesFetch, SIGNAL(finished(KJob*)),
-                q, SLOT(_k_collectionsNamesReceived(KJob *)));
+                q, SLOT(_k_collectionsNamesReceived(KJob*)));
     } else {
         _k_collectionsNamesReceived(job);
   }
diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index 09e0829..7191670 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -38,9 +38,9 @@ class ModelSignalSpy : public QObject {
     Q_OBJECT
 public:
     explicit ModelSignalSpy(QAbstractItemModel &model) {
-        connect(&model, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(onRowsInserted(QModelIndex,int,int)));
-        connect(&model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(onRowsRemoved(QModelIndex,int,int)));
-        connect(&model, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)), this, SLOT(onRowsMoved(QModelIndex,int,int, QModelIndex, int)));
+        connect(&model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(onRowsInserted(QModelIndex,int,int)));
+        connect(&model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(onRowsRemoved(QModelIndex,int,int)));
+        connect(&model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), this, SLOT(onRowsMoved(QModelIndex,int,int,QModelIndex,int)));
         connect(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
         connect(&model, SIGNAL(layoutChanged()), this, SLOT(onLayoutChanged()));
         connect(&model, SIGNAL(modelReset()), this, SLOT(onModelReset()));
diff --git a/akonadi/tests/itemsynctest.cpp b/akonadi/tests/itemsynctest.cpp
index 41a32c4..d0b7cee 100644
--- a/akonadi/tests/itemsynctest.cpp
+++ b/akonadi/tests/itemsynctest.cpp
@@ -89,9 +89,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       ItemSync* syncer = new ItemSync( col );
@@ -135,9 +135,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       ItemSync* syncer = new ItemSync( col );
@@ -199,9 +199,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       {
@@ -266,9 +266,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       ItemSync* syncer = new ItemSync( col );
@@ -320,9 +320,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       ItemSync* syncer = new ItemSync( col );
@@ -353,9 +353,9 @@ class ItemsyncTest : public QObject
       monitor.setCollectionMonitored(col);
       QSignalSpy deletedSpy(&monitor, SIGNAL(itemRemoved(Akonadi::Item)));
       QVERIFY(deletedSpy.isValid());
-      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item, Akonadi::Collection)));
+      QSignalSpy addedSpy(&monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)));
       QVERIFY(addedSpy.isValid());
-      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item, QSet<QByteArray>)));
+      QSignalSpy changedSpy(&monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)));
       QVERIFY(changedSpy.isValid());
 
       ItemSync* syncer = new ItemSync( col );


commit f8c682e31d89718a4d301783d71bca86756e86ca
Author: Kevin Ottens <ervin at kde.org>
Date:   Fri Jun 27 08:25:44 2014 +0200

    Fix the copy constructor to avoid uninitialized memory

diff --git a/akonadi/collectionfetchscope.cpp b/akonadi/collectionfetchscope.cpp
index c4232df..18c6509 100644
--- a/akonadi/collectionfetchscope.cpp
+++ b/akonadi/collectionfetchscope.cpp
@@ -42,6 +42,7 @@ public:
         contentMimeTypes = other.contentMimeTypes;
         ancestorDepth = other.ancestorDepth;
         statistics = other.statistics;
+        listFilter = other.listFilter;
     }
 
 public:


commit a28825f4d035e2bc34a927bea64c20bf3655fe01
Author: Montel Laurent <montel at kde.org>
Date:   Thu Jun 26 13:29:23 2014 +0200

    Fix Bug 320821 - kabc/plugins/ldapkio/ uses old Kolab LDAP option, also Kolab 3 options are missing
    
    BUG: 320821
    FIXED-IN: 4.14
    
    Reapply patch which was reverted because it added new i18n. It's time to readd it

diff --git a/kabc/plugins/ldapkio/resourceldapkioconfig.cpp b/kabc/plugins/ldapkio/resourceldapkioconfig.cpp
index eb393fb..ecf5254 100644
--- a/kabc/plugins/ldapkio/resourceldapkioconfig.cpp
+++ b/kabc/plugins/ldapkio/resourceldapkioconfig.cpp
@@ -251,17 +251,20 @@ AttributesDialog::AttributesDialog( const QMap<QString, QString> &attributes,
   mDefaultMap.insert( QLatin1String( "jpegPhoto" ), QLatin1String( "jpegPhoto" ) );
 
   // overwrite the default values here
-  QMap<QString, QString> kolabMap, netscapeMap, evolutionMap, outlookMap;
+  QMap<QString, QString> kolab2Map, kolab3Map, netscapeMap, evolutionMap, outlookMap;
 
-  // kolab
-  kolabMap.insert( QLatin1String( "formattedName" ), QLatin1String( "display-name" ) );
-  kolabMap.insert( QLatin1String( "mailAlias" ), QLatin1String( "mailalias" ) );
+  // Kolab 2
+  kolab2Map.insert( QLatin1String( "formattedName" ), QLatin1String( "display-name" ) );
+  kolab2Map.insert( QLatin1String( "mailAlias" ), QLatin1String( "mailalias" ) );
+  // Kolab 3
+  kolab3Map.insert( QLatin1String( "mailAlias" ), QLatin1String( "alias" ) );
 
   // evolution
   evolutionMap.insert( QLatin1String( "formattedName" ), QLatin1String( "fileAs" ) );
 
   mMapList.append( attributes );
-  mMapList.append( kolabMap );
+  mMapList.append( kolab2Map );
+  mMapList.append( kolab3Map );
   mMapList.append( netscapeMap );
   mMapList.append( evolutionMap );
   mMapList.append( outlookMap );
@@ -276,7 +279,8 @@ AttributesDialog::AttributesDialog( const QMap<QString, QString> &attributes,
   layout->addWidget( mMapCombo, 0, 1 );
 
   mMapCombo->addItem( i18n( "User Defined" ) );
-  mMapCombo->addItem( i18n( "Kolab" ) );
+  mMapCombo->addItem( i18n( "Kolab 2" ) );
+  mMapCombo->addItem( i18n( "Kolab 3" ) );
   mMapCombo->addItem( i18n( "Netscape" ) );
   mMapCombo->addItem( i18n( "Evolution" ) );
   mMapCombo->addItem( i18n( "Outlook" ) );
@@ -294,7 +298,7 @@ AttributesDialog::AttributesDialog( const QMap<QString, QString> &attributes,
   int i, j = 0;
   for ( i = 2, it = attributes.begin(); it != attributes.end(); ++it, ++i ) {
     if ( mNameDict[ it.key() ].isEmpty() ) {
-      i--;
+      --i;
       continue;
     }
     if ( ( i - 2 ) == ( mNameDict.count() >> 1 ) ) {
diff --git a/kabc/plugins/ldapkio/resourceldapkioconfig.h b/kabc/plugins/ldapkio/resourceldapkioconfig.h
index f45c832..afde68e 100644
--- a/kabc/plugins/ldapkio/resourceldapkioconfig.h
+++ b/kabc/plugins/ldapkio/resourceldapkioconfig.h
@@ -85,7 +85,8 @@ class AttributesDialog : public KDialog
   private:
     enum {
       UserMap,
-      KolabMap,
+      Kolab2Map,
+      Kolab3Map,
       NetscapeMap,
       EvolutionMap,
       OutlookMap


commit 4e1a505376dbcebec91950db865fb3c5ccf0dcf1
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Jun 26 13:12:03 2014 +0200

    KIMAP: Fix enabling of Gmail extensions

diff --git a/kimap/fetchjob.cpp b/kimap/fetchjob.cpp
index 670866f..f3a6125 100644
--- a/kimap/fetchjob.cpp
+++ b/kimap/fetchjob.cpp
@@ -171,7 +171,7 @@ bool FetchJob::setGmailExtensionsEnabled() const
 void FetchJob::setGmailExtensionsEnabled( bool enabled )
 {
   Q_D( FetchJob );
-  d->gmailEnabled = true;
+  d->gmailEnabled = enabled;
 }
 
 QMap<qint64, MessagePtr> FetchJob::messages() const


commit 50b1f705d6993655ede1558774731623a05fc0c5
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 25 15:34:15 2014 +0200

    PasteHelper: support fake Item Copy/Move into virtual collections
    
    When a resource provides it's folder hierarchy as virtual collections,
    it still wants to support Copy and Move between virtual collections. In
    such case, Copy == Link and Move == Unlink from source and Link to destination
    collection.
    
    For this to work, the Akonadi Item URL must contain 'parent' query item
    with ID of drag source collection.

diff --git a/akonadi/pastehelper.cpp b/akonadi/pastehelper.cpp
index 468fb71..c84b646 100644
--- a/akonadi/pastehelper.cpp
+++ b/akonadi/pastehelper.cpp
@@ -21,6 +21,7 @@
 
 #include "collectioncopyjob.h"
 #include "collectionmovejob.h"
+#include "collectionfetchjob.h"
 #include "item.h"
 #include "itemcreatejob.h"
 #include "itemcopyjob.h"
@@ -29,6 +30,7 @@
 #include "linkjob.h"
 #include "transactionsequence.h"
 #include "session.h"
+#include "unlinkjob.h"
 
 #include <KDebug>
 #include <KUrl>
@@ -36,9 +38,188 @@
 #include <QtCore/QByteArray>
 #include <QtCore/QMimeData>
 #include <QtCore/QStringList>
+#include <QtCore/QMutexLocker>
+
+#include <boost/bind.hpp>
 
 using namespace Akonadi;
 
+class PasteHelperJob: public Akonadi::TransactionSequence
+{
+    Q_OBJECT
+
+public:
+    explicit PasteHelperJob(Qt::DropAction action, const Akonadi::Item::List &items,
+                            const Akonadi::Collection::List &collections,
+                            const Akonadi::Collection &destination,
+                            QObject *parent = 0);
+    virtual ~PasteHelperJob();
+
+private Q_SLOTS:
+    void onDragSourceCollectionFetched(KJob *job);
+
+private:
+    void runActions();
+    void runItemsActions();
+    void runCollectionsActions();
+
+private:
+    Qt::DropAction mAction;
+    Akonadi::Item::List mItems;
+    Akonadi::Collection::List mCollections;
+    Akonadi::Collection mDestCollection;
+};
+
+PasteHelperJob::PasteHelperJob(Qt::DropAction action, const Item::List &items,
+                               const Collection::List &collections,
+                               const Collection &destination,
+                               QObject *parent)
+    : TransactionSequence(parent)
+    , mAction(action)
+    , mItems(items)
+    , mCollections(collections)
+    , mDestCollection(destination)
+{
+    //FIXME: The below code disables transactions in otder to avoid data loss due to nested
+    //transactions (copy and colcopy in the server doesn't see the items retrieved into the cache and copies empty payloads).
+    //Remove once this is fixed properly, see the other FIXME comments.
+    setProperty("transactionsDisabled", true);
+
+    Collection dragSourceCollection;
+    if (!items.isEmpty() && items.first().parentCollection().isValid()) {
+        // Check if all items have the same parent collection ID
+        const Collection parent = items.first().parentCollection();
+        if (std::find_if(items.constBegin(), items.constEnd(),
+                         boost::bind(&Entity::operator!=, boost::bind(static_cast<Collection (Item::*)() const>(&Item::parentCollection), _1), parent))
+             == items.constEnd())
+        {
+            dragSourceCollection = parent;
+        }
+    }
+
+    kDebug() << items.first().parentCollection().id() << dragSourceCollection.id();
+
+    if (dragSourceCollection.isValid()) {
+        // Disable autocommitting, because starting a Link/Unlink/Copy/Move job
+        // after the transaction has ended leaves the job hanging
+        setAutomaticCommittingEnabled(false);
+
+        CollectionFetchJob *fetch = new CollectionFetchJob(dragSourceCollection,
+                                                           CollectionFetchJob::Base,
+                                                           this);
+        QObject::connect(fetch, SIGNAL(finished(KJob*)),
+                         this, SLOT(onDragSourceCollectionFetched(KJob*)));
+    } else {
+        runActions();
+    }
+}
+
+PasteHelperJob::~PasteHelperJob()
+{
+}
+
+void PasteHelperJob::onDragSourceCollectionFetched(KJob *job)
+{
+    CollectionFetchJob *fetch = qobject_cast<CollectionFetchJob*>(job);
+    kDebug() << fetch->error() << fetch->collections().count();
+    if (fetch->error() || fetch->collections().count() != 1) {
+        runActions();
+        commit();
+        return;
+    }
+
+
+    // If the source collection is virtual, treat copy and move actions differently
+    const Collection sourceCollection = fetch->collections().first();
+    kDebug() << "FROM: " << sourceCollection.id() << sourceCollection.name() << sourceCollection.isVirtual();
+    kDebug() << "DEST: " << mDestCollection.id() << mDestCollection.name() << mDestCollection.isVirtual();
+    kDebug() << "ACTN:" << mAction;
+    if (sourceCollection.isVirtual()) {
+        switch (mAction) {
+        case Qt::CopyAction:
+            if (mDestCollection.isVirtual()) {
+                new LinkJob(mDestCollection, mItems, this);
+            } else {
+                new ItemCopyJob(mItems, mDestCollection, this);
+            }
+            break;
+        case Qt::MoveAction:
+            new UnlinkJob(sourceCollection, mItems, this);
+            if (mDestCollection.isVirtual()) {
+                new LinkJob(mDestCollection, mItems, this);
+            } else {
+                new ItemCopyJob(mItems, mDestCollection, this);
+            }
+            break;
+        case Qt::LinkAction:
+            new LinkJob(mDestCollection, mItems, this);
+            break;
+        default:
+            Q_ASSERT(false);
+        }
+        runCollectionsActions();
+        commit();
+    } else {
+      runActions();
+    }
+
+    commit();
+}
+
+void PasteHelperJob::runActions()
+{
+    runItemsActions();
+    runCollectionsActions();
+}
+
+void PasteHelperJob::runItemsActions()
+{
+    if (mItems.isEmpty()) {
+        return;
+    }
+
+    switch (mAction) {
+    case Qt::CopyAction:
+        new ItemCopyJob(mItems, mDestCollection, this);
+        break;
+    case Qt::MoveAction:
+        new ItemMoveJob(mItems, mDestCollection, this);
+        break;
+    case Qt::LinkAction:
+        new LinkJob(mDestCollection, mItems, this);
+        break;
+    default:
+        Q_ASSERT(false); // WTF?!
+    }
+}
+
+void PasteHelperJob::runCollectionsActions()
+{
+    if (mCollections.isEmpty()) {
+        return;
+    }
+
+    switch (mAction) {
+    case Qt::CopyAction:
+        foreach (const Collection &col, mCollections) {   // FIXME: remove once we have a batch job for collections as well
+            new CollectionCopyJob(col, mDestCollection, this);
+        }
+        break;
+    case Qt::MoveAction:
+        foreach (const Collection &col, mCollections) {   // FIXME: remove once we have a batch job for collections as well
+            new CollectionMoveJob(col, mDestCollection, this);
+        }
+        break;
+    case Qt::LinkAction:
+        // Not supported for collections
+        break;
+    default:
+        Q_ASSERT(false); // WTF?!
+    }
+}
+
+
+
 bool PasteHelper::canPaste(const QMimeData *mimeData, const Collection &collection)
 {
     if (!mimeData || !collection.isValid()) {
@@ -141,43 +322,22 @@ KJob *PasteHelper::pasteUriList(const QMimeData *mimeData, const Collection &des
         if (collection.isValid()) {
             collections.append(collection);
         }
-        const Item item = Item::fromUrl(url);
+        Item item = Item::fromUrl(url);
+        if (url.hasQueryItem(QLatin1String("parent"))) {
+            item.setParentCollection(Collection(url.queryItem(QLatin1String("parent")).toLongLong()));
+        }
         if (item.isValid()) {
             items.append(item);
         }
         // TODO: handle non Akonadi URLs?
     }
 
-    TransactionSequence *transaction = new TransactionSequence(session);
 
-    //FIXME: The below code disables transactions in otder to avoid data loss due to nested
-    //transactions (copy and colcopy in the server doesn't see the items retrieved into the cache and copies empty payloads).
-    //Remove once this is fixed properly, see the other FIXME comments.
-    transaction->setProperty("transactionsDisabled", true);
+    PasteHelperJob *job = new PasteHelperJob(action, items,
+                                             collections, destination,
+                                             session);
 
-    switch (action) {
-    case Qt::CopyAction:
-        if (!items.isEmpty()) {
-            new ItemCopyJob(items, destination, transaction);
-        }
-        foreach (const Collection &col, collections) {   // FIXME: remove once we have a batch job for collections as well
-            new CollectionCopyJob(col, destination, transaction);
-        }
-        break;
-    case Qt::MoveAction:
-        if (!items.isEmpty()) {
-            new ItemMoveJob(items, destination, transaction);
-        }
-        foreach (const Collection &col, collections) {   // FIXME: remove once we have a batch job for collections as well
-            new CollectionMoveJob(col, destination, transaction);
-        }
-        break;
-    case Qt::LinkAction:
-        new LinkJob(destination, items, transaction);
-        break;
-    default:
-        Q_ASSERT(false); // WTF?!
-        return 0;
-    }
-    return transaction;
+    return job;
 }
+
+#include "pastehelper.moc"


commit ccc4dc4967d93b5489039f89032eb6a8cfe3f88c
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 25 15:32:45 2014 +0200

    ETM: Encode Item drag source collection into item URL in MimeData

diff --git a/akonadi/entitytreemodel.cpp b/akonadi/entitytreemodel.cpp
index 98f4e84..fbfa817 100644
--- a/akonadi/entitytreemodel.cpp
+++ b/akonadi/entitytreemodel.cpp
@@ -770,7 +770,10 @@ QMimeData *EntityTreeModel::mimeData(const QModelIndexList &indexes) const
         if (Node::Collection == node->type) {
             urls << d->m_collections.value(node->id).url(Collection::UrlWithName);
         } else if (Node::Item == node->type) {
-            urls << d->m_items.value(node->id).url(Item::UrlWithMimeType);
+            KUrl url = d->m_items.value(node->id).url(Item::Item::UrlWithMimeType);
+            // Encode the "virtual" parent
+            url.addQueryItem(QLatin1String("parent"), QString::number(node->parent));
+            urls << url;
         } else { // if that happens something went horrible wrong
             Q_ASSERT(false);
         }


commit 7675d41eeaf2e110ce494c166e81a4952818cace
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Fri Jun 20 13:22:38 2014 +0200

    Add support for changing X-GM-LABELS via STORE command
    
    X-GM-LABELS are exactly likes FLAGS, except for the parameter keyword.

diff --git a/kimap/storejob.cpp b/kimap/storejob.cpp
index 980eb76..a3fd415 100644
--- a/kimap/storejob.cpp
+++ b/kimap/storejob.cpp
@@ -34,10 +34,37 @@ namespace KIMAP
       StoreJobPrivate( Session *session, const QString& name ) : JobPrivate( session, name ) { }
       ~StoreJobPrivate() { }
 
+      QByteArray addFlags(const QByteArray &param, const MessageFlags &flags) {
+          QByteArray parameters;
+          switch ( mode ) {
+            case StoreJob::SetFlags:
+              parameters += param;
+              break;
+            case StoreJob::AppendFlags:
+              parameters += "+" + param;
+              break;
+            case StoreJob::RemoveFlags:
+              parameters += "-" + param;
+              break;
+          }
+
+          parameters += " (";
+          foreach ( const QByteArray &flag, flags ) {
+            parameters += flag + ' ';
+          }
+          if ( !flags.isEmpty() ) {
+            parameters.chop( 1 );
+          }
+          parameters += ')';
+
+          return parameters;
+      }
+
       ImapSet set;
       bool uidBased;
       StoreJob::StoreMode mode;
       MessageFlags flags;
+      MessageFlags gmLabels;
 
       QMap<int, MessageFlags> resultingFlags;
   };
@@ -93,6 +120,18 @@ MessageFlags StoreJob::flags() const
   return d->flags;
 }
 
+void StoreJob::setGMLabels( const MessageFlags &gmLabels )
+{
+  Q_D( StoreJob );
+  d->gmLabels = gmLabels;
+}
+
+MessageFlags StoreJob::gmLabels() const
+{
+  Q_D( const StoreJob );
+  return d->gmLabels;
+}
+
 void StoreJob::setMode( StoreMode mode )
 {
   Q_D( StoreJob );
@@ -125,32 +164,21 @@ void StoreJob::doStart()
 
   QByteArray parameters = d->set.toImapSequenceSet()+' ';
 
-  switch ( d->mode ) {
-  case SetFlags:
-    parameters += "FLAGS";
-    break;
-  case AppendFlags:
-    parameters += "+FLAGS";
-    break;
-  case RemoveFlags:
-    parameters += "-FLAGS";
-    break;
-  }
-
-  parameters += " (";
-  foreach ( const QByteArray &flag, d->flags ) {
-    parameters += flag + ' ';
+  if (!d->flags.isEmpty()) {
+      parameters += d->addFlags("FLAGS", d->flags);
   }
-  if ( !d->flags.isEmpty() ) {
-    parameters.chop( 1 );
+  if (!d->gmLabels.isEmpty()) {
+      if (!d->flags.isEmpty()) {
+          parameters += ' ';
+      }
+      parameters += d->addFlags("X-GM-LABELS", d->gmLabels);
   }
-  parameters += ')';
 
   kDebug() << parameters;
 
   QByteArray command = "STORE";
   if ( d->uidBased ) {
-    command = "UID "+command;
+    command = "UID " + command;
   }
 
   d->tags << d->sessionInternal()->sendCommand( command, parameters );
diff --git a/kimap/storejob.h b/kimap/storejob.h
index 4de2f76..c75ea03 100644
--- a/kimap/storejob.h
+++ b/kimap/storejob.h
@@ -59,6 +59,9 @@ class KIMAP_EXPORT StoreJob : public Job
     void setFlags( const MessageFlags &flags );
     MessageFlags flags() const;
 
+    void setGMLabels( const MessageFlags &gmLabels );
+    MessageFlags gmLabels() const;
+
     void setMode( StoreMode mode );
     StoreMode mode() const;
 


commit 78e92780728ad486c82eaa0e5bcd0da12d04d72f
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 18 23:05:08 2014 +0200

    Add support for XOAUTH2 authentication method
    
    XOAUTH2 is used by Gmail to authenticate via OAuth tokens instead of regular
    username + password.
    
    This adds support for XOAUTH2 to KIMAP. However cyrus-sasl does not support
    XOAUTH2, so this won't work out of the box, unless a 3rd-party SASL plugin
    is provided.

diff --git a/kimap/loginjob.cpp b/kimap/loginjob.cpp
index b372c7e..d3473d4 100644
--- a/kimap/loginjob.cpp
+++ b/kimap/loginjob.cpp
@@ -572,6 +572,8 @@ void LoginJob::setAuthenticationMode(AuthenticationMode mode)
       break;
     case Anonymous: d->authMode = QLatin1String("ANONYMOUS");
       break;
+    case XOAuth2: d->authMode = QLatin1String("XOAUTH2");
+      break;
     default:
       d->authMode = QLatin1String("");
   }
diff --git a/kimap/loginjob.h b/kimap/loginjob.h
index 2c6040a..10d8a6d 100644
--- a/kimap/loginjob.h
+++ b/kimap/loginjob.h
@@ -56,7 +56,8 @@ class KIMAP_EXPORT LoginJob : public Job
         DigestMD5,
         NTLM,
         GSSAPI,
-        Anonymous
+        Anonymous,
+        XOAuth2
     };
 
     enum ErrorCode {


commit c0b72cdb0d76cd634c1603082566ea6c10ea80bf
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Sun Mar 30 19:01:50 2014 +0200

    Add support for Gmail-specific extensions to FetchJob
    
    Gmail supports additional X-GM-THRID, X-GM-MSGID and X-GM-LABELS parameters to
    FETCH commands, which returns additional information about each email.

diff --git a/kimap/fetchjob.cpp b/kimap/fetchjob.cpp
index fa49fbd..670866f 100644
--- a/kimap/fetchjob.cpp
+++ b/kimap/fetchjob.cpp
@@ -32,8 +32,15 @@ namespace KIMAP
   class FetchJobPrivate : public JobPrivate
   {
     public:
-      FetchJobPrivate( FetchJob *job, Session *session, const QString& name ) : JobPrivate( session, name ), q( job ), uidBased( false ) { }
-      ~FetchJobPrivate() { }
+      FetchJobPrivate( FetchJob *job, Session *session, const QString& name )
+          : JobPrivate( session, name )
+          , q( job )
+          , uidBased( false )
+          , gmailEnabled(false)
+      { }
+
+      ~FetchJobPrivate()
+      { }
 
       void parseBodyStructure( const QByteArray &structure, int &pos, KMime::Content *content );
       void parsePart( const QByteArray &structure, int &pos, KMime::Content *content );
@@ -50,15 +57,25 @@ namespace KIMAP
         if ( !pendingParts.isEmpty() ) {
           emit q->partsReceived( selectedMailBox,
                                  pendingUids, pendingParts );
+          emit q->partsReceived( selectedMailBox,
+                                 pendingUids, pendingAttributes,
+                                 pendingParts );
         }
         if ( !pendingSizes.isEmpty() || !pendingFlags.isEmpty() ) {
           emit q->headersReceived( selectedMailBox,
                                    pendingUids, pendingSizes,
                                    pendingFlags, pendingMessages );
+          emit q->headersReceived( selectedMailBox,
+                                   pendingUids, pendingSizes,
+                                   pendingAttributes, pendingFlags,
+                                   pendingMessages );
         }
         if ( !pendingMessages.isEmpty() ) {
           emit q->messagesReceived( selectedMailBox,
                                     pendingUids, pendingMessages );
+          emit q->messagesReceived( selectedMailBox,
+                                    pendingUids, pendingAttributes,
+                                    pendingMessages );
         }
 
         pendingUids.clear();
@@ -66,6 +83,7 @@ namespace KIMAP
         pendingParts.clear();
         pendingSizes.clear();
         pendingFlags.clear();
+        pendingAttributes.clear();
       }
 
       FetchJob * const q;
@@ -74,11 +92,13 @@ namespace KIMAP
       bool uidBased;
       FetchJob::FetchScope scope;
       QString selectedMailBox;
+      bool gmailEnabled;
 
       QTimer emitPendingsTimer;
       QMap<qint64, MessagePtr> pendingMessages;
       QMap<qint64, MessageParts> pendingParts;
       QMap<qint64, MessageFlags> pendingFlags;
+      QMap<qint64, MessageAttribute> pendingAttributes;
       QMap<qint64, qint64> pendingSizes;
       QMap<qint64, qint64> pendingUids;
   };
@@ -142,6 +162,18 @@ FetchJob::FetchScope FetchJob::scope() const
   return d->scope;
 }
 
+bool FetchJob::setGmailExtensionsEnabled() const
+{
+  Q_D( const FetchJob );
+  return d->gmailEnabled;
+}
+
+void FetchJob::setGmailExtensionsEnabled( bool enabled )
+{
+  Q_D( FetchJob );
+  d->gmailEnabled = true;
+}
+
 QMap<qint64, MessagePtr> FetchJob::messages() const
 {
   return QMap<qint64, MessagePtr>();
@@ -177,51 +209,56 @@ void FetchJob::doStart()
   switch ( d->scope.mode ) {
   case FetchScope::Headers:
     if ( d->scope.parts.isEmpty() ) {
-      parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER.FIELDS (TO FROM MESSAGE-ID REFERENCES IN-REPLY-TO SUBJECT DATE)] FLAGS UID)";
+      parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER.FIELDS (TO FROM MESSAGE-ID REFERENCES IN-REPLY-TO SUBJECT DATE)] FLAGS UID";
     } else {
       parameters += '(';
       foreach ( const QByteArray &part, d->scope.parts ) {
         parameters += "BODY.PEEK[" + part + ".MIME] ";
       }
-      parameters += "UID)";
+      parameters += "UID";
     }
     break;
   case FetchScope::Flags:
-    parameters += "(FLAGS UID)";
+    parameters += "(FLAGS UID";
     break;
   case FetchScope::Structure:
-    parameters += "(BODYSTRUCTURE UID)";
+    parameters += "(BODYSTRUCTURE UID";
     break;
   case FetchScope::Content:
     if ( d->scope.parts.isEmpty() ) {
-      parameters += "(BODY.PEEK[] UID)";
+      parameters += "(BODY.PEEK[] UID";
     } else {
       parameters += '(';
       foreach ( const QByteArray &part, d->scope.parts ) {
         parameters += "BODY.PEEK[" + part + "] ";
       }
-      parameters += "UID)";
+      parameters += "UID";
     }
     break;
   case FetchScope::Full:
-    parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[] FLAGS UID)";
+    parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[] FLAGS UID";
     break;
   case FetchScope::HeaderAndContent:
     if ( d->scope.parts.isEmpty() ) {
-      parameters += "(BODY.PEEK[] FLAGS UID)";
+      parameters += "(BODY.PEEK[] FLAGS UID";
     } else {
       parameters += "(BODY.PEEK[HEADER.FIELDS (TO FROM MESSAGE-ID REFERENCES IN-REPLY-TO SUBJECT DATE)]";
       foreach ( const QByteArray &part, d->scope.parts ) {
         parameters += " BODY.PEEK[" + part + ".MIME] BODY.PEEK[" + part + "]"; //krazy:exclude=doublequote_chars
       }
-      parameters += " FLAGS UID)";
+      parameters += " FLAGS UID";
     }
     break;
   case FetchScope::FullHeaders:
-    parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER] FLAGS UID)";
+    parameters += "(RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER] FLAGS UID";
     break;
   }
 
+  if ( d->gmailEnabled ) {
+    parameters += " X-GM-LABELS X-GM-MSGID X-GM-THRID";
+  }
+  parameters += ")";
+
   if ( d->scope.changedSince > 0 ) {
     parameters += " (CHANGEDSINCE " + QByteArray::number( d->scope.changedSince ) + ")";
   }
@@ -286,6 +323,12 @@ void FetchJob::handleResponse( const Message &response )
           } else {
             d->pendingFlags[id] << *it;
           }
+        } else if ( str == "X-GM-LABELS" ) {
+          d->pendingAttributes.insert( id, qMakePair<QByteArray, QVariant>( "X-GM-LABELS", *it ) );
+        } else if ( str == "X-GM-THRID" ) {
+          d->pendingAttributes.insert( id, qMakePair<QByteArray, QVariant>( "X-GM-THRID", *it ) );
+        } else if ( str == "X-GM-MSGID" ) {
+          d->pendingAttributes.insert( id, qMakePair<QByteArray, QVariant>( "X-GM-MSGID", *it ) );
         } else if ( str == "BODYSTRUCTURE" ) {
           int pos = 0;
           d->parseBodyStructure( *it, pos, message.get() );
diff --git a/kimap/fetchjob.h b/kimap/fetchjob.h
index 01a5712..68afaa0 100644
--- a/kimap/fetchjob.h
+++ b/kimap/fetchjob.h
@@ -42,6 +42,8 @@ typedef QMap<QByteArray, ContentPtr> MessageParts;
 typedef boost::shared_ptr<KMime::Message> MessagePtr;
 typedef QList<QByteArray> MessageFlags;
 
+typedef QPair<QByteArray, QVariant> MessageAttribute;
+
 /**
  * Fetch message data from the server
  *
@@ -222,6 +224,28 @@ class KIMAP_EXPORT FetchJob : public Job
      */
     FetchScope scope() const;
 
+    // TODO: KF5: Move this to FetchScope
+    /**
+     * Enables retrieving of Gmail-specific extensions
+     *
+     * The FETCH response will contain X-GM-MSGID, X-GM-THRID and X-GM-LABELS
+     *
+     * Do NOT enable this, unless talking to Gmail servers, otherwise the
+     * request may fail.
+     *
+     * @param enabled Whether the Gmail support should be enabled
+     * @since 4.14
+     */
+    void setGmailExtensionsEnabled(bool enabled);
+
+    /**
+     * Returns whether Gmail support is enabled
+     *
+     * @since 4.14
+     * @see setGmailExtensionsEnabled()
+     */
+    bool setGmailExtensionsEnabled() const;
+
     // XXX: [alexmerry, 2010-07-24]: BIC?  Behaviour change
     /** @deprecated returns an empty map; use the signals instead */
     KIMAP_DEPRECATED QMap<qint64, MessagePtr> messages() const;
@@ -272,6 +296,38 @@ class KIMAP_EXPORT FetchJob : public Job
                           const QMap<qint64, KIMAP::MessagePtr> &messages );
 
     /**
+     * An overloaded version of headersReceived(), which includes additional attribute
+     * specified in the FETCH response, but that don't belong to actual content of the
+     * message.
+     *
+     * @param mailBox  the name of the mailbox the fetch job was
+     *                 executed on
+     * @param uids     a map from message sequence numbers to message UIDs;
+     *                 this will always be populated
+     * @param attrs    a map from message sequence numbers to a pair of attribute
+     *                 name and value
+     * @param sizes    a map from message sequence numbers to message sizes
+     *                 (sizes are in octets and refer to the transfer encoding of
+     *                 the message); populated if the scope is FetchScope::Full or
+     *                 FetchScope::Headers
+     * @param flags    a map from message sequence numbers to message flags;
+     *                 populated if the scope is FetchScope::Flags, FetchScope::Full
+     *                 of FetchScope::Headers
+     * @param messages a map from message sequence numbers to message contents (including
+     *                 headers); populated if the scope is FetchScope::Full,
+     *                 FetchScope::Headers or FetchScope::Structure
+     *
+     * @overload
+     * @since 4.14
+     */
+    void headersReceived( const QString &mailBox,
+                          const QMap<qint64, qint64> &uids,
+                          const QMap<qint64, qint64> &sizes,
+                          const QMap<qint64, KIMAP::MessageAttribute > &attrs,
+                          const QMap<qint64, KIMAP::MessageFlags> &flags,
+                          const QMap<qint64, KIMAP::MessagePtr> &messages );
+
+    /**
      * Provides header and message results.
      *
      * This signal will be emitted if the requested scope mode
@@ -293,6 +349,26 @@ class KIMAP_EXPORT FetchJob : public Job
                            const QMap<qint64, qint64> &uids,
                            const QMap<qint64, KIMAP::MessagePtr> &messages );
 
+
+    /**
+     * An overloaded version of messagesReceived(), which includes additional attribute
+     * specified in the FETCH response, but that don't belong to actual content of the
+     * message.
+     *
+     * @param mailBox  the name of the mailbox the fetch job was
+     *                 executed on
+     * @param uids     a map from message sequence numbers to message UIDs
+     * @param attrs    a map from message sequence numbers to pair of attribute
+     *                 name and it's value
+     * @param messages a map from message sequence numbers to message contents
+     *
+     * @overload
+     * @since 4.14
+     */
+    void messagesReceived( const QString &mailBox,
+                           const QMap<qint64, qint64> &uids,
+                           const QMap<qint64, KIMAP::MessageAttribute > &attrs,
+                           const QMap<qint64, KIMAP::MessagePtr> &messages );
     /**
      * Provides header and message results.
      *
@@ -314,6 +390,25 @@ class KIMAP_EXPORT FetchJob : public Job
                         const QMap<qint64, qint64> &uids,
                         const QMap<qint64, KIMAP::MessageParts> &parts );
 
+   /**
+     * An overloaded version of partsReceived(), which includes additional attribute
+     * specified in the FETCH response, but that don't belong to actual content of the
+     * message.
+     *
+     * @param mailBox  the name of the mailbox the fetch job was
+     *                 executed on
+     * @param uids     a map from message sequence numbers to message UIDs
+     * @param attrs    a map from message sequence numbers to pair of attribute
+     * @param parts    a map from message sequence numbers to message part collections
+     *
+     * @overload
+     * @since 4.14
+     */
+    void partsReceived( const QString &mailBox,
+                        const QMap<qint64, qint64> &uids,
+                        const QMap<qint64, KIMAP::MessageAttribute > &attrs,
+                        const QMap<qint64, KIMAP::MessageParts> &parts );
+
   protected:
     virtual void doStart();
     virtual void handleResponse(const Message &response);
diff --git a/kimap/tests/fetchjobtest.cpp b/kimap/tests/fetchjobtest.cpp
index b1c29a3..e34db86 100644
--- a/kimap/tests/fetchjobtest.cpp
+++ b/kimap/tests/fetchjobtest.cpp
@@ -40,11 +40,13 @@ private:
   QMap<qint64, KIMAP::MessageFlags> m_flags;
   QMap<qint64, KIMAP::MessagePtr> m_messages;
   QMap<qint64, KIMAP::MessageParts> m_parts;
+  QMap<qint64, KIMAP::MessageAttribute> m_attrs;
 
 public Q_SLOTS:
 void onHeadersReceived( const QString &/*mailBox*/,
                         const QMap<qint64, qint64> &uids,
                         const QMap<qint64, qint64> &sizes,
+                        const QMap<qint64, KIMAP::MessageAttribute> &attrs,
                         const QMap<qint64, KIMAP::MessageFlags> &flags,
                         const QMap<qint64, KIMAP::MessagePtr> &messages )
   {
@@ -53,18 +55,27 @@ void onHeadersReceived( const QString &/*mailBox*/,
     m_sizes.unite( sizes );
     m_flags.unite( flags );
     m_messages.unite( messages );
+    m_attrs.unite( attrs );
   }
 
-void onMessagesReceived( QString, const QMap<qint64, qint64> uids, const QMap<qint64, KIMAP::MessagePtr> messages )
+void onMessagesReceived( const QString &/*mailbox*/,
+                         const QMap<qint64, qint64> uids,
+                         const QMap<qint64, KIMAP::MessageAttribute> &attrs,
+                         const QMap<qint64, KIMAP::MessagePtr> &messages )
 {
   m_signals << "messagesReceived";
   m_uids.unite( uids );
   m_messages.unite( messages );
+  m_attrs.unite( attrs );
 }
 
-void onPartsReceived( QString, QMap<qint64,qint64> /*uids*/, QMap<qint64, KIMAP::MessageParts> parts)
+void onPartsReceived( const QString &/*mailbox*/,
+                      const QMap<qint64,qint64> &/*uids*/,
+                      const QMap<qint64, KIMAP::MessageAttribute> &attrs,
+                      const QMap<qint64, KIMAP::MessageParts> &parts)
 {
   m_signals << "partsReceived";
+  m_attrs.unite( attrs );
   m_parts.unite( parts );
 }
 
@@ -172,15 +183,17 @@ void testFetch()
     job->setScope( scope );
 
     connect( job, SIGNAL(headersReceived(QString,
-                                         QMap<qint64, qint64>,
-                                         QMap<qint64, qint64>,
-                                         QMap<qint64, KIMAP::MessageFlags>,
-                                         QMap<qint64, KIMAP::MessagePtr>)),
+                                         QMap<qint64,qint64>,
+                                         QMap<qint64,qint64>,
+                                         QMap<qint64,KIMAP::MessageAttribute>,
+                                         QMap<qint64,KIMAP::MessageFlags>,
+                                         QMap<qint64,KIMAP::MessagePtr>)),
              this, SLOT(onHeadersReceived(QString,
-                                          QMap<qint64, qint64>,
-                                          QMap<qint64, qint64>,
-                                          QMap<qint64, KIMAP::MessageFlags>,
-                                          QMap<qint64, KIMAP::MessagePtr>)) );
+                                          QMap<qint64,qint64>,
+                                          QMap<qint64,qint64>,
+                                          QMap<qint64,KIMAP::MessageAttribute>,
+                                          QMap<qint64,KIMAP::MessageFlags>,
+                                          QMap<qint64,KIMAP::MessagePtr>)) );
 
     bool result = job->exec();
     QEXPECT_FAIL( "connection drop", "Expected failure on connection drop", Continue );
@@ -201,6 +214,7 @@ void testFetch()
     m_flags.clear();
     m_messages.clear();
     m_parts.clear();
+    m_attrs.clear();
 }
 
 void testFetchStructure()
@@ -226,8 +240,14 @@ void testFetchStructure()
   job->setSequenceSet( KIMAP::ImapSet( 1, 2 ) );
   job->setScope( scope );
 
-  connect( job, SIGNAL(messagesReceived(QString,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessagePtr>)),
-           SLOT(onMessagesReceived(QString,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessagePtr>)) );
+  connect( job, SIGNAL(messagesReceived(QString,
+                                        QMap<qint64,qint64>,
+                                        QMap<qint64,KIMAP::MessageAttribute>,
+                                        QMap<qint64,KIMAP::MessagePtr>)),
+           this, SLOT(onMessagesReceived(QString,
+                                         QMap<qint64,qint64>,
+                                         QMap<qint64,KIMAP::MessageAttribute>,
+                                         QMap<qint64,KIMAP::MessagePtr>)) );
 
   bool result = job->exec();
   QVERIFY( result );
@@ -245,6 +265,7 @@ void testFetchStructure()
   m_flags.clear();
   m_messages.clear();
   m_parts.clear();
+  m_attrs.clear();
 }
 
 void testFetchParts()
@@ -271,10 +292,26 @@ void testFetchParts()
   job->setSequenceSet( KIMAP::ImapSet( 2, 2 ) );
   job->setScope( scope );
 
-  connect ( job, SIGNAL(headersReceived(QString,QMap<qint64,qint64>,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessageFlags>,QMap<qint64,KIMAP::MessagePtr>)),
-            SLOT(onHeadersReceived(QString,QMap<qint64,qint64>,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessageFlags>,QMap<qint64,KIMAP::MessagePtr>)) );
-  connect( job, SIGNAL(partsReceived(QString,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessageParts>)),
-           SLOT(onPartsReceived(QString,QMap<qint64,qint64>,QMap<qint64,KIMAP::MessageParts>)));
+  connect ( job, SIGNAL(headersReceived(QString,
+                                        QMap<qint64,qint64>,
+                                        QMap<qint64,qint64>,
+                                        QMap<qint64,KIMAP::MessageAttribute>,
+                                        QMap<qint64,KIMAP::MessageFlags>,
+                                        QMap<qint64,KIMAP::MessagePtr>)),
+            this, SLOT(onHeadersReceived(QString,
+                                         QMap<qint64,qint64>,
+                                         QMap<qint64,qint64>,
+                                         QMap<qint64,KIMAP::MessageAttribute>,
+                                         QMap<qint64,KIMAP::MessageFlags>,
+                                         QMap<qint64,KIMAP::MessagePtr>)) );
+  connect( job, SIGNAL(partsReceived(QString,
+                                     QMap<qint64,qint64>,
+                                     QMap<qint64,KIMAP::MessageAttribute>,
+                                     QMap<qint64,KIMAP::MessageParts>)),
+           this, SLOT(onPartsReceived(QString,
+                                      QMap<qint64,qint64>,
+                                      QMap<qint64,KIMAP::MessageAttribute>,
+                                      QMap<qint64,KIMAP::MessageParts>)) );
 
   bool result = job->exec();
 
@@ -282,6 +319,7 @@ void testFetchParts()
   QVERIFY( m_signals.count() > 0 );
   QCOMPARE( m_uids.count(), 1 );
   QCOMPARE( m_parts.count(), 1 );
+  QCOMPARE( m_attrs.count(), 0 );
 
   // Check that we received the message header
   QCOMPARE( m_messages[2]->messageID()->identifier(), QByteArray( "1234 at example.com" ) );
@@ -309,6 +347,7 @@ void testFetchParts()
   m_flags.clear();
   m_messages.clear();
   m_parts.clear();
+  m_attrs.clear();
 }
 
 };


commit a25dccb4a9212b509ac8fb84897876c04b5ae9e7
Author: John Layt <jlayt at kde.org>
Date:   Mon Jun 23 16:10:10 2014 +0100

    Add extra religious file categories
    
    Add extra file categories to help with splitting religious holidays.

diff --git a/kholidays/holidayregion.cpp b/kholidays/holidayregion.cpp
index 0760e58..a7610f9 100644
--- a/kholidays/holidayregion.cpp
+++ b/kholidays/holidayregion.cpp
@@ -285,6 +285,10 @@ QString HolidayRegion::name() const
         typeName = i18nc( "Holiday type", "Name Days" );
       } else if ( type == QLatin1String("personal") ) {
         typeName = i18nc( "Holiday type", "Personal" );
+      } else if ( type == QLatin1String("christian") ) {
+        typeName = i18nc( "Holiday type", "Christian" );
+      } else if ( type == QLatin1String("anglican") ) {
+        typeName = i18nc( "Holiday type", "Anglican" );
       } else if ( type == QLatin1String("catholic") ) {
         typeName = i18nc( "Holiday type", "Catholic" );
       } else if ( type == QLatin1String("protestant") ) {
@@ -293,8 +297,20 @@ QString HolidayRegion::name() const
         typeName = i18nc( "Holiday type", "Orthodox" );
       } else if ( type == QLatin1String("jewish") ) {
         typeName = i18nc( "Holiday type", "Jewish" );
+      } else if ( type == QLatin1String("jewish-orthodox") ) {
+        typeName = i18nc( "Holiday type", "Jewish Orthodox" );
+      } else if ( type == QLatin1String("jewish-conservative") ) {
+        typeName = i18nc( "Holiday type", "Jewish Conservative" );
+      } else if ( type == QLatin1String("jewish-reform") ) {
+        typeName = i18nc( "Holiday type", "Jewish Reform" );
       } else if ( type == QLatin1String("islamic") ) {
         typeName = i18nc( "Holiday type", "Islamic" );
+      } else if ( type == QLatin1String("islamic-sunni") ) {
+        typeName = i18nc( "Holiday type", "Islamic Sunni" );
+      } else if ( type == QLatin1String("islamic-shia") ) {
+        typeName = i18nc( "Holiday type", "Islamic Shia" );
+      } else if ( type == QLatin1String("islamic-sufi") ) {
+        typeName = i18nc( "Holiday type", "Islamic Sufi" );
       }
     }
 


commit b002a48a2204b5f8afad573f83d75e8716975f15
Author: John Layt <jlayt at kde.org>
Date:   Fri Jun 20 23:02:30 2014 +0100

    Change Koningsdag in Netherlands holiday file
    
    The Netherlands now has a King so change form Queen's Day to King's
    Day, as well as fixing the shift rule.
    
    CCBUG: 331219

diff --git a/kholidays/holidays/plan2/holiday_nl_nl b/kholidays/holidays/plan2/holiday_nl_nl
index ea6928a..4b24bc5 100644
--- a/kholidays/holidays/plan2/holiday_nl_nl
+++ b/kholidays/holidays/plan2/holiday_nl_nl
@@ -27,7 +27,14 @@ language    "nl"
 "Pasen"                                                  public religious on easter length 2 days
 "Hemelvaart"                                             public religious on easter plus 39 days
 "Pinksteren"                                             public on easter plus 49 days length 2 days
-"Koninginnedag"                                          public on april 30 shift to monday if sunday
+: Queen's Day - Queen Beatrix 1980 - 2013 - Moves to previous day if a Sunday
+"Koninginnedag"                                          public on ((year >= 1980 && year <= 2013) ?
+                                                                    ( ([april 30] == [sunday after ([april 30])]) ? [april 29] : [april 30] ) :
+                                                                    noop)
+: King's Day - King Willem-Alexander from 2014 onwards - Moves to previous day if a Sunday
+"Koningsdag"                                             public on ((year >= 2014) ?
+                                                                    ( ([april 27] == [sunday after ([april 27])]) ? [april 26] : [april 27] ) :
+                                                                    noop)
 "Kerstmis"                                               public religious on december 25 length 2 days
 
 :: Religious Holidays


commit 598866138ee5f336f1a7c8cd1be422bdba97bab9
Author: John Layt <jlayt at kde.org>
Date:   Fri Jun 20 21:30:26 2014 +0100

    Fix Hong Kong holiday file mistakes
    
    Some lunar holiday dates were missing the correct year so we calculating
    for all years.
    
    CCBUG: 329525

diff --git a/kholidays/holidays/plan2/holiday_hk_en-gb b/kholidays/holidays/plan2/holiday_hk_en-gb
index be774cb..458f81d 100644
--- a/kholidays/holidays/plan2/holiday_hk_en-gb
+++ b/kholidays/holidays/plan2/holiday_hk_en-gb
@@ -54,10 +54,10 @@ description "Public Holidays for Hong Kong"
 "Lunar New Year"                                      public on 8 february 2016 length 3 days
 "Lunar New Year's Eve Holiday"                        public on 27 january 2017
 "Lunar New Year"                                      public on 28 january 2017 length 3 days
-"Lunar New Year's Eve Holiday"                        public on 15 february
+"Lunar New Year's Eve Holiday"                        public on 15 february 2018
 "Lunar New Year"                                      public on 16 february 2018 length 3 days
 "Lunar New Year"                                      public on 5 february 2019 length 3 days
-"Lunar New Year's Eve Holiday"                        public on 24 january
+"Lunar New Year's Eve Holiday"                        public on 24 january 2020
 "Lunar New Year"                                      public on 25 january 2020 length 3 days
 : Ching Ming Festival. See https://bugs.kde.org/show_bug.cgi?id=317834#c4
 "Ching Ming Festival"                                 public on 5 april 2010
diff --git a/kholidays/holidays/plan2/holiday_hk_zh-cn b/kholidays/holidays/plan2/holiday_hk_zh-cn
index b1eee42..08f641d 100644
--- a/kholidays/holidays/plan2/holiday_hk_zh-cn
+++ b/kholidays/holidays/plan2/holiday_hk_zh-cn
@@ -54,11 +54,11 @@ description "Public Holidays for Hong Kong"
 "農曆年初"                                              public on 8 february 2016 length 3 days
 "農曆年初"                                              public on 27 january 2017
 "農曆年初"                                              public on 28 january 2017 length 3 days
-"農曆年初"                                              public on 15 february
+"農曆年初"                                              public on 15 february 2018
 "農曆年初"                                              public on 16 february 2018 length 3 days
 "農曆年初"                                              public on 5 february 2019 length 3 days
-"農曆年初"                                              public on 24 january
-"農曆年初"                                              public on 25 january 2018 length 3 days
+"農曆年初"                                              public on 24 january 2020
+"農曆年初"                                              public on 25 january 2020 length 3 days
 : Ching Ming Festival. See https://bugs.kde.org/show_bug.cgi?id=317834#c4
 "清明節"                                                public on 5 april 2010
 "清明節"                                                public on 5 april 2011


commit 78bc1bc352e98034b23fb33457e6bfc714efadf5
Author: John Layt <jlayt at kde.org>
Date:   Fri Jun 20 21:22:41 2014 +0100

    Update Korean holiday file
    
    Hangeul Day is a day off from 2013 onwards.
    
    CCBUG: 322910

diff --git a/kholidays/holidays/plan2/holiday_kr_ko b/kholidays/holidays/plan2/holiday_kr_ko
index 73dcfc8..810d068 100644
--- a/kholidays/holidays/plan2/holiday_kr_ko
+++ b/kholidays/holidays/plan2/holiday_kr_ko
@@ -6,11 +6,12 @@
 :: Author:   John Layt <john at layt.net>
 ::           Park Shinjo <peremen at gmail.com>
 ::
-:: Updated:  2011-02-19
+:: Updated:  2014-06-20
 ::
 :: Source:   http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B5%AD%EA%B2%BD%EC%9D%BC%EC%97%90%EA%B4%80%ED%95%9C%EB%B2%95%EB%A5%A0
 ::           http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B4%80%EA%B3%B5%EC%84%9C%EC%9D%98%EA%B3%B5%ED%9C%B4%EC%9D%BC%EC%97%90%EA%B4%80%ED%95%9C%EA%B7%9C%EC%A0%95
 ::           http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B0%81%EC%A2%85%EA%B8%B0%EB%85%90%EC%9D%BC%EB%93%B1%EC%97%90%EA%B4%80%ED%95%9C%EA%B7%9C%EC%A0%95
+::           http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B4%80%EA%B3%B5%EC%84%9C%EC%9D%98%20%EA%B3%B5%ED%9C%B4%EC%9D%BC%EC%97%90%20%EA%B4%80%ED%95%9C%20%EA%B7%9C%EC%A0%95
 ::           http://ko.wikipedia.org/w/index.php?title=%ED%95%9C%EA%B5%AD%EC%9D%98_%EC%84%A4%EB%82%A0&oldid=6443996
 ::           http://ko.wikipedia.org/w/index.php?title=%EB%B6%80%EC%B2%98%EB%8B%98_%EC%98%A4%EC%8B%A0_%EB%82%A0&oldid=6444356
 ::           http://ko.wikipedia.org/w/index.php?title=%EC%B6%94%EC%84%9D&oldid=6506477
@@ -35,8 +36,11 @@ language    "ko"
 "광복절"            public on august 15
 : National Foundation Day
 "개천절"            public on october 3
+: Hangeul Day - Only a public holiday from 2013 onwards
+"한글날"            public cultural on ((year >= 2013) ? [october 9] : noop)
 : Christmas Day
 "크리스마스"        public on december 25
+
 : Lunar Holidays
 : Lunar New Year: Day 1 Month 1
 "설날"              public on 8.2.2005 length 3 days
@@ -83,8 +87,8 @@ language    "ko"
 :: Cultural
 : Constitution Day
 "제헌절"            civil on july 17
-: Hangeul Day
-"한글날"            cultural on october 9
+: Hangeul Day - Only a public holiday from 2013 onwards
+"한글날"            cultural on ((year <= 2012) ? [october 9] : noop)
 
 :: School
 


commit 0e5e5d81c1f5c70f596698227858bb98fa407494
Author: John Layt <jlayt at kde.org>
Date:   Fri Jun 20 21:14:04 2014 +0100

    Add holiday file for Barbados
    
    New file for Barbados.
    
    CCBUG: 313602

diff --git a/kholidays/holidays/plan2/holiday_bb_en-gb b/kholidays/holidays/plan2/holiday_bb_en-gb
new file mode 100644
index 0000000..a606a7d
--- /dev/null
+++ b/kholidays/holidays/plan2/holiday_bb_en-gb
@@ -0,0 +1,66 @@
+::
+:: Country:  Barbados
+::
+:: Language: British English
+::
+:: Author:   M Layne m_layne at ml1.net
+::
+:: Updated:  2014-06-20
+::
+:: Source:   http://www.totallybarbados.com/barbados/About_Barbados/Local_Information/Barbados_National_Holidays/
+::           http://en.wikipedia.org/wiki/Public_holidays_in_Barbados
+
+:: Metadata
+country     "BB"
+language    "en_GB"
+:name        "[optional - defaults to country name]"
+description "National holiday file for Barbados"
+
+:: Public Holidays
+"New Year's Day"            public on january 1
+"New Year's Holiday"        public on ( ( [january 1] == [sunday after ([january 1])] ) ? [monday after ([january 1])] : noop )
+"Errol Barrow Day"          public on january 21
+"Errol Barrow Holiday"      public on ( ( [january 21] == [sunday after ([january 21])] ) ? [monday after ([january 21])] : noop )
+"Good Friday"               public religious on easter minus 2
+"Easter Monday"             public on easter plus 1
+"National Heroes' Day"      public on april 28
+"National Heroes' Holiday"  public on ( ( [april 28] == [sunday after ([april 28])] ) ? [monday after ([april 28])] : noop )
+"Labour Day"                public on may 1
+"Labour Day Holiday"        public on ( ( [may 1] == [sunday after ([may 1])] ) ? [monday after ([may 1])] : noop )
+"Whit Monday"               public religious on easter plus 50
+"Emancipation Day"          public on august 1
+"Emancipation Holiday"      public on ( ( [august 1] == [sunday after ([august 1])] ) ? [monday after ([august 1])] : noop )
+"Kadooment Day"             public on first monday in august
+"Independence Day"          public on november 30
+"Independence Holiday"      public on ( ( [november 30] == [sunday after ([november 30])] ) ? [monday after ([november 30])] : noop )
+"Christmas"                 public religious on december 25
+"Christmas Day Holiday"     public on ( ( [december 25] == [sunday after ([december 25])] ) ? [tuesday after ([december 25])] : noop )
+"Boxing Day"                public on december 26
+"Boxing Day Holiday"        public on ( ( [december 26] == [sunday after ([december 26])] ) ? [monday after ([december 26])] : noop )
+
+:: Civil
+
+:: Religious
+"Easter"                    religious on easter
+
+:: Government
+
+:: Financial
+
+:: Commemorative
+
+:: Cultural
+"Valentine's Day"           cultural on february 14
+"Mother's Day"              cultural on second sunday in may
+"Father's Day"              cultural on third sunday in june
+"Halloween"                 cultural on october 31
+
+:: Historical
+
+:: School
+
+:: Daylight Saving (Winter/Summer Time)
+
+:: Seasons
+
+:: Name Days


commit 88272d55d0c1298b9f6e91851c3df074b549274b
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Jun 20 18:17:18 2014 +0200

    ETM: cleanup

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 5bca0a8..15ee48c 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -601,8 +601,6 @@ void EntityTreeModelPrivate::monitoredMimeTypeChanged(const QString &mimeType, b
 
 void EntityTreeModelPrivate::monitoredCollectionsChanged(const Akonadi::Collection &collection, bool monitored)
 {
-    Q_UNUSED(collection)
-    Q_UNUSED(monitored)
     if (monitored) {
         const CollectionFetchJob::Type fetchType = getFetchType(m_collectionFetchStrategy);
         fetchCollections(collection, CollectionFetchJob::Base);
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index a8b8ef2..ba98935 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -276,16 +276,6 @@ public:
     */
     QModelIndexList indexesForItem(const Item &item) const;
 
-    /**
-    * Returns the collection for the given collection @p id.
-    */
-    Collection collectionForId(Collection::Id id) const;
-
-    /**
-    * Returns the item for the given item @p id.
-    */
-    Item itemForId(Item::Id id) const;
-
     bool canFetchMore(const QModelIndex &parent) const;
 
     /**


commit 35b4dbcb1e9e58e143ff8d6939082165f226e5de
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Jun 20 17:56:43 2014 +0200

    ETM: Only remove collections that are no longer monitored if they shouldn't be part of the model anymore.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 7880950..5bca0a8 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -608,7 +608,10 @@ void EntityTreeModelPrivate::monitoredCollectionsChanged(const Akonadi::Collecti
         fetchCollections(collection, CollectionFetchJob::Base);
         fetchCollections(collection, fetchType);
     } else {
-        monitoredCollectionRemoved(collection);
+        //If a collection is derefernced and no longer explicitly monitored it might still match other filters
+        if (!shouldBePartOfModel(collection)) {
+            monitoredCollectionRemoved(collection);
+        }
     }
 }
 
@@ -746,8 +749,23 @@ bool EntityTreeModelPrivate::hasChildCollection(const Collection &collection) co
 {
     foreach (Node *node, m_childEntities[collection.id()]) {
         if (node->type == Node::Collection) {
+            const Collection subcol = m_collections[node->id];
+            if (shouldBePartOfModel(subcol)) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+bool EntityTreeModelPrivate::isAncestorMonitored(const Collection &collection) const
+{
+    Akonadi::Collection parent = collection.parentCollection();
+    while (parent.isValid()) {
+        if (m_monitor->collectionsMonitored().contains(parent)) {
             return true;
         }
+        parent = parent.parentCollection();
     }
     return false;
 }
@@ -769,6 +787,15 @@ bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) c
         return true;
     }
 
+    //We're explicitly monitoring collections, but didn't match the filter
+    if (m_mimeChecker.wantedMimeTypes().isEmpty() && !m_monitor->collectionsMonitored().isEmpty()) {
+        //The collection should be included if one of the parents is monitored
+        if (isAncestorMonitored(collection)) {
+            return true;
+        }
+        return false;
+    }
+
     // Some collection trees contain multiple mimetypes. Even though server side filtering ensures we
     // only get the ones we're interested in from the job, we have to filter on collections received through signals too.
     if (!m_mimeChecker.wantedMimeTypes().isEmpty() &&
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index 98919ed..a8b8ef2 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -297,6 +297,7 @@ public:
      */
     bool shouldBePartOfModel(const Collection &collection) const;
     bool hasChildCollection(const Collection &collection) const;
+    bool isAncestorMonitored(const Collection &collection) const;
 };
 
 }
diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index 3de03c0..09e0829 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -110,6 +110,9 @@ Akonadi::Collection createCollection(const QString &name, const Akonadi::Collect
 
     CollectionCreateJob *create = new CollectionCreateJob(col);
     create->exec();
+    if (create->error()) {
+        kWarning() << create->errorString();
+    }
     Q_ASSERT(!create->error());
     return create->collection();
 }
@@ -131,6 +134,7 @@ private Q_SLOTS:
     void testDisplayFilter();
     void testReferenceCollection();
     void testLoadingOfHiddenCollection();
+    void testSwitchFromReferenceToEnabled();
 
 private:
     Collection res;
@@ -366,6 +370,32 @@ void EtmPopulationTest::testLoadingOfHiddenCollection()
     AKVERIFYEXEC(deleteJob);
 }
 
+void EtmPopulationTest::testSwitchFromReferenceToEnabled()
+{
+    Collection col5 = createCollection(QLatin1String("col5"), monitorCol, false, QStringList() << QLatin1String("application/test") << Collection::mimeType());
+    Collection col6 = createCollection(QLatin1String("col6"), col5, true, QStringList() << QLatin1String("application/test"));
+
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    model->setListFilter(Akonadi::CollectionFetchScope::Display);
+    QTRY_VERIFY(model->isFullyPopulated());
+    model->setCollectionReferenced(col5, true);
+    QTRY_VERIFY(getIndex("col5", model).data(Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>().referenced());
+
+    //Dereference and enable the collection
+    col5.setEnabled(true);
+    model->setCollectionReferenced(col5, false);
+
+    //Index and child should stay in model since both are enabled
+    QVERIFY(getIndex("col5", model).isValid());
+    QVERIFY(getIndex("col6", model).isValid());
+
+    Akonadi::CollectionDeleteJob *deleteJob = new Akonadi::CollectionDeleteJob(col5);
+    AKVERIFYEXEC(deleteJob);
+}
+
 #include "etmpopulationtest.moc"
 
 QTEST_AKONADIMAIN(EtmPopulationTest, NoGUI)


commit fe40fce08c28687212dbfc1d214caa280097fb05
Author: John Layt <jlayt at kde.org>
Date:   Thu Jun 19 15:38:33 2014 +0100

    Update file categories
    
    Update th file name category tags to match the Plan2 categories.

diff --git a/kholidays/holidayregion.cpp b/kholidays/holidayregion.cpp
index d583677..0760e58 100644
--- a/kholidays/holidayregion.cpp
+++ b/kholidays/holidayregion.cpp
@@ -263,17 +263,25 @@ QString HolidayRegion::name() const
       // Religious types, just simple for now
       if ( type == QLatin1String("public") ) {
         typeName = i18nc( "Holiday type", "Public" );
+      } else if ( type == QLatin1String("civil") ) {
+        typeName = i18nc( "Holiday type", "Civil" );
       } else if ( type == QLatin1String("religious") ) {
         typeName = i18nc( "Holiday type", "Religious" );
+      } else if ( type == QLatin1String("government") ) {
+        typeName = i18nc( "Holiday type", "Government" );
       } else if ( type == QLatin1String("financial") ) {
         typeName = i18nc( "Holiday type", "Financial" );
       } else if ( type == QLatin1String("cultural") ) {
         typeName = i18nc( "Holiday type", "Cultural" );
+      } else if ( type == QLatin1String("commemorative") ) {
+        typeName = i18nc( "Holiday type", "Commemorative" );
+      } else if ( type == QLatin1String("historical") ) {
+        typeName = i18nc( "Holiday type", "Historical" );
       } else if ( type == QLatin1String("school") ) {
         typeName = i18nc( "Holiday type", "School" );
-      } else if ( type == QLatin1String("seasons") ) {
-        typeName = i18nc( "Holiday type", "Seasons" );
-      } else if ( type == QLatin1String("name") ) {
+      } else if ( type == QLatin1String("seasonal") ) {
+        typeName = i18nc( "Holiday type", "Seasonal" );
+      } else if ( type == QLatin1String("nameday") ) {
         typeName = i18nc( "Holiday type", "Name Days" );
       } else if ( type == QLatin1String("personal") ) {
         typeName = i18nc( "Holiday type", "Personal" );
@@ -292,8 +300,7 @@ QString HolidayRegion::name() const
 
     if ( !regionName.isEmpty() ) {
       if ( !typeName.isEmpty() ) {
-        //TODO translate when not frozen
-        tempName = QString::fromLatin1( "%1 - %2" ).arg( regionName ).arg( typeName );
+        tempName = i18nc( "Holiday file display name, %1 = region name, %2 = holiday type", "%1 - %2" ).arg( regionName ).arg( typeName );
       } else {
         tempName = regionName;
       }


commit 3a2851d11637422ec8d0ef1b0ca54b6a53078edf
Author: John Layt <jlayt at kde.org>
Date:   Thu Jun 19 14:51:10 2014 +0100

    Change test order
    
    Do teh region test first.

diff --git a/kholidays/tests/testholidayregion.h b/kholidays/tests/testholidayregion.h
index a522cba..f44e735 100644
--- a/kholidays/tests/testholidayregion.h
+++ b/kholidays/tests/testholidayregion.h
@@ -37,8 +37,8 @@ private Q_SLOTS:
     void testGb();
     void testIran();
     void testIsrael();
-    void testLocations();
     void testRegions();
+    void testLocations();
     void testDefaultRegions();
 
 private:


commit 3a6e5ca0c26ac5593beb6a423f341c34f53024e2
Author: John Layt <jlayt at kde.org>
Date:   Thu Jun 19 14:49:16 2014 +0100

    Update holiday files to new category format
    
    Add categories to all the holiday data files.  Where uncertain of a
    category I have used civil by default.  Please correct as appropriate.
    
    Conflicts:
    	kholidays/holidays/plan2/holiday_fi_fi

diff --git a/kholidays/holidays/plan2/holiday_ar_es b/kholidays/holidays/plan2/holiday_ar_es
index 9f7fbff..1bb9133 100644
--- a/kholidays/holidays/plan2/holiday_ar_es
+++ b/kholidays/holidays/plan2/holiday_ar_es
@@ -19,63 +19,63 @@ language    "es"
 description "Feriados Nacionales de Argentina"
 
 :: Public Holidays
-"Año Nuevo"                       weekend on january 1
-"Lunes de Carnaval"               weekend on easter minus 48
-"Martes de Carnaval"              weekend on easter minus 47
-"Día Nacional de la Memoria"      weekend on march 24
-"Viernes Santo"                   weekend on easter minus 2
-"Día de los Caídos en Malvinas"   weekend on april 2
-"Día del Trabajo"                 weekend on may 1
-"Revolución de Mayo"              weekend on may 25
-"Día de Manuel Belgrano"          weekend on june 20
-"Día de la Independencia"         weekend on july 9
-"Día de San Martín"               weekend on (third + (year == 2011)) monday in august
-"Día de la Raza"                  weekend on second monday in october
-"Día de la Soberanía"             weekend on fourth monday in november
-"Inmaculada Concepción de María"  weekend on december 8
-"Navidad"                         weekend on december 25
+"Año Nuevo"                       public on january 1
+"Lunes de Carnaval"               public on easter minus 48
+"Martes de Carnaval"              public on easter minus 47
+"Día Nacional de la Memoria"      public on march 24
+"Viernes Santo"                   public on easter minus 2
+"Día de los Caídos en Malvinas"   public on april 2
+"Día del Trabajo"                 public on may 1
+"Revolución de Mayo"              public on may 25
+"Día de Manuel Belgrano"          public on june 20
+"Día de la Independencia"         public on july 9
+"Día de San Martín"               public on (third + (year == 2011)) monday in august
+"Día de la Raza"                  public on second monday in october
+"Día de la Soberanía"             public on fourth monday in november
+"Inmaculada Concepción de María"  public on december 8
+"Navidad"                         public on december 25
 
 :: Special designated holdays
 
-"Censo Nacional"                  weekend on 27.10.2010
+"Censo Nacional"                  public on 27.10.2010
 
-"Bicentenario de la Bandera"      weekend on 27.02.2012
-"Bicentenario Batalla de Tucumán" weekend on 24.09.2012
+"Bicentenario de la Bandera"      public on 27.02.2012
+"Bicentenario Batalla de Tucumán" public on 24.09.2012
 
-"Bicentenario Asamblea Año XIII"  weekend on 31.01.2013
-"Bicentenario Batalla de Salta"   weekend on 20.02.2013
+"Bicentenario Asamblea Año XIII"  public on 31.01.2013
+"Bicentenario Batalla de Salta"   public on 20.02.2013
 
-"Feriado Turístico"               weekend on 25.03.2011
-"Feriado Turístico"               weekend on 09.12.2011
+"Feriado Turístico"               public on 25.03.2011
+"Feriado Turístico"               public on 09.12.2011
 
-"Feriado Turístico"               weekend on 30.04.2012
-"Feriado Turístico"               weekend on 24.12.2012
+"Feriado Turístico"               public on 30.04.2012
+"Feriado Turístico"               public on 24.12.2012
 
-"Feriado Turístico"               weekend on 01.04.2013
-"Feriado Turístico"               weekend on 21.06.2013
+"Feriado Turístico"               public on 01.04.2013
+"Feriado Turístico"               public on 21.06.2013
 
-"Feriado Turístico"               weekend on 02.05.2014
-"Feriado Turístico"               weekend on 26.12.2014
+"Feriado Turístico"               public on 02.05.2014
+"Feriado Turístico"               public on 26.12.2014
 
-"Feriado Turístico"               weekend on 23.03.2015
-"Feriado Turístico"               weekend on 07.12.2015
+"Feriado Turístico"               public on 23.03.2015
+"Feriado Turístico"               public on 07.12.2015
 
-"Feriado Turístico"               weekend on 08.07.2016
-"Feriado Turístico"               weekend on 09.12.2016
+"Feriado Turístico"               public on 08.07.2016
+"Feriado Turístico"               public on 09.12.2016
 
 
 :: Religious
 
 :: Holidays for Jewish people
-"Pésaj (Pascuas Judías)"                  on hebrew nisan 15 length 2 days
-"Chol HaMoed Pésaj (Pascuas Judías)"      on hebrew nisan 21 length 2 days
-"Rosh Hashana (Año Nuevo Judío)"          on hebrew tishrey 1 length 2 days
-"Iom Kipur (Día del Perdón Judío)"        on hebrew tishrey 10
+"Pésaj (Pascuas Judías)"                  religious on hebrew nisan 15 length 2 days
+"Chol HaMoed Pésaj (Pascuas Judías)"      religious on hebrew nisan 21 length 2 days
+"Rosh Hashana (Año Nuevo Judío)"          religious on hebrew tishrey 1 length 2 days
+"Iom Kipur (Día del Perdón Judío)"        religious on hebrew tishrey 10
 
 :: Holidays for Islamic people
-"Hégira (Año Nuevo Musulmán)"             on hijri muharram 1
-"Id Al-Fitr (Fin Ayuno Musulmán)"         on hijri shawwal 1
-"Eid al-Adha (Sacrificio Musulmán)"       on hijri thualhijjah 10
+"Hégira (Año Nuevo Musulmán)"             religious on hijri muharram 1
+"Id Al-Fitr (Fin Ayuno Musulmán)"         religious on hijri shawwal 1
+"Eid al-Adha (Sacrificio Musulmán)"       religious on hijri thualhijjah 10
 
 :: Financial
 
@@ -86,28 +86,28 @@ description "Feriados Nacionales de Argentina"
 :: Daylight Saving
 
 :: Seasons
-"Equinoxio de otoño"     on march 21
-"Solsticio de invierno"  on june 21
-"Equinoxio de primavera" on september 21
-"Solsticio de verano"    on december 21
+"Equinoxio de otoño"     seasonal on march 21
+"Solsticio de invierno"  seasonal on june 21
+"Equinoxio de primavera" seasonal on september 21
+"Solsticio de verano"    seasonal on december 21
 
 :: Name Days
 
 
 :: To be sorted
-"Jueves Santo"           on easter minus 3
-"Día de Reyes"           on january 6
-"Día de San Valentín"    on february 14
-"Día de la Mujer"        on march 8
-"Sábado de Gloria"       on easter minus 1
-"Domingo de Pascua"      on easter
-"Día del Animal"         on april 29
-"Día del Ahijado/Nieto"  on second sunday in may
-"Día del Padre"          on third sunday in june
-"Día del Amigo"          on july 20
-"Dia del Niño"           on second sunday in august
-"Día de la Madre"        on third sunday in october
-"Halloween"              on october 31
-"Noche Buena"            on december 24
-"Día de los Inocentes"   on december 28
-"Fin de Año"             on december 31
+"Jueves Santo"           civil on easter minus 3
+"Día de Reyes"           civil on january 6
+"Día de San Valentín"    civil on february 14
+"Día de la Mujer"        civil on march 8
+"Sábado de Gloria"       civil on easter minus 1
+"Domingo de Pascua"      civil on easter
+"Día del Animal"         civil on april 29
+"Día del Ahijado/Nieto"  civil on second sunday in may
+"Día del Padre"          civil on third sunday in june
+"Día del Amigo"          civil on july 20
+"Dia del Niño"           civil on second sunday in august
+"Día de la Madre"        civil on third sunday in october
+"Halloween"              civil on october 31
+"Noche Buena"            civil on december 24
+"Día de los Inocentes"   civil on december 28
+"Fin de Año"             civil on december 31
diff --git a/kholidays/holidays/plan2/holiday_at_de b/kholidays/holidays/plan2/holiday_at_de
index 2982cd8..6294ef8 100644
--- a/kholidays/holidays/plan2/holiday_at_de
+++ b/kholidays/holidays/plan2/holiday_at_de
@@ -20,82 +20,82 @@ language    "de"
 
 :: Public Holidays
 : New Year's Day
-"Neujahr"                   weekend on january 1
+"Neujahr"                   public on january 1
 : Epiphany
-"Heilige Drei Könige"       weekend on january 6
+"Heilige Drei Könige"       public on january 6
 : Easter Monday
-"Ostermontag"               weekend on easter plus  1 day
+"Ostermontag"               public on easter plus  1 day
 : Ascension
-"Christi Himmelfahrt"       weekend on easter plus 39 days
+"Christi Himmelfahrt"       public on easter plus 39 days
 : Whit Monday
-"Pfingstmontag"             weekend on easter plus 50 days
+"Pfingstmontag"             public on easter plus 50 days
 : Corpus Christi
-"Fronleichnam"              weekend on easter plus 60 days
+"Fronleichnam"              public on easter plus 60 days
 : National Holiday / Labour Day
-"Tag der Arbeit"            weekend on may 1
+"Tag der Arbeit"            public on may 1
 : Assumption
-"Maria Himmelfahrt"         weekend on august 15
+"Maria Himmelfahrt"         public on august 15
 : National Day / Declaration of Neutrality
-"Nationalfeiertag"          weekend on october 26
+"Nationalfeiertag"          public on october 26
 : All Saints
-"Allerheiligen"             weekend on november 1
+"Allerheiligen"             public on november 1
 : Immaculate Conception
-"Maria Empfängnis"          weekend on december 8
+"Maria Empfängnis"          public on december 8
 : Christmas Day
-"Christtag"                 weekend on december 25
+"Christtag"                 public on december 25
 : St Stephen's Day
-"Stephanitag"               weekend on december 26
+"Stephanitag"               public on december 26
 
 :: State Holidays
 : St Joseph in AU-K, AU-ST, AU-T, AU-V
-"Josef"                     on march 19
+"Josef"                     religious on march 19
 : St Florian in AU-OÖ
-"Florian"                   on may 4
+"Florian"                   religious on may 4
 : St Rupert of Salzburg in AU-S
-"Rupert"                    on september 24
+"Rupert"                    religious on september 24
 : Carinthian Plebiscite in AU-K
-"Tag der Volksabstimmung"   on october 10
+"Tag der Volksabstimmung"   civil on october 10
 : St Martin of Tours in AU-B
-"Martini"                   on november 11
+"Martini"                   religious on november 11
 : St Leopold in AU-NÖ, AU-W
-"Leopoldi"                  on november 15
+"Leopoldi"                  religious on november 15
 
 :: Collective Contract
 : Part or full days off as negotiated
-"Heiliger Abend"            on december 24
-"Silvester"                 on december 31
+"Heiliger Abend"            civil on december 24
+"Silvester"                 civil on december 31
 
 :: Religious
-"Rosenmontag"               on easter minus 48 days
-"Faschingsdienstag"         on easter minus 47 days
-"Aschermittwoch"            on easter minus 46 days
-"Palmsonntag"               on easter minus  7 days
-"Gründonnerstag"            on easter minus  3 days
+"Rosenmontag"               religious on easter minus 48 days
+"Faschingsdienstag"         religious on easter minus 47 days
+"Aschermittwoch"            religious on easter minus 46 days
+"Palmsonntag"               religious on easter minus  7 days
+"Gründonnerstag"            religious on easter minus  3 days
 : Good Friday, day off for members of Reformed, Lutheran, Old Catholic and Methodist Churches
-"Karfreitag"                on easter minus  2 days
-"Karsamstag"                on easter minus  1 days
+"Karfreitag"                religious on easter minus  2 days
+"Karsamstag"                religious on easter minus  1 days
 : Easter
-"Ostern"                    on easter
-"Pfingsten"                 on easter plus  49 days
-"Allerseelen"               on november 2
-"Krampus"                   on december 5
-"Nikolaus"                  on december 6
-"1. Advent"                 on sunday before december 24 minus 21 days
-"2. Advent"                 on sunday before december 24 minus 14 days
-"3. Advent"                 on sunday before december 24 minus 7 days
-"4. Advent"                 on sunday before december 24
+"Ostern"                    religious on easter
+"Pfingsten"                 religious on easter plus  49 days
+"Allerseelen"               religious on november 2
+"Krampus"                   religious on december 5
+"Nikolaus"                  religious on december 6
+"1. Advent"                 religious on sunday before december 24 minus 21 days
+"2. Advent"                 religious on sunday before december 24 minus 14 days
+"3. Advent"                 religious on sunday before december 24 minus 7 days
+"4. Advent"                 religious on sunday before december 24
 
 :: Financial
 
 :: Cultural
-"Muttertag"                 on second sunday in may
-"Vatertag"                  on second sunday in june
+"Muttertag"                 cultural on second sunday in may
+"Vatertag"                  cultural on second sunday in june
 
 :: School
 
 :: Daylight Saving
-"Sommerzeit"                on last sunday in march
-"Winterzeit"                on last sunday in october
+"Sommerzeit"                seasonal on last sunday in march
+"Winterzeit"                seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-act_en-gb b/kholidays/holidays/plan2/holiday_au-act_en-gb
index dbd48a9..4d8dca0 100644
--- a/kholidays/holidays/plan2/holiday_au-act_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-act_en-gb
@@ -20,18 +20,18 @@ description "State holiday file for Australian Capital Territory"
 
 :: Public Holidays
 :: State Holidays - ACT
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Canberra Day"                      weekend on second monday in march
-"Anzac Day"                         weekend on april 25
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"Queen's Birthday"                  weekend on second monday in june
-"Labour Day"                        weekend on first monday in october
-"Family and Community Day"          weekend on first tuesday in november
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Canberra Day"                      public on second monday in march
+"Anzac Day"                         public on april 25
+"Good Friday"                       public on religious easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"Queen's Birthday"                  public on second monday in june
+"Labour Day"                        public on first monday in october
+"Family and Community Day"          public on first tuesday in november
+"Christmas Day"                     public on religious december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
@@ -42,8 +42,8 @@ description "State holiday file for Australian Capital Territory"
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"             on first sunday in october
-"Daylight Saving End"               on first sunday in april
+"Daylight Saving Start"             seasonal on first sunday in october
+"Daylight Saving End"               seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-nsw_en-gb b/kholidays/holidays/plan2/holiday_au-nsw_en-gb
index de9ecee..f71614b 100644
--- a/kholidays/holidays/plan2/holiday_au-nsw_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-nsw_en-gb
@@ -20,16 +20,16 @@ description "State holiday file for New South Wales"
 
 :: Public Holidays
 :: State Holidays - NSW
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"Anzac Day"                         weekend on april 25
-"Queen's Birthday"                  weekend on second monday in june
-"Labour Day"                        weekend on first monday in october
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Good Friday"                       public religious on easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"Anzac Day"                         public on april 25
+"Queen's Birthday"                  public on second monday in june
+"Labour Day"                        public on first monday in october
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
@@ -40,8 +40,8 @@ description "State holiday file for New South Wales"
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"             on first sunday in october
-"Daylight Saving End"               on first sunday in april
+"Daylight Saving Start"             seasonal on first sunday in october
+"Daylight Saving End"               seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-nt_en-gb b/kholidays/holidays/plan2/holiday_au-nt_en-gb
index 99d4714..c524dd1 100644
--- a/kholidays/holidays/plan2/holiday_au-nt_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-nt_en-gb
@@ -20,27 +20,27 @@ description "State holiday file for Nothern Territory"
 
 :: Public Holidays
 :: State Holidays - NT
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Anzac Day"                         weekend on april 25
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"May Day"                           weekend on first monday in may
-"Picnic Day"                        weekend on first monday in august
-"Queen's Birthday"                  weekend on second monday in june
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Anzac Day"                         public on april 25
+"Good Friday"                       public religious on easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"May Day"                           public on first monday in may
+"Picnic Day"                        public on first monday in august
+"Queen's Birthday"                  public on second monday in june
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
 :: Financial
 
 :: Cultural
-"Alice Springs Show Day"            on first friday in july
-"Tennant Creek Show Day"            on second friday in july
-"Katherine Show Day"                on third friday in july
-"Darwin Show Day"                   on last friday in july
+"Alice Springs Show Day"            cultural on first friday in july
+"Tennant Creek Show Day"            cultural on second friday in july
+"Katherine Show Day"                cultural on third friday in july
+"Darwin Show Day"                   cultural on last friday in july
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_au-qld_en-gb b/kholidays/holidays/plan2/holiday_au-qld_en-gb
index 2b63bc6..b68a846 100644
--- a/kholidays/holidays/plan2/holiday_au-qld_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-qld_en-gb
@@ -20,16 +20,16 @@ description "State holiday file for Queensland"
 
 :: Public Holidays
 :: State Holidays - Queensland
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"Anzac Day"                         weekend on april 25
-"Labour Day"                        weekend on first monday in may
-"Queen's Birthday"                  weekend on second monday in june
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Good Friday"                       public religious on easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"Anzac Day"                         public on april 25
+"Labour Day"                        public on first monday in may
+"Queen's Birthday"                  public on second monday in june
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_au-sa_en-gb b/kholidays/holidays/plan2/holiday_au-sa_en-gb
index d3a8354..167caed 100644
--- a/kholidays/holidays/plan2/holiday_au-sa_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-sa_en-gb
@@ -20,17 +20,17 @@ description "State holiday file for South Australia"
 
 :: Public Holidays
 :: State Holidays - SA
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Adelaide Cup Day"                  weekend on second monday in march
-"Anzac Day"                         weekend on april 25
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"Queen's Birthday"                  weekend on second monday in june
-"Labour Day"                        weekend on first monday in october
-"Christmas Day"                     weekend on december 25
-"Proclamation Day"                  weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Adelaide Cup Day"                  public on second monday in march
+"Anzac Day"                         public on april 25
+"Good Friday"                       public religious on easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"Queen's Birthday"                  public on second monday in june
+"Labour Day"                        public on first monday in october
+"Christmas Day"                     public religious on december 25
+"Proclamation Day"                  public on december 26
 
 :: Religious
 
@@ -41,8 +41,8 @@ description "State holiday file for South Australia"
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"             on first sunday in october
-"Daylight Saving End"               on first sunday in april
+"Daylight Saving Start"             seasonal on first sunday in october
+"Daylight Saving End"               seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-tas_en-gb b/kholidays/holidays/plan2/holiday_au-tas_en-gb
index 39cb9d1..3d8cd3d 100644
--- a/kholidays/holidays/plan2/holiday_au-tas_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-tas_en-gb
@@ -20,18 +20,18 @@ description "State holiday file for Tasmania"
 
 :: Public Holidays
 :: State Holidays - Tasmania
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Royal Hobart Regatta"              weekend on second monday in february
-"Eight Hours Day"                   weekend on second monday in march
-"Good Friday"                       weekend on easter minus 2
-"Easter Monday"                     weekend on easter plus 1
-"Easter Tuesday"                    weekend on easter plus 2
-"Anzac Day"                         weekend on april 25
-"Recreation Day"                    weekend on first monday in november
-"Queen's Birthday"                  weekend on second monday in june
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Royal Hobart Regatta"              public on second monday in february
+"Eight Hours Day"                   public on second monday in march
+"Good Friday"                       public religious on easter minus 2
+"Easter Monday"                     public on easter plus 1
+"Easter Tuesday"                    public on easter plus 2
+"Anzac Day"                         public on april 25
+"Recreation Day"                    public on first monday in november
+"Queen's Birthday"                  public on second monday in june
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
@@ -42,8 +42,8 @@ description "State holiday file for Tasmania"
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"             on first sunday in october
-"Daylight Saving End"               on first sunday in april
+"Daylight Saving Start"             seasonal on first sunday in october
+"Daylight Saving End"               seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-vic_en-gb b/kholidays/holidays/plan2/holiday_au-vic_en-gb
index f16b86c..236295a 100644
--- a/kholidays/holidays/plan2/holiday_au-vic_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-vic_en-gb
@@ -20,17 +20,17 @@ description "State holiday file for Victoria"
 
 :: Public Holidays
 :: State Holidays - Victoria
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Labour Day"                        weekend on second monday in march
-"Good Friday"                       weekend on easter minus 2
-"Easter Saturday"                   weekend on easter minus 1
-"Easter Monday"                     weekend on easter plus 1
-"Anzac Day"                         weekend on april 25
-"Queen's Birthday"                  weekend on second monday in june
-"Melbourne Cup Day"                 weekend on first tuesday in november
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Labour Day"                        public on second monday in march
+"Good Friday"                       public religious on easter minus 2
+"Easter Saturday"                   public on easter minus 1
+"Easter Monday"                     public on easter plus 1
+"Anzac Day"                         public on april 25
+"Queen's Birthday"                  public on second monday in june
+"Melbourne Cup Day"                 public on first tuesday in november
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
@@ -41,8 +41,8 @@ description "State holiday file for Victoria"
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"             on first sunday in october
-"Daylight Saving End"               on first sunday in april
+"Daylight Saving Start"             seasonal on first sunday in october
+"Daylight Saving End"               seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_au-wa_en-gb b/kholidays/holidays/plan2/holiday_au-wa_en-gb
index 7861be9..b40efa7 100644
--- a/kholidays/holidays/plan2/holiday_au-wa_en-gb
+++ b/kholidays/holidays/plan2/holiday_au-wa_en-gb
@@ -20,19 +20,19 @@ description "State holiday file for Western Australia"
 
 :: Public Holidays
 :: State Holidays - WA
-"New Year's Day"                    weekend on january 1
-"Australia Day"                     weekend on january 26
-"Labour Day"                        weekend on first monday in march
-"Anzac Day"                         weekend on april 25
-"Good Friday"                       weekend on easter minus 2
-"Easter Monday"                     weekend on easter plus 1
-"Foundation Day"                    weekend on first monday in june
-"Queen's Birthday"                  weekend on 27.9.2010
-"Queen's Birthday"                  weekend on 3.10.2011
-"Queen's Birthday"                  weekend on 1.10.2012
-"Queen's Birthday"                  weekend on 30.9.2013
-"Christmas Day"                     weekend on december 25
-"Boxing Day"                        weekend on december 26
+"New Year's Day"                    public on january 1
+"Australia Day"                     public on january 26
+"Labour Day"                        public on first monday in march
+"Anzac Day"                         public on april 25
+"Good Friday"                       public religious on easter minus 2
+"Easter Monday"                     public on easter plus 1
+"Foundation Day"                    public on first monday in june
+"Queen's Birthday"                  public on 27.9.2010
+"Queen's Birthday"                  public on 3.10.2011
+"Queen's Birthday"                  public on 1.10.2012
+"Queen's Birthday"                  public on 30.9.2013
+"Christmas Day"                     public religious on december 25
+"Boxing Day"                        public on december 26
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_ba-srp_sr b/kholidays/holidays/plan2/holiday_ba-srp_sr
index d22c480..3ab182c 100644
--- a/kholidays/holidays/plan2/holiday_ba-srp_sr
+++ b/kholidays/holidays/plan2/holiday_ba-srp_sr
@@ -17,48 +17,48 @@ language     "sr"
 :description  ""
 
 :: Public Holidays
-"Нова година"                                                      weekend on january 1 length 2 days
-"Нова година (нерадни дан)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+"Нова година"                                                      public on january 1 length 2 days
+"Нова година (нерадни дан)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
                                                                                     [ monday after ([january 2]) ] : noop )
-"Дан Републике"                                                    weekend on january 9
-"Међународни празник рада"                                         weekend on may 1 length 2 days
-"Међународни празник рада (нерадни дан)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+"Дан Републике"                                                    public on january 9
+"Међународни празник рада"                                         public on may 1 length 2 days
+"Међународни празник рада (нерадни дан)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
                                                                                     [ monday after ([may 2]) ] : noop )
-"Дан победе над фашизмом"                                        weekend on may 9
-"Дан Општег оквирног споразума за мир у Босни и Херцеговини"       weekend on november 21
+"Дан победе над фашизмом"                                          public on may 9
+"Дан Општег оквирног споразума за мир у Босни и Херцеговини"       public on november 21
 
 :: Religious Holidays
-"Православни Бадњи-дан"                                            weekend on january 6
-"Православни Божић"                                                weekend on january 7
-"Римокатолички Бадњи-дан"                                          weekend on december 24
-"Римокатолички Божић"                                              weekend on december 25
-"Православни Велики петак"                                         weekend on pascha minus 2 days
-"Римокатолички Велики петак"                                       weekend on easter minus 2 days
-"Православни Васкрс"                                               weekend on pascha length 2 days
-"Римокатолички Ускрс"                                              weekend on easter length 2 days
-"Рамазански бајрам"                                                on hijri shawwal 1 length 2 days
-"Курбан-бајрам"                                                    on hijri thualhijjah 10 length 2 days
+"Православни Бадњи-дан"                                            public religious on january 6
+"Православни Божић"                                                public religious on january 7
+"Римокатолички Бадњи-дан"                                          public religious on december 24
+"Римокатолички Божић"                                              public religious on december 25
+"Православни Велики петак"                                         public religious on pascha minus 2 days
+"Римокатолички Велики петак"                                       public religious on easter minus 2 days
+"Православни Васкрс"                                               public religious on pascha length 2 days
+"Римокатолички Ускрс"                                              public religious on easter length 2 days
+"Рамазански бајрам"                                                religious on hijri shawwal 1 length 2 days
+"Курбан-бајрам"                                                    religious on hijri thualhijjah 10 length 2 days
 
 :: Financial
 
 :: Cultural
-"Српска Нова Година"                                               on january 14
-"Дан сећања на жртве холокауста"                                 on january 27
-"Дан Првог српског устанка"                                        on february 15
-"Дан словенске писмености"                                         on may 24
-"Дан бораца одбрамбено-отаџбинског рата"                           on june 28
+"Српска Нова Година"                                               cultural on january 14
+"Дан сећања на жртве холокауста"                                   cultural on january 27
+"Дан Првог српског устанка"                                        cultural on february 15
+"Дан словенске писмености"                                         cultural on may 24
+"Дан бораца одбрамбено-отаџбинског рата"                           cultural on june 28
 
 :: School
-"Свети Сава — школска слава"                                       weekend on january 27
+"Свети Сава — школска слава"                                       public school on january 27
 
 :: Daylight Saving
-"Летње рачунање времена (ГМТ+2)"                                  on last sunday in march
-"Зимско рачунање времена (ГМТ+1)"                                  on last sunday in october
+"Летње рачунање времена (ГМТ+2)"                                   seasonal on last sunday in march
+"Зимско рачунање времена (ГМТ+1)"                                  seasonal on last sunday in october
 
 :: Seasons
-"Први дан пролећа"                                                on march 20
-"Први дан лета"                                                   on june 21
-"Први дан јесени"                                                  on september 23
-"Први дан зиме"                                                    on december 22
+"Први дан пролећа"                                                 seasonal on march 20
+"Први дан лета"                                                    seasonal on june 21
+"Први дан јесени"                                                  seasonal on september 23
+"Први дан зиме"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavian b/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavian
index 95a2f95..b4c894a 100644
--- a/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavian
+++ b/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavian
@@ -17,48 +17,48 @@ language     "sr at ijekavian"
 :description  ""
 
 :: Public Holidays
-"Нова година"                                                      weekend on january 1 length 2 days
-"Нова година (нерадни дан)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+"Нова година"                                                      public on january 1 length 2 days
+"Нова година (нерадни дан)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
                                                                                     [ monday after ([january 2]) ] : noop )
-"Дан Републике"                                                    weekend on january 9
-"Међународни празник рада"                                         weekend on may 1 length 2 days
-"Међународни празник рада (нерадни дан)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+"Дан Републике"                                                    public on january 9
+"Међународни празник рада"                                         public on may 1 length 2 days
+"Међународни празник рада (нерадни дан)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
                                                                                     [ monday after ([may 2]) ] : noop )
-"Дан побједе над фашизмом"                                        weekend on may 9
-"Дан Општег оквирног споразума за мир у Босни и Херцеговини"       weekend on november 21
+"Дан побједе над фашизмом"                                         public on may 9
+"Дан Општег оквирног споразума за мир у Босни и Херцеговини"       public on november 21
 
 :: Religious Holidays
-"Православни Бадњи-дан"                                            weekend on january 6
-"Православни Божић"                                                weekend on january 7
-"Римокатолички Бадњи-дан"                                          weekend on december 24
-"Римокатолички Божић"                                              weekend on december 25
-"Православни Велики петак"                                         weekend on pascha minus 2 days
-"Римокатолички Велики петак"                                       weekend on easter minus 2 days
-"Православни Васкрс"                                               weekend on pascha length 2 days
-"Римокатолички Ускрс"                                              weekend on easter length 2 days
-"Рамазански бајрам"                                                on hijri shawwal 1 length 2 days
-"Курбан-бајрам"                                                    on hijri thualhijjah 10 length 2 days
+"Православни Бадњи-дан"                                            public religious on january 6
+"Православни Божић"                                                public religious on january 7
+"Римокатолички Бадњи-дан"                                          public religious on december 24
+"Римокатолички Божић"                                              public religious on december 25
+"Православни Велики петак"                                         public religious on pascha minus 2 days
+"Римокатолички Велики петак"                                       public religious on easter minus 2 days
+"Православни Васкрс"                                               public religious on pascha length 2 days
+"Римокатолички Ускрс"                                              public religious on easter length 2 days
+"Рамазански бајрам"                                                religious on hijri shawwal 1 length 2 days
+"Курбан-бајрам"                                                    religious on hijri thualhijjah 10 length 2 days
 
 :: Financial
 
 :: Cultural
-"Српска Нова Година"                                               on january 14
-"Дан сјећања на жртве холокауста"                                 on january 27
-"Дан Првог српског устанка"                                        on february 15
-"Дан словенске писмености"                                         on may 24
-"Дан бораца одбрамбено-отаџбинског рата"                           on june 28
+"Српска Нова Година"                                               cultural on january 14
+"Дан сјећања на жртве холокауста"                                  cultural on january 27
+"Дан Првог српског устанка"                                        cultural on february 15
+"Дан словенске писмености"                                         cultural on may 24
+"Дан бораца одбрамбено-отаџбинског рата"                           cultural on june 28
 
 :: School
-"Свети Сава — школска слава"                                       weekend on january 27
+"Свети Сава — школска слава"                                       public school on january 27
 
 :: Daylight Saving
-"Љетње рачунање времена (ГМТ+2)"                                  on last sunday in march
-"Зимско рачунање времена (ГМТ+1)"                                  on last sunday in october
+"Љетње рачунање времена (ГМТ+2)"                                   seasonal on last sunday in march
+"Зимско рачунање времена (ГМТ+1)"                                  seasonal on last sunday in october
 
 :: Seasons
-"Први дан прољећа"                                                on march 20
-"Први дан љета"                                                   on june 21
-"Први дан јесени"                                                  on september 23
-"Први дан зиме"                                                    on december 22
+"Први дан прољећа"                                                 seasonal on march 20
+"Први дан љета"                                                    seasonal on june 21
+"Први дан јесени"                                                  seasonal on september 23
+"Први дан зиме"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavianlatin b/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavianlatin
index 0cb6ee8..609169b 100644
--- a/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavianlatin
+++ b/kholidays/holidays/plan2/holiday_ba-srp_sr at ijekavianlatin
@@ -17,48 +17,48 @@ language     "sr at ijekavianlatin"
 :description  ""
 
 :: Public Holidays
-"Nova godina"                                                      weekend on january 1 length 2 days
-"Nova godina (neradni dan)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+"Nova godina"                                                      public on january 1 length 2 days
+"Nova godina (neradni dan)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
                                                                                     [ monday after ([january 2]) ] : noop )
-"Dan Republike"                                                    weekend on january 9
-"Međunarodni praznik rada"                                         weekend on may 1 length 2 days
-"Međunarodni praznik rada (neradni dan)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+"Dan Republike"                                                    public on january 9
+"Međunarodni praznik rada"                                         public on may 1 length 2 days
+"Međunarodni praznik rada (neradni dan)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
                                                                                     [ monday after ([may 2]) ] : noop )
-"Dan pobjede nad fašizmom"                                        weekend on may 9
-"Dan Opšteg okvirnog sporazuma za mir u Bosni i Hercegovini"       weekend on november 21
+"Dan pobjede nad fašizmom"                                         public on may 9
+"Dan Opšteg okvirnog sporazuma za mir u Bosni i Hercegovini"       public on november 21
 
 :: Religious Holidays
-"Pravoslavni Badnji-dan"                                            weekend on january 6
-"Pravoslavni Božić"                                                weekend on january 7
-"Rimokatolički Badnji-dan"                                          weekend on december 24
-"Rimokatolički Božić"                                              weekend on december 25
-"Pravoslavni Veliki petak"                                         weekend on pascha minus 2 days
-"Rimokatolički Veliki petak"                                       weekend on easter minus 2 days
-"Pravoslavni Vaskrs"                                               weekend on pascha length 2 days
-"Rimokatolički Uskrs"                                              weekend on easter length 2 days
-"Ramazanski bajram"                                                on hijri shawwal 1 length 2 days
-"Kurban-bajram"                                                    on hijri thualhijjah 10 length 2 days
+"Pravoslavni Badnji-dan"                                           public religious on january 6
+"Pravoslavni Božić"                                                public religious on january 7
+"Rimokatolički Badnji-dan"                                         public religious on december 24
+"Rimokatolički Božić"                                              public religious on december 25
+"Pravoslavni Veliki petak"                                         public religious on pascha minus 2 days
+"Rimokatolički Veliki petak"                                       public religious on easter minus 2 days
+"Pravoslavni Vaskrs"                                               public religious on pascha length 2 days
+"Rimokatolički Uskrs"                                              public religious on easter length 2 days
+"Ramazanski bajram"                                                religious on hijri shawwal 1 length 2 days
+"Kurban-bajram"                                                    religious on hijri thualhijjah 10 length 2 days
 
 :: Financial
 
 :: Cultural
-"Srpska Nova Godina"                                               on january 14
-"Dan sjećanja na žrtve holokausta"                                 on january 27
-"Dan Prvog srpskog ustanka"                                        on february 15
-"Dan slovenske pismenosti"                                         on may 24
-"Dan boraca odbrambeno-otadžbinskog rata"                           on june 28
+"Srpska Nova Godina"                                               cultural on january 14
+"Dan sjećanja na žrtve holokausta"                                 cultural on january 27
+"Dan Prvog srpskog ustanka"                                        cultural on february 15
+"Dan slovenske pismenosti"                                         cultural on may 24
+"Dan boraca odbrambeno-otadžbinskog rata"                          cultural on june 28
 
 :: School
-"Sveti Sava — školska slava"                                       weekend on january 27
+"Sveti Sava — školska slava"                                       public school on january 27
 
 :: Daylight Saving
-"Ljetnje računanje vremena (GMT+2)"                                  on last sunday in march
-"Zimsko računanje vremena (GMT+1)"                                  on last sunday in october
+"Ljetnje računanje vremena (GMT+2)"                                seasonal on last sunday in march
+"Zimsko računanje vremena (GMT+1)"                                 seasonal on last sunday in october
 
 :: Seasons
-"Prvi dan proljeća"                                                on march 20
-"Prvi dan ljeta"                                                   on june 21
-"Prvi dan jeseni"                                                  on september 23
-"Prvi dan zime"                                                    on december 22
+"Prvi dan proljeća"                                                seasonal on march 20
+"Prvi dan ljeta"                                                   seasonal on june 21
+"Prvi dan jeseni"                                                  seasonal on september 23
+"Prvi dan zime"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ba-srp_sr at latin b/kholidays/holidays/plan2/holiday_ba-srp_sr at latin
index ed856b6..2d611ed 100644
--- a/kholidays/holidays/plan2/holiday_ba-srp_sr at latin
+++ b/kholidays/holidays/plan2/holiday_ba-srp_sr at latin
@@ -17,48 +17,48 @@ language     "sr at latin"
 :description  ""
 
 :: Public Holidays
-"Nova godina"                                                      weekend on january 1 length 2 days
-"Nova godina (neradni dan)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+"Nova godina"                                                      public on january 1 length 2 days
+"Nova godina (neradni dan)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
                                                                                     [ monday after ([january 2]) ] : noop )
-"Dan Republike"                                                    weekend on january 9
-"Međunarodni praznik rada"                                         weekend on may 1 length 2 days
-"Međunarodni praznik rada (neradni dan)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+"Dan Republike"                                                    public on january 9
+"Međunarodni praznik rada"                                         public on may 1 length 2 days
+"Međunarodni praznik rada (neradni dan)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
                                                                                     [ monday after ([may 2]) ] : noop )
-"Dan pobede nad fašizmom"                                        weekend on may 9
-"Dan Opšteg okvirnog sporazuma za mir u Bosni i Hercegovini"       weekend on november 21
+"Dan pobede nad fašizmom"                                          public on may 9
+"Dan Opšteg okvirnog sporazuma za mir u Bosni i Hercegovini"       public on november 21
 
 :: Religious Holidays
-"Pravoslavni Badnji-dan"                                            weekend on january 6
-"Pravoslavni Božić"                                                weekend on january 7
-"Rimokatolički Badnji-dan"                                          weekend on december 24
-"Rimokatolički Božić"                                              weekend on december 25
-"Pravoslavni Veliki petak"                                         weekend on pascha minus 2 days
-"Rimokatolički Veliki petak"                                       weekend on easter minus 2 days
-"Pravoslavni Vaskrs"                                               weekend on pascha length 2 days
-"Rimokatolički Uskrs"                                              weekend on easter length 2 days
-"Ramazanski bajram"                                                on hijri shawwal 1 length 2 days
-"Kurban-bajram"                                                    on hijri thualhijjah 10 length 2 days
+"Pravoslavni Badnji-dan"                                           public religious on january 6
+"Pravoslavni Božić"                                                public religious on january 7
+"Rimokatolički Badnji-dan"                                         public religious on december 24
+"Rimokatolički Božić"                                              public religious on december 25
+"Pravoslavni Veliki petak"                                         public religious on pascha minus 2 days
+"Rimokatolički Veliki petak"                                       public religious on easter minus 2 days
+"Pravoslavni Vaskrs"                                               public religious on pascha length 2 days
+"Rimokatolički Uskrs"                                              public religious on easter length 2 days
+"Ramazanski bajram"                                                religious on hijri shawwal 1 length 2 days
+"Kurban-bajram"                                                    religious on hijri thualhijjah 10 length 2 days
 
 :: Financial
 
 :: Cultural
-"Srpska Nova Godina"                                               on january 14
-"Dan sećanja na žrtve holokausta"                                 on january 27
-"Dan Prvog srpskog ustanka"                                        on february 15
-"Dan slovenske pismenosti"                                         on may 24
-"Dan boraca odbrambeno-otadžbinskog rata"                           on june 28
+"Srpska Nova Godina"                                               cultural on january 14
+"Dan sećanja na žrtve holokausta"                                  cultural on january 27
+"Dan Prvog srpskog ustanka"                                        cultural on february 15
+"Dan slovenske pismenosti"                                         cultural on may 24
+"Dan boraca odbrambeno-otadžbinskog rata"                          cultural on june 28
 
 :: School
-"Sveti Sava — školska slava"                                       weekend on january 27
+"Sveti Sava — školska slava"                                       public school on january 27
 
 :: Daylight Saving
-"Letnje računanje vremena (GMT+2)"                                  on last sunday in march
-"Zimsko računanje vremena (GMT+1)"                                  on last sunday in october
+"Letnje računanje vremena (GMT+2)"                                 seasonal on last sunday in march
+"Zimsko računanje vremena (GMT+1)"                                 seasonal on last sunday in october
 
 :: Seasons
-"Prvi dan proleća"                                                on march 20
-"Prvi dan leta"                                                   on june 21
-"Prvi dan jeseni"                                                  on september 23
-"Prvi dan zime"                                                    on december 22
+"Prvi dan proleća"                                                 seasonal on march 20
+"Prvi dan leta"                                                    seasonal on june 21
+"Prvi dan jeseni"                                                  seasonal on september 23
+"Prvi dan zime"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_be_fr b/kholidays/holidays/plan2/holiday_be_fr
index 8c1fb05..62d51dc 100644
--- a/kholidays/holidays/plan2/holiday_be_fr
+++ b/kholidays/holidays/plan2/holiday_be_fr
@@ -19,38 +19,38 @@ language    "fr"
 :description "(please add description in source language) National holiday file for Belgium"
 
 :: Public Holidays
-"Jour de l'an"                                    weekend on january 1
-"Pâques"                                          weekend on easter
-"Lundi de Pâques"                                 weekend on easter plus 1 day
-"Fête du travail"                                 weekend on may 1
-"Ascencion"                                       weekend on easter plus 39 days
-"Pentecôte"                                       weekend on easter plus 49 days
-"Lundi de Pentecôte"                              weekend on easter plus 50 days
-"Fête nationale - Férié"                          weekend on july 21
-"Assomption"                                      weekend on august 15
-"Toussaint"                                       weekend on november 1
-"Armistice"                                       weekend on november 11
-"Noël"                                            weekend on december 25
+"Jour de l'an"                                    public on january 1
+"Pâques"                                          public religious on easter
+"Lundi de Pâques"                                 public on easter plus 1 day
+"Fête du travail"                                 public on may 1
+"Ascencion"                                       public religious on easter plus 39 days
+"Pentecôte"                                       public religious on easter plus 49 days
+"Lundi de Pentecôte"                              public religious on easter plus 50 days
+"Fête nationale - Férié"                          public on july 21
+"Assomption"                                      public religious on august 15
+"Toussaint"                                       public on november 1
+"Armistice"                                       public on november 11
+"Noël"                                            public religious on december 25
 
 :: Religious
-"Épiphanie"                                       on january 6
-"Mardi-gras"                                      on easter minus 47 days
-"Mercredi des cendres"                            on easter minus 46 days
-"Dimanche des rameaux"                            on easter minus 7 days
-"Jeudi saint"                                     on easter minus 3 days
-"Vendredi saint"                                  on easter minus 2 days
-"Saint Nicolas"                                   on december 06
-"Saint-Sylvestre"                                 on december 31
+"Épiphanie"                                       religious on january 6
+"Mardi-gras"                                      religious on easter minus 47 days
+"Mercredi des cendres"                            religious on easter minus 46 days
+"Dimanche des rameaux"                            religious on easter minus 7 days
+"Jeudi saint"                                     religious on easter minus 3 days
+"Vendredi saint"                                  religious on easter minus 2 days
+"Saint Nicolas"                                   religious on december 06
+"Saint-Sylvestre"                                 religious on december 31
 
 :: Financial
 
 :: Cultural
-"Fête des mères"                                  on every second sunday in may
-"Fête des pères"                                  on every third sunday in june
-"Fête de la Communauté flamande"                  on july 11
-"Fête de la Communauté française de Belgique"     on september 27
-"Fêtes de Wallonie"                               on every third sunday in september
-"Fête de la Communauté germanophone de Belgique"  on november 15
+"Fête des mères"                                  cultural on every second sunday in may
+"Fête des pères"                                  cultural on every third sunday in june
+"Fête de la Communauté flamande"                  cultural on july 11
+"Fête de la Communauté française de Belgique"     cultural on september 27
+"Fêtes de Wallonie"                               cultural on every third sunday in september
+"Fête de la Communauté germanophone de Belgique"  cultural on november 15
 
 :: School
 
@@ -62,5 +62,5 @@ language    "fr"
 
 
 :: To be sorted
-"Chandeleur"                                      on february 2
-"Jour des morts"                                  on november 2
+"Chandeleur"                                      civil on february 2
+"Jour des morts"                                  civil on november 2
diff --git a/kholidays/holidays/plan2/holiday_be_nl b/kholidays/holidays/plan2/holiday_be_nl
index e9dbb21..22095ad 100644
--- a/kholidays/holidays/plan2/holiday_be_nl
+++ b/kholidays/holidays/plan2/holiday_be_nl
@@ -19,36 +19,36 @@ language    "nl"
 :description "(please add description in source language) National holiday file for Belgium"
 
 :: Public Holidays
-"Nieuwjaar"                         weekend on january 1
-"Pasen - Feestdag"                  weekend on easter
-"Paasmaandag"                       weekend on easter plus 1 day
-"Feest van de Arbeid"               weekend on may 1
-"Hemelvaart"                        weekend on easter plus 39 days
-"Pinksteren"                        weekend on easter plus 49 days length 2 days
-"Nationale feestdag"                weekend on july 21
-"OLV Hemelvaart"                    weekend on august 15
-"Allerheiligen"                     weekend on november 1
-"Wapenstilstand"                    weekend on november 11
-"Kerstmis"                          weekend on december 25
+"Nieuwjaar"                         public on january 1
+"Pasen - Feestdag"                  public religious on easter
+"Paasmaandag"                       public on easter plus 1 day
+"Feest van de Arbeid"               public on may 1
+"Hemelvaart"                        public religious on easter plus 39 days
+"Pinksteren"                        public religious on easter plus 49 days length 2 days
+"Nationale feestdag"                public on july 21
+"OLV Hemelvaart"                    public on august 15
+"Allerheiligen"                     public on november 1
+"Wapenstilstand"                    public on november 11
+"Kerstmis"                          public religious on december 25
 
 :: Religious
-"Driekoningen"                      on january 6
-"Vastenavond"                       on easter minus 47 days
-"Aswoensdag"                        on easter minus 46 days
-"Palmzondag"                        on easter minus 7 days
-"Witte Donderdag"                   on easter minus 3 days
-"Goede Vrijdag"                     on easter minus 2 days
-"Sinterklaas"                       on december 06
+"Driekoningen"                      religious on january 6
+"Vastenavond"                       religious on easter minus 47 days
+"Aswoensdag"                        religious on easter minus 46 days
+"Palmzondag"                        religious on easter minus 7 days
+"Witte Donderdag"                   religious on easter minus 3 days
+"Goede Vrijdag"                     religious on easter minus 2 days
+"Sinterklaas"                       religious on december 06
 
 :: Financial
 
 :: Cultural
-"Moederdag"                         on every second sunday in may
-"Vaderdag"                          on every second sunday in june
-"Vlaamse Gemeenschap feestdag"      on july 11
-"Franse Gemeenschap feestdag"       on september 27
-"Waalse feesten"                    on every third sunday in september
-"Duitstalige Gemeenschap feestdag"  on november 15
+"Moederdag"                         cultural on every second sunday in may
+"Vaderdag"                          cultural on every second sunday in june
+"Vlaamse Gemeenschap feestdag"      cultural on july 11
+"Franse Gemeenschap feestdag"       cultural on september 27
+"Waalse feesten"                    cultural on every third sunday in september
+"Duitstalige Gemeenschap feestdag"  cultural on november 15
 
 :: School
 
@@ -60,7 +60,7 @@ language    "nl"
 
 
 :: To be sorted
-"Lichtmis"                          on february 2
-"Allerzielen"                       on november 2
-"Tweede kerstdag"                   on december 26
-"Oudjaar"                           on december 31
+"Lichtmis"                          civil on february 2
+"Allerzielen"                       civil on november 2
+"Tweede kerstdag"                   civil on december 26
+"Oudjaar"                           civil on december 31
diff --git a/kholidays/holidays/plan2/holiday_be_wa b/kholidays/holidays/plan2/holiday_be_wa
index 45c89b9..15e6e57 100644
--- a/kholidays/holidays/plan2/holiday_be_wa
+++ b/kholidays/holidays/plan2/holiday_be_wa
@@ -19,38 +19,38 @@ language    "wa"
 :description "(please add description in source language) National holiday file for Belgium"
 
 :: Public Holidays
-"Novelan"                                          weekend on january 1
-"PÃ¥ke"                                             weekend on easter
-"Londi d' PÃ¥ke"                                    weekend on easter plus 1 day
-"Fiesse do boutaedje"                              weekend on january 1
-"Assincion"                                        weekend on easter plus 39 days
-"Céncweme (Pintcosse)"                             weekend on easter plus 49 days
-"Londi d' Céncweme"                                weekend on easter plus 50 days
-"Fiesse nacionåle"                                 weekend on july 21
-"Grande Notru Dame"                                weekend on august 15
-"Tossint"                                          weekend on november 1
-"Ã…rmistice"                                        weekend on november 11
-"Noyé"                                             weekend on december 25
+"Novelan"                                          public on january 1
+"PÃ¥ke"                                             public religious on easter
+"Londi d' PÃ¥ke"                                    public on easter plus 1 day
+"Fiesse do boutaedje"                              public on january 1
+"Assincion"                                        public religious on easter plus 39 days
+"Céncweme (Pintcosse)"                             public religious on easter plus 49 days
+"Londi d' Céncweme"                                public religious on easter plus 50 days
+"Fiesse nacionåle"                                 public on july 21
+"Grande Notru Dame"                                public on august 15
+"Tossint"                                          public on november 1
+"Ã…rmistice"                                        public on november 11
+"Noyé"                                             public religious on december 25
 
 :: Religious
-"Fiesse des Rwès"                                  on january 6
-"Crås mårdi"                                       on easter minus 47 days
-"Mierkidi des cindes"                              on easter minus 46 days
-"Floreye PÃ¥ke"                                     on easter minus 7 days
-"Djudi sint"                                       on easter minus 3 days
-"Bon vénrdi"                                       on easter minus 2 days
-"Sint Nicolai"                                     on december 06
-"Sint Silvesse"                                    on december 31
+"Fiesse des Rwès"                                  religious on january 6
+"Crås mårdi"                                       religious on easter minus 47 days
+"Mierkidi des cindes"                              religious on easter minus 46 days
+"Floreye PÃ¥ke"                                     religious on easter minus 7 days
+"Djudi sint"                                       religious on easter minus 3 days
+"Bon vénrdi"                                       religious on easter minus 2 days
+"Sint Nicolai"                                     religious on december 06
+"Sint Silvesse"                                    religious on december 31
 
 :: Financial
 
 :: Cultural
-"Fiesse des méres"                                 on every second sunday in may
-"Fiesse des péres"                                 on every third sunday in june
-"Fiesse del Cominålté flaminde"                    on july 11
-"Fiesse del Cominålté francesse di Beldjike"       on september 27
-"Fiesses di Walonreye"                             on every third sunday in september
-"Fiesse del Cominålté Tîxhon-cåzante di Belgjike"  on november 15
+"Fiesse des méres"                                 cultural on every second sunday in may
+"Fiesse des péres"                                 cultural on every third sunday in june
+"Fiesse del Cominålté flaminde"                    cultural on july 11
+"Fiesse del Cominålté francesse di Beldjike"       cultural on september 27
+"Fiesses di Walonreye"                             cultural on every third sunday in september
+"Fiesse del Cominålté Tîxhon-cåzante di Belgjike"  cultural on november 15
 
 :: School
 
@@ -62,5 +62,5 @@ language    "wa"
 
 
 :: To be sorted
-"Tchandleuse"                                      on february 2
-"Djoû des åmes"                                    on november 2
+"Tchandleuse"                                      civil on february 2
+"Djoû des åmes"                                    civil on november 2
diff --git a/kholidays/holidays/plan2/holiday_bg_bg b/kholidays/holidays/plan2/holiday_bg_bg
index 4397460..610ef5e 100644
--- a/kholidays/holidays/plan2/holiday_bg_bg
+++ b/kholidays/holidays/plan2/holiday_bg_bg
@@ -17,18 +17,18 @@ language    "bg"
 :description "(please add description in source language) National holiday file for Bulgaria"
 
 :: Public Holidays
-"Нова година"                                                           weekend on january 1
-"Ден на Освобождението на България от османско иго"                     weekend on march 3
-"Великден"                                                              weekend on pascha
-"Великден"                                                              weekend on pascha plus 1 days
-"Ден на труда"                                                          weekend on may 1
-"Гергьовден, Ден на храбростта и Българската армия"                     weekend on may 6
-"Ден на българската просвета и култура и на славянската писменост"      weekend on may 24
-"Ден на Съединението на България"                                       weekend on september 6
-"Ден на Независимостта на България"                                     weekend on september 22
-"Бъдни вечер"                                                           weekend on december 24
-"Коледа, Рождество Христово"                                            weekend on december 25
-"Коледа, Рождество Христово"                                            weekend on december 26
+"Нова година"                                                           public on january 1
+"Ден на Освобождението на България от османско иго"                     public on march 3
+"Великден"                                                              public religious on pascha
+"Великден"                                                              public on pascha plus 1 days
+"Ден на труда"                                                          public on may 1
+"Гергьовден, Ден на храбростта и Българската армия"                     public on may 6
+"Ден на българската просвета и култура и на славянската писменост"      public on may 24
+"Ден на Съединението на България"                                       public on september 6
+"Ден на Независимостта на България"                                     public on september 22
+"Бъдни вечер"                                                           public on december 24
+"Коледа, Рождество Христово"                                            public religious on december 25
+"Коледа, Рождество Христово"                                            public on december 26
 
 :: Religious Holidays
 
@@ -46,4 +46,4 @@ language    "bg"
 
 
 :: To be sorted
-"Ден на народните будители - неприсъствен за всички учебни заведения"   on november 1
+"Ден на народните будители - неприсъствен за всички учебни заведения"   civil on november 1
diff --git a/kholidays/holidays/plan2/holiday_br_pt-br b/kholidays/holidays/plan2/holiday_br_pt-br
index 7eb9491..f0d5241 100644
--- a/kholidays/holidays/plan2/holiday_br_pt-br
+++ b/kholidays/holidays/plan2/holiday_br_pt-br
@@ -17,39 +17,39 @@ language    "pt_BR"
 :description "(please add description in source language) National holiday file for Brazil"
 
 :: Public Holidays
-"Confraternização Universal"                                weekend on january 1
-"Tiradentes"                                                weekend on april 21
-"Carnaval"                                                  weekend on easter minus 48 days length 2 days
-"Paixão de Cristo"                                          weekend on easter minus 2 days
-"Páscoa"                                                    weekend on easter
-"Corpus Christi"                                            weekend on easter plus 60 days
-"Dia do Trabalho"                                           weekend on may 1
-"Independência do Brasil"                                   weekend on september 7
-"Nossa Senhora Aparecida"                                   weekend on october 12
-"Finados"                                                   weekend on november 2
-"Proclamação da República"                                  weekend on november 15
-"Natal"                                                     weekend on december 25
+"Confraternização Universal"                                public on january 1
+"Tiradentes"                                                public on april 21
+"Carnaval"                                                  public religious on easter minus 48 days length 2 days
+"Paixão de Cristo"                                          public religious on easter minus 2 days
+"Páscoa"                                                    public religious on easter
+"Corpus Christi"                                            public religious on easter plus 60 days
+"Dia do Trabalho"                                           public on may 1
+"Independência do Brasil"                                   public on september 7
+"Nossa Senhora Aparecida"                                   public on october 12
+"Finados"                                                   public on november 2
+"Proclamação da República"                                  public on november 15
+"Natal"                                                     public religious on december 25
 
 :: Religious Holidays
-"Reis Magos"                                                on january 6
-"Cinzas"                                                    on easter minus 46 days
-"Todos os Santos"                                           on november 1
+"Reis Magos"                                                religious on january 6
+"Cinzas"                                                    religious on easter minus 46 days
+"Todos os Santos"                                           religious on november 1
 
 :: Financial
 
 :: Cultural
-"Dia das Mães"                                              on second sunday in may
-"Dia dos Pais"                                              on second sunday in august
+"Dia das Mães"                                              cultural on second sunday in may
+"Dia dos Pais"                                              cultural on second sunday in august
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Início do Outono"                                          on march 22
-"Início do Inverno"                                         on june 22
-"Início da Primavera"                                       on september 22
-"Início do Verão"                                           on december 22
+"Início do Outono"                                          seasonal on march 22
+"Início do Inverno"                                         seasonal on june 22
+"Início da Primavera"                                       seasonal on september 22
+"Início do Verão"                                           seasonal on december 22
 
 :: Name Days
 
@@ -57,35 +57,35 @@ language    "pt_BR"
 :: To be sorted
 
 : Datas comemorativas mundiais (International commemmorative dates)
-:"Dia Mundial da Religião"                                  on january 21
-"Dia Internacional da Mulher"                               on march 8
-:"Dia Mundial do Consumidor"                                on march 15
-:"Dia Internacional Contra a Discriminação Racial"          on march 21
-:"Dia Mundial da Água"                                      on march 22
-:"Dia Internacional do Livro Infantil"                      on april 2
-"Dia Mundial da Saúde"                                      on april 7
-"Dia Mundial de Combate ao Câncer"                          on april 8
-:"Dia Internacional do Café"                                on april 14
-:"Dia Mundial do Desenhista"                                on april 15
-:"Dia Mundial do Escoteiro"                                 on april 23
-:"Dia Internacional da Cruz Vermelha"                       on may 8
-:"Dia Mundial do Enfermeiro"                                on may 12
-:"Dia Internacional das Telecomunicações"                   on may 17
-:"Dia Mundial dos Museus"                                   on may 18
-:"Dia Internacional das Crianças Vítimas de Agressão"       on june 4
-:"Dia Mundial do Meio Ambiente"                             on june 5
-"Dia Internacional do Combate às Drogas"                    on june 26
-:"Dia Mundial da População"                                 on july 11
-:"Dia Mundial da Alfabetização"                             on september 8
-:"Dia Internacional para Preservação da Camada de Ozônio"   on september 16
-:"Dia Mundial da Alimentação"                               on october 16
-"Dia das Bruxas"                                            on october 31
-"Dia Mundial de Ação de Graças"                             on november 28
-"Dia Mundial da Luta contra a AIDS"                         on december 1
-:"Dia Internacional das Pessoas Portadoras de Deficiência"  on december 3
-:"Dia Internacional do Voluntário"                          on december 5
-:"Dia da Declaração dos Direitos do Homem"                  on december 10
-"Reveillon"                                                 on december 31
+:"Dia Mundial da Religião"                                  commemorative on january 21
+"Dia Internacional da Mulher"                               commemorative on march 8
+:"Dia Mundial do Consumidor"                                commemorative on march 15
+:"Dia Internacional Contra a Discriminação Racial"          commemorative on march 21
+:"Dia Mundial da Água"                                      commemorative on march 22
+:"Dia Internacional do Livro Infantil"                      commemorative on april 2
+"Dia Mundial da Saúde"                                      commemorative on april 7
+"Dia Mundial de Combate ao Câncer"                          commemorative on april 8
+:"Dia Internacional do Café"                                commemorative on april 14
+:"Dia Mundial do Desenhista"                                commemorative on april 15
+:"Dia Mundial do Escoteiro"                                 commemorative on april 23
+:"Dia Internacional da Cruz Vermelha"                       commemorative on may 8
+:"Dia Mundial do Enfermeiro"                                commemorative on may 12
+:"Dia Internacional das Telecomunicações"                   commemorative on may 17
+:"Dia Mundial dos Museus"                                   commemorative on may 18
+:"Dia Internacional das Crianças Vítimas de Agressão"       commemorative on june 4
+:"Dia Mundial do Meio Ambiente"                             commemorative on june 5
+"Dia Internacional do Combate às Drogas"                    commemorative on june 26
+:"Dia Mundial da População"                                 commemorative on july 11
+:"Dia Mundial da Alfabetização"                             commemorative on september 8
+:"Dia Internacional para Preservação da Camada de Ozônio"   commemorative on september 16
+:"Dia Mundial da Alimentação"                               commemorative on october 16
+"Dia das Bruxas"                                            commemorative on october 31
+"Dia Mundial de Ação de Graças"                             commemorative on november 28
+"Dia Mundial da Luta contra a AIDS"                         commemorative on december 1
+:"Dia Internacional das Pessoas Portadoras de Deficiência"  commemorative on december 3
+:"Dia Internacional do Voluntário"                          commemorative on december 5
+:"Dia da Declaração dos Direitos do Homem"                  commemorative on december 10
+"Reveillon"                                                 commemorative on december 31
 
 
 : Outras datas comemorativas (Other commemorative dates)
@@ -145,7 +145,7 @@ language    "pt_BR"
 :"Dia do Porteiro"                                          on june 9
 :"Dia da Língua Portuguesa"                                 on june 10
 :"Dia da Marinha Brasileira"                                on june 11
-"Dia dos Namorados"                                         on june 12
+"Dia dos Namorados"                                         commemorative on june 12
 :"Dia do Paleontólogo"                                      on june 15
 :"Dia do Químico"                                           on june 18
 :"Dia do Migrante"                                          on june 19
@@ -185,7 +185,7 @@ language    "pt_BR"
 :"Dia dos Animais"                                          on october 4
 :"Dia da Promulgação da Atual Constituição Brasileira"      on october 5
 :"Dia da Pessoa Portadora de Deficiência Física"            on october 11
-"Dia da Criança"                                            on october 12
+"Dia da Criança"                                            commemorative on october 12
 :"Dia do Agrônomo"                                          on october 12
 :"Dia do Fisioterapeuta"                                    on october 13
 :"Dia da Pecuária"                                          on october 14
@@ -200,7 +200,7 @@ language    "pt_BR"
 :"Dia do Comércio"                                          on october 30
 :"Dia do Cinema Brasileiro"                                 on november 5
 :"Dia da Bandeira"                                          on november 19
-"Dia da Consciência Negra"                                  on november 20
+"Dia da Consciência Negra"                                  commemorative on november 20
 :"Dia do Teólogo"                                           on november 30
 :"Dia da Reforma Agrária"                                   on november 30
 :"Dia da Astronomia"                                        on december 2
@@ -212,131 +212,131 @@ language    "pt_BR"
 
 
 : Datas históricas
-"Abertura dos Portos no Brasil, 1808"                       on january 28
-"Descobrimento do Brasil, 1500"                             on april 22
-"Abolição da Escravatura, 1888"                             on may 13
-"Golpe Militar, 1964"                                       on march 31
-"Chegada do Homem à Lua, 1969"                              on june 20
-"Descobrimento da América, 1492"                            on october 12
-"Morte de Zumbi dos Palmares, 1695"                         on november 20
+"Abertura dos Portos no Brasil, 1808"                       historical on january 28
+"Descobrimento do Brasil, 1500"                             historical on april 22
+"Abolição da Escravatura, 1888"                             historical on may 13
+"Golpe Militar, 1964"                                       historical on march 31
+"Chegada do Homem à Lua, 1969"                              historical on june 20
+"Descobrimento da América, 1492"                            historical on october 12
+"Morte de Zumbi dos Palmares, 1695"                         historical on november 20
 
 
 : Feriados e datas comemorativas estaduais
 
 :: Acre
-:"Dia do evangélico"                                        weekend on january 23
-:"Aniversário de Acre"                                      weekend on june 15
-:"Início da Revolução Acreana"                              weekend on august 6
-:"Dia da Amazônia"                                          weekend on september 5
-:"Assinatura do Tratado de Petrópolis"                      weekend on november 17
+:"Dia do evangélico"                                        public on january 23
+:"Aniversário de Acre"                                      public on june 15
+:"Início da Revolução Acreana"                              public on august 6
+:"Dia da Amazônia"                                          public on september 5
+:"Assinatura do Tratado de Petrópolis"                      public on november 17
 :"Aniversário de Rio Branco"                                on december 28
 
 :: Alagoas
-:"Emancipação política de Alagoas"                          weekend on september 16
+:"Emancipação política de Alagoas"                          public on september 16
 :"Aniversário de Maceió"                                    on december 5
 
 :: Amapá
 :"Aniversário de Macapá"                                    on february 4
-:"Dia de São José"                                          weekend on march 19
-:"Aniversário de Amapá"                                     weekend on october 5
+:"Dia de São José"                                          public on march 19
+:"Aniversário de Amapá"                                     public on october 5
 
 :: Amazonas
-:"Dia da Amazônia"                                          weekend on september 5
+:"Dia da Amazônia"                                          public on september 5
 :"Aniversário de Manaus"                                    on october 24
-:"Dia da Nossa Senhora da Conceição"                        weekend on december 8
+:"Dia da Nossa Senhora da Conceição"                        public on december 8
 
 :: Bahia
 :"Aniversário de Salvador"                                  on march 29
-:"Independência da Bahia"                                   weekend on july 2
+:"Independência da Bahia"                                   public on july 2
 
 :: Ceará
 :"Aniversário de Fortaleza"                                 on april 13
 
 :: Distrito Federal
 :"Aniversário de Brasília"                                  on april 21
-:"Dia do evangélico"                                        weekend on november 30
+:"Dia do evangélico"                                        public on november 30
 
 :: Espírito Santo
-:"Colonização do solo espírito-santaense"                   weekend on may 23
+:"Colonização do solo espírito-santaense"                   public on may 23
 :"Aniversário de Vitória"                                   on september 8
-:"Dia do Servidor Público"                                  weekend on october 28
+:"Dia do Servidor Público"                                  public on october 28
 
 :: Goiás
 :"Aniversário de Goiânia"                                   on october 24
-:"Dia do Servidor Público"                                  weekend on october 28
+:"Dia do Servidor Público"                                  public on october 28
 
 :: Maranhão
-:"Adesão do Maranhão à Independência"                       weekend on july 28
+:"Adesão do Maranhão à Independência"                       public on july 28
 :"Aniversário de São Luís"                                  on september 8
-:"Dia de Nossa Senhora da Conceição"                        weekend on december 8
+:"Dia de Nossa Senhora da Conceição"                        public on december 8
 
 :: Mato Grosso
 :"Aniversário de Cuiabá"                                    on april 8
 
 :: Mato Grosso do Sul
 :"Aniversário de Campo Grande"                              on august 26
-:"Criação do estado de Mato Grosso do Sul"                  weekend on october 11
+:"Criação do estado de Mato Grosso do Sul"                  public on october 11
 
 :: Minas Gerais
 :"Aniversário de Belo Horizonte"                            on december 12
 
 :: Pará
 :"Aniversário de Belém"                                     on january 12
-:"Adesão do Grão-Pará à Independência do Brasil"            weekend on august 15
-:"Dia da Nossa Senhora da Conceição"                        weekend on december 8
+:"Adesão do Grão-Pará à Independência do Brasil"            public on august 15
+:"Dia da Nossa Senhora da Conceição"                        public on december 8
 
 :: Paraíba
 :"Aniversário de João Pessoa"                               on august 5
-:"Emancipação política da Paraíba"                          weekend on august 5
+:"Emancipação política da Paraíba"                          public on august 5
 
 :: Paraná
 :"Aniversário de Curitiba"                                  on march 29
-:"Emancipação política do Paraná"                           weekend on december 19
+:"Emancipação política do Paraná"                           public on december 19
 
 :: Pernambuco
 :"Revolução Pernambucana (1817)"                            on march 6
 :"Aniversário de Recife"                                    on march 12
 
 :: Piauí
-:"Dia da Batalha de Jenipapo"                               weekend on march 13
+:"Dia da Batalha de Jenipapo"                               public on march 13
 :"Aniversário de Teresina"                                  on august 16
-:"Dia de Piauí"                                             weekend on october 19
+:"Dia de Piauí"                                             public on october 19
 
 :: Rio de Janeiro
 :"Aniversário da Cidade do Rio de Janeiro"                  on march 1
-:"Dia de São Jorge"                                         weekend on april 23
-:"Dia do Comércio"                                          weekend on october 15
+:"Dia de São Jorge"                                         public on april 23
+:"Dia do Comércio"                                          public on october 15
 
 :: Rio Grande do Norte
-:"Dia de São Pedro"                                         weekend on june 29
-:"Mártires de Cunhaú e Uruaçu"                              weekend on october 3
+:"Dia de São Pedro"                                         public on june 29
+:"Mártires de Cunhaú e Uruaçu"                              public on october 3
 :"Aniversário da Cidade de Natal"                           on december 25
 
 :: Rio Grande do Sul
 :"Aniversário de Porto Alegre"                              on march 26
-:"Revolução Farroupilha"                                    weekend on september 20
+:"Revolução Farroupilha"                                    public on september 20
 
 :: Rondônia
-:"Criação do estado de Rondônia"                            weekend on january 4
-:"Dia do Evangélico"                                        weekend on june 18
+:"Criação do estado de Rondônia"                            public on january 4
+:"Dia do Evangélico"                                        public on june 18
 :"Aniversário de Porto Velho"                               on october 2
 
 :: Roraima
 :"Aniversário de Boa Vista"                                 on june 9
-:"Criação do estado de Roraima"                             weekend on october 5
+:"Criação do estado de Roraima"                             public on october 5
 
 :: Santa Catarina
 :"Aniversário de Florianópolis"                             on march 23
-:"Criação da Capitania de Santa Catarina"                   weekend on august 11
+:"Criação da Capitania de Santa Catarina"                   public on august 11
 
 :: São Paulo
-"Aniversário da Cidade de São Paulo"                        on january 25
-"Revolução Constitucionalista de 1932"                      weekend on july 9
+"Aniversário da Cidade de São Paulo"                        civil on january 25
+"Revolução Constitucionalista de 1932"                      public on july 9
 
 :: Sergipe
 :"Aniversário de Aracaju"                                   on march 17
-:"Autonomia política de Sergipe"                            weekend on july 8
+:"Autonomia política de Sergipe"                            public on july 8
 
 :: Tocantins
 :"Aniversário de Palmas"                                    on may 20
-:"Criação deo estado de Tocantins"                          weekend on october 5
+:"Criação deo estado de Tocantins"                          public on october 5
diff --git a/kholidays/holidays/plan2/holiday_by_be b/kholidays/holidays/plan2/holiday_by_be
index 2fca163..4414b0a 100644
--- a/kholidays/holidays/plan2/holiday_by_be
+++ b/kholidays/holidays/plan2/holiday_by_be
@@ -17,15 +17,15 @@ language    "be"
 :description "(please add description in source language) National holiday file for Belarus"
 
 :: Public Holidays
-"Новый год"                               weekend on january 1
-"Рождество Христово (православное)"       weekend on january 7
-"День женщин"                             weekend on march 8
-"Радуница"                                weekend on easter plus 9
-"Праздник труда"                          weekend on may 1
-"День Победы"                             weekend on may 9
-"День Независимости Республики Беларусь"  weekend on july 3
-"День Октябрьской революции"              weekend on november 7
-"Рождество Христово (католическое)"       weekend on december 25
+"Новый год"                               public on january 1
+"Рождество Христово (православное)"       public on january 7
+"День женщин"                             public on march 8
+"Радуница"                                public on easter plus 9
+"Праздник труда"                          public on may 1
+"День Победы"                             public on may 9
+"День Независимости Республики Беларусь"  public on july 3
+"День Октябрьской революции"              public on november 7
+"Рождество Христово (католическое)"       public religious on december 25
 
 :: Religious Holidays
 
@@ -43,83 +43,83 @@ language    "be"
 
 
 :: To be sorted
-"Старый Новый год"                                                                                   on january 14
-"День студентов (Татьянин день)"                                                                     on january 25
-"День Святого Валентина (День всех влюбленных)"                                                      on february 14
-"День молодёжи в Беларуси"                                                                           on last sunday in june
-"День памяти"                                                                                        on november 2
-"День работников социальной защиты"                                                                  on january 5
-"День банковских и финансовых работников"                                                            on first sunday in january
-"День спасателя"                                                                                     on january 19
-"День инженерных войск"                                                                              on january 21
-"День белорусской науки"                                                                             on last sunday in january
-"День памяти воинов-интернационалистов"                                                              on february 15
-"День работников землеустроительной и картографо-геодезической службы"                               on february 21
-"День защитников Отечества и Вооруженных Сил"                                                        on february 23
-"День милиции"                                                                                       on march 4
-"День Конституции"                                                                                   on march 15
-"День потребителя"                                                                                   on march 15
-"День внутренних войск"                                                                              on march 18
-"День работников бытового обслуживания населения и жилищно-коммунального хозяйства"                  on fourth sunday in march
-"Пасха"                                                                                              on easter
-"День единения народов Беларуси и России"                                                            on april 2
-"День геолога"                                                                                       on first sunday in april
-"День войск противовоздушной обороны"                                                                on second sunday in april
-"День чернобыльской трагедии"                                                                        on april 26
-"День печати"                                                                                        on may 5
-"День работников радио, телевидения и связи"                                                         on may 7
-"День семьи"                                                                                         on may 15
-"День Государственного флага и герба"                                                                on second sunday in may
-"День работников физической культуры и спорта"                                                       on third saturday in may
-"День пограничника"                                                                                  on may 28
-"День химика"                                                                                        on last sunday in may
-"День охраны окружающей среды"                                                                       on june 5
-"День мелиоратора"                                                                                   on first sunday in june
-"День работников легкой промышленности"                                                              on second sunday in june
-"День медицинских работников"                                                                        on third sunday in june
-"День всенародной памяти жертв ВОВ"                                                                  on june 22
-"День работников прокуратуры"                                                                        on june 26
-"День изобретателя и рационализатора"                                                                on last saturday in june
-"День молодёжи"                                                                                      on last sunday in june
-"День экономиста"                                                                                    on june 30
-"День кооперации"                                                                                    on first saturday in july
-"Купалье"                                                                                            on july 7
-"День работников водного транспорта"                                                                 on first sunday in july
-"День работников налоговых органов"                                                                  on second sunday in july
-"День металлурга"                                                                                    on third sunday in july
-"День пожарной службы"                                                                               on july 25
-"День работников торговли"                                                                           on last sunday in july
-"День десантников"                                                                                   on august 2
-"День железнодорожных войск"                                                                         on august 6
-"День железнодорожника"                                                                              on first sunday in august
-"День строителя"                                                                                     on second sunday in august
-"День военно-воздушных сил"                                                                          on third sunday in august
-"День работников государственной статистики"                                                         on august 23
-"День шахтера"                                                                                       on last sunday in august
-"День знаний"                                                                                        on september 1
-"День белорусской письменности"                                                                      on first sunday in september
-"День работников нефтяной, газовой и топливной промышленности"                                       on first sunday in september
-"День танкистов"                                                                                     on second sunday in september
-"День мира"                                                                                          on third tuesday in september
-"День библиотек"                                                                                     on september 15
-"День таможенника"                                                                                   on september 20
-"День работников леса"                                                                               on third sunday in september
-"День машиностроителя"                                                                               on last sunday in september
-"День пожилых людей"                                                                                 on october 1
-"День архивиста"                                                                                     on october 6
-"День учителя"                                                                                       on first sunday in october
-"День работников культуры"                                                                           on second sunday in october
-"День матери"                                                                                        on october 14
-"День стандартизации"                                                                                on october 14
-"День работников фармацевтической и микробиологической промышленности"                               on october 15
-"День автомобилиста и дорожника"                                                                     on last sunday in october
-"День работников гражданской авиации"                                                                on first sunday in november
-"День ракетных войск и артиллерии"                                                                   on november 19
-"День работников сельского хозяйства и перерабатывающей промышленности агропромышленного комплекса"  on third sunday in november
-"День инвалидов Республики Беларусь"                                                                 on december 3
-"День страховых работников"                                                                          on first saturday in december
-"День юриста"                                                                                        on first sunday in december
-"День прав человека"                                                                                 on december 10
-"День белорусского кино"                                                                             on december 17
-"День сотрудника органов государственной безопасности"                                               on december 20
-"День энергетика"                                                                                    on december 22
+"Старый Новый год"                                                                                   civil on january 14
+"День студентов (Татьянин день)"                                                                     civil on january 25
+"День Святого Валентина (День всех влюбленных)"                                                      civil on february 14
+"День молодёжи в Беларуси"                                                                           civil on last sunday in june
+"День памяти"                                                                                        civil on november 2
+"День работников социальной защиты"                                                                  civil on january 5
+"День банковских и финансовых работников"                                                            civil on first sunday in january
+"День спасателя"                                                                                     civil on january 19
+"День инженерных войск"                                                                              civil on january 21
+"День белорусской науки"                                                                             civil on last sunday in january
+"День памяти воинов-интернационалистов"                                                              civil on february 15
+"День работников землеустроительной и картографо-геодезической службы"                               civil on february 21
+"День защитников Отечества и Вооруженных Сил"                                                        civil on february 23
+"День милиции"                                                                                       civil on march 4
+"День Конституции"                                                                                   civil on march 15
+"День потребителя"                                                                                   civil on march 15
+"День внутренних войск"                                                                              civil on march 18
+"День работников бытового обслуживания населения и жилищно-коммунального хозяйства"                  civil on fourth sunday in march
+"Пасха"                                                                                              civil on easter
+"День единения народов Беларуси и России"                                                            civil on april 2
+"День геолога"                                                                                       civil on first sunday in april
+"День войск противовоздушной обороны"                                                                civil on second sunday in april
+"День чернобыльской трагедии"                                                                        civil on april 26
+"День печати"                                                                                        civil on may 5
+"День работников радио, телевидения и связи"                                                         civil on may 7
+"День семьи"                                                                                         civil on may 15
+"День Государственного флага и герба"                                                                civil on second sunday in may
+"День работников физической культуры и спорта"                                                       civil on third saturday in may
+"День пограничника"                                                                                  civil on may 28
+"День химика"                                                                                        civil on last sunday in may
+"День охраны окружающей среды"                                                                       civil on june 5
+"День мелиоратора"                                                                                   civil on first sunday in june
+"День работников легкой промышленности"                                                              civil on second sunday in june
+"День медицинских работников"                                                                        civil on third sunday in june
+"День всенародной памяти жертв ВОВ"                                                                  civil on june 22
+"День работников прокуратуры"                                                                        civil on june 26
+"День изобретателя и рационализатора"                                                                civil on last saturday in june
+"День молодёжи"                                                                                      civil on last sunday in june
+"День экономиста"                                                                                    civil on june 30
+"День кооперации"                                                                                    civil on first saturday in july
+"Купалье"                                                                                            civil on july 7
+"День работников водного транспорта"                                                                 civil on first sunday in july
+"День работников налоговых органов"                                                                  civil on second sunday in july
+"День металлурга"                                                                                    civil on third sunday in july
+"День пожарной службы"                                                                               civil on july 25
+"День работников торговли"                                                                           civil on last sunday in july
+"День десантников"                                                                                   civil on august 2
+"День железнодорожных войск"                                                                         civil on august 6
+"День железнодорожника"                                                                              civil on first sunday in august
+"День строителя"                                                                                     civil on second sunday in august
+"День военно-воздушных сил"                                                                          civil on third sunday in august
+"День работников государственной статистики"                                                         civil on august 23
+"День шахтера"                                                                                       civil on last sunday in august
+"День знаний"                                                                                        civil on september 1
+"День белорусской письменности"                                                                      civil on first sunday in september
+"День работников нефтяной, газовой и топливной промышленности"                                       civil on first sunday in september
+"День танкистов"                                                                                     civil on second sunday in september
+"День мира"                                                                                          civil on third tuesday in september
+"День библиотек"                                                                                     civil on september 15
+"День таможенника"                                                                                   civil on september 20
+"День работников леса"                                                                               civil on third sunday in september
+"День машиностроителя"                                                                               civil on last sunday in september
+"День пожилых людей"                                                                                 civil on october 1
+"День архивиста"                                                                                     civil on october 6
+"День учителя"                                                                                       civil on first sunday in october
+"День работников культуры"                                                                           civil on second sunday in october
+"День матери"                                                                                        civil on october 14
+"День стандартизации"                                                                                civil on october 14
+"День работников фармацевтической и микробиологической промышленности"                               civil on october 15
+"День автомобилиста и дорожника"                                                                     civil on last sunday in october
+"День работников гражданской авиации"                                                                civil on first sunday in november
+"День ракетных войск и артиллерии"                                                                   civil on november 19
+"День работников сельского хозяйства и перерабатывающей промышленности агропромышленного комплекса"  civil on third sunday in november
+"День инвалидов Республики Беларусь"                                                                 civil on december 3
+"День страховых работников"                                                                          civil on first saturday in december
+"День юриста"                                                                                        civil on first sunday in december
+"День прав человека"                                                                                 civil on december 10
+"День белорусского кино"                                                                             civil on december 17
+"День сотрудника органов государственной безопасности"                                               civil on december 20
+"День энергетика"                                                                                    civil on december 22
diff --git a/kholidays/holidays/plan2/holiday_ca-qc_fr b/kholidays/holidays/plan2/holiday_ca-qc_fr
index cdf2e0f..fec9c40 100644
--- a/kholidays/holidays/plan2/holiday_ca-qc_fr
+++ b/kholidays/holidays/plan2/holiday_ca-qc_fr
@@ -17,26 +17,26 @@ language    "fr"
 :description "(please add description in source language) Provincial holiday file for Quebec"
 
 :: Public Holidays
-"Jour de l'An"                        weekend on january 1
-"Vendredi Saint"                      weekend on easter minus 2 days
-"Paques"                              weekend on easter
-"Lundi de Paques"                     weekend on easter plus 1 day
-"Jour de la Reine (Fete de Dollard)"  weekend on monday before may 24
-"Fete de la Confederation"            weekend on july 1
-"Jour du Travail"                     weekend on first monday in september
-"Action de Graces"                    weekend on second monday in october
-"Jour du Souvenir (Armistice 1918)"   weekend on november 11
-"Noel"                                weekend on december 25
+"Jour de l'An"                        public on january 1
+"Vendredi Saint"                      public religious on easter minus 2 days
+"Paques"                              public religious on easter
+"Lundi de Paques"                     public on easter plus 1 day
+"Jour de la Reine (Fete de Dollard)"  public on monday before may 24
+"Fete de la Confederation"            public on july 1
+"Jour du Travail"                     public on first monday in september
+"Action de Graces"                    public on second monday in october
+"Jour du Souvenir (Armistice 1918)"   public on november 11
+"Noel"                                public religious on december 25
 
 :: Religious Holidays
 
 :: Financial
 
 :: Cultural
-"St Valentin"                         on february 14
-"Fetes des Meres"                     on second sunday in may
-"Fetes des Peres"                     on third sunday in june
-"St-Jean Baptiste"                    on june 24
+"St Valentin"                         cultural on february 14
+"Fetes des Meres"                     cultural on second sunday in may
+"Fetes des Peres"                     cultural on third sunday in june
+"St-Jean Baptiste"                    cultural on june 24
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_ca_en-gb b/kholidays/holidays/plan2/holiday_ca_en-gb
index 7f034fa..cba14f0 100644
--- a/kholidays/holidays/plan2/holiday_ca_en-gb
+++ b/kholidays/holidays/plan2/holiday_ca_en-gb
@@ -17,28 +17,28 @@ language    "en_GB"
 description "National holiday file for Canada"
 
 :: Public Holidays
-"New Year's Day"    weekend on january 1
-"Good Friday"       weekend on easter minus 2 days
-"Easter"            weekend on easter
-"Easter Monday"     weekend on easter plus 1 day
-"Victoria Day"      weekend on monday before may 24
-"Canada Day"        weekend on july 1
-"Civic Holiday"     weekend on first monday in august
-"Labour Day"        weekend on first monday in september
-"Thanksgiving"      weekend on second monday in october
-"Remembrance Day"   weekend on november 11
-"Christmas"         weekend on december 25
-"Boxing Day"        weekend on december 26
+"New Year's Day"    public on january 1
+"Good Friday"       public on easter minus 2 days
+"Easter"            public religious on easter
+"Easter Monday"     public on easter plus 1 day
+"Victoria Day"      public on monday before may 24
+"Canada Day"        public on july 1
+"Civic Holiday"     public on first monday in august
+"Labour Day"        public on first monday in september
+"Thanksgiving"      public on second monday in october
+"Remembrance Day"   public on november 11
+"Christmas"         public religious on december 25
+"Boxing Day"        public on december 26
 
 :: Religious
 
 :: Financial
 
 :: Cultural
-"Valentine's Day"   on february 14
-"Mother's Day"      on second sunday in may
-"Father's Day"      on third sunday in june
-"St-Jean Baptiste"  on june 24
+"Valentine's Day"   cultural on february 14
+"Mother's Day"      cultural on second sunday in may
+"Father's Day"      cultural on third sunday in june
+"St-Jean Baptiste"  cultural on june 24
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_ch_de b/kholidays/holidays/plan2/holiday_ch_de
index 5b1d766..1a1f623 100644
--- a/kholidays/holidays/plan2/holiday_ch_de
+++ b/kholidays/holidays/plan2/holiday_ch_de
@@ -19,17 +19,17 @@ description "Feiertage in der Schweiz"
 
 :: Public Holidays
 
-"Neujahr"          weekend on january 1
-"Karfreitag"       weekend on easter minus 2 days
-"Ostern"           weekend on easter
-"Auffahrt"         weekend on easter plus 39 days
-"Pfingsten"        weekend on easter plus 49 days
-"Pfingstmontag"    weekend on easter plus 50 days
-"Bundesfeier"      weekend on august 1
-"Bettag"           weekend on third sunday in september
-"Bettagmontag"     weekend on third sunday in september plus 1 day
-"Weihnachten"      weekend on december 25
-"Stefanstag"       weekend on december 26
+"Neujahr"          public on january 1
+"Karfreitag"       public religious on easter minus 2 days
+"Ostern"           public religious on easter
+"Auffahrt"         public religious on easter plus 39 days
+"Pfingsten"        public religious on easter plus 49 days
+"Pfingstmontag"    public religious on easter plus 50 days
+"Bundesfeier"      public on august 1
+"Bettag"           public on third sunday in september
+"Bettagmontag"     public on third sunday in september plus 1 day
+"Weihnachten"      public religious on december 25
+"Stefanstag"       public on december 26
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_ch_fr b/kholidays/holidays/plan2/holiday_ch_fr
index 2c93fce..12a147a 100644
--- a/kholidays/holidays/plan2/holiday_ch_fr
+++ b/kholidays/holidays/plan2/holiday_ch_fr
@@ -19,19 +19,19 @@ description "Fêtes et jours fériés en Suisse"
 
 :: Public Holidays
 
-"Nouvel An"              weekend on january 1
-"Fête Nationale"         weekend on august 1
-"Jeune Fédéral"          weekend on third sunday in september
-"Lundi du Jeûne Fédéral" weekend on third sunday in september plus 1 day
+"Nouvel An"              public on january 1
+"Fête Nationale"         public on august 1
+"Jeune Fédéral"          public on third sunday in september
+"Lundi du Jeûne Fédéral" public on third sunday in september plus 1 day
 
 :: Religious Holidays
-"Vendredi Saint"         weekend on easter minus 2 days
-"Pâques"                 weekend on easter
-"Ascension"              weekend on easter plus 39 days
-"Pentecôte"              weekend on easter plus 49 days
-"Lundi de Pentecôte"     weekend on easter plus 50 days
-"Noël"                   weekend on december 25
-"Saint-Étienne"          weekend on december 26
+"Vendredi Saint"         public religious on easter minus 2 days
+"Pâques"                 public religious on easter
+"Ascension"              public religious on easter plus 39 days
+"Pentecôte"              public religious on easter plus 49 days
+"Lundi de Pentecôte"     public religious on easter plus 50 days
+"Noël"                   public religious on december 25
+"Saint-Étienne"          public religious on december 26
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_ch_it b/kholidays/holidays/plan2/holiday_ch_it
index b227640..605f8e3 100644
--- a/kholidays/holidays/plan2/holiday_ch_it
+++ b/kholidays/holidays/plan2/holiday_ch_it
@@ -19,21 +19,21 @@ language    "it"
 
 :: Public Holidays
 
-"Capo d'anno"      weekend on january 1
-"Epifania"         weekend on january 6
-"San Giuseppe"     weekend on march 19
-"Pasqua"           weekend on easter
-"Lunedi di Pasqua" weekend on easter plus 1 day
-"Festa dei lavoratori" weekend on may 1
-"Ascensione"       weekend on easter plus 39 days
-"Pentecoste"       weekend on easter plus 49 days
-"Lunedi di Pentecoste" weekend on easter plus 50 days
-"Festa nazionale"  weekend on august 1
-"Assunzione"       weekend on august 15
-"Ognissanti"       weekend on november 1
-"Immacolata"       weekend on december 8
-"Natale"           weekend on december 25
-"Santo Stefano"    weekend on december 26
+"Capo d'anno"               public on january 1
+"Epifania"                  public on january 6
+"San Giuseppe"              public on march 19
+"Pasqua"                    public religious on easter
+"Lunedi di Pasqua"          public religious on easter plus 1 day
+"Festa dei lavoratori"      public on may 1
+"Ascensione"                public religious on easter plus 39 days
+"Pentecoste"                public religious on easter plus 49 days
+"Lunedi di Pentecoste"      public religious on easter plus 50 days
+"Festa nazionale"           public on august 1
+"Assunzione"                public religious on august 15
+"Ognissanti"                public on november 1
+"Immacolata"                public religious on december 8
+"Natale"                    public religious on december 25
+"Santo Stefano"             public religious on december 26
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_cl_es b/kholidays/holidays/plan2/holiday_cl_es
index 95cbcd8..3b5828e 100644
--- a/kholidays/holidays/plan2/holiday_cl_es
+++ b/kholidays/holidays/plan2/holiday_cl_es
@@ -17,37 +17,38 @@ language    "es"
 :description "(please add description in source language) National holiday file for Chile"
 
 :: Public Holidays
-"Año Nuevo"                           weekend on january 1
-"Viernes Santo"                       weekend on easter minus 2
-"Sabado Santo"                        weekend on easter minus 1
-"Día Nacional del Trabajador"         weekend on may 1
-"Día de las Glorias Navales"          weekend on may 21
-"San Pedro y San Pablo"               weekend on (([6/29] == [tuesday after ([6/28])] ||
-                                                   [6/29] == [wednesday after ([6/28])] ||
-                                                   [6/29] == [thursday after ([6/28])] ) ?
-                                                  [monday before ([6/29])] :
-                                                  (([6/29] == [friday after ([6/28])])? [monday after ([6/29])]:[6/29]))
-"Virgen del Carmen"                   weekend on july 16
-"Asunción de la Virgen"               weekend on august 15
-"Día de la Independencia"             weekend on september 18
-"Día de las Glorias del Ejército"     weekend on september 19
-"Sandwich Dieciochero"                weekend on (([9/17] == [monday after ([9/16])]) ? ([9/17]) :
-                                                  (([9/20] == [friday after ([9/19])]) ? ([9/20]) : noop))
-"Día de la Raza"                      weekend on (([10/12] == [tuesday after ([10/11])] ||
-                                                   [10/12] == [wednesday after ([10/11])] ||
-                                                   [10/12] == [thursday after ([10/11])] ) ?
+"Año Nuevo"                           public on january 1
+"Viernes Santo"                       public religious on easter minus 2
+"Sabado Santo"                        public religious on easter minus 1
+"Día Nacional del Trabajador"         public on may 1
+"Día de las Glorias Navales"          public on may 21
+"San Pedro y San Pablo"               public religious on (([6/29] == [tuesday after ([6/28])] ||
+                                                            [6/29] == [wednesday after ([6/28])] ||
+                                                            [6/29] == [thursday after ([6/28])] ) ?
+                                                            [monday before ([6/29])] :
+                                                          (([6/29] == [friday after ([6/28])])?
+                                                            [monday after ([6/29])]:[6/29]))
+"Virgen del Carmen"                   public religious on july 16
+"Asunción de la Virgen"               public religious on august 15
+"Día de la Independencia"             public on september 18
+"Día de las Glorias del Ejército"     public on september 19
+"Sandwich Dieciochero"                public on (([9/17] == [monday after ([9/16])]) ? ([9/17]) :
+                                                (([9/20] == [friday after ([9/19])]) ? ([9/20]) : noop))
+"Día de la Raza"                      public on (([10/12] == [tuesday after ([10/11])] ||
+                                                  [10/12] == [wednesday after ([10/11])] ||
+                                                  [10/12] == [thursday after ([10/11])] ) ?
                                                   [monday before ([10/12])] :
-                                                  (([10/12] == [friday after ([10/11])]) ?
+                                                (([10/12] == [friday after ([10/11])]) ?
                                                   [monday after ([10/12])]:[10/12]))
-"Día Nacional de las Iglesias Evangélicas y Protestantes"  weekend on (([10/31] == [tuesday after ([10/30])]) ?
-                                                                       [friday before ([10/31])] :
-                                                                       (([10/31] == [wednesday after ([10/30])]) ?
-                                                                       [friday after ([10/31])] : [10/31]))
-"Día de Todos los Santos"             weekend on november 1
-"Inmaculada Concepción de la Virgen"  weekend on december 8
-"Navidad"                             weekend on december 25
-"Feriado Bancario de Fin de año"      weekend on december 31
-"Elecciones Prescidenciales"          weekend on 13.12.2009
+"Día Nacional de las Iglesias Evangélicas y Protestantes"  public religious on (([10/31] == [tuesday after ([10/30])]) ?
+                                                                                 [friday before ([10/31])] :
+                                                                               (([10/31] == [wednesday after ([10/30])]) ?
+                                                                                 [friday after ([10/31])] : [10/31]))
+"Día de Todos los Santos"             public religious on november 1
+"Inmaculada Concepción de la Virgen"  public religious on december 8
+"Navidad"                             public religious on december 25
+"Feriado Bancario de Fin de año"      public on december 31
+"Elecciones Prescidenciales"          public on 13.12.2009
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_cn_zh-cn b/kholidays/holidays/plan2/holiday_cn_zh-cn
index b4d10d9..c6d3621 100644
--- a/kholidays/holidays/plan2/holiday_cn_zh-cn
+++ b/kholidays/holidays/plan2/holiday_cn_zh-cn
@@ -18,11 +18,11 @@ language    "zh_CN"
 
 :: Public Holidays
 : New Year
-"元旦"                       weekend on january 1
+"元旦"                       public on january 1
 :Labor Day
-"劳动节"                     weekend on may 1
+"劳动节"                     public on may 1
 :National Day
-"国庆节"                     weekend on october 1 length 3 days
+"国庆节"                     public on october 1 length 3 days
 
 :: Religious
 
@@ -30,17 +30,17 @@ language    "zh_CN"
 
 :: Cultural
 :International Women's Day
-"国际妇女节"                  on march 8
+"国际妇女节"                  cultural on march 8
 :Arbor Day
-"植树节"                     on march 12
+"植树节"                     cultural on march 12
 :Youth Day
-"青年节"                     on may 4
+"青年节"                     cultural on may 4
 :Children's Day
-"六一儿童节"                  on june 1
+"六一儿童节"                  cultural on june 1
 :CPC Founding Day
-"建党节"                     on july 1
+"建党节"                     cultural on july 1
 :Army Day
-"建军节"                     on august 1
+"建军节"                     cultural on august 1
 
 :: School
 
@@ -55,26 +55,25 @@ language    "zh_CN"
 ::
 :: Lunar calendar based holidays
 :: and special free (on weekdays) / work (on weekends) arrangements for 2009
-:: yellow for free days, red for working days
 :: Data from http://cnreviews.com/life/living-in-china/china_public_holiday_2009_20081210.html
 :: and various en.wikipedia.org pages
 ::
-"节假日 (day off)"                                 weekend on 2 january 2009
-"工作日 (working day)"                             on 4 january 2009
-"工作日 (working day)"                             on 24 january 2009
-"春节 (Chinese New Year / Spring Festival)"       weekend on 25 january 2009 length 3 days
-"节假日 (day off)"                                 weekend on 28 january 2009 length 3 days
-"工作日 (working day)"                             on 1 february 2009
-"元宵节 (Lantern Festival)"                        on 9 february 2009
-"清明节 (Qing Ming Festival / Tomb Sweeping Day)"  weekend on 4 april 2009
-"节假日 (day off)"                                 weekend on 6 april 2009
-"端午节 (Dragon Boat Festival)"                    weekend on 28 may 2009
-"节假日 (day off)"                                 weekend on 29 may 2009
-"工作日 (working day)"                             on 31 may 2009
-"七夕节 Lover's Day"                               on 26 august 2009
-"中元节 Ghost Festival"                            on 3 september 2009
-"工作日 (working day)"                             on 27 september 2009
-"中秋节 (Mid-Autumn Festival)"                     weekend on 3 october 2009
-"节假日 (day off)"                                 weekend on 5 october 2009 length 4 days
-"工作日 (working day)"                             on 10 october 2009
-"重阳节 (Double Ninth Day / Elders' Day)"          on 26 october 2009
+"节假日 (day off)"                                 public on 2 january 2009
+"工作日 (working day)"                             civil on 4 january 2009
+"工作日 (working day)"                             civil on 24 january 2009
+"春节 (Chinese New Year / Spring Festival)"       public on 25 january 2009 length 3 days
+"节假日 (day off)"                                 public on 28 january 2009 length 3 days
+"工作日 (working day)"                             civil on 1 february 2009
+"元宵节 (Lantern Festival)"                        cultural on 9 february 2009
+"清明节 (Qing Ming Festival / Tomb Sweeping Day)"  public on 4 april 2009
+"节假日 (day off)"                                 public on 6 april 2009
+"端午节 (Dragon Boat Festival)"                    public on 28 may 2009
+"节假日 (day off)"                                 public on 29 may 2009
+"工作日 (working day)"                             civil on 31 may 2009
+"七夕节 Lover's Day"                               cultural on 26 august 2009
+"中元节 Ghost Festival"                            cultural on 3 september 2009
+"工作日 (working day)"                             civil on 27 september 2009
+"中秋节 (Mid-Autumn Festival)"                     public on 3 october 2009
+"节假日 (day off)"                                 public on 5 october 2009 length 4 days
+"工作日 (working day)"                             civil on 10 october 2009
+"重阳节 (Double Ninth Day / Elders' Day)"          cultural on 26 october 2009
diff --git a/kholidays/holidays/plan2/holiday_co_es b/kholidays/holidays/plan2/holiday_co_es
index 8193b2c..57922cf 100644
--- a/kholidays/holidays/plan2/holiday_co_es
+++ b/kholidays/holidays/plan2/holiday_co_es
@@ -18,28 +18,28 @@ language    "es"
 :description "(please add description in source language) National holiday file for Colombia"
 
 :: Public Holidays
-"Año nuevo"                   weekend on january 1
-"Epifanía"                    weekend on monday after january 6
-"San José"                    weekend on monday after march 19
-"Jueves Santo"                weekend on easter minus 3
-"Viernes Santo"               weekend on easter minus 2
-"Ascensión de Jesús"          weekend on easter plus 43
-"Corpus Christi"              weekend on easter plus 64
-"Sagrado Corazón"             weekend on easter plus 71
-"Día del Trabajo"             weekend on may 1
-"San Pedro y San Pablo"       weekend on monday after june 29
-"Grito de la Independencia"   weekend on july 20
-"Batalla de Boyacá"           weekend on august 7
-"Asunción de la Virgen"       weekend on monday after august 15
-"Día de la Raza"              weekend on monday after october 12
-"Todos los Santos"            weekend on monday after november 1
-"Independencia de Cartagena"  weekend on monday after november 11
-"Inmaculada Concepción"       weekend on december 8
-"Navidad"                     weekend on december 25
+"Año nuevo"                   public on january 1
+"Epifanía"                    public religious on monday after january 6
+"San José"                    public religious on monday after march 19
+"Jueves Santo"                public religious on easter minus 3
+"Viernes Santo"               public religious on easter minus 2
+"Ascensión de Jesús"          public religious on easter plus 43
+"Corpus Christi"              public religious on easter plus 64
+"Sagrado Corazón"             public religious on easter plus 71
+"Día del Trabajo"             public on may 1
+"San Pedro y San Pablo"       public religious on monday after june 29
+"Grito de la Independencia"   public on july 20
+"Batalla de Boyacá"           public on august 7
+"Asunción de la Virgen"       public religious on monday after august 15
+"Día de la Raza"              public on monday after october 12
+"Todos los Santos"            public on monday after november 1
+"Independencia de Cartagena"  public on monday after november 11
+"Inmaculada Concepción"       public religious on december 8
+"Navidad"                     public religious on december 25
 
 :: Religious
-"Domingo de Ramos"            on easter minus 7
-"Domingo de Pascua"           on easter
+"Domingo de Ramos"            religious on easter minus 7
+"Domingo de Pascua"           religious on easter
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_cr_en b/kholidays/holidays/plan2/holiday_cr_en
index a17a54e..09f7010 100644
--- a/kholidays/holidays/plan2/holiday_cr_en
+++ b/kholidays/holidays/plan2/holiday_cr_en
@@ -19,26 +19,26 @@ language    "en"
 description "National holiday file for Costa Rica"
 
 :: Public Holidays
-"New Year's Day"                weekend on january 1
-"Battle of Rivas Day"           weekend on april 11
-"Labor Day"                     weekend on may 1
-"Guanacaste Day"                weekend on july 25
-"Mother's Day"                  weekend on august 15
-"Independence Day"              weekend on september 15
+"New Year's Day"                public on january 1
+"Battle of Rivas Day"           public on april 11
+"Labor Day"                     public on may 1
+"Guanacaste Day"                public on july 25
+"Mother's Day"                  public on august 15
+"Independence Day"              public on september 15
 
 
 :: Religious
-"Saint Joseph's Day"            on march 19
-"Maundy Thursday"               weekend on easter minus 3 days
-"Good Friday"                   weekend on easter minus 2 days
-"Easter"                        weekend on easter
-"Virgin of Los Angeles Day"     on august 2
-"Christmas Day"                 weekend on december 25
+"Saint Joseph's Day"            religious on march 19
+"Maundy Thursday"               public religious on easter minus 3 days
+"Good Friday"                   public religious on easter minus 2 days
+"Easter"                        public religious on easter
+"Virgin of Los Angeles Day"     religious on august 2
+"Christmas Day"                 public religious on december 25
 
 :: Financial
 
 :: Cultural
-"Meeting of Cultures Day"       on october 12
+"Meeting of Cultures Day"       cultural on october 12
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_cr_es b/kholidays/holidays/plan2/holiday_cr_es
index 4fb97de..5177c67 100644
--- a/kholidays/holidays/plan2/holiday_cr_es
+++ b/kholidays/holidays/plan2/holiday_cr_es
@@ -18,25 +18,25 @@ language    "es"
 description "Días Feriados de Costa Rica"
 
 :: Public Holidays
-"Año Nuevo"                                             weekend on january 1
-"Día de Juan Santamaría"                                weekend on april 11
-"Día Internacional del Trabajo"                         weekend on may 1
-"Anexión del Partido de Nicoya a Costa Rica"            weekend on july 25
-"Día de la Madre"                                       weekend on august 15
-"Conmemoración de la Independencia de Costa Rica"       weekend on september 15
+"Año Nuevo"                                             public on january 1
+"Día de Juan Santamaría"                                public on april 11
+"Día Internacional del Trabajo"                         public on may 1
+"Anexión del Partido de Nicoya a Costa Rica"            public on july 25
+"Día de la Madre"                                       public on august 15
+"Conmemoración de la Independencia de Costa Rica"       public on september 15
 
 :: Religious
-"Día de San José"                                       on march 19
-"Jueves Santo"                                          weekend on easter minus 3 days
-"Viernes Santo"                                         weekend on easter minus 2 days
-"Pascua"                                                weekend on easter
-"día de la Virgen de los Ángeles"                       on august 2
-"Navidad"                                               weekend on december 25
+"Día de San José"                                       religious on march 19
+"Jueves Santo"                                          public religious on easter minus 3 days
+"Viernes Santo"                                         public religious on easter minus 2 days
+"Pascua"                                                public religious on easter
+"día de la Virgen de los Ángeles"                       religious on august 2
+"Navidad"                                               public religious on december 25
 
 :: Financial
 
 :: Cultural
-"Día de las Culturas"                                   on october 12
+"Día de las Culturas"                                   cultural on october 12
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_cz_cs b/kholidays/holidays/plan2/holiday_cz_cs
index f1a2d03..3357784 100644
--- a/kholidays/holidays/plan2/holiday_cz_cs
+++ b/kholidays/holidays/plan2/holiday_cz_cs
@@ -17,28 +17,28 @@ language    "cs"
 :description "(please add description in source language) National holiday file for Czech Republic"
 
 :: Public Holidays
-"Nový rok"                                                       weekend on january 1
-"Státní svátek - Den vzniku samostatného českého státu"          weekend on january 1
-"Velikonoce"                                                     weekend on easter
-"Velikonoční pondělí"                                            weekend on easter plus 1 days
-"Svátek práce"                                                   weekend on may 1
-"Státní svátek - Den osvobození"                                 weekend on may 8
-"Státní svátek - Den slovanských věrozvěstů Cyrila a Metoděje"   weekend on july 5
-"Statní svátek - Den upálení mistra Jana Husa"                   weekend on july 6
-"Státní svátek - Den České státnosti"                            weekend on september 28
-"Státní svátek - Den vzniku samostatného Československa (1918)"  weekend on october 28
-"Státní svátek - Den boje za svobodu a demokracii"               weekend on november 17
-"Štědrý den"                                                     weekend on december 24
-"1. svátek vánoční"                                              weekend on december 25
-"2. svátek vánoční"                                              weekend on december 26
+"Nový rok"                                                       public on january 1
+"Státní svátek - Den vzniku samostatného českého státu"          public on january 1
+"Velikonoce"                                                     public religious on easter
+"Velikonoční pondělí"                                            public religious on easter plus 1 days
+"Svátek práce"                                                   public on may 1
+"Státní svátek - Den osvobození"                                 public on may 8
+"Státní svátek - Den slovanských věrozvěstů Cyrila a Metoděje"   public on july 5
+"Statní svátek - Den upálení mistra Jana Husa"                   public on july 6
+"Státní svátek - Den České státnosti"                            public on september 28
+"Státní svátek - Den vzniku samostatného Československa (1918)"  public on october 28
+"Státní svátek - Den boje za svobodu a demokracii"               public on november 17
+"Štědrý den"                                                     public on december 24
+"1. svátek vánoční"                                              public religious on december 25
+"2. svátek vánoční"                                              public on december 26
 
 :: Religious
-"Silvestr"                                                       on december 31
+"Silvestr"                                                       religious on december 31
 
 :: Financial
 
 :: Cultural
-"Mezinárodní den žen"                                            on march 8
+"Mezinárodní den žen"                                            cultural on march 8
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_de-by_de b/kholidays/holidays/plan2/holiday_de-by_de
index 20682df..5dc68f1 100644
--- a/kholidays/holidays/plan2/holiday_de-by_de
+++ b/kholidays/holidays/plan2/holiday_de-by_de
@@ -31,61 +31,61 @@ language    "de"
 :description "(please add description in source language) National holiday file for Bavaria"
 
 :: Public Holidays
-"Neujahr"                     weekend on january 1
-"Hl. 3 Könige"                weekend on january 6
-"Karfreitag"                  weekend on easter minus  2 days
-"Ostern"                      weekend on easter length 2 days
-"Pfingsten"                   weekend on easter plus 49 days length 2 days
-"Christi Himmelfahrt"         weekend on easter plus 39 days
-"Fronleichnam"                weekend on easter plus 60 days
-"1. Mai"                      weekend on may 1
-"Mariä Himmelfahrt"           weekend on august 15
-"Einheitstag"                 weekend on october 3
-"Allerheiligen"               weekend on november 1
-"Buß- und Bettag"             weekend on sunday before december 24 minus 32 days
-"Weihnachten"                 weekend on december 25 length 2 days
+"Neujahr"                     public on january 1
+"Hl. 3 Könige"                public on january 6
+"Karfreitag"                  public cultural on easter minus  2 days
+"Ostern"                      public cultural on easter length 2 days
+"Pfingsten"                   public cultural on easter plus 49 days length 2 days
+"Christi Himmelfahrt"         public cultural on easter plus 39 days
+"Fronleichnam"                public cultural on easter plus 60 days
+"1. Mai"                      public on may 1
+"Mariä Himmelfahrt"           public cultural on august 15
+"Einheitstag"                 public on october 3
+"Allerheiligen"               public on november 1
+"Buß- und Bettag"             public on sunday before december 24 minus 32 days
+"Weihnachten"                 public cultural on december 25 length 2 days
 
 :: Religious
-"Lichtmeß"                    on february 2
-"Rosenmontag"                 on easter minus 48 days
-"Fasching"                    on easter minus 47 days
-"Aschermittwoch"              on easter minus 46 days
-"1. Fastensonntag"            on easter minus 42 days
-"2. Fastensonntag"            on easter minus 35 days
-"3. Fastensonntag"            on easter minus 28 days
-"Oculi"                       on easter minus 28 days
-"4. Fastensonntag"            on easter minus 21 days
-"5. Fastensonntag"            on easter minus 14 days
-"Palmsonntag"                 on easter minus  7 days
-"Pankraz"                     on may 11
-"Servaz"                      on may 12
-"Bonifaz"                     on may 13
-"Sophie"                      on may 14
-"Johanni"                     on june 24
-"Siebenschläfer"              on june 27
-"Mariä Geburt"                on september 8
-"Martini"                     on november 11
-"Nikolaus"                    on december 6
-"Christkönig"                 on sunday before december 23 minus 28 days
-"1. Advent"                   on sunday before december 24 minus 21 days
-"2. Advent"                   on sunday before december 24 minus 14 days
-"3. Advent"                   on sunday before december 24 minus  7 days
-"4. Advent"                   on sunday before december 24
-"Hl. Abend"                   on december 24
-"Silvester"                   on december 31
+"Lichtmeß"                    religious on february 2
+"Rosenmontag"                 religious on easter minus 48 days
+"Fasching"                    religious on easter minus 47 days
+"Aschermittwoch"              religious on easter minus 46 days
+"1. Fastensonntag"            religious on easter minus 42 days
+"2. Fastensonntag"            religious on easter minus 35 days
+"3. Fastensonntag"            religious on easter minus 28 days
+"Oculi"                       religious on easter minus 28 days
+"4. Fastensonntag"            religious on easter minus 21 days
+"5. Fastensonntag"            religious on easter minus 14 days
+"Palmsonntag"                 religious on easter minus  7 days
+"Pankraz"                     religious on may 11
+"Servaz"                      religious on may 12
+"Bonifaz"                     religious on may 13
+"Sophie"                      religious on may 14
+"Johanni"                     religious on june 24
+"Siebenschläfer"              religious on june 27
+"Mariä Geburt"                religious on september 8
+"Martini"                     religious on november 11
+"Nikolaus"                    religious on december 6
+"Christkönig"                 religious on sunday before december 23 minus 28 days
+"1. Advent"                   religious on sunday before december 24 minus 21 days
+"2. Advent"                   religious on sunday before december 24 minus 14 days
+"3. Advent"                   religious on sunday before december 24 minus  7 days
+"4. Advent"                   religious on sunday before december 24
+"Hl. Abend"                   religious on december 24
+"Silvester"                   religious on december 31
 
 :: Financial
 
 :: Cultural
-"Muttertag"                   on second sunday in may
-"Karwoche"                    on easter minus 6 days length 6 days
-"1. Wies'nsonntag"            on first sunday in october minus 14 days
+"Muttertag"                   cultural on second sunday in may
+"Karwoche"                    cultural on easter minus 6 days length 6 days
+"1. Wies'nsonntag"            cultural on first sunday in october minus 14 days
 
 :: School
 
 :: Daylight Saving
-"Sommerzeit"                  on last sunday in march
-"Winterzeit"                  on last sunday in october
+"Sommerzeit"                  seasonal on last sunday in march
+"Winterzeit"                  seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_de_de b/kholidays/holidays/plan2/holiday_de_de
index 3a0a9c4..048814d 100644
--- a/kholidays/holidays/plan2/holiday_de_de
+++ b/kholidays/holidays/plan2/holiday_de_de
@@ -17,41 +17,41 @@ language    "de"
 :description "(please add description in source language) National holiday file for Germany"
 
 :: Public Holidays
-"Neujahr"          weekend on 1.1.
-"Karfreitag"       weekend on easter minus 2 days
-"Ostern"           weekend on easter length 2 days
-"Pfingsten"        weekend on easter plus 49 days length 2 days
-"Himmelfahrt"      weekend on easter plus 39 days
-"1. Mai"           weekend on 1.5.
-"Tag d. Einheit"   weekend on 3.10.
-"Weihnachten"      weekend on 25.12. length 2 days
+"Neujahr"          public on 1.1.
+"Karfreitag"       public on easter minus 2 days
+"Ostern"           public on easter length 2 days
+"Pfingsten"        public on easter plus 49 days length 2 days
+"Himmelfahrt"      public on easter plus 39 days
+"1. Mai"           public on 1.5.
+"Tag d. Einheit"   public on 3.10.
+"Weihnachten"      public on 25.12. length 2 days
 
 :: Religious
-"Hl. 3 Könige"     on january 6
-"Rosenmontag"      on easter minus 48 days
-"Fasching"         on easter minus 47 days
-"Aschermittwoch"   on easter minus 46 days
-"Fronleichnam"     on easter plus 60 days
-"Reformationstag"  on october 31
-"Allerheiligen"    on november 1
-"Buß & Bettag"     on sunday before december 24 minus 32 days
-"1. Advent"        on sunday before december 24 minus 21 days
-"2. Advent"        on sunday before december 24 minus 14 days
-"3. Advent"        on sunday before december 24 minus 7 days
-"4. Advent"        on sunday before december 24
-"Hl. Abend"        on december 24
-"Silvester"        on december 31
+"Hl. 3 Könige"     religious on january 6
+"Rosenmontag"      religious on easter minus 48 days
+"Fasching"         religious on easter minus 47 days
+"Aschermittwoch"   religious on easter minus 46 days
+"Fronleichnam"     religious on easter plus 60 days
+"Reformationstag"  religious on october 31
+"Allerheiligen"    religious on november 1
+"Buß & Bettag"     religious on sunday before december 24 minus 32 days
+"1. Advent"        religious on sunday before december 24 minus 21 days
+"2. Advent"        religious on sunday before december 24 minus 14 days
+"3. Advent"        religious on sunday before december 24 minus 7 days
+"4. Advent"        religious on sunday before december 24
+"Hl. Abend"        religious on december 24
+"Silvester"        religious on december 31
 
 :: Financial
 
 :: Cultural
-"Muttertag"        on second sunday in may
+"Muttertag"        cultural on second sunday in may
 
 :: School
 
 :: Daylight Saving
-"Sommerzeit"       on last sunday in march
-"Winterzeit"       on last sunday in october
+"Sommerzeit"       seasonal on last sunday in march
+"Winterzeit"       seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_dk_da b/kholidays/holidays/plan2/holiday_dk_da
index 5c35ba4..a082c7a 100644
--- a/kholidays/holidays/plan2/holiday_dk_da
+++ b/kholidays/holidays/plan2/holiday_dk_da
@@ -17,69 +17,71 @@ language    "da"
 :description "(please add description in source language) National holiday file for Denmark"
 
 :: Public Holidays
-"Nytårsdag"                            weekend on january 1
-"Fastelavn"                            weekend on easter minus 49 days
-"Palme søndag"                         weekend on easter minus 7 days
-"Skærtorsdag"                          weekend on easter minus 3 days
-"Langfredag"                           weekend on easter minus 2 days
-"PÃ¥skedag"                             weekend on easter
-"2. PÃ¥skedag"                          weekend on easter plus 1 day
-"Store bededag"                        weekend on easter plus 26 days
-"Kristi himmelfart"                    weekend on easter plus 39 days
-"Pinsedag"                             weekend on easter plus 49 days
-"2. Pinsedag"                          weekend on easter plus 50 days
-"Grundlovsdag/Fars dag"                weekend on june 5
-"1. Advent"                            weekend on sunday before december 24 minus 21 days
-"2. Advent"                            weekend on sunday before december 24 minus 14 days
-"3. Advent"                            weekend on sunday before december 24 minus 7 days
-"4. Advent"                            weekend on sunday before december 24
-"Juleaftensdag"                        weekend on december 24
-"Juledag"                              weekend on december 25
-"2. Juledag"                           weekend on december 26
+"Nytårsdag"                            public on january 1
+"Fastelavn"                            public religious on easter minus 49 days
+"Palme søndag"                         public religious on easter minus 7 days
+"Skærtorsdag"                          public religious on easter minus 3 days
+"Langfredag"                           public religious on easter minus 2 days
+"PÃ¥skedag"                             public religious on easter
+"2. PÃ¥skedag"                          public religious on easter plus 1 day
+"Store bededag"                        public religious on easter plus 26 days
+"Kristi himmelfart"                    public religious on easter plus 39 days
+"Pinsedag"                             public religious on easter plus 49 days
+"2. Pinsedag"                          public religious on easter plus 50 days
+"Grundlovsdag/Fars dag"                public on june 5
+"1. Advent"                            public religious on sunday before december 24 minus 21 days
+"2. Advent"                            public religious on sunday before december 24 minus 14 days
+"3. Advent"                            public religious on sunday before december 24 minus 7 days
+"4. Advent"                            public religious on sunday before december 24
+"Juleaftensdag"                        public on december 24
+"Juledag"                              public religious on december 25
+"2. Juledag"                           public on december 26
 
 :: Religious
-"Hellig tre Konger"                    on january 6
-"Kyndelmisse"                          on february 2
-"Skt. Hans dag"                        on june 24
-"Mortensdag"                           on november 11
+"Hellig tre Konger"                    religious on january 6
+"Kyndelmisse"                          religious on february 2
+"Skt. Hans dag"                        religious on june 24
+"Mortensdag"                           religious on november 11
 
 :: Financial
 
 :: Cultural
-"Mors dag"                             on second sunday in may
+"Mors dag"                             cultural on second sunday in may
+
 :: Nationale mærkedage
-"Kampen ved Myslunde 1864"             on february 2
-"Stormen på København 1659"            on february 11
-"Slaget på Reden 1801"                 on april 2
-"Danmarks Besættelse 1940"             on april 9
-"Slaget ved Dybbøl 1864"               on april 18
-"Danmarks befrielse 1945"              on may 5
-"Kampen ved Helgoland 1864"            on may 9
-"Europadagen"                          on may 9
-"Valdemarsdag/Genforeningsdagen 1920"  on june 15
-"Slaget i Køge Bugt"                   on june 1
-"Slaget ved Fredericia 1849"           on july 6
-"Slaget ved Isted 1850"                on july 25
-"Stormen på Frederiksstad 1850"        on october 4
-"FN-dag"                               on october 24
+"Kampen ved Myslunde 1864"             cultural on february 2
+"Stormen på København 1659"            cultural on february 11
+"Slaget på Reden 1801"                 cultural on april 2
+"Danmarks Besættelse 1940"             cultural on april 9
+"Slaget ved Dybbøl 1864"               cultural on april 18
+"Danmarks befrielse 1945"              cultural on may 5
+"Kampen ved Helgoland 1864"            cultural on may 9
+"Europadagen"                          cultural on may 9
+"Valdemarsdag/Genforeningsdagen 1920"  cultural on june 15
+"Slaget i Køge Bugt"                   cultural on june 1
+"Slaget ved Fredericia 1849"           cultural on july 6
+"Slaget ved Isted 1850"                cultural on july 25
+"Stormen på Frederiksstad 1850"        cultural on october 4
+"FN-dag"                               cultural on october 24
+
 :: Royale fødselsdage
-"Kronprinsesse Mary"                   on february 5
-"Prinsesse Marie"                      on february 6
-"Dronning Margrete II"                 on april 16
-"Prinsesse Isabella"                   on april 21
-"Prinsesse Benedikte"                  on april 29
-"Kronprins Frederik"                   on may 26
-"Prins Joachim"                        on june 7
-"Prins Henrik"                         on june 11
-"Prins Felix"                          on july 22
-"Prins Nikolai"                        on august 28
-"Prins Christian"                      on october 15
+"Kronprinsesse Mary"                   cultural on february 5
+"Prinsesse Marie"                      cultural on february 6
+"Dronning Margrete II"                 cultural on april 16
+"Prinsesse Isabella"                   cultural on april 21
+"Prinsesse Benedikte"                  cultural on april 29
+"Kronprins Frederik"                   cultural on may 26
+"Prins Joachim"                        cultural on june 7
+"Prins Henrik"                         cultural on june 11
+"Prins Felix"                          cultural on july 22
+"Prins Nikolai"                        cultural on august 28
+"Prins Christian"                      cultural on october 15
 
 :: School
 
 :: Daylight Saving
-"Sommertid begynder"                   on last sunday in march
-"Sommertid ender"                      on last sunday in october
+"Sommertid begynder"                   seasonal on last sunday in march
+"Sommertid ender"                      seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_dz_ar b/kholidays/holidays/plan2/holiday_dz_ar
index f49e316..9adc864 100644
--- a/kholidays/holidays/plan2/holiday_dz_ar
+++ b/kholidays/holidays/plan2/holiday_dz_ar
@@ -21,26 +21,26 @@ description "National holiday file for Algeria"
 :: National Holidays
 
 : New Year's Day
-"رأس السنة الميلادية"            weekend on january 1
+"رأس السنة الميلادية"            public on january 1
 : Labour Day
-"عيد العمال"                   weekend on may 1
+"عيد العمال"                   public on may 1
 : Independence Day
-"عيد الإستقلال"           weekend on july 5
+"عيد الإستقلال"           public on july 5
 : Anniversary of the Revolution
-"ذكرى الثورة"                   weekend on november 1
+"ذكرى الثورة"                   public on november 1
 
 :: Religious Holidays
 
 : Islamic New Year
-"رأس السنة الهجرية"            weekend on hijri muharram 1
+"رأس السنة الهجرية"            public religious on hijri muharram 1
 : Ashura
-"عاشوراء"         weekend on hijri muharram 10
+"عاشوراء"         public religious on hijri muharram 10
 : Birthday of the Prophet Muhammad
-"المولد النبوى الشريف"         weekend on hijri rabialawal 12
+"المولد النبوى الشريف"         public religious on hijri rabialawal 12
 : Eid el-Fitr (End of Ramadan)
-"عيد الفطر"                    weekend on hijri shawwal 1 length 2
+"عيد الفطر"                    public religious on hijri shawwal 1 length 2
 : Eid al-Adha (End of the Hajj)
-"عيد الأضحى"                    weekend on hijri thualhijjah 10 length 2
+"عيد الأضحى"                    public religious on hijri thualhijjah 10 length 2
 
 :: Financial
 
@@ -53,12 +53,12 @@ description "National holiday file for Algeria"
 :: Seasons
 
 : Spring
-"الربيع"                 on march 20
+"الربيع"                 seasonal on march 20
 : Summer
-"الصيف"                       on june 21
+"الصيف"                       seasonal on june 21
 : Fall
-"الخريف"                   on september 23
+"الخريف"                   seasonal on september 23
 : Winter
-"الشتاء"                     on december 21
+"الشتاء"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_dz_fr b/kholidays/holidays/plan2/holiday_dz_fr
index 1b9bf85..1325334 100644
--- a/kholidays/holidays/plan2/holiday_dz_fr
+++ b/kholidays/holidays/plan2/holiday_dz_fr
@@ -21,26 +21,26 @@ description "Fêtes et jours fériés en Algérie"
 :: National Holidays
 
 : New Year's Day
-"Jour de l'an"            weekend on january 1
+"Jour de l'an"                      public on january 1
 : Labour Day
-"Fête du Travail"                   weekend on may 1
+"Fête du Travail"                   public on may 1
 : Independence Day
-"Fête de l’Indépendance"           weekend on july 5
+"Fête de l’Indépendance"            public on july 5
 : Anniversary of the Revolution
-"Anniversaire de la Révolution"                   weekend on november 1
+"Anniversaire de la Révolution"     public on november 1
 
 :: Religious Holidays
 
 : Islamic New Year
-"Awal muharram"            weekend on hijri muharram 1
+"Awal muharram"                     public religious on hijri muharram 1
 : Ashura
-"Achoura"         weekend on hijri muharram 10
+"Achoura"                           public religious on hijri muharram 10
 : Birthday of the Prophet Muhammad
-"Mawlid nabaoui"         weekend on hijri rabialawal 12
+"Mawlid nabaoui"                    public religious on hijri rabialawal 12
 : Eid el-Fitr (End of Ramadan)
-"Aïd el-Fitr"                    weekend on hijri shawwal 1 length 2
+"Aïd el-Fitr"                       public religious on hijri shawwal 1 length 2
 : Eid al-Adha (End of the Hajj)
-"Aïd El Adha"                    weekend on hijri thualhijjah 10 length 2
+"Aïd El Adha"                       public religious on hijri thualhijjah 10 length 2
 
 :: Financial
 
@@ -53,12 +53,12 @@ description "Fêtes et jours fériés en Algérie"
 :: Seasons
 
 : Spring
-"Printemps"                 on march 20
+"Printemps"                         seasonal on march 20
 : Summer
-"Été"                       on june 21
+"Été"                               seasonal on june 21
 : Fall
-"Automne"                   on september 23
+"Automne"                           seasonal on september 23
 : Winter
-"Hiver"                     on december 21
+"Hiver"                             seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ee_et b/kholidays/holidays/plan2/holiday_ee_et
index 79e7237..6b275a2 100644
--- a/kholidays/holidays/plan2/holiday_ee_et
+++ b/kholidays/holidays/plan2/holiday_ee_et
@@ -3,55 +3,56 @@
 ::
 :: Language: Estonian
 ::
-:: Author:	Hasso Tepper <hasso at estpak.ee>
-::		Marek Laane <bald at smail.ee>
+:: Author:   Hasso Tepper <hasso at estpak.ee>
+::           Marek Laane <bald at smail.ee>
 ::
-:: Updated:	2012-04-24
+:: Updated:  2012-04-24
 ::
-:: Source:	https://www.riigiteataja.ee/akt/109032011007
+:: Source:   https://www.riigiteataja.ee/akt/109032011007
 ::
 
 :: Metadata
-country     "EE"
-language    "et"
+country      "EE"
+language     "et"
 :name        "Eesti"
-:description "Eesti pühad ja tähtpäevad"
+description  "Eesti pühad ja tähtpäevad"
 
 :: Public Holidays
 :: Rahvuspüha
-"Iseseisvuspäev"				weekend on february 24
+"Iseseisvuspäev"                                public on february 24
 :: Riigipühad
-"Uusaasta"					weekend on january 1
-"Suur reede"					weekend on easter minus 2 days
-"Ülestõusmispühade 1. püha"			weekend on easter
-"Kevadpüha"					weekend on may 1
-"Nelipühade 1. püha"				weekend on easter plus 49 days
-"Võidupüha"					weekend on june 23
-"Jaanipäev"					weekend on june 24
-"Taasiseseisvumispäev"				weekend on august 20
-"Jõululaupäev"					weekend on december 24
-"Esimene jõulupüha"				weekend on december 25
-"Teine jõulupüha"				weekend on december 26
+"Uusaasta"                                      public on january 1
+"Suur reede"                                    public religious on easter minus 2 days
+"Ülestõusmispühade 1. püha"                     public religious on easter
+"Kevadpüha"                                     public on may 1
+"Nelipühade 1. püha"                            public on easter plus 49 days
+"Võidupüha"                                     public on june 23
+"Jaanipäev"                                     public on june 24
+"Taasiseseisvumispäev"                          public on august 20
+"Jõululaupäev"                                  public on december 24
+"Esimene jõulupüha"                             public religious on december 25
+"Teine jõulupüha"                               public on december 26
+
 :: Riiklikud tähtpäevad
-"Kolmekuningapäev"				on january 6
-"Tartu rahulepingu aastapäev"			on february 2
-"Emakeelepäev"					on march 14
-"Emadepäev"					on second sunday in may
-"Eesti lipu päev"				on june 4
-"Leinapäev"					on june 14
-"Kommunismi ja natsismi ohvrite mälestuspäev"	on august 23
-"Vanavanemate päev"				on second sunday in september
-"Vastupanuvõitluse päev"			on september 22
-"Hõimupäev"					on third saturday in october
-"Hingedepäev"					on november 2
-"Isadepäev"					on second sunday in november
-"Taassünni päev"				on november 16
+"Kolmekuningapäev"                              civil on january 6
+"Tartu rahulepingu aastapäev"                   civil on february 2
+"Emakeelepäev"                                  civil on march 14
+"Emadepäev"                                     civil on second sunday in may
+"Eesti lipu päev"                               civil on june 4
+"Leinapäev"                                     civil on june 14
+"Kommunismi ja natsismi ohvrite mälestuspäev"   civil on august 23
+"Vanavanemate päev"                             civil on second sunday in september
+"Vastupanuvõitluse päev"                        civil on september 22
+"Hõimupäev"                                     civil on third saturday in october
+"Hingedepäev"                                   civil on november 2
+"Isadepäev"                                     civil on second sunday in november
+"Taassünni päev"                                civil on november 16
 
 :: Religious
-"1. advent"					on sunday before december 24 minus 21 days
-"2. advent"					on sunday before december 24 minus 14 days
-"3. advent"					on sunday before december 24 minus 7 days
-"4. advent"					on sunday before december 24
+"1. advent"                                     religious on sunday before december 24 minus 21 days
+"2. advent"                                     religious on sunday before december 24 minus 14 days
+"3. advent"                                     religious on sunday before december 24 minus 7 days
+"4. advent"                                     religious on sunday before december 24
 
 :: Financial
 
@@ -68,9 +69,9 @@ language    "et"
 
 :: To be sorted
 :: Lipupäevad
-"Vabadussõjas võidelnute mälestuspäev"		on january 3
-"Tartu rahulepingu aastapäev"			on february 2
-"Euroopa päev"					on may 9
-"Teadmistepäev"					on september 1
+"Vabadussõjas võidelnute mälestuspäev"          civil on january 3
+"Tartu rahulepingu aastapäev"                   civil on february 2
+"Euroopa päev"                                  civil on may 9
+"Teadmistepäev"                                 civil on september 1
 :: Muud tähtpäevad
-"Naistepäev"					on march 8
+"Naistepäev"                                    civil on march 8
diff --git a/kholidays/holidays/plan2/holiday_eg_ar b/kholidays/holidays/plan2/holiday_eg_ar
index d4e0173..718f2ac 100644
--- a/kholidays/holidays/plan2/holiday_eg_ar
+++ b/kholidays/holidays/plan2/holiday_eg_ar
@@ -21,25 +21,25 @@ language    "ar"
 
 :: National Holidays
 : Coptic Christmas
-"عيد الميلاد المجيد"            weekend on january 7
+"عيد الميلاد المجيد"            public religious on january 7
 : Sham El Nessim (Spring Festival)
-"شم النسيم"                    weekend on pascha plus 1 days
+"شم النسيم"                    public on pascha plus 1 days
 : Sinai Liberation Day
-"عيد تحرير سيناء"              weekend on april 25
+"عيد تحرير سيناء"              public on april 25
 : Labour Day
-"عيد العمال"                   weekend on may 1
+"عيد العمال"                   public on may 1
 : Revolution Day
-"عيد الثورة"                   weekend on july 23
+"عيد الثورة"                   public on july 23
 : Armed Forces Day
-"عيد القوات المسلحة"           weekend on october 6
+"عيد القوات المسلحة"           public on october 6
 : Islamic New Year
-"رأس السنة الهجرية"            weekend on hijri muharram 1
+"رأس السنة الهجرية"            public on hijri muharram 1
 : Birthday of the Prophet Muhammad (Sunni)
-"المولد النبوى الشريف"         weekend on hijri rabialawal 12
+"المولد النبوى الشريف"         public religious on hijri rabialawal 12
 : Eid el-Fitr (End of Ramadan)
-"عيد الفطر"                    weekend on hijri shawwal 1 length 3
+"عيد الفطر"                    public religious on hijri shawwal 1 length 3
 : Eid al-Adha (End of the Hajj)
-"عيد الأضحى"                    weekend on hijri thualhijjah 10 length 3
+"عيد الأضحى"                    public religious on hijri thualhijjah 10 length 3
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_es-ct_ca b/kholidays/holidays/plan2/holiday_es-ct_ca
index e0a0da3..6aa3b6b 100644
--- a/kholidays/holidays/plan2/holiday_es-ct_ca
+++ b/kholidays/holidays/plan2/holiday_es-ct_ca
@@ -17,29 +17,29 @@ language    "ca"
 :description "(please add description in source language) Regional holiday file for Catalonia"
 
 :: Public Holidays
-"Any nou"               weekend on january 1
-"Divendres Sant"        weekend on easter minus 2 days
-"Primer de Maig"        weekend on may 1
-"Mare de Déu d'Agost"   weekend on august 15
-"Pilar"                 weekend on october 12
-"Tots Sants"            weekend on november 1
-"Constitució"           weekend on december 6
-"Immaculada"            weekend on december 8
-"Nadal"                 weekend on december 25
+"Any nou"               public on january 1
+"Divendres Sant"        public religious on easter minus 2 days
+"Primer de Maig"        public on may 1
+"Mare de Déu d'Agost"   public on august 15
+"Pilar"                 public on october 12
+"Tots Sants"            public religious on november 1
+"Constitució"           public on december 6
+"Immaculada"            public religious on december 8
+"Nadal"                 public religious on december 25
 
 :: Religious Holidays
-"Reis"                  on january 6
-"Sant Jordi"            on april 23
-"Dimecres de cendra"    on easter minus 46 days
-"Dijous Sant"           on easter minus 3 days
-"Pasqua"                on easter
-"Dilluns de Pasqua"     weekend on easter plus 1 day
-"Pentecosta"            on easter plus 49 days
-"Sant Joan"             on june 24
-"Sant Esteve"           weekend on december 26
+"Reis"                  religious on january 6
+"Sant Jordi"            religious on april 23
+"Dimecres de cendra"    religious on easter minus 46 days
+"Dijous Sant"           religious on easter minus 3 days
+"Pasqua"                religious on easter
+"Dilluns de Pasqua"     public religious on easter plus 1 day
+"Pentecosta"            religious on easter plus 49 days
+"Sant Joan"             religious on june 24
+"Sant Esteve"           public religious on december 26
 
 :: Regional Holidays of the autonomous communities
-"Diada Nacional"        weekend on september 11
+"Diada Nacional"        public on september 11
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_es_es b/kholidays/holidays/plan2/holiday_es_es
index 00e2e9d..9e6aa8e 100644
--- a/kholidays/holidays/plan2/holiday_es_es
+++ b/kholidays/holidays/plan2/holiday_es_es
@@ -20,44 +20,44 @@ language    "es"
 :description "(please add description in source language) National holiday file for Spain"
 
 :: Public Holidays
-"Año nuevo"                                  weekend on january 1
-"Viernes Santo"                              weekend on easter minus 2 days
-"Fiesta del Trabajo"                         weekend on may 1
-"Asunción de la Virgen"                      weekend on august 15
-"Fiesta Nacional de España"                  weekend on october 12
-"Todos los Santos"                           weekend on november 1
-"Día de la Constitución Española"            weekend on december 6
-"La Inmaculada Concepción"                   weekend on december 8
-"Natividad del Señor"                        weekend on december 25
+"Año nuevo"                                  public on january 1
+"Viernes Santo"                              public religious on easter minus 2 days
+"Fiesta del Trabajo"                         public on may 1
+"Asunción de la Virgen"                      public religious on august 15
+"Fiesta Nacional de España"                  public on october 12
+"Todos los Santos"                           public religious on november 1
+"Día de la Constitución Española"            public on december 6
+"La Inmaculada Concepción"                   public religious on december 8
+"Natividad del Señor"                        public religious on december 25
 
 :: Regional Holidays of the autonomous communities
-"Día de Andalucía"                           on february 28
-"Día de las Islas Baleares"                  on march 1
-"San José"                                   on march 19
-"Sant Jordi"                                 on april 23
-"Fiesta de la Comunidad de Castilla y León"  on april 23
-"Día de Aragón"                              on april 23
-"Fiesta de la Comunidad de Madrid"           on may 3
-"Día de las Letras Gallegas"                 on may 17
-"Día de Canarias"                            on may 30
-"Día de la Región de Castilla y la Mancha"   on may 31
-"Día de la Región de Murcia"                 on june 9
-"Día de la Rioja"                            on june 9
-"San Juan"                                   on june 24
-"Santiago Apóstol"                           on july 25
-"Día de las Instituciones"                   on july 28
-"Día de la Ciudad Autónoma de Ceuta"         on september 2
-"Día de Asturias"                            on september 8
-"Día de Extremadura"                         on september 8
-"Diada de Cataluña"                          on september 11
-"Ntra. Sra. de la Bien Aparecida"            on september 15
+"Día de Andalucía"                           civil on february 28
+"Día de las Islas Baleares"                  civil on march 1
+"San José"                                   civil on march 19
+"Sant Jordi"                                 civil on april 23
+"Fiesta de la Comunidad de Castilla y León"  civil on april 23
+"Día de Aragón"                              civil on april 23
+"Fiesta de la Comunidad de Madrid"           civil on may 3
+"Día de las Letras Gallegas"                 civil on may 17
+"Día de Canarias"                            civil on may 30
+"Día de la Región de Castilla y la Mancha"   civil on may 31
+"Día de la Región de Murcia"                 civil on june 9
+"Día de la Rioja"                            civil on june 9
+"San Juan"                                   civil on june 24
+"Santiago Apóstol"                           civil on july 25
+"Día de las Instituciones"                   civil on july 28
+"Día de la Ciudad Autónoma de Ceuta"         civil on september 2
+"Día de Asturias"                            civil on september 8
+"Día de Extremadura"                         civil on september 8
+"Diada de Cataluña"                          civil on september 11
+"Ntra. Sra. de la Bien Aparecida"            civil on september 15
 
 :: Religious Holidays
-"Epifanía del Señor"                         weekend on january 6
-"Jueves Santo"                               on easter minus 3 days
-"Lunes de Pascua"                            on easter plus 1 day
-"Pentecostes / 2º Pascua"                    on easter plus 50 days
-"San Esteban"                                on december 26
+"Epifanía del Señor"                         public religious on january 6
+"Jueves Santo"                               religious on easter minus 3 days
+"Lunes de Pascua"                            religious on easter plus 1 day
+"Pentecostes / 2º Pascua"                    religious on easter plus 50 days
+"San Esteban"                                religious on december 26
 
 :: Financial
 
@@ -66,13 +66,13 @@ language    "es"
 :; School
 
 :: Daylight Saving
-"Adelanto horario"                           on last sunday in march
-"Retraso horario"                            on last sunday in october
+"Adelanto horario"                           seasonal on last sunday in march
+"Retraso horario"                            seasonal on last sunday in october
 
 :: Seasons
-"Equinoccio e inicio de primavera"           on march 21
-"Solsticio e inicio de verano"               on june 21
-"Equinoccio e inicio de otoño"               on september 23
-"Solsticio e inicio de invierno"             on december 21
+"Equinoccio e inicio de primavera"           seasonal on march 21
+"Solsticio e inicio de verano"               seasonal on june 21
+"Equinoccio e inicio de otoño"               seasonal on september 23
+"Solsticio e inicio de invierno"             seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_fi_fi b/kholidays/holidays/plan2/holiday_fi_fi
index f7ded93..39e4833 100644
--- a/kholidays/holidays/plan2/holiday_fi_fi
+++ b/kholidays/holidays/plan2/holiday_fi_fi
@@ -21,46 +21,46 @@ description  "Suomen valtakunnalliset juhla- ja liputuspäivät"
 :: Public Holidays
 
 : New Year's Day
-"Uudenvuodenpäivä"                                 weekend on 1 january
+"Uudenvuodenpäivä"                                 public on 1 january
 : Epiphany
-"Loppiainen"                                       weekend on 6 january
+"Loppiainen"                                       public religious on 6 january
 : May Day
-"Vappu"                                            weekend on 1 may
+"Vappu"                                            public on 1 may
 : Midsummer
-"Juhannuspäivä"                                    weekend on saturday after 20 june
+"Juhannuspäivä"                                    public on saturday after 20 june
 : All Saints
-"Pyhäinpäivä"                                      weekend on first saturday in november
+"Pyhäinpäivä"                                      public religious on first saturday in november
 : Independence Day
-"Itsenäisyyspäivä"                                 weekend on 6 december
+"Itsenäisyyspäivä"                                 public on 6 december
 : Christmas Day
-"Joulupäivä"                                       weekend on 25 december
+"Joulupäivä"                                       public religious on 25 december
 : Boxing Day
-"Tapaninpäivä"                                     weekend on 26 december
+"Tapaninpäivä"                                     public on 26 december
 
 : pääsiäisen määräämät - determined by Easter
 : Shrove Sunday
-"Laskiaissunnuntai"                                weekend on easter minus 49 days
+"Laskiaissunnuntai"                                public religious on easter minus 49 days
 : Shrove Tuesday
-"Laskiaistiistai"                                  on easter minus 47 days
+"Laskiaistiistai"                                  religious on easter minus 47 days
 : Annunciation
-"Marianpäivä"                                      weekend on ( (( [sunday before ([03/28])] == [easter]) ||
-                                                                 ( [sunday before ([03/28])] == ([easter] - 7)) ) ?
-                                                                ([easter] - 14) :
-                                                                [sunday before ([03/28])] )
+"Marianpäivä"                                      public religious on ( (( [sunday before ([03/28])] == [easter]) ||
+                                                                          ( [sunday before ([03/28])] == ([easter] - 7)) ) ?
+                                                                          ([easter] - 14) :
+                                                                           [sunday before ([03/28])] )
 : Palm Sunday
-"Palmusunnuntai"                                   weekend on easter minus 7 days
+"Palmusunnuntai"                                   public religious on easter minus 7 days
 : Good Friday
-"Pitkäperjantai"                                   weekend on easter minus 2 days
+"Pitkäperjantai"                                   public religious on easter minus 2 days
 : Easter Day
-"Pääsiäinen"                                       weekend on easter
+"Pääsiäinen"                                       public religious on easter
 : Easter Monday
-"2. pääsiäispäivä"                                 weekend on easter plus 1 days
+"2. pääsiäispäivä"                                 public on easter plus 1 days
 : Rogation Sunday
-"Rukoussunnnuntai"                                 weekend on easter plus 35 days
+"Rukoussunnuntai"                                  public religious on easter plus 35 days
 : Ascension
-"Helatorstai"                                      weekend on easter plus 39 days
+"Helatorstai"                                      public religious on easter plus 39 days
 : : Whitsunday
-"Helluntaipäivä"                                   weekend on easter plus 49 days
+"Helluntaipäivä"                                   public religious on easter plus 49 days
 
 
 :: Religious Holidays
@@ -70,76 +70,76 @@ description  "Suomen valtakunnalliset juhla- ja liputuspäivät"
 : on Sundays and don't know if we really want them here
 
 : Sleepyhead Day (not a holiday)
-"Unikeonpäivä"                                     on 27 july
+"Unikeonpäivä"                                     cultural on 27 july
 : The First Advent Sunday
-"1. adventtisunnuntai"                             weekend on sunday before 24 december minus 21 days
+"1. adventtisunnuntai"                             public religious on sunday before 24 december minus 21 days
 : The Second Advent Sunday
-"2. adventtisunnuntai"                             weekend on sunday before 24 december minus 14 days
+"2. adventtisunnuntai"                             public religious on sunday before 24 december minus 14 days
 : The Third Advent Sunday
-"3. adventtisunnuntai"                             weekend on sunday before 24 december minus 7 days
+"3. adventtisunnuntai"                             public religious on sunday before 24 december minus 7 days
 : The Fourth Advent Sunday
-"4. adventtisunnuntai"                             weekend on sunday before 24 december
+"4. adventtisunnuntai"                             public religious on sunday before 24 december
 : Holy Innocents' Day (not a holiday)
-"Viattomien lasten päivä"                          on 28 december
+"Viattomien lasten päivä"                          religious on 28 december
 
 
 :: Financial
 
 : Enterpreneur's Day
-"Yrittäjän päivä"                                  on 5 september
+"Yrittäjän päivä"                                  cultural on 5 september
 
 
 :: Cultural
 
 : International Holocaust Remembrance Day
-"Vainojen uhrien muistopäivä"                      on 27 january
+"Vainojen uhrien muistopäivä"                      cultural on 27 january
 : J. L. Runeberg's Day
-"Runebergin päivä"                                 on 5 february
+"Runebergin päivä"                                 cultural on 5 february
 : Sami National Day
-"Saamelaisten kansallispäivä"                      on 6 february
+"Saamelaisten kansallispäivä"                      cultural on 6 february
 : Valentine's Day
-"Ystävänpäivä"                                     on 14 february
+"Ystävänpäivä"                                     cultural on 14 february
 : Kalevala's Day, Finnish Culture Day
-"Kalevalan päivä, suomalaisen kulttuurin päivä"    on 28 february
+"Kalevalan päivä, suomalaisen kulttuurin päivä"    cultural on 28 february
 : International Women's Day
-"Naistenpäivä"                                     on 8 march
+"Naistenpäivä"                                     cultural on 8 march
 : Minna Canth's Day, The Day of Equality
-"Minna Canthin päivä, tasa-arvon päivä"            on 19 march
+"Minna Canthin päivä, tasa-arvon päivä"            cultural on 19 march
 : Michael Agricola' Day, (Finnish Language Day)
-"Agricolan päivä"                                  on 9 april
+"Agricolan päivä"                                  cultural on 9 april
 : National Veteran's Day
-"Veteraanipäivä"                                   on 27 april
+"Veteraanipäivä"                                   cultural on 27 april
 : Mother's Day
-"Äitienpäivä"                                      on second sunday in  may
+"Äitienpäivä"                                      cultural on second sunday in  may
 : Europe Day
-"Eurooppa-päivä"                                   on 9 may
+"Eurooppa-päivä"                                   cultural on 9 may
 : J. V. Snellman's Day, (The Day of Finnishness)
-"Snellmanin päivä"                                 on 12 may
+"Snellmanin päivä"                                 cultural on 12 may
 : Remembrance Day
-"Kaatuneitten muistopäivä"                         on third sunday in may
+"Kaatuneitten muistopäivä"                         cultural on third sunday in may
 : Flag Day of Defence Forces
-"Puolustusvoimien lippujuhla"                      on 4 june
+"Puolustusvoimien lippujuhla"                      cultural on 4 june
 : Eino Leino's Day, (Summer and Poetry Day)
-"Eino Leinon päivä"                                on 6 july
+"Eino Leinon päivä"                                cultural on 6 july
 : Aleksis Kivi's Day, (Finnish Literature Day)
-"Aleksis Kiven päivä"                              on 10 october
+"Aleksis Kiven päivä"                              cultural on 10 october
 : United Nations Day
-"YK:n päivä"                                       on 24 october
+"YK:n päivä"                                       cultural on 24 october
 : Finnish Swedish Heritage Day
-"Svenska dagen"                                    on 6 november
+"Svenska dagen"                                    cultural on 6 november
 : Father's Day
-"Isänpäivä"                                        on second sunday in november
+"Isänpäivä"                                        cultural on second sunday in november
 : Children's Day
-"Lapsen oikeuksien päivä"                          on 20 november
+"Lapsen oikeuksien päivä"                          cultural on 20 november
 : Jean Sibelius's Day, (Finnish Music Day)
-"Jean Sibeliuksen päivä"                           on 8 december
+"Jean Sibeliuksen päivä"                           cultural on 8 december
 
 
 :: School
 
 :: Daylight Saving
-"Kesäaika alkaa (+1 tunti)"                        on last sunday in march
-"Kesäaika päättyy (-1 tunti)"                      on last sunday in october
+"Kesäaika alkaa (+1 tunti)"                        seasonal on last sunday in march
+"Kesäaika päättyy (-1 tunti)"                      seasonal on last sunday in october
 
 
 :: Seasons
@@ -153,4 +153,4 @@ description  "Suomen valtakunnalliset juhla- ja liputuspäivät"
 :: To be sorted
 
 : Leap Day
-"Karkauspäivä"                                     on 29 february
+"Karkauspäivä"                                     seasonal on 29 february
diff --git a/kholidays/holidays/plan2/holiday_fr_fr b/kholidays/holidays/plan2/holiday_fr_fr
index 92bc238..0bc2b96 100644
--- a/kholidays/holidays/plan2/holiday_fr_fr
+++ b/kholidays/holidays/plan2/holiday_fr_fr
@@ -33,98 +33,98 @@ description "Fêtes et jours fériés en France"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 
 : Alsace
 : Good Friday
-:"Vendredi saint"            weekend on easter minus 2 days
-:"St Étienne"                weekend on december 26
+:"Vendredi saint"           public religious on easter minus 2 days
+:"St Étienne"               public religious on december 26
 
 : Moselle
 : Good Friday
-:"Vendredi saint"            weekend on easter minus 2 days
-:"St Étienne"                weekend on december 26
+:"Vendredi saint"           public religious on easter minus 2 days
+:"St Étienne"               public religious on december 26
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural  on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on march 20
+"Printemps"                 seasonal on march 20
 : Summer
-"Été"                       on june 21
+"Été"                       seasonal on june 21
 : Fall
-"Automne"                   on september 23
+"Automne"                   seasonal on september 23
 : Winter
-"Hiver"                     on december 21
+"Hiver"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_gb-eaw_en-gb b/kholidays/holidays/plan2/holiday_gb-eaw_en-gb
index 0ceef22..96e7c1e 100644
--- a/kholidays/holidays/plan2/holiday_gb-eaw_en-gb
+++ b/kholidays/holidays/plan2/holiday_gb-eaw_en-gb
@@ -19,23 +19,23 @@ language    "en_GB"
 description "National holiday file for England and Wales"
 
 :: Public Holidays
-"New Years Day"                 weekend on january 1
-"New Years Day Bank Holiday"    weekend on ( (([january 1] == [saturday after ([january 1])]) || ([january 1] == [sunday after ([january 1])])) ?
+"New Years Day"                 public on january 1
+"New Years Day Bank Holiday"    public on ( (([january 1] == [saturday after ([january 1])]) || ([january 1] == [sunday after ([january 1])])) ?
                                              [monday after ([january 1])] :
                                              noop )
-"Good Friday"                   weekend on easter minus 2
-"Easter Monday"                 weekend on easter plus 1
-"Royal Wedding"                 weekend on 29.4.2011
-"Early May Bank Holiday"        weekend on first monday in may
-"Spring Bank Holiday"           weekend on ((year == 2012) ? [june 4] : [last monday in may])
-"Diamond Jubilee Holiday"       weekend on 5.6.2012
-"Summer Bank Holiday"           weekend on last monday in august
-"Christmas Day"                 weekend on december 25
-"Christmas Day Bank Holiday"    weekend on ( (([december 25] == [saturday after ([december 25])]) || ([december 25] == [sunday after ([december 25])])) ?
+"Good Friday"                   public religious on easter minus 2
+"Easter Monday"                 public on easter plus 1
+"Royal Wedding"                 public on 29.4.2011
+"Early May Bank Holiday"        public on first monday in may
+"Spring Bank Holiday"           public on ((year == 2012) ? [june 4] : [last monday in may])
+"Diamond Jubilee Holiday"       public on 5.6.2012
+"Summer Bank Holiday"           public on last monday in august
+"Christmas Day"                 public religious on december 25
+"Christmas Day Bank Holiday"    public on ( (([december 25] == [saturday after ([december 25])]) || ([december 25] == [sunday after ([december 25])])) ?
                                              [monday after ([december 25])] :
                                              noop )
-"Boxing Day"                    weekend on december 26
-"Boxing Day Bank Holiday"       weekend on ( ([december 26] == [saturday after ([december 25])] ) ?
+"Boxing Day"                    public on december 26
+"Boxing Day Bank Holiday"       public on ( ([december 26] == [saturday after ([december 25])] ) ?
                                              [monday after ([december 25])] :
                                              (([december 26] == [sunday after ([december 25])] || [december 26] == [monday after ([december 25])]) ?
                                              [tuesday after ([december 25])] :
@@ -50,8 +50,8 @@ description "National holiday file for England and Wales"
 :: School
 
 :: Daylight Saving
-"British Summer Time starts"    on last sunday in march
-"British Summer Time ends"      on last sunday in october
+"British Summer Time starts"    seasonal on last sunday in march
+"British Summer Time ends"      seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_gb-nir_en-gb b/kholidays/holidays/plan2/holiday_gb-nir_en-gb
index 200407b..a8b575b 100644
--- a/kholidays/holidays/plan2/holiday_gb-nir_en-gb
+++ b/kholidays/holidays/plan2/holiday_gb-nir_en-gb
@@ -19,35 +19,35 @@ language    "en_GB"
 description "National holiday file for Northern Ireland"
 
 :: Public Holidays
-"New Years Day"                             weekend on january 1
-"New Years Day Bank Holiday"                weekend on ( (([january 1] == [saturday after ([january 1])]) ||
+"New Years Day"                             public on january 1
+"New Years Day Bank Holiday"                public on ( (([january 1] == [saturday after ([january 1])]) ||
                                                           ([january 1] == [sunday after ([january 1])])) ?
                                                           [monday after ([january 1])] :
                                                           noop )
-"St Patrick's Day"                          weekend on march 17
-"St Patrick's Day Bank Holiday"             weekend on ( (([march 17] == [saturday after ([march 17])]) ||
+"St Patrick's Day"                          public on march 17
+"St Patrick's Day Bank Holiday"             public on ( (([march 17] == [saturday after ([march 17])]) ||
                                                           ([march 17] == [sunday after ([march 17])])) ?
                                                           [monday after ([march 17])] :
                                                           noop )
-"Good Friday"                               weekend on easter minus 2
-"Easter Monday"                             weekend on easter plus 1
-"Royal Wedding"                             weekend on 29.4.2011
-"Early May Bank Holiday"                    weekend on first monday in may
-"Spring Bank Holiday"                       weekend on ((year == 2012) ? [june 4] : [last monday in may])
-"Diamond Jubilee Holiday"                   weekend on 5.6.2012
-"Battle of the Boyne (Orangemen's Day)"     weekend on july 12
-"Battle of the Boyne Bank Holiday"          weekend on ( (([july 12] == [saturday after ([july 12])]) ||
+"Good Friday"                               public religious on easter minus 2
+"Easter Monday"                             public on easter plus 1
+"Royal Wedding"                             public on 29.4.2011
+"Early May Bank Holiday"                    public on first monday in may
+"Spring Bank Holiday"                       public on ((year == 2012) ? [june 4] : [last monday in may])
+"Diamond Jubilee Holiday"                   public on 5.6.2012
+"Battle of the Boyne (Orangemen's Day)"     public on july 12
+"Battle of the Boyne Bank Holiday"          public on ( (([july 12] == [saturday after ([july 12])]) ||
                                                           ([july 12] == [sunday after ([july 12])])) ?
                                                           [monday after ([july 12])] :
                                                           noop )
-"Summer Bank Holiday"                       weekend on last monday in august
-"Christmas Day"                             weekend on december 25
-"Christmas Day Bank Holiday"                weekend on ( (([december 25] == [saturday after ([december 25])]) ||
+"Summer Bank Holiday"                       public on last monday in august
+"Christmas Day"                             public religious on december 25
+"Christmas Day Bank Holiday"                public on ( (([december 25] == [saturday after ([december 25])]) ||
                                                           ([december 25] == [sunday after ([december 25])])) ?
                                                          [monday after ([december 25])] :
                                                          noop )
-"Boxing Day"                                weekend on december 26
-"Boxing Day Bank Holiday"                   weekend on ( ([december 26] == [saturday after ([december 25])] ) ?
+"Boxing Day"                                public on december 26
+"Boxing Day Bank Holiday"                   public on ( ([december 26] == [saturday after ([december 25])] ) ?
                                                          [monday after ([december 25])] :
                                                          (([december 26] == [sunday after ([december 25])] ||
                                                            [december 26] == [monday after ([december 25])]) ?
@@ -63,8 +63,8 @@ description "National holiday file for Northern Ireland"
 :: School
 
 :: Daylight Saving
-"British Summer Time starts"                on last sunday in march
-"British Summer Time ends"                  on last sunday in october
+"British Summer Time starts"                seasonal on last sunday in march
+"British Summer Time ends"                  seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_gb-sct_en-gb b/kholidays/holidays/plan2/holiday_gb-sct_en-gb
index c4be874..903ef21 100644
--- a/kholidays/holidays/plan2/holiday_gb-sct_en-gb
+++ b/kholidays/holidays/plan2/holiday_gb-sct_en-gb
@@ -28,28 +28,28 @@ language    "en_GB"
 description "National holiday file for Scotland"
 
 :: Public Holidays
-"New Year's Day"                    weekend on january 1
-"New Year's Day Substitute Holiday" weekend on ( (([january 1] == [saturday after ([january 1])]) ||
+"New Year's Day"                    public on january 1
+"New Year's Day Substitute Holiday" public on ( (([january 1] == [saturday after ([january 1])]) ||
                                                   ([january 1] == [sunday after ([january 1])])) ?
                                                      [monday after ([january 1])] :
                                                  noop )
-"2nd January"                       weekend on january 2
-"2nd January Substitute Holiday"    weekend on ( ([january 2] == [saturday after ([january 1])] ) ?
+"2nd January"                       public on january 2
+"2nd January Substitute Holiday"    public on ( ([january 2] == [saturday after ([january 1])] ) ?
                                                      [monday after ([january 1])] :
                                                  ((([january 2] == [sunday after ([january 1])]) ||
                                                    ([january 2] == [monday after ([january 1])])) ?
                                                      [tuesday after ([january 1])] :
                                                  noop ) )
-"Royal Wedding"                     weekend on 29.4.2011
-"Early May Bank Holiday"            weekend on first monday in may
-"Diamond Jubilee Holiday"           weekend on 5.6.2012
-"Christmas Day"                     weekend on december 25
-"Christmas Day Substitute Holiday"  weekend on ( (([december 25] == [saturday after ([december 25])]) ||
+"Royal Wedding"                     public on 29.4.2011
+"Early May Bank Holiday"            public on first monday in may
+"Diamond Jubilee Holiday"           public on 5.6.2012
+"Christmas Day"                     public religious on december 25
+"Christmas Day Substitute Holiday"  public on ( (([december 25] == [saturday after ([december 25])]) ||
                                                   ([december 25] == [sunday after ([december 25])])) ?
                                                      [monday after ([december 25])] :
                                                  noop )
-"Boxing Day"                        weekend on december 26
-"Boxing Day Substitute Holiday"     weekend on ( ([december 26] == [saturday after ([december 25])] ) ?
+"Boxing Day"                        public on december 26
+"Boxing Day Substitute Holiday"     public on ( ([december 26] == [saturday after ([december 25])] ) ?
                                                      [monday after ([december 25])] :
                                                  (([december 26] == [sunday after ([december 25])] ||
                                                   ([december 26] == [monday after ([december 25])])) ?
@@ -59,21 +59,21 @@ description "National holiday file for Scotland"
 :: Religious
 
 :: Financial
-"Good Friday Bank Holiday"          on easter minus 2
-"Spring Bank Holiday"               on ((year == 2012) ? [june 4] : [last monday in may])
-"Summer Bank Holiday"               on first monday in august
-"St Andrew's Day Bank Holiday"      on ( (([november 30] == [saturday after ([november 30])]) ||
-                                          ([november 30] == [sunday after ([november 30])])) ?
-                                             [monday after ([november 30])] :
-                                         ([november 30]) )
+"Good Friday Bank Holiday"          religious on easter minus 2
+"Spring Bank Holiday"               civil on ((year == 2012) ? [june 4] : [last monday in may])
+"Summer Bank Holiday"               civil on first monday in august
+"St Andrew's Day Bank Holiday"      civil on ( (([november 30] == [saturday after ([november 30])]) ||
+                                                ([november 30] == [sunday after ([november 30])])) ?
+                                                 [monday after ([november 30])] :
+                                                ([november 30]) )
 
 :: Cultural
 
 :: School
 
 :: Daylight Saving
-"British Summer Time starts"        on last sunday in march
-"British Summer Time ends"          on last sunday in october
+"British Summer Time starts"        seasonal on last sunday in march
+"British Summer Time ends"          seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_gf_fr b/kholidays/holidays/plan2/holiday_gf_fr
index ed2e4dc..96de2d5 100644
--- a/kholidays/holidays/plan2/holiday_gf_fr
+++ b/kholidays/holidays/plan2/holiday_gf_fr
@@ -33,90 +33,90 @@ description "Fêtes et jours fériés en Guyane"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 : Abolition of Slavery
-"Abolition de l'esclavage"  weekend on june 10
+"Abolition de l'esclavage"  public on june 10
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on march 20
+"Printemps"                 seasonal on march 20
 : Summer
-"Été"                       on june 21
+"Été"                       seasonal on june 21
 : Fall
-"Automne"                   on september 23
+"Automne"                   seasonal on september 23
 : Winter
-"Hiver"                     on december 21
+"Hiver"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_gp_fr b/kholidays/holidays/plan2/holiday_gp_fr
index 4e8c6cd..0029a24 100644
--- a/kholidays/holidays/plan2/holiday_gp_fr
+++ b/kholidays/holidays/plan2/holiday_gp_fr
@@ -33,91 +33,91 @@ description "Fêtes et jours fériés en Guadeloupe"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 : Good Friday
-"Vendredi saint"            weekend on easter minus 2 days
+"Vendredi saint"            public on easter minus 2 days
 : Abolition of Slavery
-"Abolition de l'esclavage"  weekend on may 27
-"Fête Victor Schoelcher"    weekend on july 21
-"St Étienne"                weekend on december 26
+"Abolition de l'esclavage"  public on may 27
+"Fête Victor Schoelcher"    public on july 21
+"St Étienne"                public on december 26
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Day of the dead
-"Fête des morts"            on november 2
+"Fête des morts"            religious on november 2
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on march 20
+"Printemps"                 seasonal on march 20
 : Summer
-"Été"                       on june 21
+"Été"                       seasonal on june 21
 : Fall
-"Automne"                   on september 23
+"Automne"                   seasonal on september 23
 : Winter
-"Hiver"                     on december 21
+"Hiver"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_gr_el b/kholidays/holidays/plan2/holiday_gr_el
index 36c4bb4..f03fd19 100644
--- a/kholidays/holidays/plan2/holiday_gr_el
+++ b/kholidays/holidays/plan2/holiday_gr_el
@@ -15,24 +15,24 @@
 country     "GR"
 language    "el"
 :            "National holiday file for Greece"
-:description "Εορτές και αργίες στην Ελλάδα"
+description "Εορτές και αργίες στην Ελλάδα"
 
 :: Public Holidays - Δημόσιες αργίες
-"Πρωτοχρονιά"                                                                   weekend on january 1
-"Άγια Θεοφάνεια"                                                                weekend on january 6
-"Πρωτομαγιά"                                                                    weekend on may 1
-"Επέτειος του ΟΧΙ"                                                              weekend on october 28
-"Επέτειος της επανάστασης του 1821"                                             weekend on march 25
-"Καθαρή Δευτέρα"                                                                weekend on pascha minus 48 days
-"Μεγάλη Παρασκευή"                                                              weekend on pascha minus 2 days
-"Μεγάλο Σάββατο"                                                                weekend on pascha minus 1 days
-"Το Άγιον Πάσχα"                                                                weekend on pascha
-"Δευτέρα του Πάσχα"                                                             weekend on pascha plus 1 days
-"Αγίου Πνεύματος"                                                               weekend on pascha plus 50 days
-"Κοίμηση της Θεοτόκου"                                                          weekend on august 15
-"Μαρία, Μάριος, Παναγιώτης, Παναγιώτα, Δέσποινα, Θεοτόκης"                      weekend on august 15
-"Χριστούγεννα"                                                                  weekend on december 25
-"Σύναξις Θεοτόκου"                                                              weekend on december 26
+"Πρωτοχρονιά"                                                                   public on january 1
+"Άγια Θεοφάνεια"                                                                public on january 6
+"Πρωτομαγιά"                                                                    public on may 1
+"Επέτειος του ΟΧΙ"                                                              public on october 28
+"Επέτειος της επανάστασης του 1821"                                             public on march 25
+"Καθαρή Δευτέρα"                                                                public religious on pascha minus 48 days
+"Μεγάλη Παρασκευή"                                                              public religious on pascha minus 2 days
+"Μεγάλο Σάββατο"                                                                public religious on pascha minus 1 days
+"Το Άγιον Πάσχα"                                                                public religious on pascha
+"Δευτέρα του Πάσχα"                                                             public on pascha plus 1 days
+"Αγίου Πνεύματος"                                                               public religious on pascha plus 50 days
+"Κοίμηση της Θεοτόκου"                                                          public on august 15
+"Μαρία, Μάριος, Παναγιώτης, Παναγιώτα, Δέσποινα, Θεοτόκης"                      public on august 15
+"Χριστούγεννα"                                                                  public religious on december 25
+"Σύναξις Θεοτόκου"                                                              public on december 26
 
 :: Religious - Θρησκευτικές
 
@@ -40,298 +40,41 @@ language    "el"
 
 :: Cultural
 : Mothers' day,
-"Γιορτή της μητέρας"                                                            on second sunday in may
+"Γιορτή της μητέρας"                                                            cultural on second sunday in may
 : Fathers' day
-"Γιορτή του πατέρα"                                                             on third sunday in june
+"Γιορτή του πατέρα"                                                             cultural on third sunday in june
 
 :: School - Σχολικές Αργίες
-"Εξέγερση του Πολυτεχνείου (Σχολική Αργία)"                                     on november 17
+"Εξέγερση του Πολυτεχνείου (Σχολική Αργία)"                                     school on november 17
 
 :: Daylight Saving
 : summer
-"Θερινή ώρα (1 ώρα μπροστά)"                                                    on last sunday in march
+"Θερινή ώρα (1 ώρα μπροστά)"                                                    seasonal on last sunday in march
 :winter
-"Χειμερινή ώρα (1 ώρα πίσω)"                                                    on last sunday in october
+"Χειμερινή ώρα (1 ώρα πίσω)"                                                    seasonal on last sunday in october
 
 :: Seasons
 
 :: To be sorted, it's all Greek to me :-)
 
-:: Name Days - Ονομαστικές εορτές
-
-"Βασίλης, Βασιλική, Βασιλεία, Βίβιαν"                                           on january 1
-"Συλβέστρος"                                                                    on january 2
-"Θεώνη"                                                                         on january 5
-"Φώτης, Φωτεινή, Θεοφάνης, Θεοφανία, Φανή, Ιορδάνης, Θεανώ, Ουρανία, Θεοπούλα"  on january 6
-"Ιωάννης, Ιωάννα, Πρόδρομος"                                                    on january 7
-"Αγάθων, Δομινίκη, Παρθένα, Κύρος"                                              on january 8
-"Θεοδόσης, Θεοδοσία"                                                            on january 11
-"Τατιάνα, Τατιανή"                                                              on january 12
-"Αντώνης, Αντωνία"                                                              on january 17
-"Αθανάσιος, Αθανασία, Κύριλλος"                                                 on january 18
-"Μακάριος"                                                                      on january 19
-"Ευθύμης, Ευθυμία, Φαβιανός"                                                    on january 20
-"Αγνή, Μάξιμος, Νεόφυτος, Πάτροκλος"                                            on january 21
-"Τιμόθεος, Αναστάσιος, Αναστασία"                                               on january 22
-"Αγαθάγγελος"                                                                   on january 23
-"Ξένη, Φίλωνας, Ζωσιμάς"                                                        on january 24
-"Γρηγόρης, Γρηγορία, Μαργαρίτα"                                                 on january 25
-"Ξενοφών"                                                                       on january 26
-"Χάρις, Παλλάδιος"                                                              on january 28
-"Μαύρος, Χρυσή, Τριών Ιεραρχών (Σχολική Αργία)"                                 on january 30
-"Ευδοξία, Κύρος"                                                                on january 31
-"Τρύφωνας"                                                                      on february 1
-"Υπαπαντή"                                                                      on february 2
-"Σταμάτ-ης/ία, Συμεώ-ν/νή, Σιμώνη, Ασημάκης, Ασημίνα, Μαλαματή"                 on february 3
-"Ισίδωρος, Ιάσιμος, Ιασίμη"                                                     on february 4
-"Αγαθή"                                                                         on february 5
-"Φώτης"                                                                         on february 6
-"Παρθένιος, Παρθενία"                                                           on february 7
-"Ζαχαρίας, Ζαχαρούλα"                                                           on february 8
-"Μάρκελος, Νικηφόρος, Νίκη"                                                     on february 9
-"Χαράλαμπος, Χαραλαμπία, Χαρίκλεια, Χαρίλαος, Χαρούλα"                          on february 10
-"Βλάσης, Βλασία, Θοδωρής, Θοδώρα, Αυγή "                                        on february 11
-"Μελέτης, Πλωτίνος"                                                             on february 12
-"Πρίσκιλλα"                                                                     on february 13
-"Χλόη"                                                                          on sunday after ([february 13])
-"Βαλεντίνος, Βαλεντίνη, ημέρα των ερωτευμένων"                                  on february 14
-"Ευσέβιος, Ευσεβία"                                                             on february 15
-"Πάμφιλος, Παμφίλη, Σέλευκος, Σελεύκη"                                          on february 16
-"Λέων, Αγαπητός"                                                                on february 18
-"Φιλοθέη"                                                                       on february 19
-"Ανθούσα"                                                                       on february 22
-"Πολύκαρπος"                                                                    on february 23
-"Πορφύρης, Φωτεινή"                                                             on february 26
-"Μαριάννα, Ασκληπιός"                                                           on february 28
-"Ευδοκία, Χαρίσιος"                                                             on march 1
-"Ευθαλία"                                                                       on march 2
-"Κλεόνικος, Κλεονίκη"                                                           on march 3
-"Αρχέλαος, Eυλόγιος"                                                            on march 5
-"Ησύχιος"                                                                       on march 6
-"Ευγένιος, Ευγενία"                                                             on march 7
-"Ερμής, Θεοφύλακτος, Παγκόσμια Ημέρα της Γυναίκας"                              on march 8
-"Σμάραγδος, Σμαράγδα, Ηλιάνα, Λεόντιος, Λεοντία, Λυσίμαχος Λυσιμαχη"            on march 9
-"Ξάνθος, Ξανθούλα, Σαράντης Σαραντούλα, Φιλοκτήμων"                             on march 9
-"Θεόδωρος Θεοδώρα, Θώδος, Θώδη, Θαλλής, Θάλεια, Σωφρόνιος, Σωφρονία"            on march 11
-"Λωξάντρα, Ρωξάνη, Oρθοδόξης,"                                                  on march 12
-"Λέανδρος"                                                                      on march 13
-"Βενέδικτος, Βενεδίκτη"                                                         on march 14
-"Αγάπιος"                                                                       on march 15
-"Χριστόδουλος, Ιουλιανός"                                                       on march 16
-"Αλέξιος, Αλεξία"                                                               on march 17
-"Χρύσανθος, Χρυσάνθη"                                                           on march 19
-"Δρόσος, Δροσούλα"                                                              on march 22
-"Ευαγγελισμός της Θεοτόκου "                                                    on march 25
-"Ευάγγελος, Ευαγγελία"                                                          on march 25
-"Πούλιος, Σύλας, Σύλια"                                                         on march 26
-"Λυδία, Μακεδόνιος, Μακεδονούλα"                                                on march 27
-"Ευτύχιος, Ευτυχία"                                                             on april 6
-"Ιωσήφ, Ιωσηφίνα"                                                               on april 9
-"Δημοσθένης, Ηρακλής, Μιλτιάδης, Περικλής, Σοφοκλής, Επαμεινώνδας"              on april 10
-"Όμηρος, Πελοπίδας, Παρμενίων, Πολύβιος, Αναξιμένης, Φοιλοποίμην, Φίλης"        on april 10
-"Αρίσταρχος, Θωμαΐς"                                                            on april 14
-"Λεωνίδας, Λάζαρος"                                                             on april 15
-"Βάϊος, Βάϊα, Δάφνη, Γαλήνη, Χιονία"                                            on april 16
-"Ναθαναήλ, Νέαρχος, Νιάρχος"                                                    on april 22
-"Γεώργιος, Γεωργία"                                                             on ( ( ([april 23]) >= ([pascha]) ) ?  ([april 23]) : ([pascha] + 1) )
-"Ελισάβετ, Αχιλλέας"                                                            on april 24
-"Μάρκος, Νίκη, Ραφαήλ"                                                          on ( ( ([april 23]) >= ([pascha]) ) ?  ([april 25]) : ([pascha] + 2) )
-"Νίκη"                                                                          on april 25
-"Ζωή, Πηγή"                                                                     on april 28
-"Ιάσωνας"                                                                       on april 29
-"Ιάκωβος, Θωμάς, Θωμαή, Ασημίνα"                                                on april 30
-"Ιερεμίας"                                                                      on may 1
-"Έσπερος, Εσπέρια"                                                              on may 2
-"Ροδόπη, Ξενία"                                                                 on may 3
-"Ειρήνη, Eιρηναίος, Ευφραίμ"                                                    on may 5
-"Μυροφόρα"                                                                      on may 7
-"Θεολόγος"                                                                      on may 8
-"Χριστόφορος, Ησαΐας"                                                           on may 9
-"Σίμων"                                                                         on may 10
-"Aρμόδιος,Μεθόδιος, Ολυμπία"                                                    on may 11
-"Επιφάνειος"                                                                    on may 12
-"Γλυκερία"                                                                      on may 13
-"Γιορτή της Μητέρας, Αριστοτέλης"                                               on may 14
-"Καλή"                                                                          on may 15
-"Ανδρόνικος, Ανδρονίκη, Ιουνία"                                                 on may 17
-"Ιουλία, Γαλάτεια"                                                              on may 18
-"Θεόκτιστος, Μαγδαληνή, Πατρίκιος"                                              on may 19
-"Λυδία"                                                                         on may 20
-"Κωνσταντίνος, Κωνσταντίνα, Ελένη"                                              on may 21
-"Αιμίλιος, Αιμιλία, Έμυ"                                                        on may 22
-"Μαρκιανή"                                                                      on may 24
-"Θεοδοσία"                                                                      on may 29
-"Πύρρος, Νεφέλη, Ιουστίνος, Ανάληψη"                                            on june 1
-"Νικηφόρος, Μαρίνος"                                                            on june 2
-"Υπάτιος, Υπατία"                                                               on june 3
-"Μάρθα"                                                                         on june 4
-"Aπόλλων, Δωρόθεος, Δωροθέα, Σελήνη, Νίκανδρος"                                 on june 5
-"Καλλιόπη"                                                                      on june 8
-"Ροδάνθη"                                                                       on june 9
-"Βαρθολομαίος, Βαρνάβας"                                                        on june 11
-"Ονούφριος"                                                                     on june 12
-"Ελισαίος"                                                                      on june 14
-"Αυγουστίνος, Αυγούστα, Ιερώνυμος, Μόνικα, Ορτανσία"                            on june 15
-"Γιορτή του πατέρα"                                                             on june 16
-"Έρασμος, Ερασμία, Aγίων Πάντων"                                                on june 18
-"Παΐσιος, Ζωσιμάς, Ζήσης"                                                       on june 19
-"Ευσέβιος, Ευσεβία"                                                             on june 22
-"Αριστοκλής"                                                                    on june 23
-"Φεβρωνία, Έρωτας"                                                              on june 25
-"Γερμανός"                                                                      on june 28
-"Πέτρος, Πέτρα, Παύλος, Παυλίνα"                                                on june 29
-"Απόστολος, Αποστολία, Μελίτων"                                                 on june 30
-"Αργύρης, Αργυρώ, Κοσμάς, Δαμιανός, Ανάργυρος"                                  on july 1
-"Υάκινθος, Ζουμπουλία"                                                          on july 3
-"Λουκία"                                                                        on july 4
-"Λυκίας, Λύκιος, Λυκία, "                                                       on july 6
-"Κυριακή"                                                                       on july 7
-"Θεόφιλος, Προκόπιος"                                                           on july 8
-"Ευφημία, Όλγα"                                                                 on july 11
-"Βερονίκη, Βερενίκη "                                                           on july 12
-"Σάρα"                                                                          on july 13
-"Ακύλας, Νικόδημος"                                                             on july 14
-"Βλαδίμηρος, Ιουλίττα, Κήρυκος"                                                 on july 15
-"Μαρίνα"                                                                        on july 17
-"Αιμίλιος, Αιμιλία"                                                             on july 18
-"Ηλίας, Ηλιάνα"                                                                 on july 20
-"Μαγδαληνή, Μαρκέλλα, Μαριλένα"                                                 on july 22
-"Φωκάς"                                                                         on july 23
-"Αθηναγόρας"                                                                    on july 24
-"Άννα, Ολυμπία"                                                                 on july 25
-"Παρασκευή, Παρασκευάς, Έρση"                                                   on july 26
-"Παντελής"                                                                      on july 27
-"Ειρήνη, Χρυσοβαλάντης, Βαλάντης, Χρυσοβαλάντου, Ακάκιος"                       on july 28
-"Καλλίνικος"                                                                    on july 29
-"Ανδρόνικος, Ανδρονίκη"                                                         on july 30
-"Ιωσήφ, Ιωσηφίνα"                                                               on july 31
-"Μάρκελος"                                                                      on august 1
-"Σωτήρης, Σωτηρία, Ευμορφία, Έμμυ, Μορφούλα"                                    on august 6
-"Αστέριος, Αστερία"                                                             on august 7
-"Τριαντάφυλλος, Τριανταφυλλιά"                                                  on august 8
-"Ρωμανός"                                                                       on august 9
-"Λαυρέντης, Λαυρεντία, Ευλαμπία, Ιππόλυτος, Ηρώ "                               on august 10
-"Γεράσιμος, Αλκιβιάδης, Διομήδης, Σαράντης"                                     on august 16
-"Λευκοθέα, Μύρων, Μίρκα"                                                        on august 17
-"Φλώρα"                                                                         on august 18
-"Σαμουήλ, Θεοχάρης"                                                             on august 20
-"Aγαθόνικος"                                                                    on august 22
-"Κοσμάς"                                                                        on august 24
-"Βαρθολομαίος, Τίτος"                                                           on august 25
-"Ναταλία, Ανδριανός, Ανδριανή"                                                  on august 26
-"Φανούριος, Φανουρία, Αρκαδία"                                                  on august 27
-"Θεοπίστη"                                                                      on august 29
-"Αλέξανδρος"                                                                    on august 30
-"Αδαμάντιος, Αδαμαντία, Αθηνά, Αντιγόνη, Ασπασία, Αφροδίτη, Δωδώνη"             on september 1
-"Ελπινίκη, Ερασμία, Ερατώ, Ευτέρπη, Θάλεια, Θεανώ, Καλλίστη, Κλειώ, Κλεονίκη"   on september 1
-"Κλεοπάτρα, Κοραλία, Μαργαρίτα, Μαριάνθη, Μελέτιος, Μελπομένη, Ουρανία"         on september 1
-"Πανδώρα, Πηνελόπη, Πολυμνία, Πολυνίκη, Σαπφώ, Συμεών, Τερψιχόρη, Χάιδω"        on september 1
-"Άνθιμος, Πολύδωρος, Φοίβη"                                                     on september 3
-"Ερμιόνη, Μωυσής"                                                               on september 4
-"Ζαχαρίας"                                                                      on september 5
-"Κασσιανή, Σώζων"                                                               on september 7
-"Ιωακείμ"                                                                       on september 9
-"Εράστη, Εράστος, Μητροδώρα, Πουλχερία"                                         on september 10
-"Ευανθία"                                                                       on september 11
-"Αριστείδης, Κορνήλιος"                                                         on september 13
-"Σταύρος, Σταυρούλα"                                                            on september 14
-"Νικήτας, Βησσαρίων"                                                            on september 15
-"Ευφημία"                                                                       on september 16
-"Σοφία, Ελπίδα, Αγάπη, Πίστη, Σόνια"                                            on september 17
-"Αριάδνη"                                                                       on september 18
-"Ευστάθιος, Ευσταθία"                                                           on september 20
-"Ίωνας"                                                                         on september 21
-"Φωκάς, Ζωγραφιά"                                                               on september 22
-"Πολυξένη, Ξανθίππη, Ξάνθιππος"                                                 on september 23
-"Θέκλα, Μυρσίνη, Μυρτώ"                                                         on september 24
-"Ευφροσύνη"                                                                     on september 25
-"Ζήνων"                                                                         on september 27
-"Κυριάκος, Κυριακή"                                                             on september 29
-"Θηρεσία"                                                                       on october 1
-"Κυπριανός"                                                                     on october 2
-"Διονύσης, Διονυσία"                                                            on october 3
-"Ιερόθεος, Φραγκίσκος"                                                          on october 4
-"Χαριτινή"                                                                      on october 5
-"Σέργιος, Πολυχρόνης, Χρόνης"                                                   on october 7
-"Πελαγία"                                                                       on october 8
-"Ευλάμπιος, Ευλαμπία"                                                           on october 10
-"Ανδρομάχη, Ανδρόμαχος"                                                         on october 12
-"Αγαθονίκη, Φλωρέντιος, Φλωρεντία"                                              on october 13
-"Λουκιανός"                                                                     on october 15
-"Λουκάς"                                                                        on october 18
-"Γεράσιμος, Αρτέμιος"                                                           on october 20
-"Σωκράτης, Χριστόδουλος, Όυρσουλα"                                              on october 21
-"Αβέρκιος"                                                                      on october 22
-"Ιάκωβος"                                                                       on october 23
-"Χρυσάφης"                                                                      on october 25
-"Δημήτριος, Δήμητρα, Δανάη"                                                     on october 26
-"Νέστορας"                                                                      on october 27
-"Ζηνοβία, Κλεόπας, Μαρκιανός"                                                   on october 30
-"Αριστόβουλος"                                                                  on october 31
-"Αργύρης, Αργυρώ, Κοσμάς, Δαμιανός, Ανάργυρος"                                  on november 1
-"Αφθόνιος, Αφθονία"                                                             on november 2
-"Ιωαννίκη"                                                                      on november 4
-"Λίνος"                                                                         on november 5
-"Λεονάρδος"                                                                     on november 6
-"Αθηνόδωρος"                                                                    on november 7
-"Σταμάτιος, Σταματία, Μιχάλης, Γαβριήλ, Γαβριέλα"                               on november 8
-"Ταξιάρχης, Άγγελος, Αγγελική, Ματίνα, Σεραφείμ"                                on november 8
-"Νεκτάριος, Νεκταρία"                                                           on november 9
-"Ορέστης"                                                                       on november 10
-"Μηνάς, Mήνα, Βίκτωρ, Βικτωρία"                                                 on november 11
-"Χρυσόστομος"                                                                   on november 13
-"Φίλιππος"                                                                      on november 14
-"Ματθαίος, Ιφιγένεια"                                                           on november 16
-"Πλάτωνας"                                                                      on november 18
-"Μαρία, Μάριος"                                                                 on november 21
-"Φιλήμων"                                                                       on november 22
-"Μερώπη"                                                                        on november 23
-"Κατερίνα, Μερκούριος"                                                          on november 25
-"Στέλιος, Στέλλα, Στέργιος"                                                     on november 26
-"Φαίδρα"                                                                        on november 29
-"Ανδρέας, Ανδριάνα"                                                             on november 30
-"Θεόκλητος, Ιακώβ"                                                              on december 1
-"Βαρβάρα, Δαμασκηνός"                                                           on december 4
-"Σάββας, Σαββούλα, Διογένης"                                                    on december 5
-"Νίκος, Νικολέτα"                                                               on december 6
-"Αμβρόσιος"                                                                     on december 7
-"Άννα"                                                                          on december 9
-"Ααρών, Αδάμ, Δαυίδ, Δανάη, Εύα, Ισαάκ, Ιώβ, Ραχήλ, Ρουμπίνη"                   on sunday after ([december 11])
-"Σπύρος, Σπυριδούλα"                                                            on december 12
-"Ευστράτιος, Λουκάς, Λουκία, Άρης"                                              on december 13
-"Ελευθέριος, Ελευθερία, Ανθή, Σύλβια"                                           on december 15
-"Διονύσης, Διονυσία, Δανιήλ, Ρεβέκα, Σεβαστιανός, Σεβαστή"                      on december 17
-"Ααρών, Αδάμ, Ισαάκ, Ραχήλ, Σάρα"                                               on december 17
-"Αγλαΐα"                                                                        on december 19
-"Ιγνάτιος"                                                                      on december 20
-"Θεμιστοκλής, Ιουλία"                                                           on december 21
-"Αναστασία"                                                                     on december 22
-"Ευγένιος, Ευγενία"                                                             on december 24
-"Χρήστος, Χριστίνα, Χρύσα"                                                      on december 25
-"Μανώλης, Εμμανουέλα"                                                           on december 26
-"Στέφανος, Στεφανία"                                                            on december 27
-"Δόμνα"                                                                         on december 28
-"Ιωσήφ"                                                                         on december 30
-
-
 :: Κινητές εορτές
-"Τελώνου και Φαρισαίου - Αρχή Τριωδίου"                                         on pascha minus 70 days
-"Του Ασώτου"                                                                    on pascha minus 63 days
-"Τσικνοπέμπτη"                                                                  on pascha minus 59 days
-"Κυριακή των Απόκρεω"                                                           on pascha minus 56 days
-"Τυροφάγου"                                                                     on pascha minus 49 days
-"Θεόδωρος, Θεοδώρα, Δώρα, Θώδης, Θώδος, Δώρης"                                  on pascha minus 43 days
-"Κυριακή της Ορθοδοξίας"                                                        on pascha minus 42 days
-"Σάββατο του Λαζάρου"                                                           on pascha minus 8 days
-"Κυριακή των Βαΐων"                                                             on pascha minus 7 days
-"Μεγάλη Δευτέρα"                                                                on pascha minus 6 days
-"Μεγάλη Τρίτη"                                                                  on pascha minus 5 days
-"Μεγάλη Τετάρτη"                                                                on pascha minus 4 days
-"Μεγάλη Πέμπτη"                                                                 on pascha minus 3 days
-"Αναστάσιος, Αναστασία, Λάμπρος, Λαμπρινή, Πασχάλης "                           on pascha
-"Ραφαήλ, Ειρήνη"                                                                on pascha plus 2 days
-"Πηγή, Ζήσης, Ζησούλα, Ζήσιμος, Ζωή, Ζώης"                                      on pascha plus 5 days
-"Του Θωμά"                                                                      on pascha plus 7 days
-"Ανάληψη του Χριστού"                                                           on pascha plus 39 days
-"Πεντηκοστή"                                                                    on pascha plus 49 days
-"Αγ. Πάντων"                                                                    on pascha plus 56 days
+"Τελώνου και Φαρισαίου - Αρχή Τριωδίου"                                         religious on pascha minus 70 days
+"Του Ασώτου"                                                                    religious on pascha minus 63 days
+"Τσικνοπέμπτη"                                                                  religious on pascha minus 59 days
+"Κυριακή των Απόκρεω"                                                           religious on pascha minus 56 days
+"Τυροφάγου"                                                                     religious on pascha minus 49 days
+"Θεόδωρος, Θεοδώρα, Δώρα, Θώδης, Θώδος, Δώρης"                                  religious on pascha minus 43 days
+"Κυριακή της Ορθοδοξίας"                                                        religious on pascha minus 42 days
+"Σάββατο του Λαζάρου"                                                           religious on pascha minus 8 days
+"Κυριακή των Βαΐων"                                                             religious on pascha minus 7 days
+"Μεγάλη Δευτέρα"                                                                religious on pascha minus 6 days
+"Μεγάλη Τρίτη"                                                                  religious on pascha minus 5 days
+"Μεγάλη Τετάρτη"                                                                religious on pascha minus 4 days
+"Μεγάλη Πέμπτη"                                                                 religious on pascha minus 3 days
+"Αναστάσιος, Αναστασία, Λάμπρος, Λαμπρινή, Πασχάλης "                           religious on pascha
+"Ραφαήλ, Ειρήνη"                                                                religious on pascha plus 2 days
+"Πηγή, Ζήσης, Ζησούλα, Ζήσιμος, Ζωή, Ζώης"                                      religious on pascha plus 5 days
+"Του Θωμά"                                                                      religious on pascha plus 7 days
+"Ανάληψη του Χριστού"                                                           religious on pascha plus 39 days
+"Πεντηκοστή"                                                                    religious on pascha plus 49 days
+"Αγ. Πάντων"                                                                    religious on pascha plus 56 days
diff --git a/kholidays/holidays/plan2/holiday_gr_el_nameday b/kholidays/holidays/plan2/holiday_gr_el_nameday
new file mode 100644
index 0000000..058328e
--- /dev/null
+++ b/kholidays/holidays/plan2/holiday_gr_el_nameday
@@ -0,0 +1,274 @@
+::
+:: Country:  Greece
+::
+:: Language: Greek
+::
+:: Author:   capthookb <praktoreio2002 at yahoo.gr>
+::           Dimitrios Glentadakis <dglent at gmail.com>
+::           Marios Andreopoulos <opensource at andmarios.com>
+:: Updated:  2014-04-25
+::
+:: Source:   http://www.eortologio.gr/index_uk.php
+::           http://www.argies.gr/
+
+:: Metadata
+country     "GR"
+language    "el"
+:            "Name Day holiday file for Greece"
+description "Ονομαστικές εορτές"
+
+:: Name Days - Ονομαστικές εορτές
+
+"Βασίλης, Βασιλική, Βασιλεία, Βίβιαν"                                           nameday on january 1
+"Συλβέστρος"                                                                    nameday on january 2
+"Θεώνη"                                                                         nameday on january 5
+"Φώτης, Φωτεινή, Θεοφάνης, Θεοφανία, Φανή, Ιορδάνης, Θεανώ, Ουρανία, Θεοπούλα"  nameday on january 6
+"Ιωάννης, Ιωάννα, Πρόδρομος"                                                    nameday on january 7
+"Αγάθων, Δομινίκη, Παρθένα, Κύρος"                                              nameday on january 8
+"Θεοδόσης, Θεοδοσία"                                                            nameday on january 11
+"Τατιάνα, Τατιανή"                                                              nameday on january 12
+"Αντώνης, Αντωνία"                                                              nameday on january 17
+"Αθανάσιος, Αθανασία, Κύριλλος"                                                 nameday on january 18
+"Μακάριος"                                                                      nameday on january 19
+"Ευθύμης, Ευθυμία, Φαβιανός"                                                    nameday on january 20
+"Αγνή, Μάξιμος, Νεόφυτος, Πάτροκλος"                                            nameday on january 21
+"Τιμόθεος, Αναστάσιος, Αναστασία"                                               nameday on january 22
+"Αγαθάγγελος"                                                                   nameday on january 23
+"Ξένη, Φίλωνας, Ζωσιμάς"                                                        nameday on january 24
+"Γρηγόρης, Γρηγορία, Μαργαρίτα"                                                 nameday on january 25
+"Ξενοφών"                                                                       nameday on january 26
+"Χάρις, Παλλάδιος"                                                              nameday on january 28
+"Μαύρος, Χρυσή, Τριών Ιεραρχών (Σχολική Αργία)"                                 nameday on january 30
+"Ευδοξία, Κύρος"                                                                nameday on january 31
+"Τρύφωνας"                                                                      nameday on february 1
+"Υπαπαντή"                                                                      nameday on february 2
+"Σταμάτ-ης/ία, Συμεώ-ν/νή, Σιμώνη, Ασημάκης, Ασημίνα, Μαλαματή"                 nameday on february 3
+"Ισίδωρος, Ιάσιμος, Ιασίμη"                                                     nameday on february 4
+"Αγαθή"                                                                         nameday on february 5
+"Φώτης"                                                                         nameday on february 6
+"Παρθένιος, Παρθενία"                                                           nameday on february 7
+"Ζαχαρίας, Ζαχαρούλα"                                                           nameday on february 8
+"Μάρκελος, Νικηφόρος, Νίκη"                                                     nameday on february 9
+"Χαράλαμπος, Χαραλαμπία, Χαρίκλεια, Χαρίλαος, Χαρούλα"                          nameday on february 10
+"Βλάσης, Βλασία, Θοδωρής, Θοδώρα, Αυγή "                                        nameday on february 11
+"Μελέτης, Πλωτίνος"                                                             nameday on february 12
+"Πρίσκιλλα"                                                                     nameday on february 13
+"Χλόη"                                                                          nameday on sunday after ([february 13])
+"Βαλεντίνος, Βαλεντίνη, ημέρα των ερωτευμένων"                                  nameday on february 14
+"Ευσέβιος, Ευσεβία"                                                             nameday on february 15
+"Πάμφιλος, Παμφίλη, Σέλευκος, Σελεύκη"                                          nameday on february 16
+"Λέων, Αγαπητός"                                                                nameday on february 18
+"Φιλοθέη"                                                                       nameday on february 19
+"Ανθούσα"                                                                       nameday on february 22
+"Πολύκαρπος"                                                                    nameday on february 23
+"Πορφύρης, Φωτεινή"                                                             nameday on february 26
+"Μαριάννα, Ασκληπιός"                                                           nameday on february 28
+"Ευδοκία, Χαρίσιος"                                                             nameday on march 1
+"Ευθαλία"                                                                       nameday on march 2
+"Κλεόνικος, Κλεονίκη"                                                           nameday on march 3
+"Αρχέλαος, Eυλόγιος"                                                            nameday on march 5
+"Ησύχιος"                                                                       nameday on march 6
+"Ευγένιος, Ευγενία"                                                             nameday on march 7
+"Ερμής, Θεοφύλακτος, Παγκόσμια Ημέρα της Γυναίκας"                              nameday on march 8
+"Σμάραγδος, Σμαράγδα, Ηλιάνα, Λεόντιος, Λεοντία, Λυσίμαχος Λυσιμαχη"            nameday on march 9
+"Ξάνθος, Ξανθούλα, Σαράντης Σαραντούλα, Φιλοκτήμων"                             nameday on march 9
+"Θεόδωρος Θεοδώρα, Θώδος, Θώδη, Θαλλής, Θάλεια, Σωφρόνιος, Σωφρονία"            nameday on march 11
+"Λωξάντρα, Ρωξάνη, Oρθοδόξης,"                                                  nameday on march 12
+"Λέανδρος"                                                                      nameday on march 13
+"Βενέδικτος, Βενεδίκτη"                                                         nameday on march 14
+"Αγάπιος"                                                                       nameday on march 15
+"Χριστόδουλος, Ιουλιανός"                                                       nameday on march 16
+"Αλέξιος, Αλεξία"                                                               nameday on march 17
+"Χρύσανθος, Χρυσάνθη"                                                           nameday on march 19
+"Δρόσος, Δροσούλα"                                                              nameday on march 22
+"Ευαγγελισμός της Θεοτόκου "                                                    nameday on march 25
+"Ευάγγελος, Ευαγγελία"                                                          nameday on march 25
+"Πούλιος, Σύλας, Σύλια"                                                         nameday on march 26
+"Λυδία, Μακεδόνιος, Μακεδονούλα"                                                nameday on march 27
+"Ευτύχιος, Ευτυχία"                                                             nameday on april 6
+"Ιωσήφ, Ιωσηφίνα"                                                               nameday on april 9
+"Δημοσθένης, Ηρακλής, Μιλτιάδης, Περικλής, Σοφοκλής, Επαμεινώνδας"              nameday on april 10
+"Όμηρος, Πελοπίδας, Παρμενίων, Πολύβιος, Αναξιμένης, Φοιλοποίμην, Φίλης"        nameday on april 10
+"Αρίσταρχος, Θωμαΐς"                                                            nameday on april 14
+"Λεωνίδας, Λάζαρος"                                                             nameday on april 15
+"Βάϊος, Βάϊα, Δάφνη, Γαλήνη, Χιονία"                                            nameday on april 16
+"Ναθαναήλ, Νέαρχος, Νιάρχος"                                                    nameday on april 22
+"Γεώργιος, Γεωργία"                                                             nameday on ( ( ([april 23]) >= ([pascha]) ) ?  ([april 23]) : ([pascha] + 1) )
+"Ελισάβετ, Αχιλλέας"                                                            nameday on april 24
+"Μάρκος, Νίκη, Ραφαήλ"                                                          nameday on ( ( ([april 23]) >= ([pascha]) ) ?  ([april 25]) : ([pascha] + 2) )
+"Νίκη"                                                                          nameday on april 25
+"Ζωή, Πηγή"                                                                     nameday on april 28
+"Ιάσωνας"                                                                       nameday on april 29
+"Ιάκωβος, Θωμάς, Θωμαή, Ασημίνα"                                                nameday on april 30
+"Ιερεμίας"                                                                      nameday on may 1
+"Έσπερος, Εσπέρια"                                                              nameday on may 2
+"Ροδόπη, Ξενία"                                                                 nameday on may 3
+"Ειρήνη, Eιρηναίος, Ευφραίμ"                                                    nameday on may 5
+"Μυροφόρα"                                                                      nameday on may 7
+"Θεολόγος"                                                                      nameday on may 8
+"Χριστόφορος, Ησαΐας"                                                           nameday on may 9
+"Σίμων"                                                                         nameday on may 10
+"Aρμόδιος,Μεθόδιος, Ολυμπία"                                                    nameday on may 11
+"Επιφάνειος"                                                                    nameday on may 12
+"Γλυκερία"                                                                      nameday on may 13
+"Γιορτή της Μητέρας, Αριστοτέλης"                                               nameday on may 14
+"Καλή"                                                                          nameday on may 15
+"Ανδρόνικος, Ανδρονίκη, Ιουνία"                                                 nameday on may 17
+"Ιουλία, Γαλάτεια"                                                              nameday on may 18
+"Θεόκτιστος, Μαγδαληνή, Πατρίκιος"                                              nameday on may 19
+"Λυδία"                                                                         nameday on may 20
+"Κωνσταντίνος, Κωνσταντίνα, Ελένη"                                              nameday on may 21
+"Αιμίλιος, Αιμιλία, Έμυ"                                                        nameday on may 22
+"Μαρκιανή"                                                                      nameday on may 24
+"Θεοδοσία"                                                                      nameday on may 29
+"Πύρρος, Νεφέλη, Ιουστίνος, Ανάληψη"                                            nameday on june 1
+"Νικηφόρος, Μαρίνος"                                                            nameday on june 2
+"Υπάτιος, Υπατία"                                                               nameday on june 3
+"Μάρθα"                                                                         nameday on june 4
+"Aπόλλων, Δωρόθεος, Δωροθέα, Σελήνη, Νίκανδρος"                                 nameday on june 5
+"Καλλιόπη"                                                                      nameday on june 8
+"Ροδάνθη"                                                                       nameday on june 9
+"Βαρθολομαίος, Βαρνάβας"                                                        nameday on june 11
+"Ονούφριος"                                                                     nameday on june 12
+"Ελισαίος"                                                                      nameday on june 14
+"Αυγουστίνος, Αυγούστα, Ιερώνυμος, Μόνικα, Ορτανσία"                            nameday on june 15
+"Γιορτή του πατέρα"                                                             nameday on june 16
+"Έρασμος, Ερασμία, Aγίων Πάντων"                                                nameday on june 18
+"Παΐσιος, Ζωσιμάς, Ζήσης"                                                       nameday on june 19
+"Ευσέβιος, Ευσεβία"                                                             nameday on june 22
+"Αριστοκλής"                                                                    nameday on june 23
+"Φεβρωνία, Έρωτας"                                                              nameday on june 25
+"Γερμανός"                                                                      nameday on june 28
+"Πέτρος, Πέτρα, Παύλος, Παυλίνα"                                                nameday on june 29
+"Απόστολος, Αποστολία, Μελίτων"                                                 nameday on june 30
+"Αργύρης, Αργυρώ, Κοσμάς, Δαμιανός, Ανάργυρος"                                  nameday on july 1
+"Υάκινθος, Ζουμπουλία"                                                          nameday on july 3
+"Λουκία"                                                                        nameday on july 4
+"Λυκίας, Λύκιος, Λυκία, "                                                       nameday on july 6
+"Κυριακή"                                                                       nameday on july 7
+"Θεόφιλος, Προκόπιος"                                                           nameday on july 8
+"Ευφημία, Όλγα"                                                                 nameday on july 11
+"Βερονίκη, Βερενίκη "                                                           nameday on july 12
+"Σάρα"                                                                          nameday on july 13
+"Ακύλας, Νικόδημος"                                                             nameday on july 14
+"Βλαδίμηρος, Ιουλίττα, Κήρυκος"                                                 nameday on july 15
+"Μαρίνα"                                                                        nameday on july 17
+"Αιμίλιος, Αιμιλία"                                                             nameday on july 18
+"Ηλίας, Ηλιάνα"                                                                 nameday on july 20
+"Μαγδαληνή, Μαρκέλλα, Μαριλένα"                                                 nameday on july 22
+"Φωκάς"                                                                         nameday on july 23
+"Αθηναγόρας"                                                                    nameday on july 24
+"Άννα, Ολυμπία"                                                                 nameday on july 25
+"Παρασκευή, Παρασκευάς, Έρση"                                                   nameday on july 26
+"Παντελής"                                                                      nameday on july 27
+"Ειρήνη, Χρυσοβαλάντης, Βαλάντης, Χρυσοβαλάντου, Ακάκιος"                       nameday on july 28
+"Καλλίνικος"                                                                    nameday on july 29
+"Ανδρόνικος, Ανδρονίκη"                                                         nameday on july 30
+"Ιωσήφ, Ιωσηφίνα"                                                               nameday on july 31
+"Μάρκελος"                                                                      nameday on august 1
+"Σωτήρης, Σωτηρία, Ευμορφία, Έμμυ, Μορφούλα"                                    nameday on august 6
+"Αστέριος, Αστερία"                                                             nameday on august 7
+"Τριαντάφυλλος, Τριανταφυλλιά"                                                  nameday on august 8
+"Ρωμανός"                                                                       nameday on august 9
+"Λαυρέντης, Λαυρεντία, Ευλαμπία, Ιππόλυτος, Ηρώ "                               nameday on august 10
+"Γεράσιμος, Αλκιβιάδης, Διομήδης, Σαράντης"                                     nameday on august 16
+"Λευκοθέα, Μύρων, Μίρκα"                                                        nameday on august 17
+"Φλώρα"                                                                         nameday on august 18
+"Σαμουήλ, Θεοχάρης"                                                             nameday on august 20
+"Aγαθόνικος"                                                                    nameday on august 22
+"Κοσμάς"                                                                        nameday on august 24
+"Βαρθολομαίος, Τίτος"                                                           nameday on august 25
+"Ναταλία, Ανδριανός, Ανδριανή"                                                  nameday on august 26
+"Φανούριος, Φανουρία, Αρκαδία"                                                  nameday on august 27
+"Θεοπίστη"                                                                      nameday on august 29
+"Αλέξανδρος"                                                                    nameday on august 30
+"Αδαμάντιος, Αδαμαντία, Αθηνά, Αντιγόνη, Ασπασία, Αφροδίτη, Δωδώνη"             nameday on september 1
+"Ελπινίκη, Ερασμία, Ερατώ, Ευτέρπη, Θάλεια, Θεανώ, Καλλίστη, Κλειώ, Κλεονίκη"   nameday on september 1
+"Κλεοπάτρα, Κοραλία, Μαργαρίτα, Μαριάνθη, Μελέτιος, Μελπομένη, Ουρανία"         nameday on september 1
+"Πανδώρα, Πηνελόπη, Πολυμνία, Πολυνίκη, Σαπφώ, Συμεών, Τερψιχόρη, Χάιδω"        nameday on september 1
+"Άνθιμος, Πολύδωρος, Φοίβη"                                                     nameday on september 3
+"Ερμιόνη, Μωυσής"                                                               nameday on september 4
+"Ζαχαρίας"                                                                      nameday on september 5
+"Κασσιανή, Σώζων"                                                               nameday on september 7
+"Ιωακείμ"                                                                       nameday on september 9
+"Εράστη, Εράστος, Μητροδώρα, Πουλχερία"                                         nameday on september 10
+"Ευανθία"                                                                       nameday on september 11
+"Αριστείδης, Κορνήλιος"                                                         nameday on september 13
+"Σταύρος, Σταυρούλα"                                                            nameday on september 14
+"Νικήτας, Βησσαρίων"                                                            nameday on september 15
+"Ευφημία"                                                                       nameday on september 16
+"Σοφία, Ελπίδα, Αγάπη, Πίστη, Σόνια"                                            nameday on september 17
+"Αριάδνη"                                                                       nameday on september 18
+"Ευστάθιος, Ευσταθία"                                                           nameday on september 20
+"Ίωνας"                                                                         nameday on september 21
+"Φωκάς, Ζωγραφιά"                                                               nameday on september 22
+"Πολυξένη, Ξανθίππη, Ξάνθιππος"                                                 nameday on september 23
+"Θέκλα, Μυρσίνη, Μυρτώ"                                                         nameday on september 24
+"Ευφροσύνη"                                                                     nameday on september 25
+"Ζήνων"                                                                         nameday on september 27
+"Κυριάκος, Κυριακή"                                                             nameday on september 29
+"Θηρεσία"                                                                       nameday on october 1
+"Κυπριανός"                                                                     nameday on october 2
+"Διονύσης, Διονυσία"                                                            nameday on october 3
+"Ιερόθεος, Φραγκίσκος"                                                          nameday on october 4
+"Χαριτινή"                                                                      nameday on october 5
+"Σέργιος, Πολυχρόνης, Χρόνης"                                                   nameday on october 7
+"Πελαγία"                                                                       nameday on october 8
+"Ευλάμπιος, Ευλαμπία"                                                           nameday on october 10
+"Ανδρομάχη, Ανδρόμαχος"                                                         nameday on october 12
+"Αγαθονίκη, Φλωρέντιος, Φλωρεντία"                                              nameday on october 13
+"Λουκιανός"                                                                     nameday on october 15
+"Λουκάς"                                                                        nameday on october 18
+"Γεράσιμος, Αρτέμιος"                                                           nameday on october 20
+"Σωκράτης, Χριστόδουλος, Όυρσουλα"                                              nameday on october 21
+"Αβέρκιος"                                                                      nameday on october 22
+"Ιάκωβος"                                                                       nameday on october 23
+"Χρυσάφης"                                                                      nameday on october 25
+"Δημήτριος, Δήμητρα, Δανάη"                                                     nameday on october 26
+"Νέστορας"                                                                      nameday on october 27
+"Ζηνοβία, Κλεόπας, Μαρκιανός"                                                   nameday on october 30
+"Αριστόβουλος"                                                                  nameday on october 31
+"Αργύρης, Αργυρώ, Κοσμάς, Δαμιανός, Ανάργυρος"                                  nameday on november 1
+"Αφθόνιος, Αφθονία"                                                             nameday on november 2
+"Ιωαννίκη"                                                                      nameday on november 4
+"Λίνος"                                                                         nameday on november 5
+"Λεονάρδος"                                                                     nameday on november 6
+"Αθηνόδωρος"                                                                    nameday on november 7
+"Σταμάτιος, Σταματία, Μιχάλης, Γαβριήλ, Γαβριέλα"                               nameday on november 8
+"Ταξιάρχης, Άγγελος, Αγγελική, Ματίνα, Σεραφείμ"                                nameday on november 8
+"Νεκτάριος, Νεκταρία"                                                           nameday on november 9
+"Ορέστης"                                                                       nameday on november 10
+"Μηνάς, Mήνα, Βίκτωρ, Βικτωρία"                                                 nameday on november 11
+"Χρυσόστομος"                                                                   nameday on november 13
+"Φίλιππος"                                                                      nameday on november 14
+"Ματθαίος, Ιφιγένεια"                                                           nameday on november 16
+"Πλάτωνας"                                                                      nameday on november 18
+"Μαρία, Μάριος"                                                                 nameday on november 21
+"Φιλήμων"                                                                       nameday on november 22
+"Μερώπη"                                                                        nameday on november 23
+"Κατερίνα, Μερκούριος"                                                          nameday on november 25
+"Στέλιος, Στέλλα, Στέργιος"                                                     nameday on november 26
+"Φαίδρα"                                                                        nameday on november 29
+"Ανδρέας, Ανδριάνα"                                                             nameday on november 30
+"Θεόκλητος, Ιακώβ"                                                              nameday on december 1
+"Βαρβάρα, Δαμασκηνός"                                                           nameday on december 4
+"Σάββας, Σαββούλα, Διογένης"                                                    nameday on december 5
+"Νίκος, Νικολέτα"                                                               nameday on december 6
+"Αμβρόσιος"                                                                     nameday on december 7
+"Άννα"                                                                          nameday on december 9
+"Ααρών, Αδάμ, Δαυίδ, Δανάη, Εύα, Ισαάκ, Ιώβ, Ραχήλ, Ρουμπίνη"                   nameday on sunday after ([december 11])
+"Σπύρος, Σπυριδούλα"                                                            nameday on december 12
+"Ευστράτιος, Λουκάς, Λουκία, Άρης"                                              nameday on december 13
+"Ελευθέριος, Ελευθερία, Ανθή, Σύλβια"                                           nameday on december 15
+"Διονύσης, Διονυσία, Δανιήλ, Ρεβέκα, Σεβαστιανός, Σεβαστή"                      nameday on december 17
+"Ααρών, Αδάμ, Ισαάκ, Ραχήλ, Σάρα"                                               nameday on december 17
+"Αγλαΐα"                                                                        nameday on december 19
+"Ιγνάτιος"                                                                      nameday on december 20
+"Θεμιστοκλής, Ιουλία"                                                           nameday on december 21
+"Αναστασία"                                                                     nameday on december 22
+"Ευγένιος, Ευγενία"                                                             nameday on december 24
+"Χρήστος, Χριστίνα, Χρύσα"                                                      nameday on december 25
+"Μανώλης, Εμμανουέλα"                                                           nameday on december 26
+"Στέφανος, Στεφανία"                                                            nameday on december 27
+"Δόμνα"                                                                         nameday on december 28
+"Ιωσήφ"                                                                         nameday on december 30
diff --git a/kholidays/holidays/plan2/holiday_gt_es b/kholidays/holidays/plan2/holiday_gt_es
index 5af4495..4b6d650 100644
--- a/kholidays/holidays/plan2/holiday_gt_es
+++ b/kholidays/holidays/plan2/holiday_gt_es
@@ -17,27 +17,27 @@ language    "es"
 :description "(please add description in source language) National holiday file for Guatemala"
 
 :: Public Holidays
-"Año nuevo"              weekend on january 1
-"Reyes"                  weekend on january 6
-"Trabajo"                weekend on march 19
-"Jueves Santo"           weekend on easter minus 3 days
-"Viernes Santo"          weekend on easter minus 2 days
-"Pentecostes"            weekend on easter plus 49 days
-"Ejército"               weekend on may 1
-"Virgen de la Asunción"  weekend on august 15
-"Independencia"          weekend on september 15
-"Revolucion de 1944"     weekend on october 20
-"Todos los Santos"       weekend on november 1
-"Nochebuena"             weekend on december 24
-"Navidad"                weekend on december 25
-"Fin de año"             weekend on december 31
+"Año nuevo"              public on january 1
+"Reyes"                  public on january 6
+"Trabajo"                public on march 19
+"Jueves Santo"           public on easter minus 3 days
+"Viernes Santo"          public on easter minus 2 days
+"Pentecostes"            public on easter plus 49 days
+"Ejército"               public on may 1
+"Virgen de la Asunción"  public on august 15
+"Independencia"          public on september 15
+"Revolucion de 1944"     public on october 20
+"Todos los Santos"       public on november 1
+"Nochebuena"             public on december 24
+"Navidad"                public on december 25
+"Fin de año"             public on december 31
 
 :: Religious
-"Pascua"                 on easter
-"Miércoles de ceniza"    on easter minus 46 days
-"Ascension"              on easter plus 39 days
-"Trinidad"               on easter plus 56 days
-"Corpus Christi"         on easter plus 60 days
+"Pascua"                 religious on easter
+"Miércoles de ceniza"    religious on easter minus 46 days
+"Ascension"              religious on easter plus 39 days
+"Trinidad"               religious on easter plus 56 days
+"Corpus Christi"         religious on easter plus 60 days
 
 :: Financial
 
@@ -48,9 +48,9 @@ language    "es"
 :: Daylight Saving
 
 :: Seasons
-"Llega la Primavera"     on march 20
-"Llega el Verano"        on june 21
-"Llega el Otoño"         on september 23
-"Llega el Invierno"      on december 22
+"Llega la Primavera"     seasonal on march 20
+"Llega el Verano"        seasonal on june 21
+"Llega el Otoño"         seasonal on september 23
+"Llega el Invierno"      seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_hk_en-gb b/kholidays/holidays/plan2/holiday_hk_en-gb
index 9a51f72..be774cb 100644
--- a/kholidays/holidays/plan2/holiday_hk_en-gb
+++ b/kholidays/holidays/plan2/holiday_hk_en-gb
@@ -22,138 +22,138 @@ description "Public Holidays for Hong Kong"
 
 :: Public/Statutory Holidays
 : The first day of january (or if that day is a Sunday, then the following day)
-"New Year's Day"                                      weekend on january 1
-"New Year's Day Holiday"                              weekend on ( ( [january 1] == [sunday after ([january 1])]) ?
+"New Year's Day"                                      public on january 1
+"New Year's Day Holiday"                              public on ( ( [january 1] == [sunday after ([january 1])]) ?
                                                                    [monday after ([january 1])] :
                                                                    noop )
 : Lunar New Year, Days 1-3 of Month 1
 : (and if any day is a Sunday, then the day preceding Lunar New Year's Day)
-"Lunar New Year's Eve Holiday"                        weekend on 4 february 2000
-"Lunar New Year"                                      weekend on 5 february 2000 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 23 january 2001
-"Lunar New Year"                                      weekend on 24 january 2001 length 3 days
-"Lunar New Year"                                      weekend on 12 february 2002 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 31 january 2003
-"Lunar New Year"                                      weekend on 1 february 2003 length 3 days
-"Lunar New Year"                                      weekend on 22 january 2004 length 3 days
-"Lunar New Year"                                      weekend on 9 february 2005 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 28 january 2006
-"Lunar New Year"                                      weekend on 29 january 2006 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 17 february 2007
-"Lunar New Year"                                      weekend on 18 february 2007 length 3 days
-"Lunar New Year"                                      weekend on 7 february 2008 length 3 days
-"Lunar New Year"                                      weekend on 26 january 2009 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 13 february 2010
-"Lunar New Year"                                      weekend on 14 february 2010 length 3 days
-"Lunar New Year"                                      weekend on 3 february 2011 length 3 days
-"Lunar New Year"                                      weekend on 23 january 2012 length 3 days
-"Lunar New Year"                                      weekend on 10 february 2013 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 30 january 2014
-"Lunar New Year"                                      weekend on 31 january 2014 length 3 days
-"Lunar New Year"                                      weekend on 19 february 2015 length 3 days
-"Lunar New Year"                                      weekend on 8 february 2016 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 27 january 2017
-"Lunar New Year"                                      weekend on 28 january 2017 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 15 february
-"Lunar New Year"                                      weekend on 16 february 2018 length 3 days
-"Lunar New Year"                                      weekend on 5 february 2019 length 3 days
-"Lunar New Year's Eve Holiday"                        weekend on 24 january
-"Lunar New Year"                                      weekend on 25 january 2020 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 4 february 2000
+"Lunar New Year"                                      public on 5 february 2000 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 23 january 2001
+"Lunar New Year"                                      public on 24 january 2001 length 3 days
+"Lunar New Year"                                      public on 12 february 2002 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 31 january 2003
+"Lunar New Year"                                      public on 1 february 2003 length 3 days
+"Lunar New Year"                                      public on 22 january 2004 length 3 days
+"Lunar New Year"                                      public on 9 february 2005 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 28 january 2006
+"Lunar New Year"                                      public on 29 january 2006 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 17 february 2007
+"Lunar New Year"                                      public on 18 february 2007 length 3 days
+"Lunar New Year"                                      public on 7 february 2008 length 3 days
+"Lunar New Year"                                      public on 26 january 2009 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 13 february 2010
+"Lunar New Year"                                      public on 14 february 2010 length 3 days
+"Lunar New Year"                                      public on 3 february 2011 length 3 days
+"Lunar New Year"                                      public on 23 january 2012 length 3 days
+"Lunar New Year"                                      public on 10 february 2013 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 30 january 2014
+"Lunar New Year"                                      public on 31 january 2014 length 3 days
+"Lunar New Year"                                      public on 19 february 2015 length 3 days
+"Lunar New Year"                                      public on 8 february 2016 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 27 january 2017
+"Lunar New Year"                                      public on 28 january 2017 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 15 february
+"Lunar New Year"                                      public on 16 february 2018 length 3 days
+"Lunar New Year"                                      public on 5 february 2019 length 3 days
+"Lunar New Year's Eve Holiday"                        public on 24 january
+"Lunar New Year"                                      public on 25 january 2020 length 3 days
 : Ching Ming Festival. See https://bugs.kde.org/show_bug.cgi?id=317834#c4
-"Ching Ming Festival"                                 weekend on 5 april 2010
-"Ching Ming Festival"                                 weekend on 5 april 2011
-"Ching Ming Festival"                                 weekend on 4 april 2012
-"Ching Ming Festival"                                 weekend on 4 april 2013
-"Ching Ming Festival"                                 weekend on 5 april 2014
-"Ching Ming Festival"                                 weekend on 5 april 2015
-"Ching Ming Festival"                                 weekend on 4 april 2016
-"Ching Ming Festival"                                 weekend on 4 april 2017
-"Ching Ming Festival"                                 weekend on 5 april 2018
-"Ching Ming Festival"                                 weekend on 5 april 2019
-"Ching Ming Festival"                                 weekend on 4 april 2020
+"Ching Ming Festival"                                 public on 5 april 2010
+"Ching Ming Festival"                                 public on 5 april 2011
+"Ching Ming Festival"                                 public on 4 april 2012
+"Ching Ming Festival"                                 public on 4 april 2013
+"Ching Ming Festival"                                 public on 5 april 2014
+"Ching Ming Festival"                                 public on 5 april 2015
+"Ching Ming Festival"                                 public on 4 april 2016
+"Ching Ming Festival"                                 public on 4 april 2017
+"Ching Ming Festival"                                 public on 5 april 2018
+"Ching Ming Festival"                                 public on 5 april 2019
+"Ching Ming Festival"                                 public on 4 april 2020
 : Labour Day (or if that day is a Sunday, then the following day)
-"Labour Day"                                          weekend on may 1
-"Labour Day Holiday"                                  weekend on ( ( [may 1] == [sunday after ([may 1])]) ?
+"Labour Day"                                          public on may 1
+"Labour Day Holiday"                                  public on ( ( [may 1] == [sunday after ([may 1])]) ?
                                                                    [monday after ([may 1])] :
                                                                    noop )
 : Tuen Ng Festival Day 5 of Month 5 (or if that day is a Sunday, then the following day)
-"Tuen Ng Festival"                                    weekend on 6 june 2000
-"Tuen Ng Festival"                                    weekend on 25 june 2001
-"Tuen Ng Festival"                                    weekend on 15 june 2002
-"Tuen Ng Festival"                                    weekend on 4 june 2003
-"Tuen Ng Festival"                                    weekend on 22 june 2004
-"Tuen Ng Festival"                                    weekend on 11 june 2005
-"Tuen Ng Festival"                                    weekend on 31 may 2006
-"Tuen Ng Festival"                                    weekend on 19 june 2007
-"Tuen Ng Festival"                                    weekend on 8 June 2008
-"Tuen Ng Festival Holiday"                            weekend on 9 June 2008
-"Tuen Ng Festival"                                    weekend on 27 may 2009
-"Tuen Ng Festival"                                    weekend on 16 june 2010
-"Tuen Ng Festival"                                    weekend on 6 june 2011
-"Tuen Ng Festival"                                    weekend on 23 june 2012
-"Tuen Ng Festival"                                    weekend on 12 june 2013
-"Tuen Ng Festival"                                    weekend on 2 june 2014
-"Tuen Ng Festival"                                    weekend on 20 june 2015
-"Tuen Ng Festival"                                    weekend on 9 june 2016
-"Tuen Ng Festival"                                    weekend on 30 may 2017
-"Tuen Ng Festival"                                    weekend on 18 june 2018
-"Tuen Ng Festival"                                    weekend on 7 june 2019
-"Tuen Ng Festival"                                    weekend on 25 june 2020
+"Tuen Ng Festival"                                    public on 6 june 2000
+"Tuen Ng Festival"                                    public on 25 june 2001
+"Tuen Ng Festival"                                    public on 15 june 2002
+"Tuen Ng Festival"                                    public on 4 june 2003
+"Tuen Ng Festival"                                    public on 22 june 2004
+"Tuen Ng Festival"                                    public on 11 june 2005
+"Tuen Ng Festival"                                    public on 31 may 2006
+"Tuen Ng Festival"                                    public on 19 june 2007
+"Tuen Ng Festival"                                    public on 8 June 2008
+"Tuen Ng Festival Holiday"                            public on 9 June 2008
+"Tuen Ng Festival"                                    public on 27 may 2009
+"Tuen Ng Festival"                                    public on 16 june 2010
+"Tuen Ng Festival"                                    public on 6 june 2011
+"Tuen Ng Festival"                                    public on 23 june 2012
+"Tuen Ng Festival"                                    public on 12 june 2013
+"Tuen Ng Festival"                                    public on 2 june 2014
+"Tuen Ng Festival"                                    public on 20 june 2015
+"Tuen Ng Festival"                                    public on 9 june 2016
+"Tuen Ng Festival"                                    public on 30 may 2017
+"Tuen Ng Festival"                                    public on 18 june 2018
+"Tuen Ng Festival"                                    public on 7 june 2019
+"Tuen Ng Festival"                                    public on 25 june 2020
 : Hong Kong SAR Establishment Day (or if that day is a Sunday, then the following day)
-"Hong Kong SAR Establishment Day"                     weekend on july 1
-"Hong Kong SAR Establishment Day Holiday"             weekend on ( ( [july 1] == [sunday after ([july 1])]) ?
+"Hong Kong SAR Establishment Day"                     public on july 1
+"Hong Kong SAR Establishment Day Holiday"             public on ( ( [july 1] == [sunday after ([july 1])]) ?
                                                                    [monday after ([july 1])] :
                                                                    noop )
 : The day following the Chinese Mid-Autumn Festival, Day 16 of Month 8 (or if that day is a Sunday, then the preceding day)
-"Mid-Autumn Festival Holiday"                         weekend on 13 september 2000
-"Mid-Autumn Festival Holiday"                         weekend on 2 october 2001
-"Mid-Autumn Festival Holiday"                         weekend on 22 september 2002
-"Mid-Autumn Festival Holiday"                         weekend on 12 september 2003
-"Mid-Autumn Festival Holiday"                         weekend on 29 september 2004
-"Mid-Autumn Festival Holiday"                         weekend on 19 september 2005
-"Mid-Autumn Festival Holiday"                         weekend on 7 october 2006
-"Mid-Autumn Festival Holiday"                         weekend on 26 september 2007
-"Mid-Autumn Festival Holiday"                         weekend on 15 september 2008
-"Mid-Autumn Festival Holiday"                         weekend on 3 october 2009
-"Mid-Autumn Festival Holiday"                         weekend on 23 september 2010
-"Mid-Autumn Festival Holiday"                         weekend on 13 september 2011
-"Mid-Autumn Festival Holiday"                         weekend on 1 october 2012
-"Mid-Autumn Festival Holiday"                         weekend on 20 september 2013
-"Mid-Autumn Festival Holiday"                         weekend on 9 september 2014
-"Mid-Autumn Festival Holiday"                         weekend on 28 september 2015
-"Mid-Autumn Festival Holiday"                         weekend on 16 september 2016
-"Mid-Autumn Festival Holiday"                         weekend on 5 october 2017
-"Mid-Autumn Festival Holiday"                         weekend on 25 september 2018
-"Mid-Autumn Festival Holiday"                         weekend on 14 september 2019
-"Mid-Autumn Festival Holiday"                         weekend on 2 october 2020
+"Mid-Autumn Festival Holiday"                         public on 13 september 2000
+"Mid-Autumn Festival Holiday"                         public on 2 october 2001
+"Mid-Autumn Festival Holiday"                         public on 22 september 2002
+"Mid-Autumn Festival Holiday"                         public on 12 september 2003
+"Mid-Autumn Festival Holiday"                         public on 29 september 2004
+"Mid-Autumn Festival Holiday"                         public on 19 september 2005
+"Mid-Autumn Festival Holiday"                         public on 7 october 2006
+"Mid-Autumn Festival Holiday"                         public on 26 september 2007
+"Mid-Autumn Festival Holiday"                         public on 15 september 2008
+"Mid-Autumn Festival Holiday"                         public on 3 october 2009
+"Mid-Autumn Festival Holiday"                         public on 23 september 2010
+"Mid-Autumn Festival Holiday"                         public on 13 september 2011
+"Mid-Autumn Festival Holiday"                         public on 1 october 2012
+"Mid-Autumn Festival Holiday"                         public on 20 september 2013
+"Mid-Autumn Festival Holiday"                         public on 9 september 2014
+"Mid-Autumn Festival Holiday"                         public on 28 september 2015
+"Mid-Autumn Festival Holiday"                         public on 16 september 2016
+"Mid-Autumn Festival Holiday"                         public on 5 october 2017
+"Mid-Autumn Festival Holiday"                         public on 25 september 2018
+"Mid-Autumn Festival Holiday"                         public on 14 september 2019
+"Mid-Autumn Festival Holiday"                         public on 2 october 2020
 : Chung Yeung Festival, Day 9 of Month 9 (or if that day is a Sunday, then the following day)
-"Chung Yeung Festival"                                weekend on 6 october 2000
-"Chung Yeung Festival"                                weekend on 25 october 2001
-"Chung Yeung Festival"                                weekend on 14 october 2002
-"Chung Yeung Festival"                                weekend on 4 october 2003
-"Chung Yeung Festival"                                weekend on 22 october 2004
-"Chung Yeung Festival"                                weekend on 11 october 2005
-"Chung Yeung Festival"                                weekend on 30 october 2006
-"Chung Yeung Festival"                                weekend on 19 october 2007
-"Chung Yeung Festival"                                weekend on 7 october 2008
-"Chung Yeung Festival"                                weekend on 26 october 2009
-"Chung Yeung Festival"                                weekend on 5 october 2011
-"Chung Yeung Festival"                                weekend on 23 october 2012
-"Chung Yeung Festival"                                weekend on 13 october 2013
-"Chung Yeung Festival"                                weekend on 1 november 2014
-"Chung Yeung Festival"                                weekend on 21 october 2015
-"Chung Yeung Festival"                                weekend on 9 october 2016
-"Chung Yeung Festival Holiday"                        weekend on 10 october 2016
-"Chung Yeung Festival"                                weekend on 28 october 2017
-"Chung Yeung Festival"                                weekend on 17 october 2018
-"Chung Yeung Festival"                                weekend on 7 october 2019
-"Chung Yeung Festival"                                weekend on 25 october 2020
-"Chung Yeung Festival Holiday"                        weekend on 26 october 2020
+"Chung Yeung Festival"                                public on 6 october 2000
+"Chung Yeung Festival"                                public on 25 october 2001
+"Chung Yeung Festival"                                public on 14 october 2002
+"Chung Yeung Festival"                                public on 4 october 2003
+"Chung Yeung Festival"                                public on 22 october 2004
+"Chung Yeung Festival"                                public on 11 october 2005
+"Chung Yeung Festival"                                public on 30 october 2006
+"Chung Yeung Festival"                                public on 19 october 2007
+"Chung Yeung Festival"                                public on 7 october 2008
+"Chung Yeung Festival"                                public on 26 october 2009
+"Chung Yeung Festival"                                public on 5 october 2011
+"Chung Yeung Festival"                                public on 23 october 2012
+"Chung Yeung Festival"                                public on 13 october 2013
+"Chung Yeung Festival"                                public on 1 november 2014
+"Chung Yeung Festival"                                public on 21 october 2015
+"Chung Yeung Festival"                                public on 9 october 2016
+"Chung Yeung Festival Holiday"                        public on 10 october 2016
+"Chung Yeung Festival"                                public on 28 october 2017
+"Chung Yeung Festival"                                public on 17 october 2018
+"Chung Yeung Festival"                                public on 7 october 2019
+"Chung Yeung Festival"                                public on 25 october 2020
+"Chung Yeung Festival Holiday"                        public on 26 october 2020
 : National Day (or if that day is a Sunday, then the following day)
-"National Day"                                        weekend on october 1 shift to monday if sunday
+"National Day"                                        public on october 1 shift to monday if sunday
 : Christmas Day (or if that day is a Sunday, then the second weekday after Christmas Day)
-"Christmas Day"                                       weekend on december 25
-"Christmas Day Holiday"                               weekend on ( ( [december 25] == [sunday after ([december 25])]) ?
+"Christmas Day"                                       public religious on december 25
+"Christmas Day Holiday"                               public on ( ( [december 25] == [sunday after ([december 25])]) ?
                                                                    [tuesday after ([december 25])] :
                                                                    noop )
 
@@ -161,42 +161,42 @@ description "Public Holidays for Hong Kong"
 
 :: Religious
 : Good Friday
-"Good Friday"                                         on easter minus 2
+"Good Friday"                                         religious on easter minus 2
 : The day following Good Friday
-"Day after Good Friday"                               on easter minus 1
+"Day after Good Friday"                               religious on easter minus 1
 : Easter Monday
-"Easter Monday"                                       on easter plus 1
+"Easter Monday"                                       religious on easter plus 1
 : The Birthday of the Buddha, Day 8 of Month 4 (or if that day is a Sunday, then the following day)
-"Buddha's Birthday"                                   on 11 may 2000
-"Buddha's Birthday"                                   on 30 may 2001
-"Buddha's Birthday"                                   on 19 may 2002
-"Buddha's Birthday Holiday"                           on 19 may 2003
-"Buddha's Birthday"                                   on 8 may 2003
-"Buddha's Birthday"                                   on 26 may 2004
-"Buddha's Birthday"                                   on 15 may 2005
-"Buddha's Birthday Holiday"                           on 16 may 2005
-"Buddha's Birthday"                                   on 5 may 2006
-"Buddha's Birthday"                                   on 24 may 2007
-"Buddha's Birthday"                                   on 12 may 2008
-"Buddha's Birthday"                                   on 2 may 2009
-"Buddha's Birthday"                                   on 21 may 2010
-"Buddha's Birthday"                                   on 10 may 2011
-"Buddha's Birthday"                                   on 28 may 2012
-"Buddha's Birthday"                                   on 17 may 2013
-"Buddha's Birthday"                                   on 6 may 2014
-"Buddha's Birthday"                                   on 25 may 2015
-"Buddha's Birthday"                                   on 14 may 2016
-"Buddha's Birthday"                                   on 3 may 2017
-"Buddha's Birthday"                                   on 22 may 2018
-"Buddha's Birthday"                                   on 12 may 2019
-"Buddha's Birthday Holiday"                           on 13 may 2019
-"Buddha's Birthday"                                   on 30 may 2020
+"Buddha's Birthday"                                   religious on 11 may 2000
+"Buddha's Birthday"                                   religious on 30 may 2001
+"Buddha's Birthday"                                   religious on 19 may 2002
+"Buddha's Birthday Holiday"                           religious on 19 may 2003
+"Buddha's Birthday"                                   religious on 8 may 2003
+"Buddha's Birthday"                                   religious on 26 may 2004
+"Buddha's Birthday"                                   religious on 15 may 2005
+"Buddha's Birthday Holiday"                           religious on 16 may 2005
+"Buddha's Birthday"                                   religious on 5 may 2006
+"Buddha's Birthday"                                   religious on 24 may 2007
+"Buddha's Birthday"                                   religious on 12 may 2008
+"Buddha's Birthday"                                   religious on 2 may 2009
+"Buddha's Birthday"                                   religious on 21 may 2010
+"Buddha's Birthday"                                   religious on 10 may 2011
+"Buddha's Birthday"                                   religious on 28 may 2012
+"Buddha's Birthday"                                   religious on 17 may 2013
+"Buddha's Birthday"                                   religious on 6 may 2014
+"Buddha's Birthday"                                   religious on 25 may 2015
+"Buddha's Birthday"                                   religious on 14 may 2016
+"Buddha's Birthday"                                   religious on 3 may 2017
+"Buddha's Birthday"                                   religious on 22 may 2018
+"Buddha's Birthday"                                   religious on 12 may 2019
+"Buddha's Birthday Holiday"                           religious on 13 may 2019
+"Buddha's Birthday"                                   religious on 30 may 2020
 
 :: Financial
 
 :: Cultural
 : The first weekday after Christmas Day
-"Day after Christmas Day"                             on december 26 shift to monday if sunday
+"Day after Christmas Day"                             cultural on december 26 shift to monday if sunday
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_hk_zh-cn b/kholidays/holidays/plan2/holiday_hk_zh-cn
index 8178664..b1eee42 100644
--- a/kholidays/holidays/plan2/holiday_hk_zh-cn
+++ b/kholidays/holidays/plan2/holiday_hk_zh-cn
@@ -22,138 +22,138 @@ description "Public Holidays for Hong Kong"
 
 :: Public/Statutory Holidays
 : The first day of january (or if that day is a Sunday, then the following day)
-"1月1日"                                              weekend on january 1
-"1月1日"                                              weekend on ( ( [january 1] == [sunday after ([january 1])]) ?
+"1月1日"                                              public on january 1
+"1月1日"                                              public on ( ( [january 1] == [sunday after ([january 1])]) ?
                                                                    [monday after ([january 1])] :
                                                                    noop )
 : Lunar New Year, Days 1-3 of Month 1
 : (and if any day is a Sunday, then the day preceding Lunar New Year's Day)
-"農曆年初"                                              weekend on 4 february 2000
-"農曆年初"                                              weekend on 5 february 2000 length 3 days
-"農曆年初"                                              weekend on 23 january 2001
-"農曆年初"                                              weekend on 24 january 2001 length 3 days
-"農曆年初"                                              weekend on 12 february 2002 length 3 days
-"農曆年初"                                              weekend on 31 january 2003
-"農曆年初"                                              weekend on 1 february 2003 length 3 days
-"農曆年初"                                              weekend on 22 january 2004 length 3 days
-"農曆年初"                                              weekend on 9 february 2005 length 3 days
-"農曆年初"                                              weekend on 28 january 2006
-"農曆年初"                                              weekend on 29 january 2006 length 3 days
-"農曆年初"                                              weekend on 17 february 2007
-"農曆年初"                                              weekend on 18 february 2007 length 3 days
-"農曆年初"                                              weekend on 7 february 2008 length 3 days
-"農曆年初"                                              weekend on 26 january 2009 length 3 days
-"農曆年初"                                              weekend on 13 february 2010
-"農曆年初"                                              weekend on 14 february 2010 length 3 days
-"農曆年初"                                              weekend on 3 february 2011 length 3 days
-"農曆年初"                                              weekend on 23 january 2012 length 3 days
-"農曆年初"                                              weekend on 10 february 2013 length 3 days
-"農曆年初"                                              weekend on 30 january 2014
-"農曆年初"                                              weekend on 31 january 2014 length 3 days
-"農曆年初"                                              weekend on 19 february 2015 length 3 days
-"農曆年初"                                              weekend on 8 february 2016 length 3 days
-"農曆年初"                                              weekend on 27 january 2017
-"農曆年初"                                              weekend on 28 january 2017 length 3 days
-"農曆年初"                                              weekend on 15 february
-"農曆年初"                                              weekend on 16 february 2018 length 3 days
-"農曆年初"                                              weekend on 5 february 2019 length 3 days
-"農曆年初"                                              weekend on 24 january
-"農曆年初"                                              weekend on 25 january 2018 length 3 days
+"農曆年初"                                              public on 4 february 2000
+"農曆年初"                                              public on 5 february 2000 length 3 days
+"農曆年初"                                              public on 23 january 2001
+"農曆年初"                                              public on 24 january 2001 length 3 days
+"農曆年初"                                              public on 12 february 2002 length 3 days
+"農曆年初"                                              public on 31 january 2003
+"農曆年初"                                              public on 1 february 2003 length 3 days
+"農曆年初"                                              public on 22 january 2004 length 3 days
+"農曆年初"                                              public on 9 february 2005 length 3 days
+"農曆年初"                                              public on 28 january 2006
+"農曆年初"                                              public on 29 january 2006 length 3 days
+"農曆年初"                                              public on 17 february 2007
+"農曆年初"                                              public on 18 february 2007 length 3 days
+"農曆年初"                                              public on 7 february 2008 length 3 days
+"農曆年初"                                              public on 26 january 2009 length 3 days
+"農曆年初"                                              public on 13 february 2010
+"農曆年初"                                              public on 14 february 2010 length 3 days
+"農曆年初"                                              public on 3 february 2011 length 3 days
+"農曆年初"                                              public on 23 january 2012 length 3 days
+"農曆年初"                                              public on 10 february 2013 length 3 days
+"農曆年初"                                              public on 30 january 2014
+"農曆年初"                                              public on 31 january 2014 length 3 days
+"農曆年初"                                              public on 19 february 2015 length 3 days
+"農曆年初"                                              public on 8 february 2016 length 3 days
+"農曆年初"                                              public on 27 january 2017
+"農曆年初"                                              public on 28 january 2017 length 3 days
+"農曆年初"                                              public on 15 february
+"農曆年初"                                              public on 16 february 2018 length 3 days
+"農曆年初"                                              public on 5 february 2019 length 3 days
+"農曆年初"                                              public on 24 january
+"農曆年初"                                              public on 25 january 2018 length 3 days
 : Ching Ming Festival. See https://bugs.kde.org/show_bug.cgi?id=317834#c4
-"清明節"                                                weekend on 5 april 2010
-"清明節"                                                weekend on 5 april 2011
-"清明節"                                                weekend on 4 april 2012
-"清明節"                                                weekend on 4 april 2013
-"清明節"                                                weekend on 5 april 2014
-"清明節"                                                weekend on 5 april 2015
-"清明節"                                                weekend on 4 april 2016
-"清明節"                                                weekend on 4 april 2017
-"清明節"                                                weekend on 5 april 2018
-"清明節"                                                weekend on 5 april 2019
-"清明節"                                                weekend on 4 april 2020
+"清明節"                                                public on 5 april 2010
+"清明節"                                                public on 5 april 2011
+"清明節"                                                public on 4 april 2012
+"清明節"                                                public on 4 april 2013
+"清明節"                                                public on 5 april 2014
+"清明節"                                                public on 5 april 2015
+"清明節"                                                public on 4 april 2016
+"清明節"                                                public on 4 april 2017
+"清明節"                                                public on 5 april 2018
+"清明節"                                                public on 5 april 2019
+"清明節"                                                public on 4 april 2020
 : Labour Day (or if that day is a Sunday, then the following day)
-"勞動節"                                               weekend on may 1
-"勞動節"                                               weekend on ( ( [may 1] == [sunday after ([may 1])]) ?
+"勞動節"                                               public on may 1
+"勞動節"                                               public on ( ( [may 1] == [sunday after ([may 1])]) ?
                                                                    [monday after ([may 1])] :
                                                                    noop )
 : Tuen Ng Festival Day 5 of Month 5 (or if that day is a Sunday, then the following day)
-"端午節"                                               weekend on 6 june 2000
-"端午節"                                               weekend on 25 june 2001
-"端午節"                                               weekend on 15 june 2002
-"端午節"                                               weekend on 4 june 2003
-"端午節"                                               weekend on 22 june 2004
-"端午節"                                               weekend on 11 june 2005
-"端午節"                                               weekend on 31 may 2006
-"端午節"                                               weekend on 19 june 2007
-"端午節"                                               weekend on 8 June 2008
-"端午節"                                               weekend on 9 June 2008
-"端午節"                                               weekend on 27 may 2009
-"端午節"                                               weekend on 16 june 2010
-"端午節"                                               weekend on 6 june 2011
-"端午節"                                               weekend on 23 june 2012
-"端午節"                                               weekend on 12 june 2013
-"端午節"                                               weekend on 2 june 2014
-"端午節"                                               weekend on 20 june 2015
-"端午節"                                               weekend on 9 june 2016
-"端午節"                                               weekend on 30 may 2017
-"端午節"                                               weekend on 18 june 2018
-"端午節"                                               weekend on 7 june 2019
-"端午節"                                               weekend on 25 june 2020
+"端午節"                                               public on 6 june 2000
+"端午節"                                               public on 25 june 2001
+"端午節"                                               public on 15 june 2002
+"端午節"                                               public on 4 june 2003
+"端午節"                                               public on 22 june 2004
+"端午節"                                               public on 11 june 2005
+"端午節"                                               public on 31 may 2006
+"端午節"                                               public on 19 june 2007
+"端午節"                                               public on 8 June 2008
+"端午節"                                               public on 9 June 2008
+"端午節"                                               public on 27 may 2009
+"端午節"                                               public on 16 june 2010
+"端午節"                                               public on 6 june 2011
+"端午節"                                               public on 23 june 2012
+"端午節"                                               public on 12 june 2013
+"端午節"                                               public on 2 june 2014
+"端午節"                                               public on 20 june 2015
+"端午節"                                               public on 9 june 2016
+"端午節"                                               public on 30 may 2017
+"端午節"                                               public on 18 june 2018
+"端午節"                                               public on 7 june 2019
+"端午節"                                               public on 25 june 2020
 : Hong Kong SAR Establishment Day (or if that day is a Sunday, then the following day)
-"香港特別行政區成立紀念日"                                 weekend on july 1
-"香港特別行政區成立紀念日"                                 weekend on ( ( [july 1] == [sunday after ([july 1])]) ?
+"香港特別行政區成立紀念日"                                 public on july 1
+"香港特別行政區成立紀念日"                                 public on ( ( [july 1] == [sunday after ([july 1])]) ?
                                                                    [monday after ([july 1])] :
                                                                    noop )
 : The day following the Chinese Mid-Autumn Festival, Day 16 of Month 8 (or if that day is a Sunday, then the preceding day)
-"中秋節翌日"                                            weekend on 13 september 2000
-"中秋節翌日"                                            weekend on 2 october 2001
-"中秋節翌日"                                            weekend on 22 september 2002
-"中秋節翌日"                                            weekend on 12 september 2003
-"中秋節翌日"                                            weekend on 29 september 2004
-"中秋節翌日"                                            weekend on 19 september 2005
-"中秋節翌日"                                            weekend on 7 october 2006
-"中秋節翌日"                                            weekend on 26 september 2007
-"中秋節翌日"                                            weekend on 15 september 2008
-"中秋節翌日"                                            weekend on 3 october 2009
-"中秋節翌日"                                            weekend on 23 september 2010
-"中秋節翌日"                                            weekend on 13 september 2011
-"中秋節翌日"                                            weekend on 1 october 2012
-"中秋節翌日"                                            weekend on 20 september 2013
-"中秋節翌日"                                            weekend on 9 september 2014
-"中秋節翌日"                                            weekend on 28 september 2015
-"中秋節翌日"                                            weekend on 16 september 2016
-"中秋節翌日"                                            weekend on 5 october 2017
-"中秋節翌日"                                            weekend on 25 september 2018
-"中秋節翌日"                                            weekend on 14 september 2019
-"中秋節翌日"                                            weekend on 2 october 2020
+"中秋節翌日"                                            public on 13 september 2000
+"中秋節翌日"                                            public on 2 october 2001
+"中秋節翌日"                                            public on 22 september 2002
+"中秋節翌日"                                            public on 12 september 2003
+"中秋節翌日"                                            public on 29 september 2004
+"中秋節翌日"                                            public on 19 september 2005
+"中秋節翌日"                                            public on 7 october 2006
+"中秋節翌日"                                            public on 26 september 2007
+"中秋節翌日"                                            public on 15 september 2008
+"中秋節翌日"                                            public on 3 october 2009
+"中秋節翌日"                                            public on 23 september 2010
+"中秋節翌日"                                            public on 13 september 2011
+"中秋節翌日"                                            public on 1 october 2012
+"中秋節翌日"                                            public on 20 september 2013
+"中秋節翌日"                                            public on 9 september 2014
+"中秋節翌日"                                            public on 28 september 2015
+"中秋節翌日"                                            public on 16 september 2016
+"中秋節翌日"                                            public on 5 october 2017
+"中秋節翌日"                                            public on 25 september 2018
+"中秋節翌日"                                            public on 14 september 2019
+"中秋節翌日"                                            public on 2 october 2020
 : Chung Yeung Festival, Day 9 of Month 9 (or if that day is a Sunday, then the following day)
-"重陽節"                                               weekend on 6 october 2000
-"重陽節"                                               weekend on 25 october 2001
-"重陽節"                                               weekend on 14 october 2002
-"重陽節"                                               weekend on 4 october 2003
-"重陽節"                                               weekend on 22 october 2004
-"重陽節"                                               weekend on 11 october 2005
-"重陽節"                                               weekend on 30 october 2006
-"重陽節"                                               weekend on 19 october 2007
-"重陽節"                                               weekend on 7 october 2008
-"重陽節"                                               weekend on 26 october 2009
-"重陽節"                                               weekend on 5 october 2011
-"重陽節"                                               weekend on 23 october 2012
-"重陽節"                                               weekend on 13 october 2013
-"重陽節"                                               weekend on 1 november 2014
-"重陽節"                                               weekend on 21 october 2015
-"重陽節"                                               weekend on 9 october 2016
-"重陽節"                                               weekend on 10 october 2016
-"重陽節"                                               weekend on 28 october 2017
-"重陽節"                                               weekend on 17 october 2018
-"重陽節"                                               weekend on 7 october 2019
-"重陽節"                                               weekend on 25 october 2020
-"重陽節"                                               weekend on 26 october 2020
+"重陽節"                                               public on 6 october 2000
+"重陽節"                                               public on 25 october 2001
+"重陽節"                                               public on 14 october 2002
+"重陽節"                                               public on 4 october 2003
+"重陽節"                                               public on 22 october 2004
+"重陽節"                                               public on 11 october 2005
+"重陽節"                                               public on 30 october 2006
+"重陽節"                                               public on 19 october 2007
+"重陽節"                                               public on 7 october 2008
+"重陽節"                                               public on 26 october 2009
+"重陽節"                                               public on 5 october 2011
+"重陽節"                                               public on 23 october 2012
+"重陽節"                                               public on 13 october 2013
+"重陽節"                                               public on 1 november 2014
+"重陽節"                                               public on 21 october 2015
+"重陽節"                                               public on 9 october 2016
+"重陽節"                                               public on 10 october 2016
+"重陽節"                                               public on 28 october 2017
+"重陽節"                                               public on 17 october 2018
+"重陽節"                                               public on 7 october 2019
+"重陽節"                                               public on 25 october 2020
+"重陽節"                                               public on 26 october 2020
 : National Day (or if that day is a Sunday, then the following day)
-"國慶日"                                               weekend on october 1 shift to monday if sunday
+"國慶日"                                               public on october 1 shift to monday if sunday
 : Christmas Day (or if that day is a Sunday, then the second weekday after Christmas Day)
-"聖誕節後第一個周日"                                      weekend on december 25
-"聖誕節後第一個周日"                                      weekend on ( ( [december 25] == [sunday after ([december 25])]) ?
+"聖誕節後第一個周日"                                      public religious on december 25
+"聖誕節後第一個周日"                                      public on ( ( [december 25] == [sunday after ([december 25])]) ?
                                                                    [tuesday after ([december 25])] :
                                                                    noop )
 
@@ -161,42 +161,42 @@ description "Public Holidays for Hong Kong"
 
 :: Religious
 : Good Friday
-"耶穌受難節"                                            on easter minus 2
+"耶穌受難節"                                            religious on easter minus 2
 : The day following Good Friday
-"耶穌受難節翌日"                                         on easter minus 1
+"耶穌受難節翌日"                                         religious on easter minus 1
 : Easter Monday
-"復活節星期一"                                          on easter plus 1
+"復活節星期一"                                          religious on easter plus 1
 : The Birthday of the Buddha, Day 8 of Month 4 (or if that day is a Sunday, then the following day)
-"佛誕"                                                on 11 may 2000
-"佛誕"                                                on 30 may 2001
-"佛誕"                                                on 19 may 2002
-"佛誕"                                                on 19 may 2003
-"佛誕"                                                on 8 may 2003
-"佛誕"                                                on 26 may 2004
-"佛誕"                                                on 15 may 2005
-"佛誕"                                                on 16 may 2005
-"佛誕"                                                on 5 may 2006
-"佛誕"                                                on 24 may 2007
-"佛誕"                                                on 12 may 2008
-"佛誕"                                                on 2 may 2009
-"佛誕"                                                on 21 may 2010
-"佛誕"                                                on 10 may 2011
-"佛誕"                                                on 28 may 2012
-"佛誕"                                                on 17 may 2013
-"佛誕"                                                on 6 may 2014
-"佛誕"                                                on 25 may 2015
-"佛誕"                                                on 14 may 2016
-"佛誕"                                                on 3 may 2017
-"佛誕"                                                on 22 may 2018
-"佛誕"                                                on 12 may 2019
-"佛誕"                                                on 13 may 2019
-"佛誕"                                                on 30 may 2020
+"佛誕"                                                religious on 11 may 2000
+"佛誕"                                                religious on 30 may 2001
+"佛誕"                                                religious on 19 may 2002
+"佛誕"                                                religious on 19 may 2003
+"佛誕"                                                religious on 8 may 2003
+"佛誕"                                                religious on 26 may 2004
+"佛誕"                                                religious on 15 may 2005
+"佛誕"                                                religious on 16 may 2005
+"佛誕"                                                religious on 5 may 2006
+"佛誕"                                                religious on 24 may 2007
+"佛誕"                                                religious on 12 may 2008
+"佛誕"                                                religious on 2 may 2009
+"佛誕"                                                religious on 21 may 2010
+"佛誕"                                                religious on 10 may 2011
+"佛誕"                                                religious on 28 may 2012
+"佛誕"                                                religious on 17 may 2013
+"佛誕"                                                religious on 6 may 2014
+"佛誕"                                                religious on 25 may 2015
+"佛誕"                                                religious on 14 may 2016
+"佛誕"                                                religious on 3 may 2017
+"佛誕"                                                religious on 22 may 2018
+"佛誕"                                                religious on 12 may 2019
+"佛誕"                                                religious on 13 may 2019
+"佛誕"                                                religious on 30 may 2020
 
 :: Financial
 
 :: Cultural
 : The first weekday after Christmas Day
-"聖誕節"                                               on december 26 shift to monday if sunday
+"聖誕節"                                               cultural on december 26 shift to monday if sunday
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_hr_hr b/kholidays/holidays/plan2/holiday_hr_hr
index 88e6616..377e4fb 100644
--- a/kholidays/holidays/plan2/holiday_hr_hr
+++ b/kholidays/holidays/plan2/holiday_hr_hr
@@ -22,67 +22,67 @@ language    "hr"
 description "Datoteka s blagdanima, spomendanima i neradnim danima u Hrvatskoj"
 
 :: Public Holidays
-"Nova godina"                                                      weekend on january 1
-"Sveta tri kralja"                                                 weekend on january 6
-"Uskrsni ponedjeljak"                                              weekend on easter plus 1 day
-"Tijelovo"                                                         weekend on easter plus 60 days
-"Praznik rada"                                                     weekend on may 1
-"Dan antifašističke borbe"                                         weekend on june 22
-"Dan državnosti"                                                   weekend on june 25
-"Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja"  weekend on august 5
-"Velika Gospa"                                                     weekend on august 15
-"Dan neovisnosti"                                                  weekend on october 8
-"Svi sveti"                                                        weekend on november 1
-"Božić"                                                            weekend on december 25
-"Sveti Stjepan"                                                    weekend on december 26
+"Nova godina"                                                      public on january 1
+"Sveta tri kralja"                                                 public religious on january 6
+"Uskrsni ponedjeljak"                                              public religious on easter plus 1 day
+"Tijelovo"                                                         public religious on easter plus 60 days
+"Praznik rada"                                                     public on may 1
+"Dan antifašističke borbe"                                         public on june 22
+"Dan državnosti"                                                   public on june 25
+"Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja"  public on august 5
+"Velika Gospa"                                                     public on august 15
+"Dan neovisnosti"                                                  public on october 8
+"Svi sveti"                                                        public on november 1
+"Božić"                                                            public religious on december 25
+"Sveti Stjepan"                                                    public on december 26
 
 :: Religious Holidays
-"Uskrs"                                                            on easter
-"Pepelnica"                                                        on easter minus 46 days
-"Veliki četvrtak"                                                  on easter minus 3 days
-"Veliki petak"                                                     on easter minus 2 days
-"Velika subota"                                                    on easter minus 1 day
-"Duhovi"                                                           on easter plus 49 days
-"Presveto Trojstvo"                                                on easter plus 56 days
+"Uskrs"                                                            religious on easter
+"Pepelnica"                                                        religious on easter minus 46 days
+"Veliki četvrtak"                                                  religious on easter minus 3 days
+"Veliki petak"                                                     religious on easter minus 2 days
+"Velika subota"                                                    religious on easter minus 1 day
+"Duhovi"                                                           religious on easter plus 49 days
+"Presveto Trojstvo"                                                religious on easter plus 56 days
 
 :: Financial
 
 :: Cultural
-"Valentinovo"                                                      on february 14
-"Međunarodni dan žena"                                             on march 8
-"Svjetski dan kazališta"                                           on march 27
-"Dan slobodnih dokumenata"                                         on last wednesday in march
-"Prvotravanjska Å¡ala"                                              on april 1
-"Svjetski dan smijeha"                                             on first sunday in may
-"Majčin dan"                                                       on second sunday in may
-"Svjetski dan informacijskog društva"                              on may 17
-"Dan očeva"                                                        on third sunday in june
-"Međunarodni dan mladih"                                           on august 12
-"Dan slobodnog softvera"                                           on third saturday in september
-"Međunarodni dan mira"                                             on september 21
-"Dan sjećanja na Vukovar"                                          on november 18
-"Dan hrvatskog kazališta"                                          on november 24
-"Međunarodni dan volontera"                                        on december 5
-"Sveti Nikola"                                                     on december 6
+"Valentinovo"                                                      cultural on february 14
+"Međunarodni dan žena"                                             cultural on march 8
+"Svjetski dan kazališta"                                           cultural on march 27
+"Dan slobodnih dokumenata"                                         cultural on last wednesday in march
+"Prvotravanjska Å¡ala"                                              cultural on april 1
+"Svjetski dan smijeha"                                             cultural on first sunday in may
+"Majčin dan"                                                       cultural on second sunday in may
+"Svjetski dan informacijskog društva"                              cultural on may 17
+"Dan očeva"                                                        cultural on third sunday in june
+"Međunarodni dan mladih"                                           cultural on august 12
+"Dan slobodnog softvera"                                           cultural on third saturday in september
+"Međunarodni dan mira"                                             cultural on september 21
+"Dan sjećanja na Vukovar"                                          cultural on november 18
+"Dan hrvatskog kazališta"                                          cultural on november 24
+"Međunarodni dan volontera"                                        cultural on december 5
+"Sveti Nikola"                                                     cultural on december 6
 
 :: School
-"Početak školske godine"                                           on september 1
-"Međunarodni dan pismenosti (UNESCO)"                              on september 8
-"Europski dan jezika"                                              on september 26
-"Međunarodni dan učitelja"                                         on october 5
-"Međunarodni dan školskih knjižnica"                               on october 24
+"Početak školske godine"                                           school on september 1
+"Međunarodni dan pismenosti (UNESCO)"                              school on september 8
+"Europski dan jezika"                                              school on september 26
+"Međunarodni dan učitelja"                                         school on october 5
+"Međunarodni dan školskih knjižnica"                               school on october 24
 
 :: Daylight Saving
-"Ljetno računanje vremena"                                         on last sunday in march
-"Zimsko računanje vremena"                                         on last sunday in october
+"Ljetno računanje vremena"                                         seasonal on last sunday in march
+"Zimsko računanje vremena"                                         seasonal on last sunday in october
 
 :: Seasons
-"Proljetna ravnodnevica (ekvinocij)"                               on march 20
-"Ljetna dugodnevica (solsticij)"                                   on june 21
-"Jesenska ravnodnevica (ekvinocij)"                                on september 22
-"Zimska kratkodnevica (solsticij)"                                 on december 21
+"Proljetna ravnodnevica (ekvinocij)"                               seasonal on march 20
+"Ljetna dugodnevica (solsticij)"                                   seasonal on june 21
+"Jesenska ravnodnevica (ekvinocij)"                                seasonal on september 22
+"Zimska kratkodnevica (solsticij)"                                 seasonal on december 21
 
 :: Name Days
 
 :: To be sorted
-"Dan Hrvatskoga sabora"                                            on may 30
+"Dan Hrvatskoga sabora"                                            civil on may 30
diff --git a/kholidays/holidays/plan2/holiday_hu_hu b/kholidays/holidays/plan2/holiday_hu_hu
index ad48a57..61b5d76 100644
--- a/kholidays/holidays/plan2/holiday_hu_hu
+++ b/kholidays/holidays/plan2/holiday_hu_hu
@@ -18,44 +18,44 @@ language    "hu"
 description "Nemzeti ünnepek és emléknapok magyarországon"
 
 :: Public Holidays
-"Újév"                                              weekend on january 1
-"Nemzeti ünnep: az 1848-as forradalom ünnepe"       weekend on march 15
-"Húsvét"                                            weekend on easter length 2 days
-"Pünkösd"                                           weekend on easter plus 49 length 2 days
-"Munka ünnepe"                                      weekend on may 1
-"Szent István, az államalapítás ünnepe"             weekend on august 20
+"Újév"                                              public on january 1
+"Nemzeti ünnep: az 1848-as forradalom ünnepe"       public on march 15
+"Húsvét"                                            public religious on easter length 2 days
+"Pünkösd"                                           public religious on easter plus 49 length 2 days
+"Munka ünnepe"                                      public on may 1
+"Szent István, az államalapítás ünnepe"             public on august 20
 "Nemzeti ünnep: Az 1956-os forradalom ünnepe, a 3. magyar köztársaság kikiáltásának napja"
-                                                    weekend on october 23
-"Karácsony"                                         weekend on december 25 length 2 days
+                                                    public on october 23
+"Karácsony"                                         public religious on december 25 length 2 days
 
 :: Religious
-"Vízkereszt"                                        on january 6
-"Nagypéntek"                                        on friday before ([easter])
-"A reformáció napja"                                on october 31
-"Mindenszentek napja"                               on november 1
-"Advent első vasárnapja"                            on sunday before december 24 minus 21
-"Advent második vasárnapja"                         on sunday before december 24 minus 14
-"Advent harmadik vasárnapja"                        on sunday before december 24 minus 7
-"Advent negyedik vasárnapja"                        on sunday before december 24
-"Szenteste"                                         on december 24
+"Vízkereszt"                                        religious on january 6
+"Nagypéntek"                                        religious on friday before ([easter])
+"A reformáció napja"                                religious on october 31
+"Mindenszentek napja"                               religious on november 1
+"Advent első vasárnapja"                            religious on sunday before december 24 minus 21
+"Advent második vasárnapja"                         religious on sunday before december 24 minus 14
+"Advent harmadik vasárnapja"                        religious on sunday before december 24 minus 7
+"Advent negyedik vasárnapja"                        religious on sunday before december 24
+"Szenteste"                                         religious on december 24
 
 :: Financial
 
 :: Cultural
-"A köztársaság napja"                               on february 1
-"Valentin"                                          on february 14
-"A kommunista diktatúrák áldozatainak emléknapja"   on february 25
-"NÅ‘nap"                                             on march 8
-"A holokauszt áldozatainak emléknapja"              on april 16
-"Anyák napja"                                       on first sunday in may
-"Gyermeknap"                                        on last sunday in may
-"A nemzeti összetartozás napja"                     on june 4
-"A független Magyarország napja"                    on june 19
-"Szentivánéj"                                       on june 24
-"Az aradi vértanúk emléknapja"                      on october 6
-"Halottak napja"                                    on november 2
-"Mikulás"                                           on december 6
-"Szilveszter"                                       on december 31
+"A köztársaság napja"                               cultural on february 1
+"Valentin"                                          cultural on february 14
+"A kommunista diktatúrák áldozatainak emléknapja"   cultural on february 25
+"NÅ‘nap"                                             cultural on march 8
+"A holokauszt áldozatainak emléknapja"              cultural on april 16
+"Anyák napja"                                       cultural on first sunday in may
+"Gyermeknap"                                        cultural on last sunday in may
+"A nemzeti összetartozás napja"                     cultural on june 4
+"A független Magyarország napja"                    cultural on june 19
+"Szentivánéj"                                       cultural on june 24
+"Az aradi vértanúk emléknapja"                      cultural on october 6
+"Halottak napja"                                    cultural on november 2
+"Mikulás"                                           cultural on december 6
+"Szilveszter"                                       cultural on december 31
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_id_en-us b/kholidays/holidays/plan2/holiday_id_en-us
index 2509b91..d3f7e38 100644
--- a/kholidays/holidays/plan2/holiday_id_en-us
+++ b/kholidays/holidays/plan2/holiday_id_en-us
@@ -19,69 +19,69 @@ description "National Holiday file for Indonesia"
 
 :: Public Holidays
 : Tahun Baru Masehi
-"New Year's Day"                         weekend on january 1
+"New Year's Day"                         public on january 1
 
 : Hari Proklamasi Kemerdekaan R.I.
-"Indonesian Independence Day"            weekend  on august 17
+"Indonesian Independence Day"            public  on august 17
 
 :: Religious
 : Hari Raya Galungan (lunar cal)
-"Balinese Galungan"                      on february 1 2012
+"Balinese Galungan"                      religious on february 1 2012
 
 : Hari Raya Kuningan (lunar cal)
-"Balinese Kuningan"                      on february 11 2012
+"Balinese Kuningan"                      religious on february 11 2012
 
 : Rabu Abu
-"Ash Wednesday"                          on easter minus 46 days
+"Ash Wednesday"                          religious on easter minus 46 days
 
 : Hari Raya Nyepi (lunar cal)
-"Balinese New Year"                      weekend on march 23 2012
-"Balinese New Year"                      weekend on march 12 2013
+"Balinese New Year"                      public on march 23 2012
+"Balinese New Year"                      public on march 12 2013
 
 : Maulid Nabi Muhammad SAW (hijri cal)
-"Mawlid"                                 weekend on hijri rabialawal 12
+"Mawlid"                                 public religious on hijri rabialawal 12
 
 : Wafat Yesus Kristus
-"Good Friday"                            weekend on easter minus 2 days
+"Good Friday"                            public religious on easter minus 2 days
 
 : Waisak (lunar cal)
-"Vesak"                                  weekend on may 6 2012
-"Vesak"                                  weekend on may 25 2013
+"Vesak"                                  public religious on may 6 2012
+"Vesak"                                  public religious on may 25 2013
 
 : Kenaikan Yesus Kristus
-"Ascension Day"                          weekend on easter plus 39 days
+"Ascension Day"                          public religious on easter plus 39 days
 
 : Isra Mi'raj Nabi Muhammad SAW (hijri cal)
-"Isra and Mi'raj"                       weekend on hijri rajab 27
+"Isra and Mi'raj"                        public religious on hijri rajab 27
 
 : Day after Ramadan / Idul Fitri
 : Idul Fitri (hijri cal)
-"Eid Al-Fitr"                            weekend on hijri shawwal 1 length 2 days
+"Eid Al-Fitr"                            public religious on hijri shawwal 1 length 2 days
 
 : Idul Adha (hijri cal)
-"Eid Al-Adha"                            weekend on hijri thualhijjah 10 
+"Eid Al-Adha"                            public religious on hijri thualhijjah 10
 
 : Tahun Baru Hijriyah (hijri cal)
-"Islamic New Year"                       weekend on hijri muharram 1
+"Islamic New Year"                       public religious on hijri muharram 1
 
 : Hari Natal
-"Christmas"                              weekend on december 25
+"Christmas"                              public religious on december 25
 
 
 :: Financial
 
 :: Cultural
 : Tahun Baru Imlek (lunar cal)
-"Chinese New Year"                       weekend on january 23 2012
-"Chinese New Year"                       weekend on february 9 2013
-: Chinese New Year (from Hongkong kholyday file)
-"Chinese New Year"                       weekend on 31 january 2014
-"Chinese New Year"                       weekend on 19 february 2015
-"Chinese New Year"                       weekend on 8 february 2016
-"Chinese New Year"                       weekend on 28 january 2017
-"Chinese New Year"                       weekend on 16 february 2018
-"Chinese New Year"                       weekend on 5 february 2019
-"Chinese New Year"                       weekend on 25 january 2020
+"Chinese New Year"                       public on january 23 2012
+"Chinese New Year"                       public on february 9 2013
+: Chinese New Year (from Hong Kong kholiday file)
+"Chinese New Year"                       public on 31 january 2014
+"Chinese New Year"                       public on 19 february 2015
+"Chinese New Year"                       public on 8 february 2016
+"Chinese New Year"                       public on 28 january 2017
+"Chinese New Year"                       public on 16 february 2018
+"Chinese New Year"                       public on 5 february 2019
+"Chinese New Year"                       public on 25 january 2020
 
 :: School
 
@@ -91,59 +91,59 @@ description "National Holiday file for Indonesia"
 
 :: Name Days
 : Hari Keselamatan dan Kesehatan Kerja
-"Occupational Safety and Health Day"     on january 12
+"Occupational Safety and Health Day"     civil on january 12
 : Hari Pers Nasional
-"National Press' Day"                    on february 9
+"National Press' Day"                    civil on february 9
 : Hari Gizi Nasional
-"National Nutrision day"                 on february 28
+"National Nutrision day"                 civil on february 28
 : Hari Kesehatan Sedunia
-"World Health Day"                       on april 7
+"World Health Day"                       civil on april 7
 : Hari Kartini
-"Kartini Day"                            on april 21
+"Kartini Day"                            civil on april 21
 : Hari Bumi
-"Earth Day"                              on april 22
+"Earth Day"                              civil on april 22
 : Hari Buruh
-"Labor Day"                              on may 1
+"Labor Day"                              civil on may 1
 : Hari Pendidikan Nasional
-"National Education Day"                 on may 2
+"National Education Day"                 civil on may 2
 : Hari Palang Merah dan Bulan Sabit Merah Sedunia
-"World Red Cross and Red Crescent Day"   on may 8
+"World Red Cross and Red Crescent Day"   civil on may 8
 : Hari Kebangkitan Nasional
-"National Awakening Day"                 on may 20
+"National Awakening Day"                 civil on may 20
 : Hari Peringatan Reformasi
-"Reformation Commemoration Day"          on may 22
+"Reformation Commemoration Day"          civil on may 22
 : Hari Tanpa Tembakau Sedunia
-"World No Tobacco Day"                   on may 31
+"World No Tobacco Day"                   civil on may 31
 : Hari Lahir Pancasila
-"Pancasila Birthday"                     on june 1
+"Pancasila Birthday"                     civil on june 1
 : Hari Bhayangkara
-"Police Force Day"                       on july 1
+"Police Force Day"                       civil on july 1
 : Hari Anak Nasional (note: en.wikipedia got this wrong)
-"National Children day"                  on july 23
+"National Children day"                  civil on july 23
 : Hari Pramuka
-"Scout's day"                            on august 14
+"Scout's day"                            civil on august 14
 : Hari Olahraga Nasional
-"National Sports Day"                    on september 9
+"National Sports Day"                    civil on september 9
 : Hari Kesaktian Pancasila
-"Pancasila Sanctity Day"                 on october 1
+"Pancasila Sanctity Day"                 civil on october 1
 : Hari Batik 
-"Batik Day"                              on october 2
+"Batik Day"                              civil on october 2
 : Hari Tentara Nasional Indonesia
-"Indonesian National Armed Forces Day"   on october 5
+"Indonesian National Armed Forces Day"   civil on october 5
 : Hari Sumpah Pemuda
-"Youth Pledge Day"                       on october 28
+"Youth Pledge Day"                       civil on october 28
 : Hari Korps Pegawai Republik Indonesia
-"Indonesian Civil Servant Corps Day "    on october 29
+"Indonesian Civil Servant Corps Day "    civil on october 29
 :  Hari Pahlawan
-"Heroes' Day"                            on november 10
+"Heroes' Day"                            civil on november 10
 :  Hari Guru
-"Teacher's Day"                          on november 25
+"Teacher's Day"                          civil on november 25
 :  Hari AIDS Sedunia
-"World AIDS Day"                         on december 1
+"World AIDS Day"                         civil on december 1
 : Hari Kesetiakawanan Sosial Nasional
-"National Social Solidarity Day" on december 20
+"National Social Solidarity Day"         civil on december 20
 : Hari Ibu
-"Mother's Day"                           on december 22
+"Mother's Day"                           civil on december 22
 
 
 :: To be sorted
@@ -151,15 +151,15 @@ description "National Holiday file for Indonesia"
 : Joint Leave (defined by the government every year)
 : Joint Leave for 2012
 : Cuti Bersama Kenaikan Yesus Kristus
-"Joint leave for Ascension Day"          weekend on may      18 2012
+"Joint leave for Ascension Day"          public on may      18 2012
 : Cuti Bersama Idul Fitri
-"Joint leave for Eid Al-Fitr"            weekend on august   21 2012 length 2 days
+"Joint leave for Eid Al-Fitr"            public on august   21 2012 length 2 days
 : Cuti Bersama Tahun Baru Hijriyah
-"Joint leave for Islamic New Year"       weekend on november 16 2012
+"Joint leave for Islamic New Year"       public on november 16 2012
 : Cuti Bersama Hari Raya Natal
-"Joint leave for Christmas"              weekend on december 24 2012
+"Joint leave for Christmas"              public on december 24 2012
 : Cuti bersama Tahun Baru 2013
-"Joint leave for 2013 New Year's Day"    weekend on december 31 2012
+"Joint leave for 2013 New Year's Day"    public on december 31 2012
 
 
 
diff --git a/kholidays/holidays/plan2/holiday_id_id b/kholidays/holidays/plan2/holiday_id_id
index f74de00..744e9f5 100644
--- a/kholidays/holidays/plan2/holiday_id_id
+++ b/kholidays/holidays/plan2/holiday_id_id
@@ -20,70 +20,70 @@ description "File Hari Libur Nasional Indonesia"
 
 :: Public Holidays
 : New Year's Day
-"Tahun Baru Masehi"                      weekend on january 1
+"Tahun Baru Masehi"                      public on january 1
 
 : Independence Day
-"Hari Proklamasi Kemerdekaan R.I."       weekend  on august 17
+"Hari Proklamasi Kemerdekaan R.I."       public  on august 17
 
 
 :: Religious
 : Balinese Galungan (lunar cal)
-"Hari Raya Galungan"                     on february 1 2012
+"Hari Raya Galungan"                     religious on february 1 2012
 
 : Balinese Kuningan (lunar cal)
-"Hari Raya Kuningan"                     on february 11 2012
+"Hari Raya Kuningan"                     religious on february 11 2012
 
 : Ash Wednesday
-"Rabu Abu"                               on easter minus 46 days
+"Rabu Abu"                               religious on easter minus 46 days
 
 : Balinese New Year (lunar cal)
-"Hari Raya Nyepi"                        weekend on march 23 2012
-"Hari Raya Nyepi"                        weekend on march 12 2013
+"Hari Raya Nyepi"                        public on march 23 2012
+"Hari Raya Nyepi"                        public on march 12 2013
 
 : Birth of the Prophet (hijri cal)
-"Maulid Nabi Muhammad SAW"               weekend on hijri rabialawal 12
+"Maulid Nabi Muhammad SAW"               public religious on hijri rabialawal 12
 
 : Good Friday
-"Wafat Yesus Kristus"                    weekend on easter minus 2 days
+"Wafat Yesus Kristus"                    public religious on easter minus 2 days
 
 : Buddha's Birthday (lunar cal)
-"Waisak"                                 weekend on may 6 2012
-"Waisak"                                 weekend on may 25 2013
+"Waisak"                                 public religious on may 6 2012
+"Waisak"                                 public religious on may 25 2013
 
 : Ascension Day
-"Kenaikan Yesus Kristus"                 weekend on easter plus 39 days
+"Kenaikan Yesus Kristus"                 public religious on easter plus 39 days
 
 : Ascension of the Prophet (hijri cal)
-"Isra Mi'raj Nabi Muhammad SAW"          weekend on hijri rajab 27
+"Isra Mi'raj Nabi Muhammad SAW"          public religious on hijri rajab 27
 
 : Day after Ramadan / Idul Fitri
 : Eid Al-Fitr (hijri cal)
-"Idul Fitri"                             weekend on hijri shawwal 1 length 2 days
+"Idul Fitri"                             public religious on hijri shawwal 1 length 2 days
 
 : Feast of the Sacrifice (hijri cal)
-"Idul Adha"                              weekend on hijri thualhijjah 10 
+"Idul Adha"                              public religious on hijri thualhijjah 10
 
 : Islamic New Year (hijri cal)
-"Tahun Baru Hijriyah"                    weekend on hijri muharram 1
+"Tahun Baru Hijriyah"                    public religious on hijri muharram 1
 
 : Christmas
-"Hari Natal"                             weekend on december 25
+"Hari Natal"                             public religious on december 25
 
 
 :: Financial
 
 :: Cultural
 : Chinese New Year (lunar cal)
-"Tahun Baru Imlek"                       weekend on january 23 2012
-"Tahun Baru Imlek"                       weekend on february 9 2013
-: Chinese New Year (from Hongkong kholyday file)
-"Tahun Baru Imlek"                       weekend on 31 january 2014
-"Tahun Baru Imlek"                       weekend on 19 february 2015
-"Tahun Baru Imlek"                       weekend on 8 february 2016
-"Tahun Baru Imlek"                       weekend on 28 january 2017
-"Tahun Baru Imlek"                       weekend on 16 february 2018
-"Tahun Baru Imlek"                       weekend on 5 february 2019
-"Tahun Baru Imlek"                       weekend on 25 january 2020
+"Tahun Baru Imlek"                       public on january 23 2012
+"Tahun Baru Imlek"                       public on february 9 2013
+: Chinese New Year (from Hong Kong kholiday file)
+"Tahun Baru Imlek"                       public on 31 january 2014
+"Tahun Baru Imlek"                       public on 19 february 2015
+"Tahun Baru Imlek"                       public on 8 february 2016
+"Tahun Baru Imlek"                       public on 28 january 2017
+"Tahun Baru Imlek"                       public on 16 february 2018
+"Tahun Baru Imlek"                       public on 5 february 2019
+"Tahun Baru Imlek"                       public on 25 january 2020
 
 :: School
 
@@ -93,72 +93,72 @@ description "File Hari Libur Nasional Indonesia"
 
 :: Name Days
 : Occupational Safety and Health Day
-"Hari Keselamatan dan Kesehatan Kerja"   on january 12
+"Hari Keselamatan dan Kesehatan Kerja"   civil on january 12
 : Press' Day
-"Hari Pers Nasional"                     on february 9
+"Hari Pers Nasional"                     civil on february 9
 : National Nutrision's day
-"Hari Gizi Nasional"                     on february 28
+"Hari Gizi Nasional"                     civil on february 28
 : World Health Day
-"Hari Kesehatan Sedunia"                 on april 7
+"Hari Kesehatan Sedunia"                 civil on april 7
 : Kartini Day
-"Hari Kartini"                           on april 21
+"Hari Kartini"                           civil on april 21
 : Earth day
-"Hari Bumi"                              on april 22
+"Hari Bumi"                              civil on april 22
 : Labor day 
-"Hari Buruh"                             on may 1
+"Hari Buruh"                             civil on may 1
 : National Education Day
-"Hari Pendidikan Nasional"               on may 2
+"Hari Pendidikan Nasional"               civil on may 2
 : World Red Cross and Red Crescent Day
-"Hari Palang Merah dan Bulan Sabit Merah Sedunia" on may 8
+"Hari Palang Merah dan Bulan Sabit Merah Sedunia" civil on may 8
 : National Awakening Day
-"Hari Kebangkitan Nasional"              on may 20
+"Hari Kebangkitan Nasional"              civil on may 20
 : Reformation Commemoration Day
-"Hari Peringatan Reformasi"              on may 22
+"Hari Peringatan Reformasi"              civil on may 22
 : World No Tobacco Day
-"Hari Tanpa Tembakau Sedunia"            on may 31
+"Hari Tanpa Tembakau Sedunia"            civil on may 31
 : Pancasila Birthday
-"Hari Lahir Pancasila"                   on june 1
+"Hari Lahir Pancasila"                   civil on june 1
 : Police Force Birthday
-"Hari Bhayangkara"                       on july 1
+"Hari Bhayangkara"                       civil on july 1
 : National Children day (note: en.wikipedia got this wrong)
-"Hari Anak Nasional"                     on july 23
+"Hari Anak Nasional"                     civil on july 23
 : Scout's day
-"Hari Pramuka"                           on august 14
+"Hari Pramuka"                           civil on august 14
 : National Sports Day
-"Hari Olahraga Nasional"                 on september 9
+"Hari Olahraga Nasional"                 civil on september 9
 : Pancasila Sanctity Day
-"Hari Kesaktian Pancasila"               on october 1
+"Hari Kesaktian Pancasila"               civil on october 1
 : Batik Day 
-"Hari Batik"                             on october 2
+"Hari Batik"                             civil on october 2
 : Indonesian National Armed Forces Day
-"Hari Tentara Nasional Indonesia"        on october 5
+"Hari Tentara Nasional Indonesia"        civil on october 5
 : Youth Pledge Day 
-"Hari Sumpah Pemuda"                     on october 28
+"Hari Sumpah Pemuda"                     civil on october 28
 : Civil Servant Corps Day 
-"Hari Korps Pegawai Republik Indonesia"  on october 29
+"Hari Korps Pegawai Republik Indonesia"  civil on october 29
 : Heroes' Day 
-"Hari Pahlawan"                          on november 10
+"Hari Pahlawan"                          civil on november 10
 : Teacher's Day
-"Hari Guru"                              on november 25
+"Hari Guru"                              civil on november 25
 : World AIDS Day
-"Hari AIDS Sedunia"                      on december 1
+"Hari AIDS Sedunia"                      civil on december 1
 : National Social Solidarity Day
-"Hari Kesetiakawanan Sosial Nasional"    on december 20
+"Hari Kesetiakawanan Sosial Nasional"    civil on december 20
 : Mother's Day 
-"Hari Ibu"                               on december 22
+"Hari Ibu"                               civil on december 22
 
 
 :: To be sorted
 : Joint Leave (defined by the government every year)
 : Joint Leave for 2012
 : Joint leave for Ascension Day
-"Cuti Bersama Kenaikan Yesus Kristus"    weekend on may      18 2012
+"Cuti Bersama Kenaikan Yesus Kristus"    public on may      18 2012
 : Joint leave for Eid Al-Fitr
-"Cuti Bersama Idul Fitri"                weekend on august   21 2012 length 2 days
+"Cuti Bersama Idul Fitri"                public on august   21 2012 length 2 days
 : Joint leave for Islamic New Year
-"Cuti Bersama Hari Raya Natal"           weekend on november 16 2012
+"Cuti Bersama Hari Raya Natal"           public on november 16 2012
 : Joint leave for Christmas
-"Cuti Bersama Tahun Baru Hijriyah"       weekend on december 24 2012
+"Cuti Bersama Tahun Baru Hijriyah"       public on december 24 2012
 : Joint leave for 2013 New Year's Day
-"Cuti bersama Tahun Baru 2013"           weekend on december 31 2012
+"Cuti bersama Tahun Baru 2013"           public on december 31 2012
 
diff --git a/kholidays/holidays/plan2/holiday_ie_en-gb b/kholidays/holidays/plan2/holiday_ie_en-gb
index 62bee7b..ff38917 100644
--- a/kholidays/holidays/plan2/holiday_ie_en-gb
+++ b/kholidays/holidays/plan2/holiday_ie_en-gb
@@ -17,17 +17,17 @@ language    "en_GB"
 description "National holiday file for Ireland"
 
 :: Public Holidays
-"New Years Day"         weekend january 1
-"St Patricks Day"       weekend march 17
-"Good Friday"           weekend easter minus 2
-"Easter Sunday"         weekend easter
-"Easter Monday"         weekend easter plus 1
-"May Day"               weekend first monday in may
-"Spring Bank Holiday"   weekend first monday in june
-"Summer Bank Holiday"   weekend first monday in august
-"October Bank Holiday"  weekend last monday in october
-"Christmas Day"         weekend december 25
-"St Stephens Day"       weekend december 26
+"New Years Day"         public january 1
+"St Patricks Day"       public march 17
+"Good Friday"           public easter minus 2
+"Easter Sunday"         public easter
+"Easter Monday"         public easter plus 1
+"May Day"               public first monday in may
+"Spring Bank Holiday"   public first monday in june
+"Summer Bank Holiday"   public first monday in august
+"October Bank Holiday"  public last monday in october
+"Christmas Day"         public december 25
+"St Stephens Day"       public december 26
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_ie_ga b/kholidays/holidays/plan2/holiday_ie_ga
index 28f710d..03b8f9c 100644
--- a/kholidays/holidays/plan2/holiday_ie_ga
+++ b/kholidays/holidays/plan2/holiday_ie_ga
@@ -18,49 +18,49 @@ description "Laethanta Saoire in Éirinn"
 
 :: Public Holidays
 : New Year's Day
-"Lá Caille"                      weekend january 1
+"Lá Caille"                      public january 1
 : St Patrick's Day
-"Lá Fhéile Pádraig"              weekend march 17
+"Lá Fhéile Pádraig"              public march 17
 : Good Friday
-"Aoine an Chéasta"               weekend easter minus 2
+"Aoine an Chéasta"               public easter minus 2
 : Easter
-"Domhnach Cásca"                 weekend easter
+"Domhnach Cásca"                 public easter
 : Easter Monday
-"Luan Cásca"                     weekend easter plus 1
+"Luan Cásca"                     public easter plus 1
 : May Day
-"Lá Bealtaine"                   weekend first monday in may
+"Lá Bealtaine"                   public first monday in may
 : Spring Bank Holiday
-"Lá Saoire Bainc an Earraigh"    weekend first monday in june
+"Lá Saoire Bainc an Earraigh"    public first monday in june
 : Summer Bank Holiday
-"Lá Saoire Bainc an tSamhraidh"  weekend first monday in august
+"Lá Saoire Bainc an tSamhraidh"  public first monday in august
 : October Bank Holiday
-"Lá Saoire Bainc an Fhómhair"    weekend last monday in october
+"Lá Saoire Bainc an Fhómhair"    public last monday in october
 : Christmas Day
-"Lá Nollag"                      weekend december 25
+"Lá Nollag"                      public december 25
 :St Stephan's Day
-"Lá an Dreoilín"                 weekend december 26
+"Lá an Dreoilín"                 public december 26
 
 :: Religious
-"Oíche Chinn an Dá Lá Dhéag"     on january 5
-"Lá Nollag Beag"                 on january 6
-"Lá Fhéile Muire na gCoinneal"   on february 2
-"Máirt na hInide"                on easter minus 47 days
-"Céadaoin an Luaithrigh"         on easter minus 46 days
-"Domhnach na hImrime"            on easter minus 7 days
-"Céadaoin an Bhraith"            on easter minus 4 days
-"Déardaoin Mandála"              on easter minus 3 days
-"Déardaoin Deascabhála"          on easter plus 39 days
-"An Chincís"                     on easter plus 49 days
-"Luan Cincíse"                   on easter plus 50 days
-"Déardaoin Choirp Chríost"       on easter plus 53 days
-"Domhnach na Tríonóide"          on easter plus 56 days
-"Lá San Svaítín"                 on july 15
+"Oíche Chinn an Dá Lá Dhéag"     religious on january 5
+"Lá Nollag Beag"                 religious on january 6
+"Lá Fhéile Muire na gCoinneal"   religious on february 2
+"Máirt na hInide"                religious on easter minus 47 days
+"Céadaoin an Luaithrigh"         religious on easter minus 46 days
+"Domhnach na hImrime"            religious on easter minus 7 days
+"Céadaoin an Bhraith"            religious on easter minus 4 days
+"Déardaoin Mandála"              religious on easter minus 3 days
+"Déardaoin Deascabhála"          religious on easter plus 39 days
+"An Chincís"                     religious on easter plus 49 days
+"Luan Cincíse"                   religious on easter plus 50 days
+"Déardaoin Choirp Chríost"       religious on easter plus 53 days
+"Domhnach na Tríonóide"          religious on easter plus 56 days
+"Lá San Svaítín"                 religious on july 15
 
 :: Financial
 
 :: Cultural
-"Lá na nAmadán"                  on april 1
-"Lá Samhna"                      on november 1
+"Lá na nAmadán"                  cultural on april 1
+"Lá Samhna"                      cultural on november 1
 
 :: School
 
@@ -69,8 +69,8 @@ description "Laethanta Saoire in Éirinn"
 :: Seasons
 
 :: Name Days
-"Lá Fhéile Bríde"                on february 1
-"Lá Fhéile Vailintín"            on february 14
-"Lá Fhéile Eoin"                 on june 24
-"Lá Fhéile Michíl"               on september 29
-"Lá Fhéile Mártain"              on november 11
+"Lá Fhéile Bríde"                nameday on february 1
+"Lá Fhéile Vailintín"            nameday on february 14
+"Lá Fhéile Eoin"                 nameday on june 24
+"Lá Fhéile Michíl"               nameday on september 29
+"Lá Fhéile Mártain"              nameday on november 11
diff --git a/kholidays/holidays/plan2/holiday_il_en-us b/kholidays/holidays/plan2/holiday_il_en-us
index cd4c5f7..ec82d31 100644
--- a/kholidays/holidays/plan2/holiday_il_en-us
+++ b/kholidays/holidays/plan2/holiday_il_en-us
@@ -18,49 +18,49 @@ language    "en_US"
 description "National holiday file for Israel"
 
 :: Public Holidays
-"Rosh Hashanah (New Year)"                                                  weekend on hebrew tishrey 1 length 2 days
-"Yom Kippur (Day of Atonement)"                                             weekend on hebrew tishrey 10
-"Sukkot (Feast of Tabernacles)"                                             weekend on hebrew tishrey 15
-"Simchat Torah (Assembly of the Eighth Day)"                                weekend on hebrew tishrey 22
-"Pesach (Passover)"                                                         weekend on hebrew nisan 15
-"Shvi'i shel Pesach (Seventh day of Passover)"                              weekend on hebrew nisan 21
+"Rosh Hashanah (New Year)"                                                  public religious on hebrew tishrey 1 length 2 days
+"Yom Kippur (Day of Atonement)"                                             public religious on hebrew tishrey 10
+"Sukkot (Feast of Tabernacles)"                                             public religious on hebrew tishrey 15
+"Simchat Torah (Assembly of the Eighth Day)"                                public religious on hebrew tishrey 22
+"Pesach (Passover)"                                                         public religious on hebrew nisan 15
+"Shvi'i shel Pesach (Seventh day of Passover)"                              public religious on hebrew nisan 21
 : If Yom Ha'atzmaut falls on a Friday or Saturday, move to preceeding Thursday, if falls on a Monday move to Tuesday
-"Yom Ha'atzmaut (Independence Day)"                                         weekend on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
+"Yom Ha'atzmaut (Independence Day)"                                         public on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
                                                                                                  ([iyar 5] == [saturday after ([iyar 5])])) ?
                                                                                                      [thursday before ([iyar 5])] :
                                                                                                  (([iyar 5] == [monday after ([iyar 5])]) ?
                                                                                                      [tuesday after ([iyar 5])] :
                                                                                                  [iyar 5] ) )
-"Shavuot (Pentecost)"                                                       weekend on hebrew sivan 6
+"Shavuot (Pentecost)"                                                       public religious on hebrew sivan 6
 
 :: Religious Holidays
-"Tsom Gedalyah ben Ahikam (Fast Day of Gedaliah ben Ahikam)"                on hebrew tishrey 3
-"Chol HaMoed (Feast of Tabernacles)"                                        on hebrew tishrey 16 length 6 days
-"Hanukkah (Feast of Rededication)"                                          on hebrew kislev 25 length 8 days
-"Tsom Asarah b-Tevet (Tenth of Tevet Fast)"                                 on hebrew tevet 10
-"Tu Bishvat (Fifteenth of Shvat)"                                           on hebrew shvat 15
-"Ta`anit Ester (Fast of Esther)"                                            on hebrew adar 13
-"Purim (Feast of Esther)"                                                   on hebrew adar 14
-"Chol HaMoed Pesach (Passover)"                                             on hebrew nisan 16 length 5 days
-"Lag Ba'omer (33rd day of the `Omer)"                                       on hebrew iyar 18
-"Tsom Shiva` Asar b-Tamuz (Seventeenth of Tamuz fast)"                      on hebrew tamuz 17
-"Tisha B'Av (Ninth of Av fast/Destruction of the 1st and 2nd Temples)"      on hebrew av 9
-"Tu B'Av (Fifteenth of Av/Festival of Love)"                                on hebrew av 15
+"Tsom Gedalyah ben Ahikam (Fast Day of Gedaliah ben Ahikam)"                religious on hebrew tishrey 3
+"Chol HaMoed (Feast of Tabernacles)"                                        religious on hebrew tishrey 16 length 6 days
+"Hanukkah (Feast of Rededication)"                                          religious on hebrew kislev 25 length 8 days
+"Tsom Asarah b-Tevet (Tenth of Tevet Fast)"                                 religious on hebrew tevet 10
+"Tu Bishvat (Fifteenth of Shvat)"                                           religious on hebrew shvat 15
+"Ta`anit Ester (Fast of Esther)"                                            religious on hebrew adar 13
+"Purim (Feast of Esther)"                                                   religious on hebrew adar 14
+"Chol HaMoed Pesach (Passover)"                                             religious on hebrew nisan 16 length 5 days
+"Lag Ba'omer (33rd day of the `Omer)"                                       religious on hebrew iyar 18
+"Tsom Shiva` Asar b-Tamuz (Seventeenth of Tamuz fast)"                      religious on hebrew tamuz 17
+"Tisha B'Av (Ninth of Av fast/Destruction of the 1st and 2nd Temples)"      religious on hebrew av 9
+"Tu B'Av (Fifteenth of Av/Festival of Love)"                                religious on hebrew av 15
 
 :: Financial
 
 :: Cultural
-"Yitzhak Rabin's Remembrance Day"                                           on hebrew heshvan 12
-"Holocaust Remembrance Day"                                                 on hebrew nisan 27
-"Victory Day"                                                               on gregorian may 9
+"Yitzhak Rabin's Remembrance Day"                                           cultural on hebrew heshvan 12
+"Holocaust Remembrance Day"                                                 cultural on hebrew nisan 27
+"Victory Day"                                                               cultural on gregorian may 9
 : Is always the day before Yom Ha'atzmaut
-"Yom Hazikaron (Israeli Fallen Soldiers and Victims of Terrorism Remembrance Day)"  on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
-                                                                                                 ([iyar 5] == [saturday after ([iyar 5])])) ?
-                                                                                                     [wednesday before ([iyar 5])] :
-                                                                                                 (([iyar 5] == [monday after ([iyar 5])]) ?
-                                                                                                     [iyar 5] :
-                                                                                                 [iyar 4] ) )
-"Yom Yerushalayim (Jerusalem Day)"                                          on hebrew iyar 28
+"Yom Hazikaron (Israeli Fallen Soldiers and Victims of Terrorism Remembrance Day)"  cultural on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
+                                                                                                          ([iyar 5] == [saturday after ([iyar 5])])) ?
+                                                                                                                       [wednesday before ([iyar 5])] :
+                                                                                                         (([iyar 5] == [monday after ([iyar 5])]) ?
+                                                                                                                       [iyar 5] :
+                                                                                                                       [iyar 4] ) )
+"Yom Yerushalayim (Jerusalem Day)"                                          cultural on hebrew iyar 28
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_il_he b/kholidays/holidays/plan2/holiday_il_he
index 14085ac..bfe4399 100644
--- a/kholidays/holidays/plan2/holiday_il_he
+++ b/kholidays/holidays/plan2/holiday_il_he
@@ -19,73 +19,73 @@ language    "he"
 
 :: Public Holidays
 : Rosh Hashanah (New Year)
-"ראש השנה"                                              weekend on hebrew tishrey 1 length 2 days
+"ראש השנה"                                              public religious on hebrew tishrey 1 length 2 days
 : Yom Kippur (Day of Atonement)
-"יום כיפור"                                             weekend on hebrew tishrey 10
+"יום כיפור"                                             public religious on hebrew tishrey 10
 : Sukkot (Feast of Tabernacles)
-"סוכות"                                                 weekend on hebrew tishrey 15
+"סוכות"                                                 public on hebrew tishrey 15
 : Simchat Torah (Assembly of the Eighth Day)
-"שמחת תורה"                                             weekend on hebrew tishrey 22
+"שמחת תורה"                                             public religious on hebrew tishrey 22
 : Pesach (Passover)
-"פסח"                                                   weekend on hebrew nisan 15
+"פסח"                                                   public religious on hebrew nisan 15
 : Shvi'i shel Pesach (Seventh day of Passover)
-"שביעי של פסח"                                          weekend on hebrew nisan 21
+"שביעי של פסח"                                          public religious on hebrew nisan 21
 : Yom Ha'atzmaut (Independence Day)
 : If falls on a Friday or Saturday, move to preceeding Thursday, if falls on a Monday move to Tuesday
-"יום העצמאות"                                           weekend on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
+"יום העצמאות"                                           public on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
                                                                              ([iyar 5] == [saturday after ([iyar 5])])) ?
                                                                                  [thursday before ([iyar 5])] :
                                                                              (([iyar 5] == [monday after ([iyar 5])]) ?
                                                                                  [tuesday after ([iyar 5])] :
                                                                              [iyar 5] ) )
 : Shavuot (Pentecost)
-"שבועות"                                                weekend on hebrew sivan 6
+"שבועות"                                                public religious on hebrew sivan 6
 
 :: Religious Holidays
 : Tsom Gedalyah ben Ahikam (Fast Day of Gedaliah ben Ahikam)
-"צום גדליה"                                                on hebrew tishrey 3
+"צום גדליה"                                                religious on hebrew tishrey 3
 : Chol HaMoed (Feast of Tabernacles)
-"חול המועד סוכות"                                          on hebrew tishrey 16 length 6 days
+"חול המועד סוכות"                                          religious on hebrew tishrey 16 length 6 days
 : Hanukkah (Feast of Rededication)
-"חנוכה"                                                    on hebrew kislev 25 length 8 days
+"חנוכה"                                                    religious on hebrew kislev 25 length 8 days
 : Tsom Asarah b-Tevet (Tenth of Tevet Fast)
-"צום עשרה בטבת"                                            on hebrew tevet 10
+"צום עשרה בטבת"                                            religious on hebrew tevet 10
 : Tu Bishvat (Fifteenth of Shvat)
-"טו בשבט"                                                  on hebrew shvat 15
+"טו בשבט"                                                  religious on hebrew shvat 15
 : Ta`anit Ester (Fast of Esther)
-"תענית אסתר"                                               on hebrew adar 13
+"תענית אסתר"                                               religious on hebrew adar 13
 : Purim (Feast of Esther)
-"פורים"                                                    on hebrew adar 14
+"פורים"                                                    religious on hebrew adar 14
 : Chol HaMoed Pesach (Passover)
-"חול המועד פסח"                                            on hebrew nisan 16 length 5 days
+"חול המועד פסח"                                            religious on hebrew nisan 16 length 5 days
 : Lag Ba'omer (33rd day of the `Omer)
-"לג בעומר"                                                 on hebrew iyar 18
+"לג בעומר"                                                 religious on hebrew iyar 18
 : Tsom Shiva` Asar b-Tamuz (Seventeenth of Tamuz fast)
-"שבעה עשר בתמוז"                                           on hebrew tamuz 17
+"שבעה עשר בתמוז"                                           religious on hebrew tamuz 17
 : Tisha B'Av (Ninth of Av fast/Destruction of the 1st and 2nd Temples)
-"תשעה באב"                                                 on hebrew av 9
+"תשעה באב"                                                 religious on hebrew av 9
 : Tu B'Av (Fifteenth of Av/Festival of Love)
-"טו באב"                                                   on hebrew av 15
+"טו באב"                                                   religious on hebrew av 15
 
 :: Financial
 
 :: Cultural
 : Yom Hazikaron le Yitzhak Rabin (Yitzhak Rabin's Remembrance Day)
-"יום הזיכרון ליצחק רבין"                                   on hebrew heshvan 12
+"יום הזיכרון ליצחק רבין"                                   commemorative on hebrew heshvan 12
 : Yom Hazikaron LaShoah VeLaGevurah (Holocaust Remembrance Day)
-"יום הזיכרון לשואה ולגבורה"                                on hebrew nisan 27
+"יום הזיכרון לשואה ולגבורה"                                commemorative on hebrew nisan 27
 : Victory Day
-"יום הניצחון על גרמניה הנאצית"                             on may 9
+"יום הניצחון על גרמניה הנאצית"                             civil on may 9
 : Yom Hazikaron (Israeli Fallen Soldiers and Victims of Terrorism Remembrance Day)
 : Is always the day before Yom Ha'atzmaut
-"יום הזיכרון לחללי מערכות ישראל ונפגעי פעולות האיבה"       on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
+"יום הזיכרון לחללי מערכות ישראל ונפגעי פעולות האיבה"       commemorative on hebrew ( (([iyar 5] == [friday after ([iyar 5])]) ||
                                                                         ([iyar 5] == [saturday after ([iyar 5])])) ?
                                                                             [wednesday before ([iyar 5])] :
                                                                         (([iyar 5] == [monday after ([iyar 5])]) ?
                                                                             [iyar 5] :
                                                                         [iyar 4] ) )
 : Yom Yerushalayim (Jerusalem Day)
-"יום ירושלים"                                              on hebrew iyar 28
+"יום ירושלים"                                              civil on hebrew iyar 28
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_in_en-gb b/kholidays/holidays/plan2/holiday_in_en-gb
index 4710966..d3897ff 100644
--- a/kholidays/holidays/plan2/holiday_in_en-gb
+++ b/kholidays/holidays/plan2/holiday_in_en-gb
@@ -23,12 +23,11 @@ language    "en_GB"
 description "National holiday file for India"
 
 :: Public Holidays
-"New Year holiday"            weekend on january 1
-"Muharram"                    weekend on january 10
-"Republic Day"                weekend on january 26
-"Independence Day"            weekend on august 15
-"Mahatma Gandhi's Birthday"   weekend on october 2
-"Christmas"                   weekend on december 25
+"New Year holiday"            public on january 1
+"Republic Day"                public on january 26
+"Independence Day"            public on august 15
+"Mahatma Gandhi's Birthday"   public on october 2
+"Christmas"                   public religious on december 25
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_ir_en-us b/kholidays/holidays/plan2/holiday_ir_en-us
index c5246f6..b5904c4 100644
--- a/kholidays/holidays/plan2/holiday_ir_en-us
+++ b/kholidays/holidays/plan2/holiday_ir_en-us
@@ -18,28 +18,28 @@ language    "en_US"
 description "National holiday file for Iran"
 
 :: Public Holidays
-"Nowrouz"                                                               weekend on jalali farvardin 1 length 4
-"Islamic Republic Day"                                                  weekend on jalali farvardin 12
-"Nature Day"                                                            weekend on jalali farvardin 13
-"Khomeini's Death"                                                      weekend on jalali khordad 14
-"Revolt of Khordad 15"                                                  weekend on jalali khordad 15
-"Victory of the Revolution"                                             weekend on jalali bahman 22
-"Nationalization of Oil Industry"                                       weekend on jalali esfand 29
-"Tasu'a of Imam Hussain"                                                weekend on hijri muharram 9
-"Ashura of Imam Hussain"                                                weekend on hijri muharram 10
-"Arba'een of Imam Hussain"                                              weekend on hijri safar 20
-"Demise of prophet Muhammad and Martyrdom of Imam Hassan (Mujtaba)"     weekend on hijri safar 28
-"Martyrdom of Imam Reza"                                                weekend on hijri safar 29
-"Birth of Muhammad and Imam Jafar"                                      weekend on hijri rabialawal 17
-"Martyrdom of Fatima"                                                   weekend on hijri jumaadaalthaani 3
-"Birth of Imam Ali"                                                     weekend on hijri rajab 13
-"Mission of Muhammad"                                                   weekend on hijri rajab 27
-"Birth of Imam Mahdi"                                                   weekend on hijri shaban 15
-"Martyrdom of Imam Ali"                                                 weekend on hijri ramadan 21
-"Eid ul-Fitr"                                                           weekend on hijri shawwal 1
-"Martyrdom of Imam Jafar"                                               weekend on hijri shawwal 25
-"Eid ul-Adha"                                                           weekend on hijri thualhijjah 10
-"Eid al-Ghadeer"                                                        weekend on hijri thualhijjah 18
+"Nowrouz"                                                               public religious on jalali farvardin 1 length 4
+"Islamic Republic Day"                                                  public on jalali farvardin 12
+"Nature Day"                                                            public on jalali farvardin 13
+"Khomeini's Death"                                                      public on jalali khordad 14
+"Revolt of Khordad 15"                                                  public on jalali khordad 15
+"Victory of the Revolution"                                             public on jalali bahman 22
+"Nationalization of Oil Industry"                                       public on jalali esfand 29
+"Tasu'a of Imam Hussain"                                                public religious on hijri muharram 9
+"Ashura of Imam Hussain"                                                public religious on hijri muharram 10
+"Arba'een of Imam Hussain"                                              public religious on hijri safar 20
+"Demise of prophet Muhammad and Martyrdom of Imam Hassan (Mujtaba)"     public religious on hijri safar 28
+"Martyrdom of Imam Reza"                                                public religious on hijri safar 29
+"Birth of Muhammad and Imam Jafar"                                      public religious on hijri rabialawal 17
+"Martyrdom of Fatima"                                                   public religious on hijri jumaadaalthaani 3
+"Birth of Imam Ali"                                                     public religious on hijri rajab 13
+"Mission of Muhammad"                                                   public religious on hijri rajab 27
+"Birth of Imam Mahdi"                                                   public religious on hijri shaban 15
+"Martyrdom of Imam Ali"                                                 public religious on hijri ramadan 21
+"Eid ul-Fitr"                                                           public religious on hijri shawwal 1
+"Martyrdom of Imam Jafar"                                               public religious on hijri shawwal 25
+"Eid ul-Adha"                                                           public religious on hijri thualhijjah 10
+"Eid al-Ghadeer"                                                        public religious on hijri thualhijjah 18
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_ir_fa b/kholidays/holidays/plan2/holiday_ir_fa
index 893e2b4..87ff936 100644
--- a/kholidays/holidays/plan2/holiday_ir_fa
+++ b/kholidays/holidays/plan2/holiday_ir_fa
@@ -19,49 +19,49 @@ language    "fa"
 
 :: Public Holidays
 : Nowrouz / Eid
-"عید نوروز"                               weekend on jalali farvardin 1 length 4
+"عید نوروز"                               public religious on jalali farvardin 1 length 4
 : Islamic Republic Day
-"روز جمهوری اسلامی"                        weekend on jalali farvardin 12
+"روز جمهوری اسلامی"                        public on jalali farvardin 12
 : Nature Day
-"روز طبیعت"                               weekend on jalali farvardin 13
+"روز طبیعت"                               public on jalali farvardin 13
 : Khomeini's Death
-"رحلت امام خمینی"                         weekend on jalali khordad 14
+"رحلت امام خمینی"                         public on jalali khordad 14
 : Revolt of Khordad 15
-"قیام ۱۵ خرداد"                           weekend on jalali khordad 15
+"قیام ۱۵ خرداد"                           public on jalali khordad 15
 : Victory of the Revolution
-"پیروزی انقلاب"                            weekend on jalali bahman 22
+"پیروزی انقلاب"                            public on jalali bahman 22
 : Nationalization of Oil Industry
-"ملی شدن صنعت نفت"                        weekend on jalali esfand 29
+"ملی شدن صنعت نفت"                        public on jalali esfand 29
 : Tasu'a of Imam Hussain
-"تاسوعا"                                  weekend on hijri muharram 9
+"تاسوعا"                                  public religious on hijri muharram 9
 : Ashura of Imam Hussain
-"عاشورا"                                  weekend on hijri muharram 10
+"عاشورا"                                  public religious on hijri muharram 10
 : Arba'een of Imam Hussain
-"اربعین"                                  weekend on hijri safar 20
+"اربعین"                                  public religious on hijri safar 20
 : Demise of prophet Muhammad and Martyrdom of Imam Hassan (Mujtaba)
-"وفات حضرت محمد و شهادت امام حسن مجتبی"   weekend on hijri safar 28
+"وفات حضرت محمد و شهادت امام حسن مجتبی"   public religious on hijri safar 28
 : Martyrdom of Imam Reza
-"شهادت امام رضا"                          weekend on hijri safar 29
+"شهادت امام رضا"                          public religious on hijri safar 29
 : Birth of Muhammad and Imam Jafar
-"ولادت حضرت محمد و امام جعفر صادق"         weekend on hijri rabialawal 17
+"ولادت حضرت محمد و امام جعفر صادق"         public religious on hijri rabialawal 17
 : Martyrdom of Fatima
-"شهادت حضرت فاطمه"                        weekend on hijri jumaadaalthaani 3
+"شهادت حضرت فاطمه"                        public religious on hijri jumaadaalthaani 3
 : Birth of Imam Ali
-"ولادت حضرت علی"                           weekend on hijri rajab 13
+"ولادت حضرت علی"                           public religious on hijri rajab 13
 : Mission of Muhammad
-"بعثت حضرت محمد"                          weekend on hijri rajab 27
+"بعثت حضرت محمد"                          public religious on hijri rajab 27
 : Birth of Imam Mahdi
-"ولادت حضرت مهدی"                          weekend on hijri shaban 15
+"ولادت حضرت مهدی"                          public religious on hijri shaban 15
 : Martyrdom of Imam Ali
-"شهادت حضرت علی"                          weekend on hijri ramadan 21
+"شهادت حضرت علی"                          public religious on hijri ramadan 21
 : Eid ul-Fitr (End of Ramadhan)
-"عید فطر"                                 weekend on hijri shawwal 1
+"عید فطر"                                 public religious on hijri shawwal 1
 : Martyrdom of Imam Jafar
-"شهادت امام جعفر صادق"                    weekend on hijri shawwal 25
+"شهادت امام جعفر صادق"                    public religious on hijri shawwal 25
 : Eid ul-Adha (Ghurban)
-"عید قربان"                               weekend on hijri thualhijjah 10
+"عید قربان"                               public religious on hijri thualhijjah 10
 : Eid al-Ghadeer
-"عید غدیر"                                weekend on hijri thualhijjah 18
+"عید غدیر"                                public religious on hijri thualhijjah 18
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_is_is b/kholidays/holidays/plan2/holiday_is_is
index 1dd8187..85370cd 100644
--- a/kholidays/holidays/plan2/holiday_is_is
+++ b/kholidays/holidays/plan2/holiday_is_is
@@ -17,59 +17,59 @@ language    "is"
 :description "(please add description in source language) National holiday file for Iceland"
 
 :: Public Holidays
-"Nýjársdagur"                  weekend on january 1
-"Skírdagur"                    weekend on easter minus 3 days
-"Föstudagurinn langi"          weekend on easter minus 2 days
-"Annar í Páskum"               weekend on easter plus 1 day
-"Uppstigningardagur"           weekend on easter plus 40 days
-"Hvítasunna"                   weekend on easter plus 49 days
-"Sumardagurinn fyrsti"         weekend on thursday after april 18
-"Frídagur verkamanna"          weekend on may 1
-"Lýðveldisdagurinn"            weekend on june 17
-"Frídagur verslunarmanna"      weekend on monday after july 31
-"Fullveldisdagurinn"           weekend on december 1
-"Aðfangadagur"                 weekend on december 24
-"Jóladagur"                    weekend on december 25
-"Annar í jólum"                weekend on december 26
-"Gamlársdagur"                 weekend on december 31
+"Nýjársdagur"                  public on january 1
+"Skírdagur"                    public religious on easter minus 3 days
+"Föstudagurinn langi"          public religious on easter minus 2 days
+"Annar í Páskum"               public religious on easter plus 1 day
+"Uppstigningardagur"           public religious on easter plus 40 days
+"Hvítasunna"                   public religious on easter plus 49 days
+"Sumardagurinn fyrsti"         public on thursday after april 18
+"Frídagur verkamanna"          public on may 1
+"Lýðveldisdagurinn"            public on june 17
+"Frídagur verslunarmanna"      public on monday after july 31
+"Fullveldisdagurinn"           public on december 1
+"Aðfangadagur"                 public on december 24
+"Jóladagur"                    public religious on december 25
+"Annar í jólum"                public on december 26
+"Gamlársdagur"                 public on december 31
 
 :: Religious
-"Pálmasunnudagur"              on easter minus 7 days
-"Páskadagur"                   on easter
-"Bolludagur"                   on easter minus 48 days
-"Sprengidagur"                 on easter minus 47 days
-"Öskudagur"                    on easter minus 46 days
-"Trinity"                      on easter plus 56 day
-"Corpus Christi"               on easter plus 53 days
-"1. í Aðventu"                 on sunday before december 24 minus 21
-"2. í Aðventu"                 on sunday before december 24 minus 14
-"3. í Aðventu"                 on sunday before december 24 minus 7
-"4. í Aðventu"                 on sunday before december 24
-"Þorláksmessa"                 on december 23
+"Pálmasunnudagur"              religious on easter minus 7 days
+"Páskadagur"                   religious on easter
+"Bolludagur"                   religious on easter minus 48 days
+"Sprengidagur"                 religious on easter minus 47 days
+"Öskudagur"                    religious on easter minus 46 days
+"Trinity"                      religious on easter plus 56 day
+"Corpus Christi"               religious on easter plus 53 days
+"1. í Aðventu"                 religious on sunday before december 24 minus 21
+"2. í Aðventu"                 religious on sunday before december 24 minus 14
+"3. í Aðventu"                 religious on sunday before december 24 minus 7
+"4. í Aðventu"                 religious on sunday before december 24
+"Þorláksmessa"                 religious on december 23
 
 :: Financial
 
 :: Cultural
-"Valentínusardagur"            on february 14
-"St. Patrick dagur"            on march 17
-"Sjómannadagurinn"             on sunday after may 31
-"Jónsmessa"                    on june 24
-"Hundadagar byrja"             on july 13
-"Hundadagar enda"              on august 23
-"Alþjóðlegi ljóðadagurinn"     on october 15
-"Dagur Sameinuðu Þjóðanna"     on october 24
-"Halloween"                    on october 31
-"Þakkargjörðardagurinn (BNA)"  on fourth thursday in november
-"Wright bræðra dagur"          on december 17
+"Valentínusardagur"            cultural on february 14
+"St. Patrick dagur"            cultural on march 17
+"Sjómannadagurinn"             cultural on sunday after may 31
+"Jónsmessa"                    cultural on june 24
+"Hundadagar byrja"             cultural on july 13
+"Hundadagar enda"              cultural on august 23
+"Alþjóðlegi ljóðadagurinn"     cultural on october 15
+"Dagur Sameinuðu Þjóðanna"     cultural on october 24
+"Halloween"                    cultural on october 31
+"Þakkargjörðardagurinn (BNA)"  cultural on fourth thursday in november
+"Wright bræðra dagur"          cultural on december 17
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Vorjafndægur"                 on march 22
-"Sumar sólstöður"              on june 22
-"Haustjafndægur"               on september 22
-"Vetrarsólstöður"              on december 22
+"Vorjafndægur"                 seasonal on march 22
+"Sumar sólstöður"              seasonal on june 22
+"Haustjafndægur"               seasonal on september 22
+"Vetrarsólstöður"              seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_it-bz_de b/kholidays/holidays/plan2/holiday_it-bz_de
index 5c6e3dc..808e725 100644
--- a/kholidays/holidays/plan2/holiday_it-bz_de
+++ b/kholidays/holidays/plan2/holiday_it-bz_de
@@ -17,39 +17,39 @@ language    "de"
 :description "(please add description in source language) Regional holiday file for South Tyrol"
 
 :: Public Holidays
-"Neujahr"               weekend on january 1
-"Hl. 3 Könige"          weekend on january 6
-"Ostersonntag"          weekend on easter
-"Ostermontag"           weekend on easter plus 1 day
-"Tag der Freiheit"      weekend on april 25
-"Tag der Arbeit"        weekend on may 1
-"Maria Himmelfahrt"     weekend on august 15
-"Allerheiligen"         weekend on november 1
-"Maria Empfängnis"      weekend on december 8
-"Christtag"             weekend on december 25
-"Stephanstag"           weekend on december 26
+"Neujahr"               public on january 1
+"Hl. 3 Könige"          public religious on january 6
+"Ostersonntag"          public religious on easter
+"Ostermontag"           public on easter plus 1 day
+"Tag der Freiheit"      public on april 25
+"Tag der Arbeit"        public on may 1
+"Maria Himmelfahrt"     public on august 15
+"Allerheiligen"         public religious on november 1
+"Maria Empfängnis"      public religious on december 8
+"Christtag"             public religious on december 25
+"Stephanstag"           public religious on december 26
 
 :: Religious
-"Hl. Joseph"            on march 19
-"Unnsinger Donnerstag"  on easter minus 52 days
-"Faschingsdienstag"     on easter minus 47 days
-"Aschermittwoch"        on easter minus 46 days
-"Pfingstsonntag"        on easter plus 49 days
-"Pfingstmontag"         on easter plus 50 days
-"Christi Himmelfahrt"   on easter plus 39 days
-"Hl. Peter und Paul"    on june 29
-"Hl. Franziskus"        on october 4
-"Allerseelen"           on november 2
-"Silvester"             on december 31
+"Hl. Joseph"            religious on march 19
+"Unnsinger Donnerstag"  religious on easter minus 52 days
+"Faschingsdienstag"     religious on easter minus 47 days
+"Aschermittwoch"        religious on easter minus 46 days
+"Pfingstsonntag"        religious on easter plus 49 days
+"Pfingstmontag"         religious on easter plus 50 days
+"Christi Himmelfahrt"   religious on easter plus 39 days
+"Hl. Peter und Paul"    religious on june 29
+"Hl. Franziskus"        religious on october 4
+"Allerseelen"           religious on november 2
+"Silvester"             religious on december 31
 
 :: Financial
 
 :: Cultural
-"Tag der Frau"          on march 8
-"Vatertag"              on march 19
-"Muttertag"             on second sunday in may
-"Tag der Republik"      on june 2
-"Nationalfeiertag"      on november 4
+"Tag der Frau"          cultural on march 8
+"Vatertag"              cultural on march 19
+"Muttertag"             cultural on second sunday in may
+"Tag der Republik"      cultural on june 2
+"Nationalfeiertag"      cultural on november 4
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_it_it b/kholidays/holidays/plan2/holiday_it_it
index fbced15..7468767 100644
--- a/kholidays/holidays/plan2/holiday_it_it
+++ b/kholidays/holidays/plan2/holiday_it_it
@@ -18,57 +18,57 @@ language    "it"
 :description "(please add description in source language) National holiday file for Italy"
 
 :: Public Holidays
-"Capodanno"                       weekend on january 1
-"Epifania"                        weekend on january 6
-"Pasqua"                          weekend on easter
-"Lunedì dell'Angelo"              weekend on easter plus 1 day
-"Anniversario della Liberazione"  weekend on april 25
-"Festa del Lavoro"                weekend on may 1
-"Festa della Repubblica"          weekend on june 2
-"Ferragosto"                      weekend on august 15
-"Ognissanti"                      weekend on november 1
-"Immacolata Concezione"           weekend on december 8
-"Natale"                          weekend on december 25
-"Santo Stefano"                   weekend on december 26
+"Capodanno"                       public on january 1
+"Epifania"                        public on january 6
+"Pasqua"                          public on easter
+"Lunedì dell'Angelo"              public on easter plus 1 day
+"Anniversario della Liberazione"  public on april 25
+"Festa del Lavoro"                public on may 1
+"Festa della Repubblica"          public on june 2
+"Ferragosto"                      public on august 15
+"Ognissanti"                      public on november 1
+"Immacolata Concezione"           public on december 8
+"Natale"                          public on december 25
+"Santo Stefano"                   public on december 26
 
 :: Religious
-"San Giuseppe"                    on march 19
-"Giovedì Grasso"                  on easter minus 52 days
-"Martedì Grasso"                  on easter minus 47 days
-"Mercoledì delle Ceneri"          on easter minus 46 days
-"Prima di Quaresima"              on easter minus 42 days
-"Seconda di Quaresima"            on easter minus 35 days
-"Terza di Quaresima"              on easter minus 28 days
-"Quarta di Quaresima"             on easter minus 21 days
-"Quinta di Quaresima"             on easter minus 14 days
-"Domenica delle Palme"            on easter minus 7 days
-"Ascensione"                      on easter plus 39 days
-"Pentecoste"                      on easter plus 49 days
-"Santissima Trinità"              on easter plus 56 days
-"Corpus Domini"                   on easter plus 63 days
-"Sacro Cuore di Gesù"             on easter plus 68 days
-"Santi Pietro e Paolo"            on june 29
-"San Francesco"                   on october 4
-"Defunti"                         on november 2
-"Prima d'avvento"                 on sunday before 24 december minus 21 days
-"Seconda d'avvento"               on sunday before 24 december minus 14 days
-"Terza d'avvento"                 on sunday before 24 december minus 7 days
-"Quarta d'avvento"                on sunday before 24 december
-"San Silvestro"                   on december 31
+"San Giuseppe"                    religious on march 19
+"Giovedì Grasso"                  religious on easter minus 52 days
+"Martedì Grasso"                  religious on easter minus 47 days
+"Mercoledì delle Ceneri"          religious on easter minus 46 days
+"Prima di Quaresima"              religious on easter minus 42 days
+"Seconda di Quaresima"            religious on easter minus 35 days
+"Terza di Quaresima"              religious on easter minus 28 days
+"Quarta di Quaresima"             religious on easter minus 21 days
+"Quinta di Quaresima"             religious on easter minus 14 days
+"Domenica delle Palme"            religious on easter minus 7 days
+"Ascensione"                      religious on easter plus 39 days
+"Pentecoste"                      religious on easter plus 49 days
+"Santissima Trinità"              religious on easter plus 56 days
+"Corpus Domini"                   religious on easter plus 63 days
+"Sacro Cuore di Gesù"             religious on easter plus 68 days
+"Santi Pietro e Paolo"            religious on june 29
+"San Francesco"                   religious on october 4
+"Defunti"                         religious on november 2
+"Prima d'avvento"                 religious on sunday before 24 december minus 21 days
+"Seconda d'avvento"               religious on sunday before 24 december minus 14 days
+"Terza d'avvento"                 religious on sunday before 24 december minus 7 days
+"Quarta d'avvento"                religious on sunday before 24 december
+"San Silvestro"                   religious on december 31
 
 :: Financial
 
 :: Cultural
-"Giornata della Memoria"          on january 27
-"Giornata del Ricordo"            on february 10
-"Festa della donna"               on march 8
-"Festa dell'Unità nazionale"      on november 4
+"Giornata della Memoria"          cultural on january 27
+"Giornata del Ricordo"            cultural on february 10
+"Festa della donna"               cultural on march 8
+"Festa dell'Unità nazionale"      cultural on november 4
 
 :: School
 
 :: Daylight Saving
-"Passaggio all'ora legale"        on last sunday in march
-"Passaggio all'ora solare"        on last sunday in october
+"Passaggio all'ora legale"        seasonal on last sunday in march
+"Passaggio all'ora solare"        seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_jm_en-gb b/kholidays/holidays/plan2/holiday_jm_en-gb
index 8367a10..ac6e1e3 100644
--- a/kholidays/holidays/plan2/holiday_jm_en-gb
+++ b/kholidays/holidays/plan2/holiday_jm_en-gb
@@ -17,26 +17,26 @@ language    "en_GB"
 :description "(please add description in source language) National holiday file for Jamaica"
 
 :: Public Holidays
-"New Year's Day"       weekend on january 1
-"Ash Wednesday"        weekend on february 25
-"Good Friday"          weekend on easter minus 2 days
-"Easter"               weekend on easter
-"Easter Monday"        weekend on easter plus 1 day
-"Labour Day"           weekend on may 23
-"Emancipation Day"     weekend on august 1
-"Independence Day"     weekend on august 6
-"National Heroes Day"  weekend on third monday in october
-"Christmas"            weekend on december 25
-"Boxing Day"           weekend on december 26
+"New Year's Day"       public on january 1
+"Ash Wednesday"        public religious on february 25
+"Good Friday"          public religious on easter minus 2 days
+"Easter"               public religious on easter
+"Easter Monday"        public on easter plus 1 day
+"Labour Day"           public on may 23
+"Emancipation Day"     public on august 1
+"Independence Day"     public on august 6
+"National Heroes Day"  public on third monday in october
+"Christmas"            public religious on december 25
+"Boxing Day"           public on december 26
 
 :: Religious
 
 :: Financial
 
 :: Cultural
-"Valentine's Day"      on february 14
-"Mother's Day"         on second sunday in may
-"Father's Day"         on third sunday in june
+"Valentine's Day"      cultural on february 14
+"Mother's Day"         cultural on second sunday in may
+"Father's Day"         cultural on third sunday in june
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_jp_en-us b/kholidays/holidays/plan2/holiday_jp_en-us
index d9e58dc..ebad669 100644
--- a/kholidays/holidays/plan2/holiday_jp_en-us
+++ b/kholidays/holidays/plan2/holiday_jp_en-us
@@ -17,51 +17,51 @@ language    "en_US"
 description "National holiday file for Japan"
 
 :: Public Holidays
-"New Year's Day"                   weekend on january 1
-"Coming of Age"                    weekend on second monday in january
-"National Foundation Day"          weekend on february 11
-"Vernal Equinox Day"               weekend on 20.3.2005
-"Vernal Equinox Day"               weekend on 21.3.2006
-"Vernal Equinox Day"               weekend on 21.3.2007
-"Vernal Equinox Day"               weekend on 20.3.2008
-"Vernal Equinox Day"               weekend on 20.3.2009
-"Vernal Equinox Day"               weekend on 21.3.2010
-"Greenery Day"                     weekend on april 29
-"Constitution Day"                 weekend on may 3
-"Holiday"                          weekend on may 4
-"Children's Day"                   weekend on may 5
-"Oceans' Day"                      weekend on third monday in july
-"Respect for Senior Citizens Day"  weekend on third monday in september
-"Autumnal Equinox Day"             weekend on september 23
-"Sports Day"                       weekend on second monday in october
-"Culture Day"                      weekend on november 3
-"Labor Thanksgiving Day"           weekend on november 23
-"The Emperor's Birthday"           weekend on december 23
+"New Year's Day"                   public on january 1
+"Coming of Age"                    public on second monday in january
+"National Foundation Day"          public on february 11
+"Vernal Equinox Day"               public on 20.3.2005
+"Vernal Equinox Day"               public on 21.3.2006
+"Vernal Equinox Day"               public on 21.3.2007
+"Vernal Equinox Day"               public on 20.3.2008
+"Vernal Equinox Day"               public on 20.3.2009
+"Vernal Equinox Day"               public on 21.3.2010
+"Greenery Day"                     public on april 29
+"Constitution Day"                 public on may 3
+"Holiday"                          public on may 4
+"Children's Day"                   public on may 5
+"Oceans' Day"                      public on third monday in july
+"Respect for Senior Citizens Day"  public on third monday in september
+"Autumnal Equinox Day"             public on september 23
+"Sports Day"                       public on second monday in october
+"Culture Day"                      public on november 3
+"Labor Thanksgiving Day"           public on november 23
+"The Emperor's Birthday"           public on december 23
 :: If a "National Holiday" is on Sunday,the following day
 :: shall be a substitute holiday.
-"Substitute holiday"               weekend on 21.3.2005
-"Substitute holiday"               weekend on 2.1.2006
-"Substitute holiday"               weekend on 12.2.2007
-"Substitute holiday"               weekend on 30.4.2007
-"Substitute holiday"               weekend on 24.9.2007
-"Substitute holiday"               weekend on 24.12.2007
-"Substitute holiday"               weekend on 24.11.2008
-"Substitute holiday"               weekend on 22.3.2010
+"Substitute holiday"               public on 21.3.2005
+"Substitute holiday"               public on 2.1.2006
+"Substitute holiday"               public on 12.2.2007
+"Substitute holiday"               public on 30.4.2007
+"Substitute holiday"               public on 24.9.2007
+"Substitute holiday"               public on 24.12.2007
+"Substitute holiday"               public on 24.11.2008
+"Substitute holiday"               public on 22.3.2010
 
 :: Religious
 
 :: Financial
 
 :: Cultural
-"St. Valentine's Day"              on february 14
-"Girls' Festival"                  on march 3
-"Buddha's Birthday"                on april 8
-"May Day"                          on may 1
-"Boys' Festival"                   on may 5
-"Mother's Day"                     on second sunday in may
-"Father's Day"                     on third sunday in june
-"Festival of the Weaver Star"      on july 7
-"Christmas"                        on december 25
+"St. Valentine's Day"              cultural on february 14
+"Girls' Festival"                  cultural on march 3
+"Buddha's Birthday"                cultural on april 8
+"May Day"                          cultural on may 1
+"Boys' Festival"                   cultural on may 5
+"Mother's Day"                     cultural on second sunday in may
+"Father's Day"                     cultural on third sunday in june
+"Festival of the Weaver Star"      cultural on july 7
+"Christmas"                        cultural on december 25
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_jp_ja b/kholidays/holidays/plan2/holiday_jp_ja
index 844cc48..b61f2d8 100644
--- a/kholidays/holidays/plan2/holiday_jp_ja
+++ b/kholidays/holidays/plan2/holiday_jp_ja
@@ -18,67 +18,67 @@ language    "ja"
 
 :: Public Holidays
 :"New Year's Day"
-"元旦"                               weekend on january 1
+"元旦"                               public on january 1
 :"Coming of Age"
-"成人の日"                            weekend on second monday in january
+"成人の日"                            public on second monday in january
 :"National Foundation Day"
-"建国記念日"                          weekend on february 11
+"建国記念日"                          public on february 11
 :"Vernal Equinox Day"
-"春分の日"                            weekend on 20.3.2005
-"春分の日"                            weekend on 21.3.2006
-"春分の日"                            weekend on 21.3.2007
-"春分の日"                            weekend on 21.3.2008
-"春分の日"                            weekend on 21.3.2009
-"春分の日"                            weekend on 21.3.2010
+"春分の日"                            public on 20.3.2005
+"春分の日"                            public on 21.3.2006
+"春分の日"                            public on 21.3.2007
+"春分の日"                            public on 21.3.2008
+"春分の日"                            public on 21.3.2009
+"春分の日"                            public on 21.3.2010
 :"Greenery Day"
-"みどりの日"                          weekend on april 29
+"みどりの日"                          public on april 29
 :"Constitution Day"
-"憲法記念日"                          weekend on may 3
+"憲法記念日"                          public on may 3
 :"Holiday"
-"休日"                               weekend on may 4
+"休日"                               public on may 4
 :"Children's Day"
-"こどもの日"                          weekend on may 5
+"こどもの日"                          public on may 5
 :"Oceans' Day"
-"海の日"                             weekend on third monday in july
+"海の日"                             public on third monday in july
 :"Respect for Senior Citizens Day"
-"敬老の日"                            weekend on third monday in september
+"敬老の日"                            public on third monday in september
 :"Autumnal Equinox Day"
-"秋分の日"                            weekend on september 23
+"秋分の日"                            public on september 23
 :"Sports Day"
-"体育の日"                            weekend on second monday in october
+"体育の日"                            public on second monday in october
 :"Culture Day"
-"文化の日"                            weekend on november 3
+"文化の日"                            public on november 3
 :"Labor Thanksgiving Day"
-"勤労感謝の日"                         weekend on november 23
+"勤労感謝の日"                         public on november 23
 :"The Emperor's Birthday"
-"天皇誕生日"                          weekend on december 23
+"天皇誕生日"                          public on december 23
 
 :: If a "National Holiday" is on Sunday,the following day
 :: shall be a substitute holiday.
 :"Substitute holiday"
-"振替休日"                            weekend on 21.3.2005
-"振替休日"                            weekend on 2.1.2006
-"振替休日"                            weekend on 12.2.2007
-"振替休日"                            weekend on 30.4.2007
-"振替休日"                            weekend on 24.9.2007
-"振替休日"                            weekend on 24.12.2007
-"振替休日"                            weekend on 24.11.2008
-"振替休日"                            weekend on 22.3.2010
+"振替休日"                            public on 21.3.2005
+"振替休日"                            public on 2.1.2006
+"振替休日"                            public on 12.2.2007
+"振替休日"                            public on 30.4.2007
+"振替休日"                            public on 24.9.2007
+"振替休日"                            public on 24.12.2007
+"振替休日"                            public on 24.11.2008
+"振替休日"                            public on 22.3.2010
 
 :: Religious
 
 :: Financial
 
 :: Cultural
-:"St. Valentine's Day"              on february 14
-:"Girls' Festival"                  on march 3
-:"Buddha's Birthday"                on april 8
-:"May Day"                          on may 1
-:"Boys' Festival"                   on may 5
-:"Mother's Day"                     on second sunday in may
-:"Father's Day"                     on third sunday in june
-:"Festival of the Weaver Star"      on july 7
-:"Christmas"                        on december 25
+:"St. Valentine's Day"              cultural on february 14
+:"Girls' Festival"                  cultural on march 3
+:"Buddha's Birthday"                cultural on april 8
+:"May Day"                          cultural on may 1
+:"Boys' Festival"                   cultural on may 5
+:"Mother's Day"                     cultural on second sunday in may
+:"Father's Day"                     cultural on third sunday in june
+:"Festival of the Weaver Star"      cultural on july 7
+:"Christmas"                        cultural on december 25
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_kr_ko b/kholidays/holidays/plan2/holiday_kr_ko
index 2bc7a7a..73dcfc8 100644
--- a/kholidays/holidays/plan2/holiday_kr_ko
+++ b/kholidays/holidays/plan2/holiday_kr_ko
@@ -24,57 +24,57 @@ language    "ko"
 
 :: Public Holidays
 : New Year's Day
-"양력설"            weekend on january 1
+"양력설"            public on january 1
 : March 1st Movement Day
-"3·1절"             weekend on march 1
+"3·1절"             public on march 1
 : Children's Day
-"어린이날"          weekend on may 5
+"어린이날"          public on may 5
 : Memorial Day
-"현충일"            weekend on june 6
+"현충일"            public on june 6
 : Liberation Day
-"광복절"            weekend on august 15
+"광복절"            public on august 15
 : National Foundation Day
-"개천절"            weekend on october 3
+"개천절"            public on october 3
 : Christmas Day
-"크리스마스"        weekend on december 25
+"크리스마스"        public on december 25
 : Lunar Holidays
 : Lunar New Year: Day 1 Month 1
-"설날"              weekend on 8.2.2005 length 3 days
-"설날"              weekend on 28.1.2006 length 3 days
-"설날"              weekend on 17.2.2007 length 3 days
-"설날"              weekend on 6.2.2008 length 3 days
-"설날"              weekend on 25.1.2009 length 3 days
-"설날"              weekend on 13.2.2010 length 3 days
-"설날"              weekend on 2.2.2011 length 3 days
-"설날"              weekend on 22.1.2012 length 3 days
-"설날"              weekend on 9.2.2013 length 3 days
-"설날"              weekend on 30.1.2014 length 3 days
-"설날"              weekend on 18.2.2015 length 3 days
-"설날"              weekend on 7.2.2016 length 3 days
+"설날"              public on 8.2.2005 length 3 days
+"설날"              public on 28.1.2006 length 3 days
+"설날"              public on 17.2.2007 length 3 days
+"설날"              public on 6.2.2008 length 3 days
+"설날"              public on 25.1.2009 length 3 days
+"설날"              public on 13.2.2010 length 3 days
+"설날"              public on 2.2.2011 length 3 days
+"설날"              public on 22.1.2012 length 3 days
+"설날"              public on 9.2.2013 length 3 days
+"설날"              public on 30.1.2014 length 3 days
+"설날"              public on 18.2.2015 length 3 days
+"설날"              public on 7.2.2016 length 3 days
 : Buddha's Birthday: Day 8 Month 4
-"부처님 오신 날"    weekend on 24.5.2007
-"부처님 오신 날"    weekend on 12.5.2008
-"부처님 오신 날"    weekend on 2.5.2009
-"부처님 오신 날"    weekend on 21.5.2010
-"부처님 오신 날"    weekend on 10.5.2011
-"부처님 오신 날"    weekend on 28.5.2012
-"부처님 오신 날"    weekend on 17.5.2013
-"부처님 오신 날"    weekend on 6.5.2014
-"부처님 오신 날"    weekend on 25.5.2015
-"부처님 오신 날"    weekend on 14.5.2016
+"부처님 오신 날"    public religious on 24.5.2007
+"부처님 오신 날"    public religious on 12.5.2008
+"부처님 오신 날"    public religious on 2.5.2009
+"부처님 오신 날"    public religious on 21.5.2010
+"부처님 오신 날"    public religious on 10.5.2011
+"부처님 오신 날"    public religious on 28.5.2012
+"부처님 오신 날"    public religious on 17.5.2013
+"부처님 오신 날"    public religious on 6.5.2014
+"부처님 오신 날"    public religious on 25.5.2015
+"부처님 오신 날"    public religious on 14.5.2016
 : Chuseok: Day 15 Month 8
-"추석"              weekend on 17.9.2005 length 3 days
-"추석"              weekend on 5.10.2006 length 3 days
-"추석"              weekend on 24.9.2007 length 3 days
-"추석"              weekend on 13.9.2008 length 3 days
-"추석"              weekend on 2.10.2009 length 3 days
-"추석"              weekend on 21.9.2010 length 3 days
-"추석"              weekend on 11.9.2011 length 3 days
-"추석"              weekend on 29.9.2012 length 3 days
-"추석"              weekend on 18.9.2013 length 3 days
-"추석"              weekend on 7.9.2014 length 3 days
-"추석"              weekend on 26.9.2015 length 3 days
-"추석"              weekend on 14.9.2016 length 3 days
+"추석"              public on 17.9.2005 length 3 days
+"추석"              public on 5.10.2006 length 3 days
+"추석"              public on 24.9.2007 length 3 days
+"추석"              public on 13.9.2008 length 3 days
+"추석"              public on 2.10.2009 length 3 days
+"추석"              public on 21.9.2010 length 3 days
+"추석"              public on 11.9.2011 length 3 days
+"추석"              public on 29.9.2012 length 3 days
+"추석"              public on 18.9.2013 length 3 days
+"추석"              public on 7.9.2014 length 3 days
+"추석"              public on 26.9.2015 length 3 days
+"추석"              public on 14.9.2016 length 3 days
 
 :: Religious
 
@@ -82,9 +82,9 @@ language    "ko"
 
 :: Cultural
 : Constitution Day
-"제헌절"            on july 17
+"제헌절"            civil on july 17
 : Hangeul Day
-"한글날"            on october 9
+"한글날"            cultural on october 9
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_kz_kk b/kholidays/holidays/plan2/holiday_kz_kk
index 71fc7d7..3f6affb 100644
--- a/kholidays/holidays/plan2/holiday_kz_kk
+++ b/kholidays/holidays/plan2/holiday_kz_kk
@@ -18,21 +18,21 @@ description "Қазақстан Республикасының мейрамда
 
 :: Public Holidays
 :: New Year
-"Жаңа жыл"                                       weekend on january 1 length 2 days
+"Жаңа жыл"                                       public on january 1 length 2 days
 :: International Women’s Day
-"Халықаралық әйелдер күні"                       weekend on march 8
+"Халықаралық әйелдер күні"                       public on march 8
 :: Nauryz
-"Наурыз мейрамы"                                 weekend on march 22
+"Наурыз мейрамы"                                 public on march 22
 :: Kazakhstan Peoples Solidarity Holiday
-"Қазақстан халқының бірлігі мерекесі"            weekend on may 1
+"Қазақстан халқының бірлігі мерекесі"            public on may 1
 :: Victory Day
-"Жеңіс күні"                                     weekend on may 9
+"Жеңіс күні"                                     public on may 9
 :: Capital City Day
-"Астана күні"                                    weekend on july 6
+"Астана күні"                                    public on july 6
 :: The Republic of Kazakhstan Constitution Day
-"Қазақстан Республикасының Конституциясы күні"   weekend on august 30
+"Қазақстан Республикасының Конституциясы күні"   public on august 30
 :: Independence Day
-"Тәуелсіздік күні"                               weekend on december 16 length 2 days
+"Тәуелсіздік күні"                               public on december 16 length 2 days
 
 :: Religious
 
@@ -49,81 +49,81 @@ description "Қазақстан Республикасының мейрамда
 :: Name Days
 
 :: Professional Holidays
-"Инженерлiк әскерлер күнi"                                              on january 21
-"Хатшылар күнi"                                                         on february 27
-"Республикалық ұлан күнi"                                               on march 16
-"Сауда күнi"                                                            on march 18
-"Театр күнi"                                                            on march 27
-"Геолог күнi"                                                           on april 1
-"Күлкi күнi"                                                            on april 1
-"Қазақстан Республикасы әскери-теңiз күштерi күнi"                      on april 2
-"Тергеуші күні"                                                         on april 6
-"Ғарышкер күні"                                                         on april 12
-"Әуе қорғаныс әскерлерiнiң күнi"                                        on april 15
-"Ғылым күнi"                                                            on april 16
-"Өртке қарсы қызмет қызметкерлерiнiң күнi"                              on april 17
-"Бүкiләлемдiк еңбек қорғау күні"                                        on april 28
-"Халықаралық би күнi"                                                   on april 29
-"Радио күні"                                                            on may 5
+"Инженерлiк әскерлер күнi"                                              civil on january 21
+"Хатшылар күнi"                                                         civil on february 27
+"Республикалық ұлан күнi"                                               civil on march 16
+"Сауда күнi"                                                            civil on march 18
+"Театр күнi"                                                            civil on march 27
+"Геолог күнi"                                                           civil on april 1
+"Күлкi күнi"                                                            civil on april 1
+"Қазақстан Республикасы әскери-теңiз күштерi күнi"                      civil on april 2
+"Тергеуші күні"                                                         civil on april 6
+"Ғарышкер күні"                                                         civil on april 12
+"Әуе қорғаныс әскерлерiнiң күнi"                                        civil on april 15
+"Ғылым күнi"                                                            civil on april 16
+"Өртке қарсы қызмет қызметкерлерiнiң күнi"                              civil on april 17
+"Бүкiләлемдiк еңбек қорғау күні"                                        civil on april 28
+"Халықаралық би күнi"                                                   civil on april 29
+"Радио күні"                                                            civil on may 5
 :: Fatherland Defender’s Day
-"Отан қорғаушы күні"                                                    on may 7
-"Химиктер күнi"                                                         on may 27
+"Отан қорғаушы күні"                                                    civil on may 7
+"Химиктер күнi"                                                         civil on may 27
 :: Political Repression Victims Memory Day
-"Саяси қуғын-сүргіндер құрбандарын еске"                                on may 31
-"Балаларды қорғау күнi"                                                 on june 1
+"Саяси қуғын-сүргіндер құрбандарын еске"                                civil on may 31
+"Балаларды қорғау күнi"                                                 civil on june 1
 :: The Republic of Kazakhstan National Symbols’ Day
-"Қазақстан Республикасының мемлекеттік"                                 on june 4
-"Айналадағы ортаны қорғау күні"                                         on june 5
-"Бүкiләлемдiк донор күнi"                                               on june 14
+"Қазақстан Республикасының мемлекеттік"                                 civil on june 4
+"Айналадағы ортаны қорғау күні"                                         civil on june 5
+"Бүкiләлемдiк донор күнi"                                               civil on june 14
 :: Police Day
-"Полиция күні"                                                          on june 23
+"Полиция күні"                                                          civil on june 23
 :: Health Professionals’ Day
-"Медицина қызметкері күні"                                              on third sunday in june
+"Медицина қызметкері күні"                                              civil on third sunday in june
 :: Press, TV and Radio Day
-"Баспасөз, теледидар және радио күнi"                                   on last sunday in june
+"Баспасөз, теледидар және радио күнi"                                   civil on last sunday in june
 :: Diplomatic service Day
-"Дипломатиялық қызмет күні"                                             on july 2
-"Бүкiләлемдiк сүйісу күні"                                              on july 6
-"Ұлттық қауiпсiздiк комитетiнiң күнi. Прокуратура күнi"                 on july 13
-"Теңіз және өзен флоты күні"                                            on first sunday in july
+"Дипломатиялық қызмет күні"                                             civil on july 2
+"Бүкiләлемдiк сүйісу күні"                                              civil on july 6
+"Ұлттық қауiпсiздiк комитетiнiң күнi. Прокуратура күнi"                 civil on july 13
+"Теңіз және өзен флоты күні"                                            civil on first sunday in july
 :: Metal-Maker’s Day
-"Металлург күні"                                                        on third sunday in july
-"Жүйелік администратор күні"                                            on last sunday in july
-"Әуе-десант әскерлерінің күні"                                          on august 2
-"Шекаралық әскерлер күнi"                                               on august 18
-"Әуе флоты күнi"                                                        on august 19
-"Көлік және байланыс қызметкерлері күні"                                on first sunday in august
+"Металлург күні"                                                        civil on third sunday in july
+"Жүйелік администратор күні"                                            civil on last sunday in july
+"Әуе-десант әскерлерінің күні"                                          civil on august 2
+"Шекаралық әскерлер күнi"                                               civil on august 18
+"Әуе флоты күнi"                                                        civil on august 19
+"Көлік және байланыс қызметкерлері күні"                                civil on first sunday in august
 :: Builder’s Day
-"Құрылысшы күні"                                                        on second sunday in august
+"Құрылысшы күні"                                                        civil on second sunday in august
 :: Sports Day
-"Спорт күні"                                                            on third sunday in august
+"Спорт күні"                                                            civil on third sunday in august
 :: Miner’s day
-"Шахтер күні"                                                           on last sunday in august
+"Шахтер күні"                                                           civil on last sunday in august
 :: Knowledge day
-"Бiлiм күнi"                                                            on september 1
+"Бiлiм күнi"                                                            civil on september 1
 :: Oil and Gas Complex Workers’ Day
-"Мұнай-газ кешені қызметкерлерінің күні"                                on first sunday in september
-"Танкистер күні"                                                        on second sunday in september
+"Мұнай-газ кешені қызметкерлерінің күні"                                civil on first sunday in september
+"Танкистер күні"                                                        civil on second sunday in september
 :: The Republic of Kazakhstan Languages Day
-"Қазақстан Республикасының халықтары"                                   on third sunday in september
+"Қазақстан Республикасының халықтары"                                   civil on third sunday in september
 :: Nuclear Industry Workers’ Day
-"Атом саласының қызметкерлері күні"                                     on september 28
-"Сәулетшi күнi"                                                         on october 5
-"Есепшiлер және тексерушiлер күнi"                                      on october 6
-"Бүкіләлемдік пошта күні"                                               on october 9
-"Кiтапханашы күнi"                                                      on october 15
-"Байланыс қызметкерлерiнiң күнi"                                        on october 20
-"Автомобиль көлiгi қызметкерлерiнiң күнi"                               on october 28
+"Атом саласының қызметкерлері күні"                                     civil on september 28
+"Сәулетшi күнi"                                                         civil on october 5
+"Есепшiлер және тексерушiлер күнi"                                      civil on october 6
+"Бүкіләлемдік пошта күні"                                               civil on october 9
+"Кiтапханашы күнi"                                                      civil on october 15
+"Байланыс қызметкерлерiнiң күнi"                                        civil on october 20
+"Автомобиль көлiгi қызметкерлерiнiң күнi"                               civil on october 28
 :: Teacher’s Day
-"Мұғалiм күнi"                                                          on first sunday in october
+"Мұғалiм күнi"                                                          civil on first sunday in october
 :: National Currency Day
-"Ұлттық валюта күні"                                                    on november 15
-"Студенттер күнi"                                                       on november 17
-"Ракета әскерлері және артиллерия күнi"                                 on november 17
-"Жол полициясы қызметкерлерiнiң күнi"                                   on november 23
+"Ұлттық валюта күні"                                                    civil on november 15
+"Студенттер күнi"                                                       civil on november 17
+"Ракета әскерлері және артиллерия күнi"                                 civil on november 17
+"Жол полициясы қызметкерлерiнiң күнi"                                   civil on november 23
 :: Agriculture Workers’ Day
-"Ауыл шаруашылығы қызметкерлерінің күні"                                on third sunday in november
-"Қазақстан Республикасы кеден қызметiнiң күнi"                          on december 12
-"Экономист күнi"                                                        on december 25
+"Ауыл шаруашылығы қызметкерлерінің күні"                                civil on third sunday in november
+"Қазақстан Республикасы кеден қызметiнiң күнi"                          civil on december 12
+"Экономист күнi"                                                        civil on december 25
 :: Power Engineer’s Day
-"Энергетик күні"                                                        on third sunday in december
+"Энергетик күні"                                                        civil on third sunday in december
diff --git a/kholidays/holidays/plan2/holiday_kz_ru b/kholidays/holidays/plan2/holiday_kz_ru
index 96d1f38..37917c2 100644
--- a/kholidays/holidays/plan2/holiday_kz_ru
+++ b/kholidays/holidays/plan2/holiday_kz_ru
@@ -19,21 +19,21 @@ description "Праздники Республики Казахстан"
 
 :: Public Holidays
 :: New Year
-"Новый год"                                      weekend on january 1 length 2 days
+"Новый год"                                      public on january 1 length 2 days
 :: International Women’s Day
-"Международный женский день"                     weekend on march 8
+"Международный женский день"                     public on march 8
 :: Nauryz
-"Наурыз мейрамы"                                 weekend on march 22
+"Наурыз мейрамы"                                 public on march 22
 :: Kazakhstan Peoples Solidarity Holiday
-"Праздник единства народа Казахстана"            weekend on may 1
+"Праздник единства народа Казахстана"            public on may 1
 :: Victory Day
-"День Победы"                                    weekend on may 9
+"День Победы"                                    public on may 9
 :: Capital City Day
-"День Столицы"                                   weekend on july 6
+"День Столицы"                                   public on july 6
 :: The Republic of Kazakhstan Constitution Day
-"День Конституции Республики Казахстан"          weekend on august 30
+"День Конституции Республики Казахстан"          public on august 30
 :: Independence Day
-"День Независимости"                             weekend on december 16 length 2 days
+"День Независимости"                             public on december 16 length 2 days
 
 :: Religious
 
@@ -50,82 +50,82 @@ description "Праздники Республики Казахстан"
 :: Name Days
 
 :: Professional Holidays
-"День инженерных войск"                                                 on january 21
-"День секретаря"                                                        on february 27
-"День республиканской гвардии"                                          on march 16
-"День торговли"                                                         on march 18
-"День театра"                                                           on march 27
-"День геолога"                                                          on april 1
-"День смеха"                                                            on april 1
-"День образования военно-морских сил РК"                                on april 2
-"День следствия"                                                        on april 6
-"День космонавтики"                                                     on april 12
-"День войск противовоздушной обороны"                                   on april 15
-"День науки"                                                            on april 16
-"День работников пожарной охраны"                                       on april 17
-"Всемирный день охраны труда"                                           on april 28
-"Международный день танца"                                              on april 29
-"День радио"                                                            on may 5
+"День инженерных войск"                                                 civil on january 21
+"День секретаря"                                                        civil on february 27
+"День республиканской гвардии"                                          civil on march 16
+"День торговли"                                                         civil on march 18
+"День театра"                                                           civil on march 27
+"День геолога"                                                          civil on april 1
+"День смеха"                                                            civil on april 1
+"День образования военно-морских сил РК"                                civil on april 2
+"День следствия"                                                        civil on april 6
+"День космонавтики"                                                     civil on april 12
+"День войск противовоздушной обороны"                                   civil on april 15
+"День науки"                                                            civil on april 16
+"День работников пожарной охраны"                                       civil on april 17
+"Всемирный день охраны труда"                                           civil on april 28
+"Международный день танца"                                              civil on april 29
+"День радио"                                                            civil on may 5
 :: Fatherland Defender’s Day
-"День защитника Отечества"                                              on may 7
-"День химика"                                                           on may 27
+"День защитника Отечества"                                              civil on may 7
+"День химика"                                                           civil on may 27
 :: Political Repression Victims Memory Day
-"День памяти жертв политических репрессий"                              on may 31
-"День защиты детей"                                                     on june 1
+"День памяти жертв политических репрессий"                              civil on may 31
+"День защиты детей"                                                     civil on june 1
 :: The Republic of Kazakhstan National Symbols’ Day
-"День государственных символов Республики Казахстан"                    on june 4
-"День охраны окружающей среды"                                          on june 5
-"Всемирный день донора крови"                                           on june 14
+"День государственных символов Республики Казахстан"                    civil on june 4
+"День охраны окружающей среды"                                          civil on june 5
+"Всемирный день донора крови"                                           civil on june 14
 :: Police Day
-"День полиции"                                                          on june 23
+"День полиции"                                                          civil on june 23
 :: Health Professionals’ Day
-"День медицинского работника"                                           on third sunday in june
+"День медицинского работника"                                           civil on third sunday in june
 :: Press, TV and Radio Day
-"День печати, телевидения и радио"                                      on last sunday in june
+"День печати, телевидения и радио"                                      civil on last sunday in june
 :: Diplomatic service Day
-"День дипломатической службы"                                           on july 2
-"Всемирный день поцелуя"                                                on july 6
-"День комитета Национальной Безопасности. День прокуратуры"             on july 13
-"День морского и речного флота"                                         on first sunday in july
+"День дипломатической службы"                                           civil on july 2
+"Всемирный день поцелуя"                                                civil on july 6
+"День комитета Национальной Безопасности. День прокуратуры"             civil on july 13
+"День морского и речного флота"                                         civil on first sunday in july
 :: Metal-Maker’s Day
-"День металлурга"                                                       on third sunday in july
-"День системного администратора"                                        on last sunday in july
-"День воздушно-десантных войск"                                         on august 2
-"День образования пограничных войск"                                    on august 18
-"День воздушного флота"                                                 on august 19
+"День металлурга"                                                       civil on third sunday in july
+"День системного администратора"                                        civil on last sunday in july
+"День воздушно-десантных войск"                                         civil on august 2
+"День образования пограничных войск"                                    civil on august 18
+"День воздушного флота"                                                 civil on august 19
 :: Transport and Communication Workers’ Day
-"День работников транспорта и связи"                                    on first sunday in august
+"День работников транспорта и связи"                                    civil on first sunday in august
 :: Builder’s Day
-"День строителя"                                                        on second sunday in august
+"День строителя"                                                        civil on second sunday in august
 :: Sports Day
-"День спорта"                                                           on third sunday in august
+"День спорта"                                                           civil on third sunday in august
 :: Miner’s day
-"День шахтера"                                                          on last sunday in august
+"День шахтера"                                                          civil on last sunday in august
 :: Knowledge day
-"День знаний"                                                           on september 1
+"День знаний"                                                           civil on september 1
 :: Oil and Gas Complex Workers’ Day
-"День работников нефтегазового комплекса"                               on first sunday in september
-"День танкистов"                                                        on second sunday in september
+"День работников нефтегазового комплекса"                               civil on first sunday in september
+"День танкистов"                                                        civil on second sunday in september
 :: The Republic of Kazakhstan Languages Day
-"День языков народов Республики Казахстан"                              on third sunday in september
+"День языков народов Республики Казахстан"                              civil on third sunday in september
 :: Nuclear Industry Workers’ Day
-"День работников атомной отрасли"                                       on september 28
-"День архитектора"                                                      on october 5
-"День бухгалтеров и аудиторов"                                          on october 6
-"Всемирный день почты"                                                  on october 9
-"День библиотекаря"                                                     on october 15
-"День работников связи"                                                 on october 20
-"День работников автомобильного транспорта"                             on october 28
+"День работников атомной отрасли"                                       civil on september 28
+"День архитектора"                                                      civil on october 5
+"День бухгалтеров и аудиторов"                                          civil on october 6
+"Всемирный день почты"                                                  civil on october 9
+"День библиотекаря"                                                     civil on october 15
+"День работников связи"                                                 civil on october 20
+"День работников автомобильного транспорта"                             civil on october 28
 :: Teacher’s Day
-"День учителя"                                                          on first sunday in october
+"День учителя"                                                          civil on first sunday in october
 :: National Currency Day
-"День национальной валюты. День финансистов"                            on november 15
-"День студентов"                                                        on november 17
-"День ракетных войск и артиллерии"                                      on november 17
-"День сотрудников дорожной полиции"                                     on november 23
+"День национальной валюты. День финансистов"                            civil on november 15
+"День студентов"                                                        civil on november 17
+"День ракетных войск и артиллерии"                                      civil on november 17
+"День сотрудников дорожной полиции"                                     civil on november 23
 :: Agriculture Workers’ Day
-"День работников сельского хозяйства"                                   on third sunday in november
-"День образования таможенной службы РК"                                 on december 12
-"День экономистов"                                                      on december 25
+"День работников сельского хозяйства"                                   civil on third sunday in november
+"День образования таможенной службы РК"                                 civil on december 12
+"День экономистов"                                                      civil on december 25
 :: Power Engineer’s Day
-"День энергетика"                                                       on third sunday in december
+"День энергетика"                                                       civil on third sunday in december
diff --git a/kholidays/holidays/plan2/holiday_lt_lt b/kholidays/holidays/plan2/holiday_lt_lt
index 4c5ba12..344dec2 100644
--- a/kholidays/holidays/plan2/holiday_lt_lt
+++ b/kholidays/holidays/plan2/holiday_lt_lt
@@ -18,34 +18,34 @@ language    "lt"
 :description "(please add description in source language) National holiday file for Lithuania"
 
 :: Public Holidays
-"Naujieji metai"                                            weekend on january 1
-"Lietuvos valstybės atkūrimo diena"                         weekend on february 16
-"Lietuvos nepriklausomybės atkūrimo diena"                  weekend on march 11
-"Velykos"                                                   weekend on easter length 2 days
-"TarptautinÄ— darbo diena"                                   weekend on may 1
-"Motinos diena"                                             weekend on first sunday in may
-"Rasos (JoninÄ—s)"                                           weekend on june 24
-"Valstybės (Lietuvos karaliaus Mindaugo karūnavimo) diena"  weekend on july 6
-"Žolinė (Švč. Mergelės Marijos ėmimo į dangų diena)"        weekend on august 15
-"Visų Šventųjų diena"                                       weekend on november 1
-"KalÄ—dos"                                                   weekend on december 25 length 2 days
+"Naujieji metai"                                            public on january 1
+"Lietuvos valstybės atkūrimo diena"                         public on february 16
+"Lietuvos nepriklausomybės atkūrimo diena"                  public on march 11
+"Velykos"                                                   public on easter length 2 days
+"TarptautinÄ— darbo diena"                                   public on may 1
+"Motinos diena"                                             public on first sunday in may
+"Rasos (JoninÄ—s)"                                           public on june 24
+"Valstybės (Lietuvos karaliaus Mindaugo karūnavimo) diena"  public on july 6
+"Žolinė (Švč. Mergelės Marijos ėmimo į dangų diena)"        public on august 15
+"Visų Šventųjų diena"                                       public on november 1
+"KalÄ—dos"                                                   public on december 25 length 2 days
 
 :: Religious
-"Trys karaliai"                                             on january 6
-"Pelenų diena"                                              on easter minus 46 days
-"Verbų sekmadienis"                                         on easter minus 7 days
-"Didysis penktadienis"                                      on easter minus 2 days
-"SekminÄ—s"                                                  on easter plus 49 days
-"Kūčios"                                                    on december 24
-:"GavÄ—nia"                                                  on easter minus 45 days length 44 days
-:"Adventas"                                                 on november 28 length 27 days
+"Trys karaliai"                                             religious on january 6
+"Pelenų diena"                                              religious on easter minus 46 days
+"Verbų sekmadienis"                                         religious on easter minus 7 days
+"Didysis penktadienis"                                      religious on easter minus 2 days
+"SekminÄ—s"                                                  religious on easter plus 49 days
+"Kūčios"                                                    religious on december 24
+:"GavÄ—nia"                                                  religious on easter minus 45 days length 44 days
+:"Adventas"                                                 religious on november 28 length 27 days
 
 :: Financial
 
 :: Cultural
-"Å v. Valentino diena"                                       on february 14
-"Užgavėnės"                                                 on easter minus 47 days
-"Melagio diena"                                             on april 1
+"Å v. Valentino diena"                                       cultural on february 14
+"Užgavėnės"                                                 cultural on easter minus 47 days
+"Melagio diena"                                             cultural on april 1
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_lu_fr b/kholidays/holidays/plan2/holiday_lu_fr
index 0d0e83b..63d3470 100644
--- a/kholidays/holidays/plan2/holiday_lu_fr
+++ b/kholidays/holidays/plan2/holiday_lu_fr
@@ -17,18 +17,18 @@ language    "fr"
 :description "(please add description in source language) National holiday file for Luxembourg"
 
 :: Public Holidays
-"Nouvel an"           weekend on january 1
-"Pâques"              weekend on easter
-"Lundi de Pâques"     weekend on easter plus 1 day
-"Fête du travail"     weekend on may 1
-"Ascension"           weekend on easter plus 39 days
-"Pentecôte"           weekend on easter plus 49 days
-"Lundi de Pentecôte"  weekend on easter plus 50 days
-"Fête nationale"      weekend on june 23
-"Assomption"          weekend on august 15
-"Toussaint"           weekend on november 1
-"Noël"                weekend on december 25
-"Saint-Étienne"       weekend on december 26
+"Nouvel an"           public on january 1
+"Pâques"              public religious on easter
+"Lundi de Pâques"     public on easter plus 1 day
+"Fête du travail"     public on may 1
+"Ascension"           public religious on easter plus 39 days
+"Pentecôte"           public religious on easter plus 49 days
+"Lundi de Pentecôte"  public religious on easter plus 50 days
+"Fête nationale"      public on june 23
+"Assomption"          public religious on august 15
+"Toussaint"           public religious on november 1
+"Noël"                public religious on december 25
+"Saint-Étienne"       public religious on december 26
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_lu_lb b/kholidays/holidays/plan2/holiday_lu_lb
index b9a62e8..5e984c0 100644
--- a/kholidays/holidays/plan2/holiday_lu_lb
+++ b/kholidays/holidays/plan2/holiday_lu_lb
@@ -17,18 +17,18 @@ language    "lb"
 :description "(please add description in source language) National holiday file for Luxembourg"
 
 :: Public Holidays
-"Neijoerschdag"        weekend on january 1
-"Ouschteren"           weekend on easter
-"Ouschterméindeg"      weekend on easter plus 1 day
-"Éischte Mee"          weekend on may 1
-"Christihimmelfahrt"   weekend on easter plus 39 days
-"Péngschten"           weekend on easter plus 49 days
-"Päischtméindeg"       weekend on easter plus 50 days
-"Nationale Feierdag"   weekend on june 23
-"Maria Himmelfahrt"    weekend on august 15
-"Allerhellegen"        weekend on november 1
-"Chrëschtdag"          weekend on december 25
-"Stiefesdag"           weekend on december 26
+"Neijoerschdag"        public on january 1
+"Ouschteren"           public religious on easter
+"Ouschterméindeg"      public on easter plus 1 day
+"Éischte Mee"          public on may 1
+"Christihimmelfahrt"   public religious on easter plus 39 days
+"Péngschten"           public religious on easter plus 49 days
+"Päischtméindeg"       public religious on easter plus 50 days
+"Nationale Feierdag"   public on june 23
+"Maria Himmelfahrt"    public religious on august 15
+"Allerhellegen"        public religious on november 1
+"Chrëschtdag"          public religious on december 25
+"Stiefesdag"           public on december 26
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_lv_lv b/kholidays/holidays/plan2/holiday_lv_lv
index 830d9d6..c98ceaf 100644
--- a/kholidays/holidays/plan2/holiday_lv_lv
+++ b/kholidays/holidays/plan2/holiday_lv_lv
@@ -20,96 +20,96 @@ language    "lv"
 
 :: Public Holidays
 : New Year's Day
-"Jaunais Gads"                                                      weekend on january 1
+"Jaunais Gads"                                                      public on january 1
 : Easter Friday
-"Lielā Piektdiena"                                                  weekend on easter minus 2 days
+"Lielā Piektdiena"                                                  public religious on easter minus 2 days
 : Easter
-"Lieldienas"                                                        weekend on easter
+"Lieldienas"                                                        public religious on easter
 : Easter Monday
-"2. Lieldienas"                                                     weekend on easter plus 1 days
+"2. Lieldienas"                                                     public on easter plus 1 days
 : Labour Day & Convocation of the Constitutional Assembly
-"Darba svētki"                                                      weekend on may 1
+"Darba svētki"                                                      public on may 1
 : Independence Day
-"Neatkarības deklarācijas pasludināšanas diena"                     weekend on may 4
-"Neatkarības deklarācijas pasludināšanas diena"                     weekend on ( ( ( [may 4] == [saturday after ([may 4])] ) ||
+"Neatkarības deklarācijas pasludināšanas diena"                     public on may 4
+"Neatkarības deklarācijas pasludināšanas diena"                     public on ( ( ( [may 4] == [saturday after ([may 4])] ) ||
                                                                                  ( [may 4] == [sunday after ([may 4])] ) ) ?
                                                                                  [ monday after ([may 4]) ] :
                                                                                  noop )
 : Midsummers Eve
-"LÄ«go Diena"                                                        weekend on june 23
+"LÄ«go Diena"                                                        public on june 23
 : Midsummers Eve
-"Jāņi"                                                              weekend on june 23
+"Jāņi"                                                              public on june 23
 : Proclamation of the Republic of Latvia
-"Latvijas Republikas proklamēšanas diena"                           weekend on november 18
-"Latvijas Republikas proklamēšanas diena"                           weekend on ( ( ( [november 18] == [saturday after ([november 18])] ) ||
+"Latvijas Republikas proklamēšanas diena"                           public on november 18
+"Latvijas Republikas proklamēšanas diena"                           public on ( ( ( [november 18] == [saturday after ([november 18])] ) ||
                                                                                  ( [november 18] == [sunday after ([november 18])] ) ) ?
                                                                                  [ monday after ([november 18]) ] :
                                                                                  noop )
 : Christmas Eve
-"Ziemassvētku vakars"                                               weekend on december 24
+"Ziemassvētku vakars"                                               public religious on december 24
 : Christmas Day
-"Ziemassvētki"                                                      weekend on december 25
+"Ziemassvētki"                                                      public religious on december 25
 : Christmas Day No 2
-"2. Ziemassvētki"                                                   weekend on december 26
+"2. Ziemassvētki"                                                   public on december 26
 : New Year's Eve
-"Vecgada vakars"                                                    weekend on december 31
+"Vecgada vakars"                                                    public on december 31
 
 :: Religious Holidays
-"Vasarsvētkus"                                                      on easter plus 49 days
+"Vasarsvētkus"                                                      religious on easter plus 49 days
 
 :: Financial
 
 :: Commemorative
 : Commemoration Day of Defenders of the Barricades in 1991
-"1991. gada barikāžu aizstāvju atceres dienu"                       on january 20
+"1991. gada barikāžu aizstāvju atceres dienu"                       commemorative on january 20
 : International (de iure) Recognition of the Republic of Latvia
-"Latvijas Republikas starptautiskās (de jure) atzīšanas dienu"      on january 26
+"Latvijas Republikas starptautiskās (de jure) atzīšanas dienu"      commemorative on january 26
 : Commemoration Day of Victims of Communist Terror
-"Komunistiskā genocīda upuru piemiņas dienu"                        on march 25
+"Komunistiskā genocīda upuru piemiņas dienu"                        commemorative on march 25
 : The Defeat of Nazism and Commemoration Day of Victims of World War II
-"Nacisma sagrāves dienu un Otrā pasaules kara upuru piemiņas dienu" on may 8
+"Nacisma sagrāves dienu un Otrā pasaules kara upuru piemiņas dienu" commemorative on may 8
 : Commemoration Day of Victims of Communist Terror
-"Komunistiskā genocīda upuru piemiņas dienu"                        on june 14
+"Komunistiskā genocīda upuru piemiņas dienu"                        commemorative on june 14
 : Occupation of the Republic of Latvia
-"Latvijas Republikas okupācijas dienu"                              on june 17
+"Latvijas Republikas okupācijas dienu"                              commemorative on june 17
 : Heroes' Commemoration Day (Anniversary of the Battle of CÄ“sis)
-"Varoņu piemiņas dienu (Cēsu kaujas atceres dienu)"                 on june 22
+"Varoņu piemiņas dienu (Cēsu kaujas atceres dienu)"                 commemorative on june 22
 : Commemoration Day of Genocide against the Jews
-"Ebreju tautas genocīda upuru piemiņas dienu"                       on july 4
+"Ebreju tautas genocīda upuru piemiņas dienu"                       commemorative on july 4
 : Commemoration Day of The Latvian Freedom Fighters
-"Latvijas brīvības cīnītāju piemiņas dienu"                         on august 11
+"Latvijas brīvības cīnītāju piemiņas dienu"                         commemorative on august 11
 : Passing of the Constitutional Law on the Status of the Republic of Latvia as a State and Actual Restoration of the Republic of Latvia
-"Konstitucionālā likuma 'Par Latvijas Republikas valstisko statusu' pieņemšanas un Latvijas Republikas faktiskās neatkarības atjaunošanas dienu"    on august 21
+"Konstitucionālā likuma 'Par Latvijas Republikas valstisko statusu' pieņemšanas un Latvijas Republikas faktiskās neatkarības atjaunošanas dienu"    commemorative on august 21
 : Stalinist and Nazi Victims Memorial Day
-"Staļinisma un Nacisma upuru atceres dienu"                         on august 23
+"Staļinisma un Nacisma upuru atceres dienu"                         commemorative on august 23
 : Latvian Freedom Fighters' Remembrance Day - Lāčplēsis Day
-"Lāčplēša dienu"                                                    on november 11
+"Lāčplēša dienu"                                                    commemorative on november 11
 : Commemoration Day of Victims of Genocide Against the Latvian People by the Totalitarian Communist Regime.
-"Pret latviešu tautu vērstā totalitārā komunistiskā režīma genocīda upuru piemiņas dienu"   on 1st sunday in december
+"Pret latviešu tautu vērstā totalitārā komunistiskā režīma genocīda upuru piemiņas dienu"   commemorative on 1st sunday in december
 
 :: Cultural
 : International Women’s Day
-"Starptautisko sieviešu dienu"                                      on march 8
+"Starptautisko sieviešu dienu"                                      cultural on march 8
 : Europe Day
-"Eiropas dienu"                                                     on may 9
+"Eiropas dienu"                                                     cultural on may 9
 : Mothers Day
-"Mātes dienu"                                                       on second sunday in may
+"Mātes dienu"                                                       cultural on second sunday in may
 : International Day of The Family
-"Starptautisko ģimenes dienu"                                       on may 15
+"Starptautisko ģimenes dienu"                                       cultural on may 15
 : International Children’s Day
-"Starptautisko bērnu aizsardzības dienu"                            on june 1
+"Starptautisko bērnu aizsardzības dienu"                            cultural on june 1
 : Sea Festival Day
-"Jūras svētku dienu"                                                on 2nd saturday in july
+"Jūras svētku dienu"                                                cultural on 2nd saturday in july
 : Knowledge Day (First Day of School)
-"Zinību dienu"                                                      on september 1
+"Zinību dienu"                                                      cultural on september 1
 : Father's Day
-"TÄ“va dienu"                                                        on second sunday in september
+"TÄ“va dienu"                                                        cultural on second sunday in september
 : Baltic Unity Day
-"Baltu vienības dienu"                                              on september 22
+"Baltu vienības dienu"                                              cultural on september 22
 : International Day of Older Persons
-"Starptautisko veco ļaužu dienu"                                    on october 1
+"Starptautisko veco ļaužu dienu"                                    cultural on october 1
 : Teacher’s Day
-"Skolotāju dienu"                                                   on 1st sunday in october
+"Skolotāju dienu"                                                   cultural on 1st sunday in october
 
 :: School
 
diff --git a/kholidays/holidays/plan2/holiday_ma_ar b/kholidays/holidays/plan2/holiday_ma_ar
index c87a86f..4386cea 100644
--- a/kholidays/holidays/plan2/holiday_ma_ar
+++ b/kholidays/holidays/plan2/holiday_ma_ar
@@ -19,33 +19,33 @@ description "National holiday file for Morocco"
 
 :: National Holidays
 : New Year's Day
-"رأس السنة الميلادية"                    weekend on january 1
+"رأس السنة الميلادية"                    public on january 1
 : Proclamation of Independence
-"تقديم وثيقة الاستقلال"                  weekend on january 11
+"تقديم وثيقة الاستقلال"                  public on january 11
 : Labour Day
-"عيد الشغل"                               weekend on may 1
+"عيد الشغل"                               public on may 1
 : Enthronement Day
-"عيد العرش"                             weekend on july 30
+"عيد العرش"                             public on july 30
 : Oued Ed-Dahab Day
-"يوم وادي الذهب"                       weekend on august 14
+"يوم وادي الذهب"                       public on august 14
 : Revolution of the King and the People
-"ذكرى ثورة الملك والشعب"               weekend on august 20
+"ذكرى ثورة الملك والشعب"               public on august 20
 : Birthday of King Mohammed VI
-"عيد الشباب"                          weekend on august 21
+"عيد الشباب"                          public on august 21
 : Green March
-"ذكرى المسيرة الخضراء"                weekend on november 6
+"ذكرى المسيرة الخضراء"                public on november 6
 : Independence day
-"عيد الاستقلال"                       weekend on november 18
+"عيد الاستقلال"                       public on november 18
 
 :: Religious Holidays
 : Islamic New Year
-"رأس السنة الهجرية"             weekend on hijri muharram 1
+"رأس السنة الهجرية"             public religious on hijri muharram 1
 : Birthday of the Prophet Muhammad
-"عيد المولد النبوي الشريف"     weekend on hijri rabialawal 12
+"عيد المولد النبوي الشريف"     public religious on hijri rabialawal 12
 : Eid el-Fitr (End of Ramadan)
-"عيد الفطر"            weekend on hijri shawwal 1 length 2
+"عيد الفطر"            public religious on hijri shawwal 1 length 2
 : Eid al-Adha (End of the Hajj)
-"عيد الأضحى"      weekend on hijri thualhijjah 10 length 2
+"عيد الأضحى"      public religious on hijri thualhijjah 10 length 2
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_ma_fr b/kholidays/holidays/plan2/holiday_ma_fr
index 8f86e7f..f0c6a05 100644
--- a/kholidays/holidays/plan2/holiday_ma_fr
+++ b/kholidays/holidays/plan2/holiday_ma_fr
@@ -20,33 +20,33 @@ description "Fêtes et jours fériés au Maroc"
 :: National Holidays
 
 : New Year's Day
-"Jour de l'an"            weekend on january 1
+"Jour de l'an"                                  public on january 1
 : Proclamation of Independence
-"Anniversaire du manifeste de l'indépendance" weekend on january 11
+"Anniversaire du manifeste de l'indépendance"   public on january 11
 : Labour Day
-"Fête du Travail"                   weekend on may 1
+"Fête du Travail"                               public on may 1
 : Enthronement Day
-"Fête du trône"                     weekend on july 30
+"Fête du trône"                                 public on july 30
 : Oued Ed-Dahab Day
-"Journée de Oued Ed-Dahab"          weekend on august 14
+"Journée de Oued Ed-Dahab"                      public on august 14
 : Revolution of the King and the People
-"Fête de la révolution du Roi et du peuple"     weekend on august 20
+"Fête de la révolution du Roi et du peuple"     public on august 20
 : Birthday of King Mohammed VI
-"Anniversaire de sa majesté le roi Mohammed VI" weekend on august 21
+"Anniversaire de sa majesté le roi Mohammed VI" public on august 21
 : Green March
-"Anniversaire de la Marche Verte"       weekend on november 6
+"Anniversaire de la Marche Verte"               public on november 6
 : Independence day
-"Fête de l'Indépendance"        weekend on november 18
+"Fête de l'Indépendance"                        public on november 18
 
 :: Religious Holidays
 : Islamic New Year
-"Awal muharram"            weekend on hijri muharram 1
+"Awal muharram"                                 public religious on hijri muharram 1
 : Birthday of the Prophet Muhammad
-"Mawlid nabaoui"         weekend on hijri rabialawal 12
+"Mawlid nabaoui"                                public religious on hijri rabialawal 12
 : Eid el-Fitr (End of Ramadan)
-"Aïd el-Fitr"                    weekend on hijri shawwal 1 length 2
+"Aïd el-Fitr"                                   public religious on hijri shawwal 1 length 2
 : Eid al-Adha (End of the Hajj)
-"Aïd El Adha"                    weekend on hijri thualhijjah 10 length 2
+"Aïd El Adha"                                   public religious on hijri thualhijjah 10 length 2
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_mq_fr b/kholidays/holidays/plan2/holiday_mq_fr
index 18d5ee3..e83d28e 100644
--- a/kholidays/holidays/plan2/holiday_mq_fr
+++ b/kholidays/holidays/plan2/holiday_mq_fr
@@ -33,91 +33,91 @@ description "Fêtes et jours fériés en Martinique"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 : Good Friday
-"Vendredi saint"            weekend on easter minus 2 days
+"Vendredi saint"            public religious on easter minus 2 days
 : Abolition of Slavery
-"Abolition de l'esclavage"  weekend on may 22
-"Fête Victor Schoelcher"    weekend on july 21
-"St Étienne"                weekend on december 26
+"Abolition de l'esclavage"  public on may 22
+"Fête Victor Schoelcher"    public on july 21
+"St Étienne"                public religious on december 26
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Day of the dead
-"Fête des morts"            on november 2
+"Fête des morts"            religious on november 2
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural  on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on march 20
+"Printemps"                 seasonal on march 20
 : Summer
-"Été"                       on june 21
+"Été"                       seasonal on june 21
 : Fall
-"Automne"                   on september 23
+"Automne"                   seasonal on september 23
 : Winter
-"Hiver"                     on december 21
+"Hiver"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_mx_es b/kholidays/holidays/plan2/holiday_mx_es
index af8e12a..df100a7 100644
--- a/kholidays/holidays/plan2/holiday_mx_es
+++ b/kholidays/holidays/plan2/holiday_mx_es
@@ -17,23 +17,23 @@ language    "es"
 :description "(please add description in source language) National holiday file for Mexico"
 
 :: Public Holidays
-"Año Nuevo"                         weekend on january 1
-"Día de la Constitución"            weekend on february 5
-"Día del trabajo"                   weekend on may 1
-"Día de la Independencia"           weekend on september 16
-"Natalicio de Benito Juárez"        weekend on march 21
-"Navidad"                           weekend on december 25
-"Día de la Revolución"              weekend on november 20
+"Año Nuevo"                         public on january 1
+"Día de la Constitución"            public on february 5
+"Día del trabajo"                   public on may 1
+"Día de la Independencia"           public on september 16
+"Natalicio de Benito Juárez"        public on march 21
+"Navidad"                           public religious on december 25
+"Día de la Revolución"              public on november 20
 
 :: Religious
-"Día de los Reyes"                  on january 6
-"Domingo de Pascua"                 on easter
-"Sábado de Gloria"                  on easter minus 1
-"Viérnes Santo"                     on easter minus 2
-"Jueves Santo"                      on easter minus 3
-"Día de Todos los Santos"           on november 1
-"Día de los Fieles Difuntos"        on november 2
-"Día de Vírgen de Guadalupe"        on december 12
+"Día de los Reyes"                  religious on january 6
+"Domingo de Pascua"                 religious on easter
+"Sábado de Gloria"                  religious on easter minus 1
+"Viérnes Santo"                     religious on easter minus 2
+"Jueves Santo"                      religious on easter minus 3
+"Día de Todos los Santos"           religious on november 1
+"Día de los Fieles Difuntos"        religious on november 2
+"Día de Vírgen de Guadalupe"        religious on december 12
 
 :: Financial
 
@@ -44,17 +44,17 @@ language    "es"
 :: Daylight Saving
 
 :: Seasons
-"Equinoxio de primavera"            on march 21
-"Solsticio de verano"               on june 21
-"Equinoxio de otoño"                on september 21
-"Solsticio de invierno"             on december 21
+"Equinoxio de primavera"            seasonal on march 21
+"Solsticio de verano"               seasonal on june 21
+"Equinoxio de otoño"                seasonal on september 21
+"Solsticio de invierno"             seasonal on december 21
 
 :: Name Days
 
 
 :: To be sorted
-"Día de la expropiación petrolera"  on march 18
-"Batalla de Puebla"                 on may 5
-"Día de la Madre"                   on may 10
-"Día de la Raza"                    on october 12
-"Día de los Santos Inocentes"       on december 28
+"Día de la expropiación petrolera"  civil on march 18
+"Batalla de Puebla"                 civil on may 5
+"Día de la Madre"                   civil on may 10
+"Día de la Raza"                    civil on october 12
+"Día de los Santos Inocentes"       civil on december 28
diff --git a/kholidays/holidays/plan2/holiday_na_en-gb b/kholidays/holidays/plan2/holiday_na_en-gb
index 339430d..4ccf790 100644
--- a/kholidays/holidays/plan2/holiday_na_en-gb
+++ b/kholidays/holidays/plan2/holiday_na_en-gb
@@ -13,22 +13,22 @@
 :: Metadata
 country     "NA"
 language    "en_GB"
-:name        "optional - defaults to country name"
-:description "(please add description in source language) National holiday file for Namibia"
+:name       "optional - defaults to country name"
+description "National holiday file for Namibia"
 
 :: Public Holidays
-"New Year's Day"                  on january 1 shift to monday if sunday
-"Independence Day"                on march 21 shift to monday if sunday
-"Good Friday"                     on easter minus 2 day
-"Easter Monday"                   on easter plus 1 day
-"Ascension Day"                   on easter plus 39 days
-"Workers Day"                     on may 1 shift to monday if sunday
-"Cassinga Day"                    on may 4 shift to monday if sunday
-"Africa Day"                      on may 25 shift to monday if sunday
-"Heroes Day"                      on august 26 shift to monday if sunday
-"International Human Rights Day"  on december 10 shift to monday if sunday
-"Christmas Day"                   on december 25 shift to monday if sunday
-"Family Day"                      on december 26 shift to monday if sunday
+"New Year's Day"                  public on january 1 shift to monday if sunday
+"Independence Day"                public on march 21 shift to monday if sunday
+"Good Friday"                     public religious on easter minus 2 day
+"Easter Monday"                   public on easter plus 1 day
+"Ascension Day"                   public religious on easter plus 39 days
+"Workers Day"                     public on may 1 shift to monday if sunday
+"Cassinga Day"                    public on may 4 shift to monday if sunday
+"Africa Day"                      public on may 25 shift to monday if sunday
+"Heroes Day"                      public on august 26 shift to monday if sunday
+"International Human Rights Day"  public on december 10 shift to monday if sunday
+"Christmas Day"                   public religious on december 25 shift to monday if sunday
+"Family Day"                      public on december 26 shift to monday if sunday
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_nc_fr b/kholidays/holidays/plan2/holiday_nc_fr
index f4f7ae4..2b33932 100644
--- a/kholidays/holidays/plan2/holiday_nc_fr
+++ b/kholidays/holidays/plan2/holiday_nc_fr
@@ -33,89 +33,89 @@ description "Fêtes et jours fériés en Nouvelle-Calédonie"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
-"Fête de la citoyenneté"    weekend on september 24
+"Fête de la citoyenneté"    public on september 24
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on september 23
+"Printemps"                 seasonal on september 23
 : Summer
-"Été"                       on december 21
+"Été"                       seasonal on december 21
 : Fall
-"Automne"                   on march 20
+"Automne"                   seasonal on march 20
 : Winter
-"Hiver"                     on june 21
+"Hiver"                     seasonal on june 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_nl_nl b/kholidays/holidays/plan2/holiday_nl_nl
index fe9f263..ea6928a 100644
--- a/kholidays/holidays/plan2/holiday_nl_nl
+++ b/kholidays/holidays/plan2/holiday_nl_nl
@@ -11,7 +11,7 @@
 :: Source:
 ::
 :: Note:     Goede Vrijdag and Bevrijdingsdag are not holidays for
-::           everybody, therefore I don't put them in the "weekend" color.
+::           everybody, therefore I don't put them in the "public" category.
 ::           Government employees usually have these days off, for other
 ::           categories it varies.  Check with your employer!
 ::
@@ -23,56 +23,56 @@ language    "nl"
 :description "(please add description in source language) National holiday file for Netherlands"
 
 :: Public Holidays
-"Nieuwjaar"                                              weekend on january 1
-"Pasen"                                                  weekend on easter length 2 days
-"Hemelvaart"                                             weekend on easter plus 39 days
-"Pinksteren"                                             weekend on easter plus 49 days length 2 days
-"Koninginnedag"                                          weekend on april 30 shift to monday if sunday
-"Kerstmis"                                               weekend on december 25 length 2 days
+"Nieuwjaar"                                              public on january 1
+"Pasen"                                                  public religious on easter length 2 days
+"Hemelvaart"                                             public religious on easter plus 39 days
+"Pinksteren"                                             public on easter plus 49 days length 2 days
+"Koninginnedag"                                          public on april 30 shift to monday if sunday
+"Kerstmis"                                               public religious on december 25 length 2 days
 
 :: Religious Holidays
-"Driekoningen"                                           on january 6
-:"Septuagesima (zeventigste)"                             on easter minus 63 days
-:"Sexagesima (zestigste)"                                 on easter minus 56 days
-:"Quinquagesima (vijftigste)"                             on easter minus 49 days
-"Vastenavond"                                            on easter minus 47 days
-"Aswoensdag"                                             on easter minus 46 days
-:"Invocabit (roept Hij mij aan, begin Veertigdagentijd)"  on easter minus 42 days
-:"Reminiscere (gedenk)"                                   on easter minus 35 days
-:"Oculi (ogen)"                                           on easter minus 28 days
-:"Laetare (verheugt u)"                                   on easter minus 21 days
-:"Judica (doe recht)"                                     on easter minus 14 days
-"Palmzondag"                                             on easter minus 7 days
-"Witte Donderdag"                                        on easter minus 3 days
-"Goede Vrijdag"                                          on easter minus 2 days
-:"Quasi modo geniti (als pasgeboren kinderen)"            on easter plus 7 days
-:"Misericordias Domini (trouw van de Heer)"               on easter plus 14 days
-:"Jubilate (juicht)"                                      on easter plus 21 days
-:"Cantate (zingt)"                                        on easter plus 28 days
-:"Rogate (bidt)"                                          on easter plus 35 days
-:"Exaudi (hoor)"                                          on easter plus 42 days
-:"Trinitatis (drie-eenheid)"                              on easter plus 56 days
-"Hervormingsdag"                                         on october 31
-"Allerheiligen"                                          on november 1
-"Allerzielen"                                            on november 2
-:"Laatste zondag kerkelijk jaar"                          on sunday before november 26
-:"Eerste advent"                                          on sunday before december 3
-:"Tweede advent"                                          on sunday before december 10
-:"Derde advent (Gaudete)"                                 on sunday before december 17
-:"Vierde advent (Rorate)"                                 on sunday before december 24
+"Driekoningen"                                            religious on january 6
+:"Septuagesima (zeventigste)"                             religious on easter minus 63 days
+:"Sexagesima (zestigste)"                                 religious on easter minus 56 days
+:"Quinquagesima (vijftigste)"                             religious on easter minus 49 days
+"Vastenavond"                                             religious on easter minus 47 days
+"Aswoensdag"                                              religious on easter minus 46 days
+:"Invocabit (roept Hij mij aan, begin Veertigdagentijd)"  religious on easter minus 42 days
+:"Reminiscere (gedenk)"                                   religious on easter minus 35 days
+:"Oculi (ogen)"                                           religious on easter minus 28 days
+:"Laetare (verheugt u)"                                   religious on easter minus 21 days
+:"Judica (doe recht)"                                     religious on easter minus 14 days
+"Palmzondag"                                              religious on easter minus 7 days
+"Witte Donderdag"                                         religious on easter minus 3 days
+"Goede Vrijdag"                                           religious on easter minus 2 days
+:"Quasi modo geniti (als pasgeboren kinderen)"            religious on easter plus 7 days
+:"Misericordias Domini (trouw van de Heer)"               religious on easter plus 14 days
+:"Jubilate (juicht)"                                      religious on easter plus 21 days
+:"Cantate (zingt)"                                        religious on easter plus 28 days
+:"Rogate (bidt)"                                          religious on easter plus 35 days
+:"Exaudi (hoor)"                                          religious on easter plus 42 days
+:"Trinitatis (drie-eenheid)"                              religious on easter plus 56 days
+"Hervormingsdag"                                          religious on october 31
+"Allerheiligen"                                           religious on november 1
+"Allerzielen"                                             religious on november 2
+:"Laatste zondag kerkelijk jaar"                          religious on sunday before november 26
+:"Eerste advent"                                          religious on sunday before december 3
+:"Tweede advent"                                          religious on sunday before december 10
+:"Derde advent (Gaudete)"                                 religious on sunday before december 17
+:"Vierde advent (Rorate)"                                 religious on sunday before december 24
 
 :: Financial
 
 :: Cultural
-"Moederdag"                                              on every second sunday in may
-"Vaderdag"                                               on every third sunday in june
-"Oudjaar"                                                on december 31
+"Moederdag"                                              cultural on every second sunday in may
+"Vaderdag"                                               cultural on every third sunday in june
+"Oudjaar"                                                cultural on december 31
 
 :: School
 
 :: Daylight Saving
-"Zomertijd"                                              on last sunday in march
-"Wintertijd"                                             on last sunday in october
+"Zomertijd"                                              seasonal on last sunday in march
+"Wintertijd"                                             seasonal on last sunday in october
 
 :: Seasons
 
@@ -80,6 +80,6 @@ language    "nl"
 
 
 :: To be sorted
-"Dodenherdenking"                                        on may 4
-"Bevrijdingsdag"                                         on may 5
-"Dierendag"                                              on october 4
+"Dodenherdenking"                                        civil on may 4
+"Bevrijdingsdag"                                         civil on may 5
+"Dierendag"                                              civil on october 4
diff --git a/kholidays/holidays/plan2/holiday_no_nb b/kholidays/holidays/plan2/holiday_no_nb
index 303c636..1f88b82 100644
--- a/kholidays/holidays/plan2/holiday_no_nb
+++ b/kholidays/holidays/plan2/holiday_no_nb
@@ -17,76 +17,77 @@ language    "nb"
 :description "(please add description in source language) National holiday file for Norway"
 
 :: Public Holidays
-"Nyttårsdag"                                     weekend on january 1
-"Palmesøndag"                                    weekend on easter minus 7
-"Skjærtorsdag"                                   weekend on easter minus 3
-"Langfredag"                                     weekend on easter minus 2
-"Første påskedag"                                weekend on easter
-"Andre påskedag"                                 weekend on easter plus 1
-"Arbeidernes internasjonale kampdag"             weekend on may 1
-"Grunnlovsdagen"                                 weekend on may 17
-"Kristi himmelfartsdag"                          weekend on easter plus 39 days
-"Første pinsedag"                                weekend on easter plus 49 days
-"Andre pinsedag"                                 weekend on easter plus 50 days
-"Første juledag"                                 weekend on december 25
-"Andre juledag"                                  weekend on december 26
+"Nyttårsdag"                                     public on january 1
+"Palmesøndag"                                    public religious on easter minus 7
+"Skjærtorsdag"                                   public religious on easter minus 3
+"Langfredag"                                     public religious on easter minus 2
+"Første påskedag"                                public religious on easter
+"Andre påskedag"                                 public on easter plus 1
+"Arbeidernes internasjonale kampdag"             public on may 1
+"Grunnlovsdagen"                                 public on may 17
+"Kristi himmelfartsdag"                          public religious on easter plus 39 days
+"Første pinsedag"                                public religious on easter plus 49 days
+"Andre pinsedag"                                 public religious on easter plus 50 days
+"Første juledag"                                 public religious on december 25
+"Andre juledag"                                  public on december 26
 
 :: Religious
 :: PÃ¥ske og pinse
-"Fastelavnssøndag"                               on easter minus 49
-"Fetetirsdag"                                    on easter minus 47
-"Askeonsdag"                                     on easter minus 46
-"PÃ¥skeaften"                                     on easter minus 1
-"Pinseaften"                                     on easter plus 48 days
-"Bots- og bededag"                               on last sunday in october
+"Fastelavnssøndag"                               religious on easter minus 49
+"Fetetirsdag"                                    religious on easter minus 47
+"Askeonsdag"                                     religious on easter minus 46
+"PÃ¥skeaften"                                     religious on easter minus 1
+"Pinseaften"                                     religious on easter plus 48 days
+"Bots- og bededag"                               religious on last sunday in october
 :: Jul
-"Første søndag i advent"                         on sunday before 24.12 minus 21 days
-"Andre søndag i advent"                          on sunday before 24.12 minus 14 days
-"Tredje søndag i advent"                         on sunday before 24.12 minus 7 days
-"Fjerde søndag i advent"                         on sunday before 24.12
-"Luciadagen"                                     on 13.12
-"Lille julaften"                                 on 23.12
-"Julaften"                                       on 24.12
+"Første søndag i advent"                         religious on sunday before december 24 minus 21 days
+"Andre søndag i advent"                          religious on sunday before december 24 minus 14 days
+"Tredje søndag i advent"                         religious on sunday before december 24 minus 7 days
+"Fjerde søndag i advent"                         religious on sunday before december 24
+"Luciadagen"                                     religious on december 13
+"Lille julaften"                                 religious on december 23
+"Julaften"                                       religious on december 24
 
 :: Financial
 
 :: Cultural
 :: Mors- og farsdag
-"Morsdag"                                        on second sunday in february
-"Farsdag"                                        on second sunday in november
+"Morsdag"                                        cultural on second sunday in february
+"Farsdag"                                        cultural on second sunday in november
+
 :: Offisielle flaggdager som ikke er høytidssager
-"H.K.H. Prinsesse Ingrid Alexandras fødselsdag"  on january 21
-"Samefolkets dag"                                on february 6
-"H.M. Kong Harald Vs fødselsdag"                 on february 21
-"Frigjøringsdagen 1945"                          on may 8
-"H.M. Dronning Sonjas fødselsdag"                on july 4
-"H.K.H. Kronprins Haakon Magnus’ fødselsdag"     on july 20
-"Olsokdagen"                                     on july 29
-"H.K.H. Kronprinsesse Mette-Marits fødselsdag"  on august 19
+"H.K.H. Prinsesse Ingrid Alexandras fødselsdag"  civil on january 21
+"Samefolkets dag"                                civil on february 6
+"H.M. Kong Harald Vs fødselsdag"                 civil on february 21
+"Frigjøringsdagen 1945"                          civil on may 8
+"H.M. Dronning Sonjas fødselsdag"                civil on july 4
+"H.K.H. Kronprins Haakon Magnus’ fødselsdag"     civil on july 20
+"Olsokdagen"                                     civil on july 29
+"H.K.H. Kronprinsesse Mette-Marits fødselsdag"   civil on august 19
 :: Nyttår
-"Nyttårsaften" on 31.12
+"Nyttårsaften"                                   civil on december 31
 :: Andre
-"Valentinsdagen"                                 on february 14
+"Valentinsdagen"                                 cultural on february 14
 :: Original version was "on 29.2" but appears every year in error due to no validity checking
 :: Re-enable when new parser which has noop ability
-::"Skuddårsdagen"                                  on ((leapyear year) ? [2/29] : noop)
-"Den internasjonale kvinnedagen"                 on march 8
-"Aprilsnarr"                                     on april 1
-"Unionsoppløsningen 1905"                        on june 7
-"Sankthansaften"                                 on june 23
-"Sankthansdagen"                                 on june 24
-"Mikkelsmesse"                                   on september 29
-"FN-dagen"                                       on october 24
-"Allehelgensaften"                               on october 31
-"Allehelgensdag"                                 on first sunday in november
+::"Skuddårsdagen"                                cultural on ((leapyear year) ? [2/29] : noop)
+"Den internasjonale kvinnedagen"                 cultural on march 8
+"Aprilsnarr"                                     cultural on april 1
+"Unionsoppløsningen 1905"                        cultural on june 7
+"Sankthansaften"                                 cultural on june 23
+"Sankthansdagen"                                 cultural on june 24
+"Mikkelsmesse"                                   cultural on september 29
+"FN-dagen"                                       cultural on october 24
+"Allehelgensaften"                               cultural on october 31
+"Allehelgensdag"                                 cultural on first sunday in november
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Sommertid starter"                              on last sunday in march
-"Vintertid starter"                              on last sunday in october
+"Sommertid starter"                              seasonal on last sunday in march
+"Vintertid starter"                              seasonal on last sunday in october
 
 :: Name Days
 
diff --git a/kholidays/holidays/plan2/holiday_no_nn b/kholidays/holidays/plan2/holiday_no_nn
index 76ea181..2542086 100644
--- a/kholidays/holidays/plan2/holiday_no_nn
+++ b/kholidays/holidays/plan2/holiday_no_nn
@@ -17,74 +17,74 @@ language    "nn"
 :description "(please add description in source language) National holiday file for Norway"
 
 :: Public Holidays
-"Nyttårsdag"                                     weekend on january 1
-"Palmesøndag"                                    weekend on easter minus 7
-"Skjærtorsdag"                                   weekend on easter minus 3
-"Langfredag"                                     weekend on easter minus 2
-"Første påskedag"                                weekend on easter
-"Andre påskedag"                                 weekend on easter plus 1
-"Arbeidaranes internasjonale kampdag"            weekend on may 1
-"Grunnlovsdagen"                                 weekend on may 17
-"Kristi himmelfartsdag"                          weekend on easter plus 39 days
-"Første pinsedag"                                weekend on easter plus 49 days
-"Andre pinsedag"                                 weekend on easter plus 50 days
-"Første juledag"                                 weekend on december 25
-"Andre juledag"                                  weekend on december 26
+"Nyttårsdag"                                     public on january 1
+"Palmesøndag"                                    public religious on easter minus 7
+"Skjærtorsdag"                                   public religious on easter minus 3
+"Langfredag"                                     public religious on easter minus 2
+"Første påskedag"                                public religious on easter
+"Andre påskedag"                                 public on easter plus 1
+"Arbeidaranes internasjonale kampdag"            public on may 1
+"Grunnlovsdagen"                                 public on may 17
+"Kristi himmelfartsdag"                          public religious on easter plus 39 days
+"Første pinsedag"                                public religious on easter plus 49 days
+"Andre pinsedag"                                 public religious on easter plus 50 days
+"Første juledag"                                 public religious on december 25
+"Andre juledag"                                  public on december 26
 
 :: Religious
 :: PÃ¥ske og pinse
-"Fastelavnssøndag"                               on easter minus 49
-"Feitetysdag"                                    on easter minus 47
-"Askeonsdag"                                     on easter minus 46
-"PÃ¥skeaftan"                                     on easter minus 1
-"Pinseaftan"                                     on easter plus 48 days
-"Bots- og bededag"                               on last sunday in october
+"Fastelavnssøndag"                               religious on easter minus 49
+"Feitetysdag"                                    religious on easter minus 47
+"Askeonsdag"                                     religious on easter minus 46
+"PÃ¥skeaftan"                                     religious on easter minus 1
+"Pinseaftan"                                     religious on easter plus 48 days
+"Bots- og bededag"                               religious on last sunday in october
 :: Jul
-"Første søndag i advent"                         on sunday before 24.12 minus 21 days
-"Andre søndag i advent"                          on sunday before 24.12 minus 14 days
-"Tredje søndag i advent"                         on sunday before 24.12 minus 7 days
-"Fjerde søndag i advent"                         on sunday before 24.12
-"Luciadagen"                                     on 13.12
-"Litlejulaftan"                                  on 23.12
-"Julaften"                                       on 24.12
+"Første søndag i advent"                         religious on sunday before december 24 minus 21 days
+"Andre søndag i advent"                          religious on sunday before december 24 minus 14 days
+"Tredje søndag i advent"                         religious on sunday before december 24 minus 7 days
+"Fjerde søndag i advent"                         religious on sunday before december 24
+"Luciadagen"                                     religious on december 13
+"Litlejulaftan"                                  religious on december 23
+"Julaften"                                       religious on december 24
 
 :: Financial
 
 :: Cultural
 :: Mors- og farsdag
-"Morsdag"                                        on second sunday in february
-"Farsdag"                                        on second sunday in november
+"Morsdag"                                        cultural on second sunday in february
+"Farsdag"                                        cultural on second sunday in november
 :: Offisielle flaggdager som ikkje er høgtidsdagar
-"Prinsesse Ingrid Alexandras fødselsdag"         on january 21
-"Samefolkets dag"                                on february 6
-"H.M. Kong Harald Vs fødselsdag"                 on february 21
-"Frigjeringsdagen 1945"                          on may 8
-"H.M. Dronning Sonjas fødselsdag"                on july 4
-"Kronprins Haakon Magnus’ fødselsdag"            on july 20
-"Olsokdagen"                                     on july 29
-"Kronprinsesse Mette-Marits fødselsdag"          on august 19
+"Prinsesse Ingrid Alexandras fødselsdag"         civil on january 21
+"Samefolkets dag"                                civil on february 6
+"H.M. Kong Harald Vs fødselsdag"                 civil on february 21
+"Frigjeringsdagen 1945"                          civil on may 8
+"H.M. Dronning Sonjas fødselsdag"                civil on july 4
+"Kronprins Haakon Magnus’ fødselsdag"            civil on july 20
+"Olsokdagen"                                     civil on july 29
+"Kronprinsesse Mette-Marits fødselsdag"          civil on august 19
 :: Nyttår
-"Nyttårsaftan" on 31.12
+"Nyttårsaftan"                                   civil on december 31
 :: Andre
-"Valentinsdagen"                                 on february 14
+"Valentinsdagen"                                 cultural on february 14
 :: Re-enable when new parser which has noop ability
-::"Skotårsdagen"                                  on ((leapyear year) ? [2/29] : noop)
-"Den internasjonale kvinnedagen"                 on march 8
-"Aprilsnarr"                                     on april 1
-"Unionsoppløysinga 1905"                         on june 7
-"Jonsokaftan"                                    on june 23
-"Jonsokdagen"                                    on june 24
-"Mikkelsmesse"                                   on september 29
-"SN-dagen"                                       on october 24
-"Allehelgensaftan"                               on october 31
-"Allehelgensdag"                                 on first sunday in november
+::"Skotårsdagen"                                 cultural on ((leapyear year) ? [2/29] : noop)
+"Den internasjonale kvinnedagen"                 cultural on march 8
+"Aprilsnarr"                                     cultural on april 1
+"Unionsoppløysinga 1905"                         cultural on june 7
+"Jonsokaftan"                                    cultural on june 23
+"Jonsokdagen"                                    cultural on june 24
+"Mikkelsmesse"                                   cultural on september 29
+"SN-dagen"                                       cultural on october 24
+"Allehelgensaftan"                               cultural on october 31
+"Allehelgensdag"                                 cultural on first sunday in november
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Sommartid startar"                              on last sunday in march
-"Vintertid startar"                              on last sunday in october
+"Sommartid startar"                              seasonal on last sunday in march
+"Vintertid startar"                              seasonal on last sunday in october
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_nz_en-gb b/kholidays/holidays/plan2/holiday_nz_en-gb
index 09be1a8..69c7599 100644
--- a/kholidays/holidays/plan2/holiday_nz_en-gb
+++ b/kholidays/holidays/plan2/holiday_nz_en-gb
@@ -21,31 +21,31 @@ language    "en_GB"
 description "National holiday file for New Zealand"
 
 :: Public Holidays
-"New Year's Day"                    weekend on january 1
-"New Year's Day Holiday"            weekend on ( ( ( [january 1] == [saturday after ([january 1])] ) ||
+"New Year's Day"                    public on january 1
+"New Year's Day Holiday"            public on ( ( ( [january 1] == [saturday after ([january 1])] ) ||
                                                    ( [january 1] == [sunday after ([january 1])] ) ) ?
                                                   [ monday after ([january 1]) ] :
                                                   noop )
-"Day after New Year's Day"          weekend on january 2
-"Day after New Year's Day Holiday"  weekend on ( ( [january 2] == [saturday after ([january 1])] ) ?
+"Day after New Year's Day"          public on january 2
+"Day after New Year's Day Holiday"  public on ( ( [january 2] == [saturday after ([january 1])] ) ?
                                                  [monday after ([december 25])] :
                                                  ( ( [january 2] == [sunday after ([january 1])] ||
                                                      [january 2] == [monday after ([january 1])] ) ?
                                                  [tuesday after ([january 1])] :
                                                  noop ) )
-"Good Friday"                        weekend on easter minus 2 days
-"Easter Monday"                      weekend on easter plus 1 days
-"Waitangi Day"                       weekend on february 6
-"Anzac Day"                          weekend on april 25
-"Queen's Birthday"                   weekend on first monday in june
-"Labour Day"                         weekend on fourth monday in october
-"Christmas Day"                      weekend on december 25
-"Christmas Day Holiday"              weekend on ( ( ( [december 25] == [saturday after ([december 25])] ) ||
+"Good Friday"                        public religious on easter minus 2 days
+"Easter Monday"                      public on easter plus 1 days
+"Waitangi Day"                       public on february 6
+"Anzac Day"                          public on april 25
+"Queen's Birthday"                   public on first monday in june
+"Labour Day"                         public on fourth monday in october
+"Christmas Day"                      public religious on december 25
+"Christmas Day Holiday"              public on ( ( ( [december 25] == [saturday after ([december 25])] ) ||
                                                     ( [december 25] == [sunday after ([december 25])] ) ) ?
                                                   [ monday after ([december 25]) ] :
                                                   noop )
-"Boxing Day"                         weekend on december 26
-"Boxing Day Holiday"                 weekend on ( ( [december 26] == [saturday after ([december 25])] ) ?
+"Boxing Day"                         public on december 26
+"Boxing Day Holiday"                 public on ( ( [december 26] == [saturday after ([december 25])] ) ?
                                                   [monday after ([december 25])] :
                                                   ( ( [december 26] == [sunday after ([december 25])] ||
                                                       [december 26] == [monday after ([december 25])] ) ?
@@ -55,71 +55,71 @@ description "National holiday file for New Zealand"
 :: Provincial Holidays
 :: All move to nearest Monday unless otherwise noted
 :: Auckland nominally 29 January
-"Auckland Anniversary Day"           on monday after 26 january
+"Auckland Anniversary Day"           civil on monday after 26 january
 :: Taranaki nominally 31 March moves to 2nd Monday in March to miss Easter
-"Taranaki Anniversary Day"           on second monday in march
+"Taranaki Anniversary Day"           civil on second monday in march
 :: Hawkes Bay nominally 1 November moves to Friday before Labour day
-"Hawkes Bay Anniversary Day"         on fourth monday in october minus 3 days
+"Hawkes Bay Anniversary Day"         civil on fourth monday in october minus 3 days
 :: Wellington nominally 22 January
-"Wellington Anniversary Day"         on monday after 19 january
+"Wellington Anniversary Day"         civil on monday after 19 january
 :: Marlborough nominally 1 November moves to Friday before Labour day
-"Marlborough Anniversary Day"        on fourth monday in october plus 7 days
+"Marlborough Anniversary Day"        civil on fourth monday in october plus 7 days
 :: Nelson nominally 1 February moves to nearest monday
-"Nelson Anniversary Day"             on monday after 29 january
+"Nelson Anniversary Day"             civil on monday after 29 january
 :: Canterbury nominally 16 December moves to 2nd Fri after 1st Tues in Nov
-"Canterbury Anniversary Day"         on friday after 11 november
+"Canterbury Anniversary Day"         civil on friday after 11 november
 :: South Canterbury nominally 16 December moves to 4th Monday in September
-"South Canterbury Anniversary Day"   on fourth monday in september
+"South Canterbury Anniversary Day"   civil on fourth monday in september
 :: Westland nominally 1 December
-"Westland Anniversary Day"           on monday after 28 november
+"Westland Anniversary Day"           civil on monday after 28 november
 :: Otago nominally 23 March
-"Otago Anniversary Day"              on monday after 20 march
+"Otago Anniversary Day"              civil on monday after 20 march
 :: Southland nominally 17 January
-"Southland Anniversary Day"          on monday after 14 march
+"Southland Anniversary Day"          civil on monday after 14 march
 :: Chatham Islands nominally 30 November
-"Chatham Islands Anniversary Day"    on monday after 27 november
+"Chatham Islands Anniversary Day"    civil on monday after 27 november
 
 :: Religious Holidays
-:"Epiphany                 on sunday after january 2
-:"Baptism of Lord"         on sunday after january 2 plus 7 days
-:"Presentation"            on february 2
-"Ash Wednesday"            on easter minus 46 days
-:"Palm Sunday"             on easter minus 7 days
-"Easter Sunday"            on easter
-"Ascension"                on easter plus 39 days
-"Pentecost"                on easter plus 49 days
-"Trinity"                  on easter plus 56 days
-"Corpus Christi"           on easter plus 63 days
-:"Sacred Heart"            on easter plus 68 days
-:"John the Baptist"        on june 24
-:"Sts Peter & Paul"        on june 29
-:"Transfiguration"         on august 6
-"Assumption"               on august 15
-"All Saints"               on november 1
-:"All Souls"               on november 2
-:"Christ the King"         on sunday before december 24 minus 28 days
-:"1. Advent"               on sunday before december 24 minus 21 days
-:"2. Advent"               on sunday before december 24 minus 14 days
-:"3. Advent"               on sunday before december 24 minus 7 days
-:"4. Advent"               on sunday before december 24
-:"Holy Family"             on first sunday after december 26
+:"Epiphany                 religious on sunday after january 2
+:"Baptism of Lord"         religious on sunday after january 2 plus 7 days
+:"Presentation"            religious on february 2
+"Ash Wednesday"            religious on easter minus 46 days
+:"Palm Sunday"             religious on easter minus 7 days
+"Easter Sunday"            religious on easter
+"Ascension"                religious on easter plus 39 days
+"Pentecost"                religious on easter plus 49 days
+"Trinity"                  religious on easter plus 56 days
+"Corpus Christi"           religious on easter plus 63 days
+:"Sacred Heart"            religious on easter plus 68 days
+:"John the Baptist"        religious on june 24
+:"Sts Peter & Paul"        religious on june 29
+:"Transfiguration"         religious on august 6
+"Assumption"               religious on august 15
+"All Saints"               religious on november 1
+:"All Souls"               religious on november 2
+:"Christ the King"         religious on sunday before december 24 minus 28 days
+:"1. Advent"               religious on sunday before december 24 minus 21 days
+:"2. Advent"               religious on sunday before december 24 minus 14 days
+:"3. Advent"               religious on sunday before december 24 minus 7 days
+:"4. Advent"               religious on sunday before december 24
+:"Holy Family"             religious on first sunday after december 26
 
 :: Financial
 
 :: Cultural
-"St. Valentine's Day"      on february 14
-"St. Patrick's Day"        on march 17
-"Mother's Day"             on second sunday in may
-"Father's Day"             on first sunday in september
-"Halloween"                on october 31
-"Guy Fawkes"               on november 5
-"Melbourne Cup"            on first tuesday in november
+"St. Valentine's Day"      cultural on february 14
+"St. Patrick's Day"        cultural on march 17
+"Mother's Day"             cultural on second sunday in may
+"Father's Day"             cultural on first sunday in september
+"Halloween"                cultural on october 31
+"Guy Fawkes"               cultural on november 5
+"Melbourne Cup"            cultural on first tuesday in november
 
 :: School
 
 :: Daylight Saving
-"Daylight Saving begins"  on last sunday in september
-"Daylight Saving ends"    on first sunday in april
+"Daylight Saving begins"  seasonal on last sunday in september
+"Daylight Saving ends"    seasonal on first sunday in april
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_pa_en b/kholidays/holidays/plan2/holiday_pa_en
index f3dacb4..ac7cc8e 100644
--- a/kholidays/holidays/plan2/holiday_pa_en
+++ b/kholidays/holidays/plan2/holiday_pa_en
@@ -18,51 +18,51 @@ language    "en"
 :description "(please add description in source language) National holiday file for Panama"
 
 :: Public Holidays
-"New Year's Day"                weekend on january 1
-"Martyr´s Day"	     	        weekend on january 9
-"Carnival/Shrove Tuesday"       weekend on easter minus 47
-"Good Friday"                   weekend on easter minus 2
-"Labor Day / May Day"           weekend on may 1
-"Old Panama Foundation"         on august 15
-"Separation Day from Colombia"  weekend on november 3
-"Colon Day"     	        weekend on november 5
-"Shout in La Villa de los Santos"  weekend on november 10
-"Independence from Spain"       weekend on november 28
-"Mother Day / Inmaculate Conception"       weekend on december 8
-"Christmas Day"                 weekend on december 25
+"New Year's Day"                        public on january 1
+"Martyr´s Day"                          public on january 9
+"Carnival/Shrove Tuesday"               public on easter minus 47
+"Good Friday"                           public religious on easter minus 2
+"Labor Day / May Day"                   public on may 1
+"Old Panama Foundation"                 civil on august 15
+"Separation Day from Colombia"          public on november 3
+"Colon Day"                             public on november 5
+"Shout in La Villa de los Santos"       public on november 10
+"Independence from Spain"               public on november 28
+"Mother Day / Inmaculate Conception"    public religious on december 8
+"Christmas Day"                         public religious on december 25
 
 :: Religious
-"Epiphany"	                on january 6
-"Saint Joseph"                  on march 19
-"Ash Wednesday"			weekend on easter minus 46
-"Maundy Thursday"               on easter minus 3
-"Palm Sunday"                   on easter minus 7
-"Easter Day"          	        on easter
-"Ascension"                     on easter plus 39
-"Pentecost Monday"	        on easter plus 50
-"Holy Tinity"			on easter plus 56
-"Corpus Christi"                on easter plus 60
-"Sacred Heart"                  on easter plus 71
-"St. Peter and St. Paul Day"    on june 29
-"The Assumption"                on august 15
-"St. Francis of Assisi"		on october 4
-"All Saints"                    on november 1
+"Epiphany"                              religious on january 6
+"Saint Joseph"                          religious on march 19
+"Ash Wednesday"                         public religious on easter minus 46
+"Maundy Thursday"                       religious on easter minus 3
+"Palm Sunday"                           religious on easter minus 7
+"Easter Day"                            religious on easter
+"Ascension"                             religious on easter plus 39
+"Pentecost Monday"                      religious on easter plus 50
+"Holy Tinity"                           religious on easter plus 56
+"Corpus Christi"                        religious on easter plus 60
+"Sacred Heart"                          religious on easter plus 71
+"St. Peter and St. Paul Day"            religious on june 29
+"The Assumption"                        religious on august 15
+"St. Francis of Assisi"                 religious on october 4
+"All Saints"                            religious on november 1
 
 :: Financial
 
 :: Cultural
-"Columbus Day/Dia de la Raza"   on october 12
-"Internet International Day"	on may 17
-"Christmas Eve"			on december 24
+"Columbus Day/Dia de la Raza"           cultural on october 12
+"Internet International Day"            cultural on may 17
+"Christmas Eve"                         cultural on december 24
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"March Equinox"	                on march 20
-"June Solstice"	                on june 21
-"September Equinox"             on september 22
-"December Solstice"             on december 21
+"March Equinox"                         seasonal on march 20
+"June Solstice"                         seasonal on june 21
+"September Equinox"                     seasonal on september 22
+"December Solstice"                     seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_pa_es b/kholidays/holidays/plan2/holiday_pa_es
index 1b3e4f9..ff569fe 100644
--- a/kholidays/holidays/plan2/holiday_pa_es
+++ b/kholidays/holidays/plan2/holiday_pa_es
@@ -18,51 +18,51 @@ language    "es"
 :description "(please add description in source language) National holiday file for Panama"
 
 :: Public Holidays
-"Año nuevo"                   weekend on january 1
-"Día de los Martires"         weekend on january 9
-"Martes Carnaval"             weekend on easter minus 47
-"Viernes Santo"               weekend on easter minus 2
-"Día del Trabajo"             weekend on may 1
-"Fundación Panama Vieja"      on august 15
-"Separación Panamá-Colombia"  weekend on november 3
-"Día de Colón"		      weekend on november 5
-"Grito en La Villa, Los Santos"  weekend on november 10
-"Independencia Panamá-España" weekend on november 28
-"Día de la Madre"             weekend on december 8
-"Navidad"                     weekend on december 25
+"Año nuevo"                         public on january 1
+"Día de los Martires"               public religious on january 9
+"Martes Carnaval"                   public religious on easter minus 47
+"Viernes Santo"                     public religious on easter minus 2
+"Día del Trabajo"                   public on may 1
+"Fundación Panama Vieja"            public on august 15
+"Separación Panamá-Colombia"        public on november 3
+"Día de Colón"                      public on november 5
+"Grito en La Villa, Los Santos"     public on november 10
+"Independencia Panamá-España"       public on november 28
+"Día de la Madre"                   public religious on december 8
+"Navidad"                           public religious on december 25
 
 :: Religious
-"Epifanía/Día de Reyes"       on january 6
-"San José"                    on march 19
-"Miércoles de Cenizas"	      weekend on easter minus 46
-"Jueves Santo"                on easter minus 3
-"Domingo de Ramos"            on easter minus 7
-"Domingo de Pascua"           on easter
-"Ascensión de Jesús"          on easter plus 39
-"Lunes Penteconstés"	      on easter plus 50
-"Santísima Trinidad"	      on easter plus 56
-"Corpus Christi"              on easter plus 60
-"Sagrado Corazón"             on easter plus 71
-"San Pedro y San Pablo"       on june 29
-"Asunción de la Virgen"       on august 15
-"San Francisco de Asís"	      on october 4
-"Todos los Santos"            on november 1
+"Epifanía/Día de Reyes"             religious on january 6
+"San José"                          religious on march 19
+"Miércoles de Cenizas"              public religious on easter minus 46
+"Jueves Santo"                      religious on easter minus 3
+"Domingo de Ramos"                  religious on easter minus 7
+"Domingo de Pascua"                 religious on easter
+"Ascensión de Jesús"                religious on easter plus 39
+"Lunes Penteconstés"                religious on easter plus 50
+"Santísima Trinidad"                religious on easter plus 56
+"Corpus Christi"                    religious on easter plus 60
+"Sagrado Corazón"                   religious on easter plus 71
+"San Pedro y San Pablo"             religious on june 29
+"Asunción de la Virgen"             religious on august 15
+"San Francisco de Asís"             religious on october 4
+"Todos los Santos"                  religious on november 1
 
 :: Financial
 
 :: Cultural
-"Día de la Raza"              on october 12
-"Día Internacional de Internet"	on may 17
-"Víspera de Navidad"          on december 24
+"Día de la Raza"                    cultural on october 12
+"Día Internacional de Internet"     cultural on may 17
+"Víspera de Navidad"                cultural on december 24
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Equinoccio"	               on march 20
-"Solticio"	               on june 21
-"Equinoccio"                   on september 22
-"Solticio"                     on december 21
+"Equinoccio"                        seasonal on march 20
+"Solticio"                          seasonal on june 21
+"Equinoccio"                        seasonal on september 22
+"Solticio"                          seasonal on december 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_pe_es b/kholidays/holidays/plan2/holiday_pe_es
index c54f90b..f01cee1 100644
--- a/kholidays/holidays/plan2/holiday_pe_es
+++ b/kholidays/holidays/plan2/holiday_pe_es
@@ -17,21 +17,21 @@ language    "es"
 description "Feriados Nacionales de Peru"
 
 :: Public Holidays
-"Año Nuevo"                       weekend on january 1
-"Día del Trabajo"                 weekend on may 1
-"Día de la Independencia"         weekend on july 28
-"Fiestas Patrias"                 weekend on july 29
-"Combate de Angamos"              weekend on October 8
+"Año Nuevo"                       public on january 1
+"Día del Trabajo"                 public on may 1
+"Día de la Independencia"         public on july 28
+"Fiestas Patrias"                 public on july 29
+"Combate de Angamos"              public on October 8
 
 :: Religious
-"Jueves Santo"                    weekend on easter minus 3
-"Viernes Santo"                   weekend on easter minus 2
-"Pascua"                          weekend on easter
-"Día de San Pedro y San Pablo"    weekend on june 29
-"Día de Todos los Santos"         weekend on November 1
-"Día de Santa Rosa de Lima"       weekend on August 30
-"Inmaculada Concepción"           weekend on december 8
-"Navidad"                         weekend on december 25
+"Jueves Santo"                    public religious on easter minus 3
+"Viernes Santo"                   public religious on easter minus 2
+"Pascua"                          public religious on easter
+"Día de San Pedro y San Pablo"    public religious on june 29
+"Día de Todos los Santos"         public religious on November 1
+"Día de Santa Rosa de Lima"       public religious on August 30
+"Inmaculada Concepción"           public religious on december 8
+"Navidad"                         public religious on december 25
 
 :: Financial
 
diff --git a/kholidays/holidays/plan2/holiday_pf_fr b/kholidays/holidays/plan2/holiday_pf_fr
index 7821fc4..d5ccb02 100644
--- a/kholidays/holidays/plan2/holiday_pf_fr
+++ b/kholidays/holidays/plan2/holiday_pf_fr
@@ -33,89 +33,89 @@ description "Fêtes et jours fériés en Polynésie Française"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"                                      weekend on january 1
+"Jour de l'an"                                      public on january 1
 : Easter
-"Pâques"                                            weekend on easter length 2 days
-"Ascension"                                         weekend on easter plus 39 days
-"Pentecôte"                                         weekend on easter plus 49 days length 2 days
+"Pâques"                                            public religious on easter length 2 days
+"Ascension"                                         public religious on easter plus 39 days
+"Pentecôte"                                         public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"                                   weekend on may 1
+"Fête du Travail"                                   public on may 1
 : WW2 armistice
-"Fête de la Victoire"                               weekend on may 8
+"Fête de la Victoire"                               public on may 8
 : National day
-"Fête nationale"                                    weekend on july 14
+"Fête nationale"                                    public on july 14
 : Assumption
-"Assomption"                                        weekend on august 15
+"Assomption"                                        public religious on august 15
 : All saints day
-"Toussaint"                                         weekend on november 1
+"Toussaint"                                         public religious on november 1
 : WW1 armistice
-"Armistice de 1918"                                 weekend on november 11
+"Armistice de 1918"                                 public on november 11
 : Christmas day
-"Noël"                                              weekend on december 25
+"Noël"                                              public religious on december 25
 
 :: Territorial and Regional holidays
-"Fête de l'autonomie de la Polynésie française"     weekend on june 29
+"Fête de l'autonomie de la Polynésie française"     public on june 29
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                                         on first sunday in january
+"Épiphanie"                                         religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                                        on february 2
-"Mardi Gras"                                        on easter minus 47 days
+"Chandeleur"                                        religious on february 2
+"Mardi Gras"                                        religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"                              on easter minus 46 days
+"Mercredi des Cendres"                              religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"                                    on easter minus 2 days
+"Vendredi saint"                                    religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"                                    on november 2
-"St Étienne"                                        on december 26
+"Fête des morts"                                    religious on november 2
+"St Étienne"                                        religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"                                 on february 14
+"Fête des amoureux"                                 cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"                             on first sunday in march
+"Fête des grands-mères"                             cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"                             on last sunday in april
+"Souvenir des Déportés"                             commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"                               on may 9
+"Journée de l'Europe"                               cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"                            on may 10
+"Mémoire de l'esclavage"                            commemorative on may 10
 : Neighbors' day
-"Fête des voisins"                                  on last tuesday in may
+"Fête des voisins"                                  cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"                                    cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"                                    on third sunday in june
+"Fête des pères"                                    cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"                                on june 8
+"Morts en Indochine"                                commemorative on june 8
 : Music day
-"Fête de la Musique"                                on june 21
+"Fête de la Musique"                                cultural on june 21
 : St John
-"Fête de la Saint Jean"                             on june 24
+"Fête de la Saint Jean"                             cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"                                on september 25
+"Hommage aux Harkis"                                commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"                                  on december 5
+"Morts en Algérie"                                  commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"                                       on last sunday in march
+"Heure d'été"                                       seasonal on last sunday in march
 : winter
-"Heure d'hiver"                                     on last sunday in october
+"Heure d'hiver"                                     seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on september 23
+"Printemps"                                         seasonal on september 23
 : Summer
-"Été"                       on december 21
+"Été"                                               seasonal on december 21
 : Fall
-"Automne"                   on march 20
+"Automne"                                           seasonal on march 20
 : Winter
-"Hiver"                     on june 21
+"Hiver"                                             seasonal on june 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_pl_pl b/kholidays/holidays/plan2/holiday_pl_pl
index e0f77ca..54d56ac 100644
--- a/kholidays/holidays/plan2/holiday_pl_pl
+++ b/kholidays/holidays/plan2/holiday_pl_pl
@@ -17,53 +17,53 @@ language    "pl"
 :description "(please add description in source language) National holiday file for Poland"
 
 :: Public Holidays
-"Nowy Rok"               weekend on january 1
-"Wielkanoc"              weekend on easter length 2 days
-"Lany Poniedziałek"      weekend on easter plus 1 day
-"Zielone ÅšwiÄ…tki"        weekend on easter plus 49 days
-"Boże Ciało"             weekend on easter plus 60 days
-"Święto Pracy"           weekend on may 1
-"Święto Konstytucji"     weekend on may 3
-"Wniebowzięcie NMP"      weekend on august 15
-"Wszystkich Świętych"    weekend on november 1
-"Święto Niepodległości"  weekend on november 11
-"Boże Narodzenie"        weekend on december 25 length 2 days
+"Nowy Rok"               public on january 1
+"Wielkanoc"              public religious on easter length 2 days
+"Lany Poniedziałek"      public on easter plus 1 day
+"Zielone ÅšwiÄ…tki"        public religious on easter plus 49 days
+"Boże Ciało"             public religious on easter plus 60 days
+"Święto Pracy"           public on may 1
+"Święto Konstytucji"     public on may 3
+"Wniebowzięcie NMP"      public on august 15
+"Wszystkich Świętych"    public religious on november 1
+"Święto Niepodległości"  public on november 11
+"Boże Narodzenie"        public religious on december 25 length 2 days
 
 :: Religious
-"Åšledzik"                on easter minus 47 days
-"Popielec"               on easter minus 46 days
-"Wielki PiÄ…tek"          on easter minus  2 days
-"Niedziela Palmowa"      on easter minus 7 days
+"Åšledzik"                religious on easter minus 47 days
+"Popielec"               religious on easter minus 46 days
+"Wielki PiÄ…tek"          religious on easter minus  2 days
+"Niedziela Palmowa"      religious on easter minus 7 days
 
 :: Financial
 
 :: Cultural
-"Walentynki"             on february 14
+"Walentynki"             cultural on february 14
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"PoczÄ…tek wiosny"        on march 21
-"PoczÄ…tek lata"          on june 22
-"PoczÄ…tek jesieni"       on september 23
-"PoczÄ…tek zimy"          on december 22
+"PoczÄ…tek wiosny"        seasonal on march 21
+"PoczÄ…tek lata"          seasonal on june 22
+"PoczÄ…tek jesieni"       seasonal on september 23
+"PoczÄ…tek zimy"          seasonal on december 22
 
 :: Name Days
 
 
 :: To be sorted
-"Trzech Króli"           on january 6
-"Dzień Babci"            on january 21
-"Dzień Dziadka"          on january 22
-"Dzień Kobiet"           on march 8
-"Dzień Flagi"            on may 2
-"Dzień Matki"            on may 26
-"Dzień Dziecka"          on june 1
-"Dzień Ojca"             on june 23
-"Zaduszki"               on november 2
-"Andrzejki"              on november 30
-"Św. Mikołaj"            on december 6
-"Wigilia"                on december 24
-"Sylwester"              on december 31
+"Trzech Króli"           civil on january 6
+"Dzień Babci"            civil on january 21
+"Dzień Dziadka"          civil on january 22
+"Dzień Kobiet"           civil on march 8
+"Dzień Flagi"            civil on may 2
+"Dzień Matki"            civil on may 26
+"Dzień Dziecka"          civil on june 1
+"Dzień Ojca"             civil on june 23
+"Zaduszki"               civil on november 2
+"Andrzejki"              civil on november 30
+"Św. Mikołaj"            civil on december 6
+"Wigilia"                civil on december 24
+"Sylwester"              civil on december 31
diff --git a/kholidays/holidays/plan2/holiday_pt_pt b/kholidays/holidays/plan2/holiday_pt_pt
index 7132eda..f7f8e06 100644
--- a/kholidays/holidays/plan2/holiday_pt_pt
+++ b/kholidays/holidays/plan2/holiday_pt_pt
@@ -17,22 +17,22 @@ language    "pt"
 :description "(please add description in source language) National holiday file for Portugal"
 
 :: Public Holidays
-"Ano Novo"              weekend on january 1
-"6ª feira santa"        weekend on easter minus 2 days
-"25 de Abril"           weekend on april 25
-"1º de Maio"            weekend on may 1
-"10 de Junho"           weekend on june 10
-"Assunção"              weekend on august 15
-"Nª Senhora Conceição"  weekend on december 8
-"Natal"                 weekend on december 25
+"Ano Novo"              public on january 1
+"6ª feira santa"        public religious on easter minus 2 days
+"25 de Abril"           public on april 25
+"1º de Maio"            public on may 1
+"10 de Junho"           public on june 10
+"Assunção"              public on august 15
+"Nª Senhora Conceição"  public religious on december 8
+"Natal"                 public religious on december 25
 
 :: Religious
-"Carnaval"              on easter minus 50 days length 4 days
-"4ª feira de cinzas"    on easter minus 46 days
-"Páscoa"                on easter
-"Ascension"             on easter plus 39 days
-"Trinity"               on easter plus 56 days
-"Pentecostes"           on easter plus 49 days
+"Carnaval"              religious on easter minus 50 days length 4 days
+"4ª feira de cinzas"    religious on easter minus 46 days
+"Páscoa"                religious on easter
+"Ascension"             religious on easter plus 39 days
+"Trinity"               religious on easter plus 56 days
+"Pentecostes"           religious on easter plus 49 days
 
 :: Financial
 
@@ -43,17 +43,17 @@ language    "pt"
 :: Daylight Saving
 
 :: Seasons
-"Primavera"            on march 22
-"Verão"                on june 22
-"Outono"               on september 22
-"Inverno"              on december 22
+"Primavera"            seasonal on march 22
+"Verão"                seasonal on june 22
+"Outono"               seasonal on september 22
+"Inverno"              seasonal on december 22
 
 
 :: Removed holidays
-:: "Corpo de Deus"         weekend on easter plus 60 days
-:: "República"             weekend on october 5
-:: "Todos os Santos"       weekend on november 1
-:: "Restauração"           weekend on december 1
+:: "Corpo de Deus"         public on easter plus 60 days
+:: "República"             public on october 5
+:: "Todos os Santos"       public on november 1
+:: "Restauração"           public on december 1
 
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_py_es b/kholidays/holidays/plan2/holiday_py_es
index 0e05561..8855c57 100644
--- a/kholidays/holidays/plan2/holiday_py_es
+++ b/kholidays/holidays/plan2/holiday_py_es
@@ -17,17 +17,17 @@ language    "es"
 :description "(please add description in source language) National holiday file for Paraguay"
 
 :: Public Holidays
-"Año nuevo"            weekend on january 1
-"Día de los Heroes"    weekend on march 1
-"Jueves Santo"         weekend on easter minus 3 days
-"Viernes Santo"        weekend on easter minus 2 days
-"Trabajo"              weekend on may 1
-"Independencia"        weekend on may 15
-"Paz del Chaco"        weekend on june 12
-"Asunción"             weekend on august 15
-"Batalla de Boquerón"  weekend on september 29
-"Virgen de Caacupé"    weekend on december 8
-"Navidad"              weekend on december 25
+"Año nuevo"            public on january 1
+"Día de los Heroes"    public on march 1
+"Jueves Santo"         public religious on easter minus 3 days
+"Viernes Santo"        public religious on easter minus 2 days
+"Trabajo"              public on may 1
+"Independencia"        public on may 15
+"Paz del Chaco"        public on june 12
+"Asunción"             public religious on august 15
+"Batalla de Boquerón"  public on september 29
+"Virgen de Caacupé"    public religious on december 8
+"Navidad"              public religious on december 25
 
 :: Religious
 
diff --git a/kholidays/holidays/plan2/holiday_re_fr b/kholidays/holidays/plan2/holiday_re_fr
index 4f9908e..2731459 100644
--- a/kholidays/holidays/plan2/holiday_re_fr
+++ b/kholidays/holidays/plan2/holiday_re_fr
@@ -33,90 +33,90 @@ description "Fêtes et jours fériés en La Réunion"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 : Abolition of Slavery
-"Abolition de l'esclavage"  weekend on december 20
+"Abolition de l'esclavage"  public on december 20
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     cultural on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on september 23
+"Printemps"                 seasonal on september 23
 : Summer
-"Été"                       on december 21
+"Été"                       seasonal on december 21
 : Fall
-"Automne"                   on march 20
+"Automne"                   seasonal on march 20
 : Winter
-"Hiver"                     on june 21
+"Hiver"                     seasonal on june 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ro_ro b/kholidays/holidays/plan2/holiday_ro_ro
index 5e1beb9..4c1bdb6 100644
--- a/kholidays/holidays/plan2/holiday_ro_ro
+++ b/kholidays/holidays/plan2/holiday_ro_ro
@@ -17,17 +17,17 @@ language    "ro"
 :description "(please add description in source language) National holiday file for Romania"
 
 :: Public Holidays
-"Anul nou"                   weekend on january 1 length 2 days
-"PaÅŸtele"                    weekend on pascha length 2 days
-"Rusalii"                    weekend on pascha plus 49 days length 2 days
-"Ziua muncii"                weekend on may 1
-"Adormirea Maicii Domnului"  weekend on august 15
-"Ziua naţională"             weekend on december 1
-"Crăciunul"                  weekend on december 25 length 2 days
+"Anul nou"                   public on january 1 length 2 days
+"PaÅŸtele"                    public religious on pascha length 2 days
+"Rusalii"                    public religious on pascha plus 49 days length 2 days
+"Ziua muncii"                public on may 1
+"Adormirea Maicii Domnului"  public on august 15
+"Ziua naţională"             public on december 1
+"Crăciunul"                  public religious on december 25 length 2 days
 
 :: Religious
-"Floriile"                   on pascha minus 6 days
-"Înălţarea Domnului"         on pascha plus 40 days
+"Floriile"                   religious on pascha minus 6 days
+"Înălţarea Domnului"         religious on pascha plus 40 days
 
 :: Financial
 
@@ -43,7 +43,7 @@ language    "ro"
 
 
 :: To be sorted
-"Sărbătoarea unirii"         on january 24
-"Ziua mamei"                 on may 8
-"Ziua copilului"             on june 1
-"Ziua Revoluţiei"            on december 22
+"Sărbătoarea unirii"         civil on january 24
+"Ziua mamei"                 civil on may 8
+"Ziua copilului"             civil on june 1
+"Ziua Revoluţiei"            civil on december 22
diff --git a/kholidays/holidays/plan2/holiday_rs_sr b/kholidays/holidays/plan2/holiday_rs_sr
index 56b8152..6223111 100644
--- a/kholidays/holidays/plan2/holiday_rs_sr
+++ b/kholidays/holidays/plan2/holiday_rs_sr
@@ -24,48 +24,48 @@ language     "sr"
 :description  ""
 
 :: Public Holidays
-"Нова Година"                                                      weekend on january 1 length 2 days
-"Нова Година (нерадни дан)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
-                                                                                    [ monday after ([january 2]) ] : noop )
-"Православни Божић"                                                weekend on january 7
-"Дан државности"                                                   weekend on february 15
-"Дан државности (нерадни дан)"                                     weekend on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
-                                                                                    [ monday after ([february 15]) ] : noop )
-"Међународни празник рада"                                         weekend on may 1 length 2 days
-"Међународни празник рада (нерадни дан)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
-                                                                                    [ monday after ([may 2]) ] : noop )
-"Дан победе"                                                     weekend on may 9
-"Видовдан"                                                         weekend on june 28
+"Нова Година"                                                      public on january 1 length 2 days
+"Нова Година (нерадни дан)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+                                                                                   [ monday after ([january 2]) ] : noop )
+"Православни Божић"                                                public on january 7
+"Дан државности"                                                   public on february 15
+"Дан државности (нерадни дан)"                                     public on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
+                                                                                   [ monday after ([february 15]) ] : noop )
+"Међународни празник рада"                                         public on may 1 length 2 days
+"Међународни празник рада (нерадни дан)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+                                                                                   [ monday after ([may 2]) ] : noop )
+"Дан победе"                                                       public on may 9
+"Видовдан"                                                         public on june 28
 
 :: Religious Holidays
-"Православни Велики петак"                                         weekend on pascha minus 2 days
-"Православна Велика субота"                                        weekend on pascha minus 1 days
-"Православни Васкрс"                                               weekend on pascha length 2 days
-"Римокатолички Велики петак"                                       weekend on easter minus 2 days
-"Римокатоличка Велика субота"                                      on easter minus 1 days
-"Римокатолички Ускрс"                                              on easter length 2 days
-"Римокатолички Божић"                                              on december 25
-"Рамазански бајрам"                                                on hijri shawwal 1
-"Курбан-бајрам"                                                    on hijri thualhijjah 10
-"Јом Кипур"                                                        on hebrew tishrey 10
+"Православни Велики петак"                                         public religious on pascha minus 2 days
+"Православна Велика субота"                                        public religious on pascha minus 1 days
+"Православни Васкрс"                                               public religious on pascha length 2 days
+"Римокатолички Велики петак"                                       public religious on easter minus 2 days
+"Римокатоличка Велика субота"                                      religious on easter minus 1 days
+"Римокатолички Ускрс"                                              religious on easter length 2 days
+"Римокатолички Божић"                                              religious on december 25
+"Рамазански бајрам"                                                religious on hijri shawwal 1
+"Курбан-бајрам"                                                    religious on hijri thualhijjah 10
+"Јом Кипур"                                                        religious on hebrew tishrey 10
 
 :: Financial
 
 :: Cultural
-"Српска Нова Година"                                               on january 14
-"Дан сећања на жртве холокауста"                                 on january 27
+"Српска Нова Година"                                               cultural on january 14
+"Дан сећања на жртве холокауста"                                   cultural on january 27
 
 :: School
-"Свети Сава"                                                       weekend on january 27
+"Свети Сава"                                                       public school on january 27
 
 :: Daylight Saving
-"Летње рачунање времена (ГМТ+2)"                                  on last sunday in march
-"Зимско рачунање времена (ГМТ+1)"                                  on last sunday in october
+"Летње рачунање времена (ГМТ+2)"                                   seasonal on last sunday in march
+"Зимско рачунање времена (ГМТ+1)"                                  seasonal on last sunday in october
 
 :: Seasons
-"Први дан пролећа"                                                on march 20
-"Први дан лета"                                                   on june 21
-"Први дан јесени"                                                  on september 23
-"Први дан зиме"                                                    on december 22
+"Први дан пролећа"                                                 seasonal on march 20
+"Први дан лета"                                                    seasonal on june 21
+"Први дан јесени"                                                  seasonal on september 23
+"Први дан зиме"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_rs_sr at ijekavian b/kholidays/holidays/plan2/holiday_rs_sr at ijekavian
index ba57732..620dc97 100644
--- a/kholidays/holidays/plan2/holiday_rs_sr at ijekavian
+++ b/kholidays/holidays/plan2/holiday_rs_sr at ijekavian
@@ -24,48 +24,48 @@ language     "sr at ijekavian"
 :description  ""
 
 :: Public Holidays
-"Нова Година"                                                      weekend on january 1 length 2 days
-"Нова Година (нерадни дан)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
-                                                                                    [ monday after ([january 2]) ] : noop )
-"Православни Божић"                                                weekend on january 7
-"Дан државности"                                                   weekend on february 15
-"Дан државности (нерадни дан)"                                     weekend on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
-                                                                                    [ monday after ([february 15]) ] : noop )
-"Међународни празник рада"                                         weekend on may 1 length 2 days
-"Међународни празник рада (нерадни дан)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
-                                                                                    [ monday after ([may 2]) ] : noop )
-"Дан побједе"                                                     weekend on may 9
-"Видовдан"                                                         weekend on june 28
+"Нова Година"                                                      public on january 1 length 2 days
+"Нова Година (нерадни дан)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+                                                                                   [ monday after ([january 2]) ] : noop )
+"Православни Божић"                                                public on january 7
+"Дан државности"                                                   public on february 15
+"Дан државности (нерадни дан)"                                     public on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
+                                                                                   [ monday after ([february 15]) ] : noop )
+"Међународни празник рада"                                         public on may 1 length 2 days
+"Међународни празник рада (нерадни дан)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+                                                                                   [ monday after ([may 2]) ] : noop )
+"Дан побједе"                                                      public on may 9
+"Видовдан"                                                         public on june 28
 
 :: Religious Holidays
-"Православни Велики петак"                                         weekend on pascha minus 2 days
-"Православна Велика субота"                                        weekend on pascha minus 1 days
-"Православни Васкрс"                                               weekend on pascha length 2 days
-"Римокатолички Велики петак"                                       weekend on easter minus 2 days
-"Римокатоличка Велика субота"                                      on easter minus 1 days
-"Римокатолички Ускрс"                                              on easter length 2 days
-"Римокатолички Божић"                                              on december 25
-"Рамазански бајрам"                                                on hijri shawwal 1
-"Курбан-бајрам"                                                    on hijri thualhijjah 10
-"Јом Кипур"                                                        on hebrew tishrey 10
+"Православни Велики петак"                                         public religious on pascha minus 2 days
+"Православна Велика субота"                                        public religious on pascha minus 1 days
+"Православни Васкрс"                                               public religious on pascha length 2 days
+"Римокатолички Велики петак"                                       public religious on easter minus 2 days
+"Римокатоличка Велика субота"                                      religious on easter minus 1 days
+"Римокатолички Ускрс"                                              religious on easter length 2 days
+"Римокатолички Божић"                                              religious on december 25
+"Рамазански бајрам"                                                religious on hijri shawwal 1
+"Курбан-бајрам"                                                    religious on hijri thualhijjah 10
+"Јом Кипур"                                                        religious on hebrew tishrey 10
 
 :: Financial
 
 :: Cultural
-"Српска Нова Година"                                               on january 14
-"Дан сјећања на жртве холокауста"                                 on january 27
+"Српска Нова Година"                                               cultural on january 14
+"Дан сјећања на жртве холокауста"                                  cultural on january 27
 
 :: School
-"Свети Сава"                                                       weekend on january 27
+"Свети Сава"                                                       public school on january 27
 
 :: Daylight Saving
-"Љетње рачунање времена (ГМТ+2)"                                  on last sunday in march
-"Зимско рачунање времена (ГМТ+1)"                                  on last sunday in october
+"Љетње рачунање времена (ГМТ+2)"                                   seasonal on last sunday in march
+"Зимско рачунање времена (ГМТ+1)"                                  seasonal on last sunday in october
 
 :: Seasons
-"Први дан прољећа"                                                on march 20
-"Први дан љета"                                                   on june 21
-"Први дан јесени"                                                  on september 23
-"Први дан зиме"                                                    on december 22
+"Први дан прољећа"                                                 seasonal on march 20
+"Први дан љета"                                                    seasonal on june 21
+"Први дан јесени"                                                  seasonal on september 23
+"Први дан зиме"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_rs_sr at ijekavianlatin b/kholidays/holidays/plan2/holiday_rs_sr at ijekavianlatin
index abbee71..f5c9d61 100644
--- a/kholidays/holidays/plan2/holiday_rs_sr at ijekavianlatin
+++ b/kholidays/holidays/plan2/holiday_rs_sr at ijekavianlatin
@@ -24,48 +24,48 @@ language     "sr at ijekavianlatin"
 :description  ""
 
 :: Public Holidays
-"Nova Godina"                                                      weekend on january 1 length 2 days
-"Nova Godina (neradni dan)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
-                                                                                    [ monday after ([january 2]) ] : noop )
-"Pravoslavni Božić"                                                weekend on january 7
-"Dan državnosti"                                                   weekend on february 15
-"Dan državnosti (neradni dan)"                                     weekend on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
-                                                                                    [ monday after ([february 15]) ] : noop )
-"Međunarodni praznik rada"                                         weekend on may 1 length 2 days
-"Međunarodni praznik rada (neradni dan)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
-                                                                                    [ monday after ([may 2]) ] : noop )
-"Dan pobjede"                                                     weekend on may 9
-"Vidovdan"                                                         weekend on june 28
+"Nova Godina"                                                      public on january 1 length 2 days
+"Nova Godina (neradni dan)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+                                                                                   [ monday after ([january 2]) ] : noop )
+"Pravoslavni Božić"                                                public on january 7
+"Dan državnosti"                                                   public on february 15
+"Dan državnosti (neradni dan)"                                     public on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
+                                                                                   [ monday after ([february 15]) ] : noop )
+"Međunarodni praznik rada"                                         public on may 1 length 2 days
+"Međunarodni praznik rada (neradni dan)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+                                                                                   [ monday after ([may 2]) ] : noop )
+"Dan pobjede"                                                      public on may 9
+"Vidovdan"                                                         public on june 28
 
 :: Religious Holidays
-"Pravoslavni Veliki petak"                                         weekend on pascha minus 2 days
-"Pravoslavna Velika subota"                                        weekend on pascha minus 1 days
-"Pravoslavni Vaskrs"                                               weekend on pascha length 2 days
-"Rimokatolički Veliki petak"                                       weekend on easter minus 2 days
-"Rimokatolička Velika subota"                                      on easter minus 1 days
-"Rimokatolički Uskrs"                                              on easter length 2 days
-"Rimokatolički Božić"                                              on december 25
-"Ramazanski bajram"                                                on hijri shawwal 1
-"Kurban-bajram"                                                    on hijri thualhijjah 10
-"Jom Kipur"                                                        on hebrew tishrey 10
+"Pravoslavni Veliki petak"                                         public religious on pascha minus 2 days
+"Pravoslavna Velika subota"                                        public religious on pascha minus 1 days
+"Pravoslavni Vaskrs"                                               public religious on pascha length 2 days
+"Rimokatolički Veliki petak"                                       public religious on easter minus 2 days
+"Rimokatolička Velika subota"                                      religious on easter minus 1 days
+"Rimokatolički Uskrs"                                              religious on easter length 2 days
+"Rimokatolički Božić"                                              religious on december 25
+"Ramazanski bajram"                                                religious on hijri shawwal 1
+"Kurban-bajram"                                                    religious on hijri thualhijjah 10
+"Jom Kipur"                                                        religious on hebrew tishrey 10
 
 :: Financial
 
 :: Cultural
-"Srpska Nova Godina"                                               on january 14
-"Dan sjećanja na žrtve holokausta"                                 on january 27
+"Srpska Nova Godina"                                               cultural on january 14
+"Dan sjećanja na žrtve holokausta"                                 cultural on january 27
 
 :: School
-"Sveti Sava"                                                       weekend on january 27
+"Sveti Sava"                                                       public school on january 27
 
 :: Daylight Saving
-"Ljetnje računanje vremena (GMT+2)"                                  on last sunday in march
-"Zimsko računanje vremena (GMT+1)"                                  on last sunday in october
+"Ljetnje računanje vremena (GMT+2)"                                seasonal on last sunday in march
+"Zimsko računanje vremena (GMT+1)"                                 seasonal on last sunday in october
 
 :: Seasons
-"Prvi dan proljeća"                                                on march 20
-"Prvi dan ljeta"                                                   on june 21
-"Prvi dan jeseni"                                                  on september 23
-"Prvi dan zime"                                                    on december 22
+"Prvi dan proljeća"                                                seasonal on march 20
+"Prvi dan ljeta"                                                   seasonal on june 21
+"Prvi dan jeseni"                                                  seasonal on september 23
+"Prvi dan zime"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_rs_sr at latin b/kholidays/holidays/plan2/holiday_rs_sr at latin
index 25649c7..e3dd519 100644
--- a/kholidays/holidays/plan2/holiday_rs_sr at latin
+++ b/kholidays/holidays/plan2/holiday_rs_sr at latin
@@ -24,48 +24,48 @@ language     "sr at latin"
 :description  ""
 
 :: Public Holidays
-"Nova Godina"                                                      weekend on january 1 length 2 days
-"Nova Godina (neradni dan)"                                        weekend on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
-                                                                                    [ monday after ([january 2]) ] : noop )
-"Pravoslavni Božić"                                                weekend on january 7
-"Dan državnosti"                                                   weekend on february 15
-"Dan državnosti (neradni dan)"                                     weekend on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
-                                                                                    [ monday after ([february 15]) ] : noop )
-"Međunarodni praznik rada"                                         weekend on may 1 length 2 days
-"Međunarodni praznik rada (neradni dan)"                           weekend on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
-                                                                                    [ monday after ([may 2]) ] : noop )
-"Dan pobede"                                                     weekend on may 9
-"Vidovdan"                                                         weekend on june 28
+"Nova Godina"                                                      public on january 1 length 2 days
+"Nova Godina (neradni dan)"                                        public on ( ( ( [january 2] == [sunday after ([january 2])] ) ) ?
+                                                                                   [ monday after ([january 2]) ] : noop )
+"Pravoslavni Božić"                                                public on january 7
+"Dan državnosti"                                                   public on february 15
+"Dan državnosti (neradni dan)"                                     public on ( ( ( [february 15] == [sunday after ([february 15])] ) ) ?
+                                                                                   [ monday after ([february 15]) ] : noop )
+"Međunarodni praznik rada"                                         public on may 1 length 2 days
+"Međunarodni praznik rada (neradni dan)"                           public on ( ( ( [may 2] == [sunday after ([may 2])] ) ) ?
+                                                                                   [ monday after ([may 2]) ] : noop )
+"Dan pobede"                                                       public on may 9
+"Vidovdan"                                                         public on june 28
 
 :: Religious Holidays
-"Pravoslavni Veliki petak"                                         weekend on pascha minus 2 days
-"Pravoslavna Velika subota"                                        weekend on pascha minus 1 days
-"Pravoslavni Vaskrs"                                               weekend on pascha length 2 days
-"Rimokatolički Veliki petak"                                       weekend on easter minus 2 days
-"Rimokatolička Velika subota"                                      on easter minus 1 days
-"Rimokatolički Uskrs"                                              on easter length 2 days
-"Rimokatolički Božić"                                              on december 25
-"Ramazanski bajram"                                                on hijri shawwal 1
-"Kurban-bajram"                                                    on hijri thualhijjah 10
-"Jom Kipur"                                                        on hebrew tishrey 10
+"Pravoslavni Veliki petak"                                         public religious on pascha minus 2 days
+"Pravoslavna Velika subota"                                        public religious on pascha minus 1 days
+"Pravoslavni Vaskrs"                                               public religious on pascha length 2 days
+"Rimokatolički Veliki petak"                                       public religious on easter minus 2 days
+"Rimokatolička Velika subota"                                      religious on easter minus 1 days
+"Rimokatolički Uskrs"                                              religious on easter length 2 days
+"Rimokatolički Božić"                                              religious on december 25
+"Ramazanski bajram"                                                religious on hijri shawwal 1
+"Kurban-bajram"                                                    religious on hijri thualhijjah 10
+"Jom Kipur"                                                        religious on hebrew tishrey 10
 
 :: Financial
 
 :: Cultural
-"Srpska Nova Godina"                                               on january 14
-"Dan sećanja na žrtve holokausta"                                 on january 27
+"Srpska Nova Godina"                                               cultural on january 14
+"Dan sećanja na žrtve holokausta"                                  cultural on january 27
 
 :: School
-"Sveti Sava"                                                       weekend on january 27
+"Sveti Sava"                                                       public school on january 27
 
 :: Daylight Saving
-"Letnje računanje vremena (GMT+2)"                                  on last sunday in march
-"Zimsko računanje vremena (GMT+1)"                                  on last sunday in october
+"Letnje računanje vremena (GMT+2)"                                 seasonal on last sunday in march
+"Zimsko računanje vremena (GMT+1)"                                 seasonal on last sunday in october
 
 :: Seasons
-"Prvi dan proleća"                                                on march 20
-"Prvi dan leta"                                                   on june 21
-"Prvi dan jeseni"                                                  on september 23
-"Prvi dan zime"                                                    on december 22
+"Prvi dan proleća"                                                 seasonal on march 20
+"Prvi dan leta"                                                    seasonal on june 21
+"Prvi dan jeseni"                                                  seasonal on september 23
+"Prvi dan zime"                                                    seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ru_ru b/kholidays/holidays/plan2/holiday_ru_ru
index 673d8fc..b6a57f8 100644
--- a/kholidays/holidays/plan2/holiday_ru_ru
+++ b/kholidays/holidays/plan2/holiday_ru_ru
@@ -17,14 +17,14 @@ language    "ru"
 :description "(please add description in source language) National holiday file for Russia"
 
 :: Public Holidays
-"Новогодние каникулы"          weekend on january 1 length 5 days
-"Рождество Христово"           weekend on january 7
-"День защитника Отечества"     weekend on february 23
-"Международный женский день"   weekend on march 8
-"Праздник Весны и Труда"       weekend on may 1
-"День Победы"                  weekend on may 9
-"День России"                  weekend on june 12
-"День народного единства"      weekend on november 4
+"Новогодние каникулы"          public on january 1 length 5 days
+"Рождество Христово"           public on january 7
+"День защитника Отечества"     public on february 23
+"Международный женский день"   public on march 8
+"Праздник Весны и Труда"       public on may 1
+"День Победы"                  public on may 9
+"День России"                  public on june 12
+"День народного единства"      public on november 4
 
 :: Religious
 
@@ -42,94 +42,94 @@ language    "ru"
 
 
 :: To be sorted
-"День работника прокуратуры Российской Федерации"                       on january 12
-"День российской печати"                                                on january 13
-"День инженерных войск"                                                 on january 21
-"День российского студенчества"                                         on january 25
-"День снятия блокады города Ленинграда (1944 год)"                      on january 27
-"Сталинградская битва (1943 год)"                                       on february 2
-"День российской науки"                                                 on february 8
-"День дипломатического работника"                                       on february 10
-"День работников геодезии и картографии"                                on second sunday in march
-"День работников торговли, бытового обслуживания населения и ЖКХ"       on third sunday in march
-"День внутренних войск МВД"                                             on march 27
-"День специалиста юридической службы в Вооружённых Силах"               on march 29
-"День единения народов"                                                 on april 2
-"День сотрудников военных комиссариатов"                                on april 8
-"День геолога"                                                          on first sunday in april
-"День космонавтики"                                                     on april 12
-"День войск противовоздушной обороны"                                   on second sunday in april
-"День специалиста по радиоэлектронной борьбе"                           on april 15
-"Ледовое побоище (1242 год)"                                            on april 18
-"День памяти погибших в радиационных авариях и катастрофах"             on april 26
-"День пожарной охраны"                                                  on april 30
-"День радио, праздник работников всех отраслей связи"                   on may 7
-"День химика"                                                           on last sunday in may
-"День славянской письменности и культуры"                               on may 24
-"Общероссийский День библиотек"                                         on may 27
-"День пограничника"                                                     on may 28
-"Пушкинский день России"                                                on june 6
-"День социального работника"                                            on june 8
-"День работников текстильной и лёгкой промышленности"                   on second sunday in june
-"День медицинского работника"                                           on third sunday in june
-"День изобретателя и рационализатора"                                   on last saturday in june
-"День памяти и скорби"                                                  on june 22
-"День молодёжи"                                                         on june 27
-"День работников морского и речного флота"                              on first sunday in july
-"Полтавская битва (1709 год)"                                           on july 10
-"День рыбака"                                                           on second sunday in july
-"День российской почты"                                                 on second sunday in july
-"День металлурга"                                                       on third sunday in july
-"День Военно-Морского Флота"                                            on last sunday in july
-"День Тыла Вооружённых Сил Российской Федерации"                        on august 1
-"День Воздушно-десантных войск"                                         on august 2
-"День железнодорожника"                                                 on first sunday in august
-"День Железнодорожных войск Российской Федерации"                       on august 6
-"День победы у мыса Гангут (1714 год)"                                  on august 9
-"День Военно-воздушных сил"                                             on august 12
-"День физкультурника"                                                   on second saturday in august
-"День строителя"                                                        on second sunday in august
-"День Воздушного Флота России"                                          on third sunday in august
-"День Государственного флага Российской Федерации"                      on august 22
-"Курская битва (1943 год)"                                              on august 23
-"День шахтёра"                                                          on last sunday in august
-"День кино"                                                             on august 27
-"День знаний"                                                           on september 1
-"День российской гвардии"                                               on september 2
-"День солидарности в борьбе с терроризмом"                              on september 3
-"День специалиста по ядерному обеспечению"                              on september 4
-"День работников нефтяной и газовой промышленности"                     on first sunday in september
-"Бородинское сражение (1812 год)"                                       on september 8
-"День победы у мыса Тендра (1790 год)"                                  on september 11
-"День танкиста"                                                         on second sunday in september
-"Куликовская битва (1380 год)"                                          on september 21
-"День работников леса"                                                  on third sunday in september
-"День работника атомной промышленности"                                 on september 28
-"День машиностроителя"                                                  on last sunday in september
-"День пожилых людей"                                                    on october 1
-"День Сухопутных войск"                                                 on october 1
-"День Космических войск"                                                on october 4
-"День учителя"                                                          on october 5
-"День военного связиста"                                                on october 20
-"День подразделений специального назначения"                            on october 24
-"День таможенника Российской Федерации"                                 on october 25
-"День работника сельского хозяйства и перерабатывающей промышленности"  on second sunday in october
-"День работников дорожного хозяйства"                                   on third sunday in october
-"День работников автомобильного транспорта"                             on last sunday in october
-"День памяти жертв политических репрессий"                              on october 30
-"День военного разведчика"                                              on november 5
-"Октябрьская революция 1917 года"                                       on november 7
-"День милиции"                                                          on ((year < 2011) ? [november 10] : noop)
-"День сотрудника органов внутренних дел"                                on ((year >= 2011) ? [november 10] : noop)
-"День войск радиационной, химической и биологической защиты"            on november 13
-"День ракетных войск и артиллерии"                                      on november 19
-"День работника налоговых органов Российской Федерации"                 on november 21
-"День матери"                                                           on last sunday in november
-"День победы у мыса Синоп (1853 год)"                                   on december 1
-"Битва под Москвой (1941 год)"                                          on december 5
-"День Конституции Российской Федерации"                                 on december 12
-"День Ракетных войск стратегического назначения"                        on december 17
-"День работника органов безопасности Российской Федерации"              on december 20
-"День энергетика"                                                       on december 22
-"День взятия крепости Измаил (1790 год)"                                on december 24
-"День спасателя Российской Федерации"                                   on december 27
+"День работника прокуратуры Российской Федерации"                       civil on january 12
+"День российской печати"                                                civil on january 13
+"День инженерных войск"                                                 civil on january 21
+"День российского студенчества"                                         civil on january 25
+"День снятия блокады города Ленинграда (1944 год)"                      civil on january 27
+"Сталинградская битва (1943 год)"                                       civil on february 2
+"День российской науки"                                                 civil on february 8
+"День дипломатического работника"                                       civil on february 10
+"День работников геодезии и картографии"                                civil on second sunday in march
+"День работников торговли, бытового обслуживания населения и ЖКХ"       civil on third sunday in march
+"День внутренних войск МВД"                                             civil on march 27
+"День специалиста юридической службы в Вооружённых Силах"               civil on march 29
+"День единения народов"                                                 civil on april 2
+"День сотрудников военных комиссариатов"                                civil on april 8
+"День геолога"                                                          civil on first sunday in april
+"День космонавтики"                                                     civil on april 12
+"День войск противовоздушной обороны"                                   civil on second sunday in april
+"День специалиста по радиоэлектронной борьбе"                           civil on april 15
+"Ледовое побоище (1242 год)"                                            civil on april 18
+"День памяти погибших в радиационных авариях и катастрофах"             civil on april 26
+"День пожарной охраны"                                                  civil on april 30
+"День радио, праздник работников всех отраслей связи"                   civil on may 7
+"День химика"                                                           civil on last sunday in may
+"День славянской письменности и культуры"                               civil on may 24
+"Общероссийский День библиотек"                                         civil on may 27
+"День пограничника"                                                     civil on may 28
+"Пушкинский день России"                                                civil on june 6
+"День социального работника"                                            civil on june 8
+"День работников текстильной и лёгкой промышленности"                   civil on second sunday in june
+"День медицинского работника"                                           civil on third sunday in june
+"День изобретателя и рационализатора"                                   civil on last saturday in june
+"День памяти и скорби"                                                  civil on june 22
+"День молодёжи"                                                         civil on june 27
+"День работников морского и речного флота"                              civil on first sunday in july
+"Полтавская битва (1709 год)"                                           civil on july 10
+"День рыбака"                                                           civil on second sunday in july
+"День российской почты"                                                 civil on second sunday in july
+"День металлурга"                                                       civil on third sunday in july
+"День Военно-Морского Флота"                                            civil on last sunday in july
+"День Тыла Вооружённых Сил Российской Федерации"                        civil on august 1
+"День Воздушно-десантных войск"                                         civil on august 2
+"День железнодорожника"                                                 civil on first sunday in august
+"День Железнодорожных войск Российской Федерации"                       civil on august 6
+"День победы у мыса Гангут (1714 год)"                                  civil on august 9
+"День Военно-воздушных сил"                                             civil on august 12
+"День физкультурника"                                                   civil on second saturday in august
+"День строителя"                                                        civil on second sunday in august
+"День Воздушного Флота России"                                          civil on third sunday in august
+"День Государственного флага Российской Федерации"                      civil on august 22
+"Курская битва (1943 год)"                                              civil on august 23
+"День шахтёра"                                                          civil on last sunday in august
+"День кино"                                                             civil on august 27
+"День знаний"                                                           civil on september 1
+"День российской гвардии"                                               civil on september 2
+"День солидарности в борьбе с терроризмом"                              civil on september 3
+"День специалиста по ядерному обеспечению"                              civil on september 4
+"День работников нефтяной и газовой промышленности"                     civil on first sunday in september
+"Бородинское сражение (1812 год)"                                       civil on september 8
+"День победы у мыса Тендра (1790 год)"                                  civil on september 11
+"День танкиста"                                                         civil on second sunday in september
+"Куликовская битва (1380 год)"                                          civil on september 21
+"День работников леса"                                                  civil on third sunday in september
+"День работника атомной промышленности"                                 civil on september 28
+"День машиностроителя"                                                  civil on last sunday in september
+"День пожилых людей"                                                    civil on october 1
+"День Сухопутных войск"                                                 civil on october 1
+"День Космических войск"                                                civil on october 4
+"День учителя"                                                          civil on october 5
+"День военного связиста"                                                civil on october 20
+"День подразделений специального назначения"                            civil on october 24
+"День таможенника Российской Федерации"                                 civil on october 25
+"День работника сельского хозяйства и перерабатывающей промышленности"  civil on second sunday in october
+"День работников дорожного хозяйства"                                   civil on third sunday in october
+"День работников автомобильного транспорта"                             civil on last sunday in october
+"День памяти жертв политических репрессий"                              civil on october 30
+"День военного разведчика"                                              civil on november 5
+"Октябрьская революция 1917 года"                                       civil on november 7
+"День милиции"                                                          civil on ((year < 2011) ? [november 10] : noop)
+"День сотрудника органов внутренних дел"                                civil on ((year >= 2011) ? [november 10] : noop)
+"День войск радиационной, химической и биологической защиты"            civil on november 13
+"День ракетных войск и артиллерии"                                      civil on november 19
+"День работника налоговых органов Российской Федерации"                 civil on november 21
+"День матери"                                                           civil on last sunday in november
+"День победы у мыса Синоп (1853 год)"                                   civil on december 1
+"Битва под Москвой (1941 год)"                                          civil on december 5
+"День Конституции Российской Федерации"                                 civil on december 12
+"День Ракетных войск стратегического назначения"                        civil on december 17
+"День работника органов безопасности Российской Федерации"              civil on december 20
+"День энергетика"                                                       civil on december 22
+"День взятия крепости Измаил (1790 год)"                                civil on december 24
+"День спасателя Российской Федерации"                                   civil on december 27
diff --git a/kholidays/holidays/plan2/holiday_se_sv b/kholidays/holidays/plan2/holiday_se_sv
index 8123cf2..9434e6d 100644
--- a/kholidays/holidays/plan2/holiday_se_sv
+++ b/kholidays/holidays/plan2/holiday_se_sv
@@ -17,46 +17,46 @@ language    "sv"
 :description "(please add description in source language) National holiday file for Sweden"
 
 :: Public Holidays
-"Nyårsdagen"         weekend on january 1
-"Trett.d. Jul"       weekend on january 6
-"LÃ¥ngfredagen"       weekend on easter minus 2
-"PÃ¥skdagen"          weekend on easter
-"Annandag påsk"      weekend on easter plus 1
-"Pingstdagen"        weekend on easter plus 49 days
-"Kristi Him.f."      weekend on easter plus 39 days
+"Nyårsdagen"         public on january 1
+"Trett.d. Jul"       public on january 6
+"LÃ¥ngfredagen"       public religious on easter minus 2
+"PÃ¥skdagen"          public religious on easter
+"Annandag påsk"      public on easter plus 1
+"Pingstdagen"        public religious on easter plus 49 days
+"Kristi Him.f."      public religious on easter plus 39 days
 :: Before 2005
-:: "Annandag Pingst"    weekend on easter plus 50 days
-"Första Maj"         weekend on may 1
+:: "Annandag Pingst" public religious on easter plus 50 days
+"Första Maj"         public on may 1
 :: After 2005
-"Nationaldagen"      weekend on june 6
-"Midsommardagen"     weekend on saturday before june 26
-"Alla helgons dag"   weekend on first sunday in november minus 1
-"Juldagen"           weekend on december 25
-"Annandag Jul"       weekend on december 26
+"Nationaldagen"      public on june 6
+"Midsommardagen"     public on saturday before june 26
+"Alla helgons dag"   public religious on first sunday in november minus 1
+"Juldagen"           public religious on december 25
+"Annandag Jul"       public on december 26
 
 :: Religious
-"Fettisdagen"        on easter minus 47 days
-"Askonsdagen"        on easter minus 46 days
-"Sommartid"          on last sunday in march
-"Skärtorsdagen"      on easter minus 3
-"PÃ¥skafton"          on easter minus 1
-"Pingstafton"        on easter plus 48 days
+"Fettisdagen"        religious on easter minus 47 days
+"Askonsdagen"        religious on easter minus 46 days
+"Sommartid"          religious on last sunday in march
+"Skärtorsdagen"      religious on easter minus 3
+"PÃ¥skafton"          religious on easter minus 1
+"Pingstafton"        religious on easter plus 48 days
 :: After 2005
-"Annandag Pingst"    on easter plus 50 days
-"1. Advent"          on sunday before december 24 minus 21 days
-"2. Advent"          on sunday before december 24 minus 14 days
-"3. Advent"          on sunday before december 24 minus 7 days
-"4. Advent"          on sunday before december 24
+"Annandag Pingst"    religious on easter plus 50 days
+"1. Advent"          religious on sunday before december 24 minus 21 days
+"2. Advent"          religious on sunday before december 24 minus 14 days
+"3. Advent"          religious on sunday before december 24 minus 7 days
+"4. Advent"          religious on sunday before december 24
 
 :: Financial
 
 :: Cultural
-"Alla hjärtans dag"  on february 14
+"Alla hjärtans dag"  cultural on february 14
 :: Before 2005
-:: "Nationaldagen"      on june 6
-"Midsommarafton"     on friday before june 25
-"Vintertid"          on last sunday in october
-"Nyårsafton"         on december 31
+:: "Nationaldagen"   civil on june 6
+"Midsommarafton"     cultural on friday before june 25
+"Vintertid"          cultural on last sunday in october
+"Nyårsafton"         cultural on december 31
 
 :: School
 
@@ -68,5 +68,5 @@ language    "sv"
 
 
 :: To be sorted
-"Trett.d.afton"      on january 5
-"Julafton"           on december 24
+"Trett.d.afton"      civil on january 5
+"Julafton"           civil on december 24
diff --git a/kholidays/holidays/plan2/holiday_sg_en-gb b/kholidays/holidays/plan2/holiday_sg_en-gb
index d8de666..3af0476 100644
--- a/kholidays/holidays/plan2/holiday_sg_en-gb
+++ b/kholidays/holidays/plan2/holiday_sg_en-gb
@@ -18,26 +18,26 @@ language    "en_GB"
 description "National holiday file for Singapore"
 
 :: Public Holidays
-"New Year's Day"                 weekend on january 1
-"Chinese New Year"               weekend on january 23 2012 length 2 days
-"Chinese New Year"               weekend on february 10 2013 length 2 days
-"Chinese New Year"               weekend on january 31 2014 length 2 days
-"Good Friday"                    weekend on easter minus 2
-"Labour Day"                     weekend on may 1
-"Vesak Day"                      weekend on may 5 2012
-"Vesak Day"                      weekend on may 24 2013
-"Vesak Day"                      weekend on may 13 2014
-"National Day"                   weekend on august 9
-"Hari Raya Puasa"                weekend on august 19 2012
-"Hari Raya Puasa"                weekend on august 8 2013
-"Hari Raya Puasa"                weekend on july 28 2014
-"Hari Raya Haji"                 weekend on october 26 2012
-"Hari Raya Haji"                 weekend on october 15 2013
-"Hari Raya Haji"                 weekend on october 4 2014
-"Deepavali"                      weekend on november 13 2012
-"Deepavali"                      weekend on november 3 2013
-"Deepavali"                      weekend on october 23 2014
-"Christmas Day"                  weekend on december 25
+"New Year's Day"                 public on january 1
+"Chinese New Year"               public on january 23 2012 length 2 days
+"Chinese New Year"               public on february 10 2013 length 2 days
+"Chinese New Year"               public on january 31 2014 length 2 days
+"Good Friday"                    public religious on easter minus 2
+"Labour Day"                     public on may 1
+"Vesak Day"                      public on may 5 2012
+"Vesak Day"                      public on may 24 2013
+"Vesak Day"                      public on may 13 2014
+"National Day"                   public on august 9
+"Hari Raya Puasa"                public on august 19 2012
+"Hari Raya Puasa"                public on august 8 2013
+"Hari Raya Puasa"                public on july 28 2014
+"Hari Raya Haji"                 public on october 26 2012
+"Hari Raya Haji"                 public on october 15 2013
+"Hari Raya Haji"                 public on october 4 2014
+"Deepavali"                      public on november 13 2012
+"Deepavali"                      public on november 3 2013
+"Deepavali"                      public on october 23 2014
+"Christmas Day"                  public religious on december 25
 
 :: Religious Holidays
 
diff --git a/kholidays/holidays/plan2/holiday_si_sl b/kholidays/holidays/plan2/holiday_si_sl
index 455e269..816b52e 100644
--- a/kholidays/holidays/plan2/holiday_si_sl
+++ b/kholidays/holidays/plan2/holiday_si_sl
@@ -20,36 +20,36 @@ language    "sl"
 
 
 :: Public Holidays
-"Novo leto"                                           weekend on january 1
-"Dan upora proti okupatorju"                          weekend on april 27
-"Praznik dela"                                        weekend on may 1 length 2 days
-"Dan državnosti"                                      weekend on june 25
-"Združitev prekmurskih Slovencev z matičnim narodom"  on august 17
-"Vrnitev Primorske k matični domovini"                on september 15
-"Dan Rudolfa Maistra"                                 on november 23
-"Dan samostojnosti in enotnosti"                      weekend on december 26
+"Novo leto"                                           public on january 1
+"Dan upora proti okupatorju"                          public on april 27
+"Praznik dela"                                        public on may 1 length 2 days
+"Dan državnosti"                                      public on june 25
+"Združitev prekmurskih Slovencev z matičnim narodom"  civil on august 17
+"Vrnitev Primorske k matični domovini"                civil on september 15
+"Dan Rudolfa Maistra"                                 civil on november 23
+"Dan samostojnosti in enotnosti"                      public on december 26
 
 
 :: Religious Holidays
-"Velika noč"                                          weekend on easter
-"Velikonočni ponedeljek"                              weekend on easter plus 1 day
-"Binkošti"                                            weekend on easter plus 49 days
-"Marijino vnebovzetje"                                weekend on august 15
-"Dan reformacije"                                     weekend on october 31
-"Dan spomina na mrtve"                                weekend on november 1
-"Božič"                                               weekend on december 25
+"Velika noč"                                          public religious on easter
+"Velikonočni ponedeljek"                              public religious on easter plus 1 day
+"Binkošti"                                            public religious on easter plus 49 days
+"Marijino vnebovzetje"                                public religious on august 15
+"Dan reformacije"                                     public religious on october 31
+"Dan spomina na mrtve"                                public religious on november 1
+"Božič"                                               public religious on december 25
 
 :: Financial
 
 :: Cultural
-"Prešernov dan, slovenski kulturni praznik"           weekend on february 8
-"Dan Primoža Trubarja"                                on june 8
+"Prešernov dan, slovenski kulturni praznik"           public cultural on february 8
+"Dan Primoža Trubarja"                                cultural on june 8
 
 :: School
 
 :: Daylight Saving
-"Poletni čas"      on last sunday in march
-"Zimski čas"       on last sunday in october
+"Poletni čas"                                         seasonal on last sunday in march
+"Zimski čas"                                          seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_sk_sk b/kholidays/holidays/plan2/holiday_sk_sk
index d0855e2..e8203d2 100644
--- a/kholidays/holidays/plan2/holiday_sk_sk
+++ b/kholidays/holidays/plan2/holiday_sk_sk
@@ -17,23 +17,23 @@ language    "sk"
 :description "(please add description in source language) National holiday file for Slovak Republic"
 
 :: Public Holidays
-"Nový rok"                          weekend on january 1
-"Deň vzniku SR"                     weekend on january 1
-"Traja králi"                       weekend on january 6
-"Veľký piatok"                      weekend on easter minus 2
-"Veľkonočná nedeľa"                 weekend on easter
-"Veľkonočný pondelok"               weekend on easter plus 1
-"Sviatok práce"                     weekend on may 1
-"Deň víťazstva nad fašizmom"        weekend on may 8
-"Sviatok sv. Cyrila a Metoda"       weekend on july 5
-"Výročie SNP"                       weekend on august 29
-"Deň Ústavy SR"                     weekend on september 1
-"Sedembolestná Panna Mária"         weekend on september 15
-"Sviatok všetkých svätých"          weekend on november 1
-"Deň boja za slobodu a demokraciu"  weekend on november 17
-"Štedrý deň"                        weekend on december 24
-"1. sviatok vianočný"               weekend on december 25
-"2. sviatok vianočný"               weekend on december 26
+"Nový rok"                          public on january 1
+"Deň vzniku SR"                     public on january 1
+"Traja králi"                       public on january 6
+"Veľký piatok"                      public religious on easter minus 2
+"Veľkonočná nedeľa"                 public religious on easter
+"Veľkonočný pondelok"               public on easter plus 1
+"Sviatok práce"                     public on may 1
+"Deň víťazstva nad fašizmom"        public on may 8
+"Sviatok sv. Cyrila a Metoda"       public on july 5
+"Výročie SNP"                       public on august 29
+"Deň Ústavy SR"                     public on september 1
+"Sedembolestná Panna Mária"         public on september 15
+"Sviatok všetkých svätých"          public religious on november 1
+"Deň boja za slobodu a demokraciu"  public on november 17
+"Štedrý deň"                        public religious on december 24
+"1. sviatok vianočný"               public religious on december 25
+"2. sviatok vianočný"               public religious on december 26
 
 :: Religious Holidays
 
@@ -51,9 +51,9 @@ language    "sk"
 
 
 :: To be sorted
-"Medzinárodný deň žien"             on march 8
-"Deň učiteľov"                      on april 28
-"Deň matiek"                        on may 13
-"Medzinárodný deň detí"             on june 1
-"Deň otcov"                         on june 17
-"Pamiatka zosnulých"                on november 2
+"Medzinárodný deň žien"             civil on march 8
+"Deň učiteľov"                      civil on april 28
+"Deň matiek"                        civil on may 13
+"Medzinárodný deň detí"             civil on june 1
+"Deň otcov"                         civil on june 17
+"Pamiatka zosnulých"                civil on november 2
diff --git a/kholidays/holidays/plan2/holiday_sm_it b/kholidays/holidays/plan2/holiday_sm_it
index 054c69a..c866432 100644
--- a/kholidays/holidays/plan2/holiday_sm_it
+++ b/kholidays/holidays/plan2/holiday_sm_it
@@ -19,62 +19,62 @@ language    "it"
 :description "(please add description in source language) National holiday file for San Marino"
 
 :: Public Holidays
-"Capodanno"                       weekend on january 1
-"Epifania"                        weekend on january 6
-"Pasqua"                          weekend on easter
-"Lunedì dell'Angelo"              weekend on easter plus 1 day
-"Festa di Sant'Agata"		  weekend on february 5
-"Anniversario Arengo - Festa delle Milizie"	weekend on march 25
-"Ingresso Eccellentissimi Capitani Reggenti"	  weekend on april 1
-"Festa del Lavoro"                weekend on may 1
-"Caduta governo Fascista"	  weekend on july 28
-"Ferragosto"                      weekend on august 15
-"Festa della Repubblica - Santo Patrono"	  weekend on september 3
-"Ingresso Eccellentissimi Capitani Reggenti"	weekend on october 1
-"Ognissanti"                      weekend on november 1
-"Commemorazione dei defunti"	  weekend on november 2
-"Immacolata Concezione"           weekend on december 8
-"Natale"                          weekend on december 25
-"Santo Stefano"                   weekend on december 26
+"Capodanno"                       public on january 1
+"Epifania"                        public religious on january 6
+"Pasqua"                          public religious on easter
+"Lunedì dell'Angelo"              public religious on easter plus 1 day
+"Festa di Sant'Agata"             public religious on february 5
+"Anniversario Arengo - Festa delle Milizie"       public on march 25
+"Ingresso Eccellentissimi Capitani Reggenti"      public on april 1
+"Festa del Lavoro"                public on may 1
+"Caduta governo Fascista"         public on july 28
+"Ferragosto"                      public on august 15
+"Festa della Repubblica - Santo Patrono"          public on september 3
+"Ingresso Eccellentissimi Capitani Reggenti"      public on october 1
+"Ognissanti"                      religious public on november 1
+"Commemorazione dei defunti"      public on november 2
+"Immacolata Concezione"           religious public on december 8
+"Natale"                          religious public on december 25
+"Santo Stefano"                   religious public on december 26
 
 :: Religious
-"San Giuseppe"                    on march 19
-"Giovedì Grasso"                  on easter minus 52 days
-"Martedì Grasso"                  on easter minus 47 days
-"Mercoledì delle Ceneri"          on easter minus 46 days
-"Prima di Quaresima"              on easter minus 42 days
-"Seconda di Quaresima"            on easter minus 35 days
-"Terza di Quaresima"              on easter minus 28 days
-"Quarta di Quaresima"             on easter minus 21 days
-"Quinta di Quaresima"             on easter minus 14 days
-"Domenica delle Palme"            on easter minus 7 days
-"Ascensione"                      on easter plus 39 days
-"Pentecoste"                      on easter plus 49 days
-"Santissima Trinità"              on easter plus 56 days
-"Corpus Domini"                   weekend on easter plus 63 days
-"Sacro Cuore di Gesù"             on easter plus 68 days
-"Santi Pietro e Paolo"            on june 29
-"San Francesco"                   on october 4
-"Defunti"                         on november 2
-"Prima d'avvento"                 on sunday before 24 december minus 21 days
-"Seconda d'avvento"               on sunday before 24 december minus 14 days
-"Terza d'avvento"                 on sunday before 24 december minus 7 days
-"Quarta d'avvento"                on sunday before 24 december
-"San Silvestro"                   on december 31
+"San Giuseppe"                    religious on march 19
+"Giovedì Grasso"                  religious on easter minus 52 days
+"Martedì Grasso"                  religious on easter minus 47 days
+"Mercoledì delle Ceneri"          religious on easter minus 46 days
+"Prima di Quaresima"              religious on easter minus 42 days
+"Seconda di Quaresima"            religious on easter minus 35 days
+"Terza di Quaresima"              religious on easter minus 28 days
+"Quarta di Quaresima"             religious on easter minus 21 days
+"Quinta di Quaresima"             religious on easter minus 14 days
+"Domenica delle Palme"            religious on easter minus 7 days
+"Ascensione"                      religious on easter plus 39 days
+"Pentecoste"                      religious on easter plus 49 days
+"Santissima Trinità"              religious on easter plus 56 days
+"Corpus Domini"                   public religious on easter plus 63 days
+"Sacro Cuore di Gesù"             religious on easter plus 68 days
+"Santi Pietro e Paolo"            religious on june 29
+"San Francesco"                   religious on october 4
+"Defunti"                         religious on november 2
+"Prima d'avvento"                 religious on sunday before 24 december minus 21 days
+"Seconda d'avvento"               religious on sunday before 24 december minus 14 days
+"Terza d'avvento"                 religious on sunday before 24 december minus 7 days
+"Quarta d'avvento"                religious on sunday before 24 december
+"San Silvestro"                   religious on december 31
 
 :: Financial
 
 :: Cultural
-"Giornata della Memoria"          on january 27
-"Giornata del Ricordo"            on february 10
-"Festa della donna"               on march 8
-"Festa dell'Unità nazionale"      on november 4
+"Giornata della Memoria"          cultural on january 27
+"Giornata del Ricordo"            cultural on february 10
+"Festa della donna"               cultural on march 8
+"Festa dell'Unità nazionale"      cultural on november 4
 
 :: School
 
 :: Daylight Saving
-"Passaggio all'ora legale"        on last sunday in march
-"Passaggio all'ora solare"        on last sunday in october
+"Passaggio all'ora legale"        seasonal on last sunday in march
+"Passaggio all'ora solare"        seasonal on last sunday in october
 
 :: Seasons
 
diff --git a/kholidays/holidays/plan2/holiday_th_en-gb b/kholidays/holidays/plan2/holiday_th_en-gb
index 84abede..15636b3 100644
--- a/kholidays/holidays/plan2/holiday_th_en-gb
+++ b/kholidays/holidays/plan2/holiday_th_en-gb
@@ -17,21 +17,21 @@ language    "en_GB"
 description "National holiday file for Thailand"
 
 :: Public Holidays
-"New Years Day"                 weekend on January 1
-:"Makha Bucha Day"               weekend on February 11
-"Chakri Memorial Day"           weekend on April 6
-"Songkran Festival"             weekend on April 13 length 3 days
-"Coranation Day"                weekend on May 5
-:"Royal Ploughing Ceremony Day"  weekend on May 8
-:"Visakha Bucha Day"             weekend on May 10
-:"Mid Year Day"                  weekend on July 1
-:"Asarnha Bucha Day"             weekend on July 8
-:"Khao Phansa Day"               weekend on July 9
-"HMThe Queens Birthday"         weekend on August 12
-"Chulalongkorn Day"             weekend on October 23
-"HM The King's Birthdayday"     weekend on December 5
-"Constitution Day"              weekend on December 10
-"New Years Eve"                 weekend on December 31
+"New Years Day"                 public on January 1
+:"Makha Bucha Day"              public on February 11
+"Chakri Memorial Day"           public on April 6
+"Songkran Festival"             public on April 13 length 3 days
+"Coranation Day"                public on May 5
+:"Royal Ploughing Ceremony Day" public on May 8
+:"Visakha Bucha Day"            public on May 10
+:"Mid Year Day"                 public on July 1
+:"Asarnha Bucha Day"            public on July 8
+:"Khao Phansa Day"              public on July 9
+"HM The Queens Birthday"        public on August 12
+"Chulalongkorn Day"             public on October 23
+"HM The King's Birthdayday"     public on December 5
+"Constitution Day"              public on December 10
+"New Years Eve"                 public on December 31
 
 :: Religious Holidays
 
@@ -44,9 +44,9 @@ description "National holiday file for Thailand"
 :: Daylight Saving
 
 :: Seasons
-"Hot season begins"    on march 1
-"Rainy season begins"  on june 1
-"Cool season begins"   on november 1
+"Hot season begins"    seasonal on march 1
+"Rainy season begins"  seasonal on june 1
+"Cool season begins"   seasonal on november 1
 
 :: Name Days
 
diff --git a/kholidays/holidays/plan2/holiday_tr_en-gb b/kholidays/holidays/plan2/holiday_tr_en-gb
index e154827..be1551b 100644
--- a/kholidays/holidays/plan2/holiday_tr_en-gb
+++ b/kholidays/holidays/plan2/holiday_tr_en-gb
@@ -23,97 +23,97 @@ language    "en_GB"
 description "National holiday file for Turkey"
 
 :: Public Holidays
-"New Year's Day"                                      weekend on january 1
-"National Sovereignty and Children's Day"             weekend on april 23
-"Labour and Solidarity Day"                           weekend on may 1
-"Commemoration of Atatürk, Youth and Sports Day"      weekend on may 19
-"Victory Day"                                         weekend on august 30
-"Republic Day"                                        weekend on october 29
+"New Year's Day"                                      public on january 1
+"National Sovereignty and Children's Day"             public on april 23
+"Labour and Solidarity Day"                           public on may 1
+"Commemoration of Atatürk, Youth and Sports Day"      public on may 19
+"Victory Day"                                         public on august 30
+"Republic Day"                                        public on october 29
 
 :: Religious
 :: We cannot use KDE Hijri calendar since is one/two days ahead
 :: than holiday dates defined for Turkey
-:: "Ramadan Feast"                                      weekend on hijri shawwal 1 length 3 days
-:: "Sacrifice Feast"                                    weekend on hijri thualhijjah 10 length 4 days
+:: "Ramadan Feast"                                    public religious on hijri shawwal 1 length 3 days
+:: "Sacrifice Feast"                                  public religious on hijri thualhijjah 10 length 4 days
 
-"Ramadan Feast"                                       weekend on 08 august 2013 length 3 days
-"Ramadan Feast"                                       weekend on 28 july 2014 length 3 days
-"Ramadan Feast"                                       weekend on 17 july 2015 length 3 days
+"Ramadan Feast"                                       public religious on 08 august 2013 length 3 days
+"Ramadan Feast"                                       public religious on 28 july 2014 length 3 days
+"Ramadan Feast"                                       public religious on 17 july 2015 length 3 days
 
-"Sacrifice Feast"                                     weekend on 15 october 2013 length 4 days
-"Sacrifice Feast"                                     weekend on 04 october 2014 length 4 days
-"Sacrifice Feast"                                     weekend on 23 september 2015 length 4 days
+"Sacrifice Feast"                                     public religious on 15 october 2013 length 4 days
+"Sacrifice Feast"                                     public religious on 04 october 2014 length 4 days
+"Sacrifice Feast"                                     public religious on 23 september 2015 length 4 days
 
-"Night of Qadr"                                       on 03 august 2013
-"Night of Qadr"                                       on 23 july 2014
-"Night of Qadr"                                       on 12 july 2015
+"Night of Qadr"                                       religious on 03 august 2013
+"Night of Qadr"                                       religious on 23 july 2014
+"Night of Qadr"                                       religious on 12 july 2015
 
-"Mawlid"                                              on 23 january 2013
-"Mawlid"                                              on 12 january 2014
-"Mawlid"                                              on 02 january 2015
-"Mawlid"                                              on 22 december 2015
+"Mawlid"                                              religious on 23 january 2013
+"Mawlid"                                              religious on 12 january 2014
+"Mawlid"                                              religious on 02 january 2015
+"Mawlid"                                              religious on 22 december 2015
 
-"Regaib Night"                                        on 16 may 2013
-"Regaib Night"                                        on 01 may 2014
-"Regaib Night"                                        on 23 april 2015
+"Regaib Night"                                        religious on 16 may 2013
+"Regaib Night"                                        religious on 01 may 2014
+"Regaib Night"                                        religious on 23 april 2015
 
-"Miraj"                                               on 05 june 2013
-"Miraj"                                               on 25 may 2014
-"Miraj"                                               on 15 may 2015
+"Miraj"                                               religious on 05 june 2013
+"Miraj"                                               religious on 25 may 2014
+"Miraj"                                               religious on 15 may 2015
 
-"Bara'ah Night"                                       on 23 june 2013
-"Bara'ah Night"                                       on 12 june 2014
-"Bara'ah Night"                                       on 01 june 2015
+"Bara'ah Night"                                       religious on 23 june 2013
+"Bara'ah Night"                                       religious on 12 june 2014
+"Bara'ah Night"                                       religious on 01 june 2015
 
 :: Financial
 
 :: Cultural
-"World Cancer Day"                                    on february 4
-"Valentine's Day"                                     on february 14
-"Civil Defense Day"                                   on february 28
-"Memorial Week for Previous Earthquakes"              on march 1
-"International Women's Day"                           on march 8
-"Feast of Medicine"                                   on march 14
-"Martyrs' Day"                                        on march 18
-"Çanakkale Victory"                                   on march 18
-"Nowruz"                                              on march 21
-"World Theatre Day"                                   on march 27
-"World Health Day"                                    on april 7
-"Hıdrellez"                                           on may 6
-"Mother's Day"                                        on second sunday in may
-"Ethics Day"                                          on may 25
-"The Conquest of Ä°stanbul"                            on may 29
-"World Environment Day"                               on june 5
-"World Blood Donor Day"                               on june 14
-"Father's Day"                                        on third sunday in june
-"Maritime and Cabotage Day"                           on july 1
-"International Day of Peace"                          on september 1
-"Veterans Day"                                        on september 19
-"Turkish Language Day"                                on september 26
-"World Heart Day"                                     on last sunday in september
-"World Animal Day"                                    on october 4
-"Anniversary of Atatürk's Death"                      on november 10
-"Universal Children's Day"                            on november 20
-"Teachers' Day"                                       on november 24
-"Intl. Day for Elimination of Violence against Women" on november 25
-"World AIDS Day"                                      on december 1
-"International Day of Persons with Disabilities"      on december 3
-"Human Rights Day"                                    on december 10
+"World Cancer Day"                                    cultural on february 4
+"Valentine's Day"                                     cultural on february 14
+"Civil Defense Day"                                   cultural on february 28
+"Memorial Week for Previous Earthquakes"              cultural on march 1
+"International Women's Day"                           cultural on march 8
+"Feast of Medicine"                                   cultural on march 14
+"Martyrs' Day"                                        cultural on march 18
+"Çanakkale Victory"                                   cultural on march 18
+"Nowruz"                                              cultural on march 21
+"World Theatre Day"                                   cultural on march 27
+"World Health Day"                                    cultural on april 7
+"Hıdrellez"                                           cultural on may 6
+"Mother's Day"                                        cultural on second sunday in may
+"Ethics Day"                                          cultural on may 25
+"The Conquest of Ä°stanbul"                            cultural on may 29
+"World Environment Day"                               cultural on june 5
+"World Blood Donor Day"                               cultural on june 14
+"Father's Day"                                        cultural on third sunday in june
+"Maritime and Cabotage Day"                           cultural on july 1
+"International Day of Peace"                          cultural on september 1
+"Veterans Day"                                        cultural on september 19
+"Turkish Language Day"                                cultural on september 26
+"World Heart Day"                                     cultural on last sunday in september
+"World Animal Day"                                    cultural on october 4
+"Anniversary of Atatürk's Death"                      cultural on november 10
+"Universal Children's Day"                            cultural on november 20
+"Teachers' Day"                                       cultural on november 24
+"Intl. Day for Elimination of Violence against Women" cultural on november 25
+"World AIDS Day"                                      cultural on december 1
+"International Day of Persons with Disabilities"      cultural on december 3
+"Human Rights Day"                                    cultural on december 10
 
 :: School
 
 :: Daylight Saving
-"Daylight Saving Start"                               on ((year == 2011) ? [march 28] : [last sunday in march])
-"Daylight Saving End"                                 on last sunday in october
+"Daylight Saving Start"                               seasonal on ((year == 2011) ? [march 28] : [last sunday in march])
+"Daylight Saving End"                                 seasonal on last sunday in october
 
 :: Seasons
-"Spring Begins"                                       on march 21
-"Summer Begins"                                       on june 21
-"Fall Begins"                                         on september 23
-"Winter Begins"                                       on december 21
-
-"Heat Falling from the Sun to the Air"                on november 8 plus 105 days
-"Heat Falling from the Sun to the Water"              on november 8 plus 112 days
-"Heat Falling from the Sun to the Ground"             on november 8 plus 119 days
+"Spring Begins"                                       seasonal on march 21
+"Summer Begins"                                       seasonal on june 21
+"Fall Begins"                                         seasonal on september 23
+"Winter Begins"                                       seasonal on december 21
+
+"Heat Falling from the Sun to the Air"                seasonal on november 8 plus 105 days
+"Heat Falling from the Sun to the Water"              seasonal on november 8 plus 112 days
+"Heat Falling from the Sun to the Ground"             seasonal on november 8 plus 119 days
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_tr_tr b/kholidays/holidays/plan2/holiday_tr_tr
index 8e46358..7d952ea 100644
--- a/kholidays/holidays/plan2/holiday_tr_tr
+++ b/kholidays/holidays/plan2/holiday_tr_tr
@@ -23,97 +23,97 @@ language    "tr"
 description "National holiday file for Turkey"
 
 :: Public Holidays
-"Yeni Yıl Tatili"                                  weekend on january 1
-"Ulusal Egemenlik ve Çocuk Bayramı"                weekend on april 23
-"Emek ve Dayanışma Günü"                           weekend on may 1
-"Atatürk'ü Anma, Gençlik ve Spor Bayramı"          weekend on may 19
-"Zafer Bayramı"                                    weekend on august 30
-"Cumhuriyet Bayramı"                               weekend on october 29
+"Yeni Yıl Tatili"                                  public on january 1
+"Ulusal Egemenlik ve Çocuk Bayramı"                public on april 23
+"Emek ve Dayanışma Günü"                           public on may 1
+"Atatürk'ü Anma, Gençlik ve Spor Bayramı"          public on may 19
+"Zafer Bayramı"                                    public on august 30
+"Cumhuriyet Bayramı"                               public on october 29
 
 :: Religious
 :: We cannot use KDE Hijri calendar since is one/two days ahead
 :: than holiday dates defined for Turkey
-:: "Ramazan Bayramı"                                  weekend on hijri shawwal 1 length 3 days
-:: "Kurban Bayramı"                                   weekend on hijri thualhijjah 10 length 4 days
+:: "Ramazan Bayramı"                               public religious on hijri shawwal 1 length 3 days
+:: "Kurban Bayramı"                                public religious on hijri thualhijjah 10 length 4 days
 
-"Ramazan Bayramı"                                  weekend on 08 august 2013 length 3 days
-"Ramazan Bayramı"                                  weekend on 28 july 2014 length 3 days
-"Ramazan Bayramı"                                  weekend on 17 july 2015 length 3 days
+"Ramazan Bayramı"                                  public religious on 08 august 2013 length 3 days
+"Ramazan Bayramı"                                  public religious on 28 july 2014 length 3 days
+"Ramazan Bayramı"                                  public religious on 17 july 2015 length 3 days
 
-"Kurban Bayramı"                                   weekend on 15 october 2013 length 4 days
-"Kurban Bayramı"                                   weekend on 04 october 2014 length 4 days
-"Kurban Bayramı"                                   weekend on 23 september 2015 length 4 days
+"Kurban Bayramı"                                   public religious on 15 october 2013 length 4 days
+"Kurban Bayramı"                                   public religious on 04 october 2014 length 4 days
+"Kurban Bayramı"                                   public religious on 23 september 2015 length 4 days
 
-"Kadir Gecesi"                                     on 03 august 2013
-"Kadir Gecesi"                                     on 23 july 2014
-"Kadir Gecesi"                                     on 12 july 2015
+"Kadir Gecesi"                                     religious on 03 august 2013
+"Kadir Gecesi"                                     religious on 23 july 2014
+"Kadir Gecesi"                                     religious on 12 july 2015
 
-"Mevlid Kandili"                                   on 23 january 2013
-"Mevlid Kandili"                                   on 12 january 2014
-"Mevlid Kandili"                                   on 02 january 2015
-"Mevlid Kandili"                                   on 22 december 2015
+"Mevlid Kandili"                                   religious on 23 january 2013
+"Mevlid Kandili"                                   religious on 12 january 2014
+"Mevlid Kandili"                                   religious on 02 january 2015
+"Mevlid Kandili"                                   religious on 22 december 2015
 
-"Regaib Kandili"                                   on 16 may 2013
-"Regaib Kandili"                                   on 01 may 2014
-"Regaib Kandili"                                   on 23 april 2015
+"Regaib Kandili"                                   religious on 16 may 2013
+"Regaib Kandili"                                   religious on 01 may 2014
+"Regaib Kandili"                                   religious on 23 april 2015
 
-"Mirac Kandili"                                    on 05 june 2013
-"Mirac Kandili"                                    on 25 may 2014
-"Mirac Kandili"                                    on 15 may 2015
+"Mirac Kandili"                                    religious on 05 june 2013
+"Mirac Kandili"                                    religious on 25 may 2014
+"Mirac Kandili"                                    religious on 15 may 2015
 
-"Berat Kandili"                                    on 23 june 2013
-"Berat Kandili"                                    on 12 june 2014
-"Berat Kandili"                                    on 01 june 2015
+"Berat Kandili"                                    religious on 23 june 2013
+"Berat Kandili"                                    religious on 12 june 2014
+"Berat Kandili"                                    religious on 01 june 2015
 
 :: Financial
 
 :: Cultural
-"Dünya Kanser Günü"                                on february 4
-"Sevgililer Günü"                                  on february 14
-"Sivil Savunma Günü"                               on february 28
-"Deprem Haftası Başlangıcı"                        on march 1
-"Dünya Kadınlar Günü"                              on march 8
-"Tıp Bayramı"                                      on march 14
-"Şehitler Günü"                                    on march 18
-"Çanakkale Zaferi"                                 on march 18
-"Nevruz Bayramı"                                   on march 21
-"Dünya Tiyatrolar Günü"                            on march 27
-"Dünya Sağlık Günü"                                on april 7
-"Hıdrellez"                                        on may 6
-"Anneler Günü"                                     on second sunday in may
-"Etik Günü"                                        on may 25
-"Ä°stanbul'un Fethi"                                on may 29
-"Dünya Çevre Günü"                                 on june 5
-"Dünya Gönüllü Kan Bağışçıları Günü"               on june 14
-"Babalar Günü"                                     on third sunday in june
-"Kabotaj ve Deniz Bayramı"                         on july 1
-"Dünya Barış Günü"                                 on september 1
-"Gaziler Günü"                                     on september 19
-"Türk Dil Bayramı"                                 on september 26
-"Dünya Kalp Günü"                                  on last sunday in september
-"Dünya Hayvanları Koruma Günü"                     on october 4
-"Atatürk'ün Ölüm Yıldönümü"                        on november 10
-"Çocuk Hakları Günü"                               on november 20
-"Öğretmenler Günü"                                 on november 24
-"Kadına Yönelik Şiddete Karşı Mücadele Günü"       on november 25
-"Dünya AIDS Günü"                                  on december 1
-"Dünya Özürlüler Günü"                             on december 3
-"Dünya İnsan Hakları Günü"                         on december 10
+"Dünya Kanser Günü"                                cultural on february 4
+"Sevgililer Günü"                                  cultural on february 14
+"Sivil Savunma Günü"                               cultural on february 28
+"Deprem Haftası Başlangıcı"                        cultural on march 1
+"Dünya Kadınlar Günü"                              cultural on march 8
+"Tıp Bayramı"                                      cultural on march 14
+"Şehitler Günü"                                    cultural on march 18
+"Çanakkale Zaferi"                                 cultural on march 18
+"Nevruz Bayramı"                                   cultural on march 21
+"Dünya Tiyatrolar Günü"                            cultural on march 27
+"Dünya Sağlık Günü"                                cultural on april 7
+"Hıdrellez"                                        cultural on may 6
+"Anneler Günü"                                     cultural on second sunday in may
+"Etik Günü"                                        cultural on may 25
+"Ä°stanbul'un Fethi"                                cultural on may 29
+"Dünya Çevre Günü"                                 cultural on june 5
+"Dünya Gönüllü Kan Bağışçıları Günü"               cultural on june 14
+"Babalar Günü"                                     cultural on third sunday in june
+"Kabotaj ve Deniz Bayramı"                         cultural on july 1
+"Dünya Barış Günü"                                 cultural on september 1
+"Gaziler Günü"                                     cultural on september 19
+"Türk Dil Bayramı"                                 cultural on september 26
+"Dünya Kalp Günü"                                  cultural on last sunday in september
+"Dünya Hayvanları Koruma Günü"                     cultural on october 4
+"Atatürk'ün Ölüm Yıldönümü"                        cultural on november 10
+"Çocuk Hakları Günü"                               cultural on november 20
+"Öğretmenler Günü"                                 cultural on november 24
+"Kadına Yönelik Şiddete Karşı Mücadele Günü"       cultural on november 25
+"Dünya AIDS Günü"                                  cultural on december 1
+"Dünya Özürlüler Günü"                             cultural on december 3
+"Dünya İnsan Hakları Günü"                         cultural on december 10
 
 :: School
 
 :: Daylight Saving
-"Yaz Saati Uygulaması Başlangıcı"                  on ((year == 2011) ? [march 28] : [last sunday in march])
-"Yaz Saati Uygulaması Bitişi"                      on last sunday in october
+"Yaz Saati Uygulaması Başlangıcı"                  seasonal on ((year == 2011) ? [march 28] : [last sunday in march])
+"Yaz Saati Uygulaması Bitişi"                      seasonal on last sunday in october
 
 :: Seasons
-"İlkbahar Başlangıcı"                              on march 21
-"Yaz Başlangıcı"                                   on june 21
-"Sonbahar Başlangıcı"                              on september 23
-"Kış Başlangıcı"                                   on december 21
-
-"Birinci Cemrenin (Havaya) Düşüşü"                 on november 8 plus 105 days
-"İkinci Cemrenin (Suya) Düşüşü"                    on november 8 plus 112 days
-"Üçüncü Cemrenin (Toprağa) Düşüşü"                 on november 8 plus 119 days
+"İlkbahar Başlangıcı"                              seasonal on march 21
+"Yaz Başlangıcı"                                   seasonal on june 21
+"Sonbahar Başlangıcı"                              seasonal on september 23
+"Kış Başlangıcı"                                   seasonal on december 21
+
+"Birinci Cemrenin (Havaya) Düşüşü"                 seasonal on november 8 plus 105 days
+"İkinci Cemrenin (Suya) Düşüşü"                    seasonal on november 8 plus 112 days
+"Üçüncü Cemrenin (Toprağa) Düşüşü"                 seasonal on november 8 plus 119 days
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_ua_uk b/kholidays/holidays/plan2/holiday_ua_uk
index 373b650..ed65972 100644
--- a/kholidays/holidays/plan2/holiday_ua_uk
+++ b/kholidays/holidays/plan2/holiday_ua_uk
@@ -22,313 +22,313 @@ description "Файл списку святкових днів України"
 
 :: Public Holidays
 : New Year's Day
-"Новий Рік"                                                         weekend on january 1
+"Новий Рік"                                                         public on january 1
 : New Year's Day Substitute Holiday
-"Новий Рік"                                                         weekend on ( (([january 1] == [saturday after ([january 1])]) ||
-                                                                                  ([january 1] == [sunday after ([january 1])])) ?
-                                                                                      [monday after ([january 1])] :
+"Новий Рік"                                                         public on ( (([january 1] == [saturday after ([january 1])]) ||
+                                                                                 ([january 1] == [sunday after ([january 1])])) ?
+                                                                                  [monday after ([january 1])] :
                                                                                   noop )
-: Orthodox Christmas, could use "weekend on julian december 25"
-"Різдво Христове"                                                   weekend on january 7 
+: Orthodox Christmas, could use "public on julian december 25"
+"Різдво Христове"                                                   public religious on january 7
 : Orthodox Christmas Substitute Holiday
-"Різдво Христове"                                                   weekend on ( (([january 7] == [saturday after ([january 7])]) ||
-                                                                                  ([january 7] == [sunday after ([january 7])])) ?
-                                                                                      [monday after ([january 7])] :
+"Різдво Христове"                                                   public on ( (([january 7] == [saturday after ([january 7])]) ||
+                                                                                 ([january 7] == [sunday after ([january 7])])) ?
+                                                                                  [monday after ([january 7])] :
                                                                                   noop )
 : International Women's Day
-"Міжнародний жіночий день"                                          weekend on march 8
+"Міжнародний жіночий день"                                          public on march 8
 : International Women's Day Substitute Holiday
-"Міжнародний жіночий день"                                          weekend on ( (([march 8] == [saturday after ([march 8])]) ||
-                                                                                  ([march 8] == [sunday after ([march 8])])) ?
-                                                                                      [monday after ([march 8])] :
+"Міжнародний жіночий день"                                          public on ( (([march 8] == [saturday after ([march 8])]) ||
+                                                                                 ([march 8] == [sunday after ([march 8])])) ?
+                                                                                  [monday after ([march 8])] :
                                                                                   noop )
 : Orthodox Easter
-"Великдень"                                                         weekend on pascha
+"Великдень"                                                         public religious on pascha
 : Orthodox Easter Substitute Holiday
-"Великдень"                                                         weekend on monday after ([pascha])
+"Великдень"                                                         public on monday after ([pascha])
 : International Workers' Day
-"День міжнародної солідарності трудящих"                            weekend on may 1 length 2 days
+"День міжнародної солідарності трудящих"                            public on may 1 length 2 days
 : International Workers' Day Substitute Holiday
-"День міжнародної солідарності трудящих"                            weekend on ( (([may 1] == [saturday after ([may 1])])) ?
-                                                                                      [monday after ([may 1])] :
-                                                                                  ((([may 1] == [sunday after ([may 1])])) ?
-                                                                                      [tuesday after ([may 1])] :
+"День міжнародної солідарності трудящих"                            public on ( (([may 1] == [saturday after ([may 1])])) ?
+                                                                                  [monday after ([may 1])] :
+                                                                               ((([may 1] == [sunday after ([may 1])])) ?
+                                                                                  [tuesday after ([may 1])] :
                                                                                   noop ) )
-"День міжнародної солідарності трудящих"                            weekend on ( (([may 2] == [saturday after ([may 2])])) ?
-                                                                                      [monday after ([may 2])] :
-                                                                                  ((([may 2] == [sunday after ([may 2])])) ?
-                                                                                      [tuesday after ([may 2])] :
+"День міжнародної солідарності трудящих"                            public on ( (([may 2] == [saturday after ([may 2])])) ?
+                                                                                  [monday after ([may 2])] :
+                                                                               ((([may 2] == [sunday after ([may 2])])) ?
+                                                                                  [tuesday after ([may 2])] :
                                                                                   noop ) )
 : Victory Day
-"День Перемоги"                                                     weekend on may 9
+"День Перемоги"                                                     public on may 9
 : Victory Day Substitute Holiday
-"День Перемоги"                                                     weekend on ( (([may 9] == [saturday after ([may 9])]) ||
-                                                                                  ([may 9] == [sunday after ([may 9])])) ?
-                                                                                      [monday after ([may 9])] :
+"День Перемоги"                                                     public on ( (([may 9] == [saturday after ([may 9])]) ||
+                                                                                 ([may 9] == [sunday after ([may 9])])) ?
+                                                                                  [monday after ([may 9])] :
                                                                                   noop )
 : Orthodox Pentecost / Holy Trinity Day (Triytsya)
-"Трійця"                                                            weekend on pascha plus 49 days
+"Трійця"                                                            public religious on pascha plus 49 days
 : Orthodox Pentecost / Holy Trinity Day (Triytsya) Substitute Holiday
-"Трійця"                                                            weekend on pascha plus 50 days
+"Трійця"                                                            public religious on pascha plus 50 days
 : Constitution Day
-"День Конституції України"                                          weekend on june 28
+"День Конституції України"                                          public on june 28
 : Constitution Day Substitute Holiday
-"День Конституції України"                                          weekend on ( (([june 28] == [saturday after ([june 28])]) ||
-                                                                                  ([june 28] == [sunday after ([june 28])])) ?
-                                                                                      [monday after ([june 28])] :
+"День Конституції України"                                          public on ( (([june 28] == [saturday after ([june 28])]) ||
+                                                                                 ([june 28] == [sunday after ([june 28])])) ?
+                                                                                  [monday after ([june 28])] :
                                                                                   noop )
 : Independence Day
-"День Незалежності України"                                         weekend on august 24
+"День Незалежності України"                                         public on august 24
 : Independence Day Substitute Holiday
-"День Незалежності України"                                         weekend on ( (([august 24] == [saturday after ([august 24])]) ||
-                                                                                  ([august 24] == [sunday after ([august 24])])) ?
-                                                                                      [monday after ([august 24])] :
+"День Незалежності України"                                         public on ( (([august 24] == [saturday after ([august 24])]) ||
+                                                                                 ([august 24] == [sunday after ([august 24])])) ?
+                                                                                  [monday after ([august 24])] :
                                                                                   noop )
 
 :: Religious
 : Old New Year Eve, could use "on julian december 31"
-"Щедрий вечір"                                                      on january 13
+"Щедрий вечір"                                                      religious on january 13
 : Old New Year, could use "on julian january 1"
-"День Василія Великого"                                             on january 14
+"День Василія Великого"                                             religious on january 14
 : Epiphany
-"Водохреща"                                                         on january 19
+"Водохреща"                                                         religious on january 19
 : The Purification of St. Mary
-"Стрітення"                                                         on february 15
+"Стрітення"                                                         religious on february 15
 : Feast of St. John the Baptist
-"Різдво Івана Хрестителя (Івана Купала)"                            on july 7
+"Різдво Івана Хрестителя (Івана Купала)"                            religious on july 7
 : Merciful Saviour and the Blessed Virgin Mary
-"Маковея"                                                           on august 14
+"Маковея"                                                           religious on august 14
 : Assumption of Mary
-"Успіння Пресвятої Богородиці"                                      on august 28
+"Успіння Пресвятої Богородиці"                                      religious on august 28
 : The Protection of the Mother of God
-"Покрова Пресвятої Богородиці"                                      on october 14
+"Покрова Пресвятої Богородиці"                                      religious on october 14
 
 :: Financial
 
 :: Cultural
 : Unity Day of Ukraine
-"День соборності України"                                           on january 22
+"День соборності України"                                           cultural on january 22
 : Battle of Kruty Memorial Day
-"День пам’яті героїв Крут"                                          on january 29
+"День пам’яті героїв Крут"                                          cultural on january 29
 : Valentine's Day
-"День святого Валентина (День всіх закоханих)"                      on february 14
+"День святого Валентина (День всіх закоханих)"                      cultural on february 14
 : International Mother Language Day
-"Міжнародний день рідної мови"                                      on february 21
+"Міжнародний день рідної мови"                                      cultural on february 21
 : International Day for Monuments and Sites
-"День пам'яток історії та культури"                                 on april 18
+"День пам'яток історії та культури"                                 cultural on april 18
 : Environment Day
-"День довкілля"                                                     on third saturday in april
+"День довкілля"                                                     cultural on third saturday in april
 : Mother's Day
-"День матері"                                                       on second sunday in may
+"День матері"                                                       cultural on second sunday in may
 : Europe Day
-"День Європи"                                                       on third saturday in may
+"День Європи"                                                       cultural on third saturday in may
 : Saints Cyril and Methodius Day
-"День слов'янської писемності і культури"                           on may 24
+"День слов'янської писемності і культури"                           cultural on may 24
 : Children's Day
-"День захисту дітей"                                                on june 1
+"День захисту дітей"                                                cultural on june 1
 : Memorial Day of War Victim's Mourning in Ukraine
-"День скорботи і вшанування пам'яті жертв війни в Україні"          on june 22
+"День скорботи і вшанування пам'яті жертв війни в Україні"          cultural on june 22
 : International Youth Day
-"День молоді"                                                       on last sunday in june
+"День молоді"                                                       cultural on last sunday in june
 : Ukrainian Flag Day
-"День Державного Прапора України"                                   on august 23
+"День Державного Прапора України"                                   cultural on august 23
 : Ukrainian Library Day
-"Всеукраїнський день бібліотек"                                     on september 30
+"Всеукраїнський день бібліотек"                                     cultural on september 30
 : Day of Ukrainian Cossacks
-"День Українського козацтва"                                        on october 14
+"День Українського козацтва"                                        cultural on october 14
 : Day of Ukrainian Script and Language
-"День української писемності та мови"                               on november 9
+"День української писемності та мови"                               cultural on november 9
 : Freedom Day
-"День Свободи"                                                      on november 22
+"День Свободи"                                                      cultural on november 22
 : Holodomor Memorial Day
-"День пам'яті жертв голодоморів"                                    on fourth saturday in november
+"День пам'яті жертв голодоморів"                                    cultural on fourth saturday in november
 
 :: School
 
 :: Daylight Saving
 : DST forward
-"Перехід на літній час"                                             on last sunday in march
+"Перехід на літній час"                                             seasonal on last sunday in march
 : DST back
-"Перехід на зимовий час"                                            on last sunday in october
+"Перехід на зимовий час"                                            seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Початок весни"                                                     on march 1
+"Початок весни"                                                     seasonal on march 1
 : Summer
-"Початок літа"                                                      on june 1
+"Початок літа"                                                      seasonal on june 1
 : Autumn
-"Початок осені"                                                     on september 1
+"Початок осені"                                                     seasonal on september 1
 : Winter
-"Початок зими"                                                      on december 1
+"Початок зими"                                                      seasonal on december 1
 
 :: Name Days
 
 :: Professions
 : Customs Official Day
-"Міжнародний день митника"                                                                  on january 26
+"Міжнародний день митника"                                                                  cultural on january 26
 : Firefighter's Day
-"День працівників пожежної охорони"                                                         on january 29
+"День працівників пожежної охорони"                                                         cultural on january 29
 : Soviet Troop Withdrawal from Afghanistan Day
-"День вшанування учасників бойових дій на території інших держав"                           on february 15
+"День вшанування учасників бойових дій на території інших держав"                           cultural on february 15
 : Defender of the Fatherland Day
-"День захисника Вітчизни"                                                                   on february 23
+"День захисника Вітчизни"                                                                   cultural on february 23
 : Land Surveyor's Day
-"День землевпорядника"                                                                      on second saturday in march
+"День землевпорядника"                                                                      cultural on second saturday in march
 : Day of the Housing and Consumer Services
-"День працівників житлово-комунального господарства і побутового обслуговування населення"  on third sunday in march
+"День працівників житлово-комунального господарства і побутового обслуговування населення"  cultural on third sunday in march
 : Day of Ukrainian Culture and Folk Art
-"Всеукраїнський день працівників культури та аматорів народного мистецтва"                  on march 23
+"Всеукраїнський день працівників культури та аматорів народного мистецтва"                  cultural on march 23
 : Ukrainian Day Against TB
-"Всеукраїнський день боротьби із захворюванням на туберкульоз"                              on march 24
+"Всеукраїнський день боротьби із захворюванням на туберкульоз"                              cultural on march 24
 : Day of Security Service of Ukraine
-"День Служби безпеки України"                                                               on march 25
+"День Служби безпеки України"                                                               cultural on march 25
 : Day of the Interior Troops of the Ministry of Internal Affairs of Ukraine
-"День внутрішніх військ Міністерства внутрішніх справ України"                              on march 26
+"День внутрішніх військ Міністерства внутрішніх справ України"                              cultural on march 26
 : Geologist's Day
-"День геолога"                                                                              on first sunday in april
+"День геолога"                                                                              cultural on first sunday in april
 : Day of Rocket-space Industry of Ukraine
-"День працівників ракетно-космічної галузі України"                                         on april 12
+"День працівників ракетно-космічної галузі України"                                         cultural on april 12
 : Day of Labor
-"День охорони праці"                                                                        on april 28
+"День охорони праці"                                                                        cultural on april 28
 : Bank's Day
-"День банківських працівників"                                                              on may 20
+"День банківських працівників"                                                              cultural on may 20
 : Scientist's Day
-"День науки"                                                                                on third saturday in may
+"День науки"                                                                                cultural on third saturday in may
 : Polygraphist's Day
-"День працівників видавництв, поліграфії і книгорозповсюдження"                             on last saturday in may
+"День працівників видавництв, поліграфії і книгорозповсюдження"                             cultural on last saturday in may
 : Chemist's Day
-"День хіміка"                                                                               on last sunday in may
+"День хіміка"                                                                               cultural on last sunday in may
 : Peacekeeper's Day
-"Міжнародний день миротворців Організації Об'єднаних Націй"                                 on may 29
+"Міжнародний день миротворців Організації Об'єднаних Націй"                                 cultural on may 29
 : Frontier-guard Day
-"День прикордонника"                                                                        on may 28
+"День прикордонника"                                                                        cultural on may 28
 : Journalist's Day
-"День журналіста"                                                                           on june 6
+"День журналіста"                                                                           cultural on june 6
 : Local Industry Day
-"День працівників місцевої промисловості"                                                   on first sunday in june
+"День працівників місцевої промисловості"                                                   cultural on first sunday in june
 : Water Industry Day
-"День працівників водного господарства"                                                     on first sunday in june
+"День працівників водного господарства"                                                     cultural on first sunday in june
 : Light Industry Day
-"День працівників легкої промисловості"                                                     on second sunday in june
+"День працівників легкої промисловості"                                                     cultural on second sunday in june
 : Medical Day
-"День медичного працівника"                                                                 on third sunday in june
+"День медичного працівника"                                                                 cultural on third sunday in june
 : Authorities Day
-"День державної служби"                                                                     on june 23
+"День державної служби"                                                                     cultural on june 23
 : Ukrainian Custom Official Day
-"День митної служби України"                                                                on june 25
+"День митної служби України"                                                                cultural on june 25
 : Architecture Day
-"День архітектури України"                                                                  on july 1
+"День архітектури України"                                                                  cultural on july 1
 : Taxman's Day
-"День працівника державної податкової служби України"                                       on july 2
+"День працівника державної податкової служби України"                                       cultural on july 2
 : Antiaircraft Defence Day
-"День Військ Протиповітряної оборони"                                                       on first sunday in july
+"День Військ Протиповітряної оборони"                                                       cultural on first sunday in july
 : Navy Day
-"День Військово-Морських Сил"                                                               on first sunday in july
+"День Військово-Морських Сил"                                                               cultural on first sunday in july
 : Sailor's Day
-"День працівників морського та річкового флоту"                                             on first sunday in july
+"День працівників морського та річкового флоту"                                             cultural on first sunday in july
 : Fishman's Day
-"День рибалки"                                                                              on second sunday in july
+"День рибалки"                                                                              cultural on second sunday in july
 : Bookkeeper's Day
-"День бухгалтера"                                                                           on july 16
+"День бухгалтера"                                                                           cultural on july 16
 : Metallurgical and Miner's Day
-"День працівників металургійної та гірничодобувної промисловості"                           on third sunday in july
+"День працівників металургійної та гірничодобувної промисловості"                           cultural on third sunday in july
 : Tradesman's Day
-"День працівників торгівлі"                                                                 on last sunday in july
+"День працівників торгівлі"                                                                 cultural on last sunday in july
 : Airborne Day
-"День аеромобільних військ"                                                                 on august 2
+"День аеромобільних військ"                                                                 cultural on august 2
 : Military Operator's Day
-"День військ зв'язку"                                                                       on august 8
+"День військ зв'язку"                                                                       cultural on august 8
 : Builder's Day
-"День будівельника"                                                                         on second sunday in august
+"День будівельника"                                                                         cultural on second sunday in august
 : Veterenary Day
-"День працівників ветеринарної медицини"                                                    on second sunday in august
+"День працівників ветеринарної медицини"                                                    cultural on second sunday in august
 : Beekeeper's Day
-"День пасічника"                                                                            on august 19
+"День пасічника"                                                                            cultural on august 19
 : Aviation Day
-"День авіації"                                                                              on last saturday in august
+"День авіації"                                                                              cultural on last saturday in august
 : Miner's Day
-"День шахтаря"                                                                              on last sunday in august
+"День шахтаря"                                                                              cultural on last sunday in august
 : Businessman's Day
-"День підприємця"                                                                           on first sunday in september
+"День підприємця"                                                                           cultural on first sunday in september
 :Sport Day
-"День фізичної культури і спорту"                                                           on second saturday in september
+"День фізичної культури і спорту"                                                           cultural on second saturday in september
 : Tankman's Day
-"День танкістів"                                                                            on second sunday in september
+"День танкістів"                                                                            cultural on second sunday in september
 : Oil and Gas Industry Day
-"День працівників нафтової, газової та нафтопереробної промисловості"                       on second sunday in september
+"День працівників нафтової, газової та нафтопереробної промисловості"                       cultural on second sunday in september
 : Ukrainian Cinema Day
-"День українського кіно"                                                                    on second saturday in september
+"День українського кіно"                                                                    cultural on second saturday in september
 : Civil Defence Day
-"День працівників цивільного захисту"                                                       on september 17
+"День працівників цивільного захисту"                                                       cultural on september 17
 : Peace Day
-"День миру"                                                                                 on september 21
+"День миру"                                                                                 cultural on september 21
 : Partizan's Day
-"День партизанської слави"                                                                  on september 22
+"День партизанської слави"                                                                  cultural on september 22
 : Pharmacist's Day
-"День фармацевтичного працівника"                                                           on third saturday in september
+"День фармацевтичного працівника"                                                           cultural on third saturday in september
 : Inventor's Day
-"День винахідника і раціоналізатора"                                                        on third saturday in september
+"День винахідника і раціоналізатора"                                                        cultural on third saturday in september
 : Forest Guard Day
-"День працівника лісу"                                                                      on third sunday in september
+"День працівника лісу"                                                                      cultural on third sunday in september
 : Machine Building Day
-"День машинобудівника"                                                                      on fourth sunday in september
+"День машинобудівника"                                                                      cultural on fourth sunday in september
 : Knowledge Day
-"День знань"                                                                                on september 1
+"День знань"                                                                                cultural on september 1
 : Tourist's Day
-"День туризму"                                                                              on september 27
+"День туризму"                                                                              cultural on september 27
 : Education Day
-"День працівників освіти"                                                                   on first sunday in october
+"День працівників освіти"                                                                   cultural on first sunday in october
 : Lawyer's Day
-"День юриста"                                                                               on october 8
+"День юриста"                                                                               cultural on october 8
 : Standartization Day
-"День працівників стандартизації та метрології"                                             on october 10
+"День працівників стандартизації та метрології"                                             cultural on october 10
 : Epidemiologist's Day
-"День працівників державної санітарно-епідеміологічної служби"                              on second sunday in october
+"День працівників державної санітарно-епідеміологічної служби"                              cultural on second sunday in october
 : Artist's Day
-"День художника"                                                                            on second sunday in october
+"День художника"                                                                            cultural on second sunday in october
 : Food Industry Day
-"День працівників харчової промисловості"                                                   on third sunday in october
+"День працівників харчової промисловості"                                                   cultural on third sunday in october
 : Automobilist's Day
-"День автомобіліста і дорожника"                                                            on last sunday in october
+"День автомобіліста і дорожника"                                                            cultural on last sunday in october
 : Miltary Engineering Day
-"День інженерних військ"                                                                    on november 3
+"День інженерних військ"                                                                    cultural on november 3
 : Artillery Day
-"День ракетних військ і артилерії"                                                          on november 3
+"День ракетних військ і артилерії"                                                          cultural on november 3
 : Railroad Day
-"День залізничника"                                                                         on november 4
+"День залізничника"                                                                         cultural on november 4
 : Social Woker's Day
-"День працівника соціальної сфери"                                                          on first sunday in november
+"День працівника соціальної сфери"                                                          cultural on first sunday in november
 : Telecommunication Day
-"День працівників радіо, телебачення та зв'язку"                                            on november 16
+"День працівників радіо, телебачення та зв'язку"                                            cultural on november 16
 : Student's Day
-"День студента"                                                                             on november 17
+"День студента"                                                                             cultural on november 17
 : Meteorology Day
-"День працівників гідрометеорологічної служби"                                              on november 19
+"День працівників гідрометеорологічної служби"                                              cultural on november 19
 : Glass Worker's Day
-"День скловиробника"                                                                        on november 19
+"День скловиробника"                                                                        cultural on november 19
 : Farmer's Day
-"День працівників сільського господарства"                                                  on third sunday in november
+"День працівників сільського господарства"                                                  cultural on third sunday in november
 : Procuracy Day
-"День працівників прокуратури"                                                              on december 1
+"День працівників прокуратури"                                                              cultural on december 1
 : Statistics Day
-"День працівників статистики"                                                               on december 5
+"День працівників статистики"                                                               cultural on december 5
 : Army Day
-"День Збройних Сил України"                                                                 on december 6
+"День Збройних Сил України"                                                                 cultural on december 6
 : Local Authorities Day
-"День місцевого самоврядування"                                                             on december 7
+"День місцевого самоврядування"                                                             cultural on december 7
 : Infantry Day
-"День Сухопутних військ  України"                                                           on december 12
+"День Сухопутних військ  України"                                                           cultural on december 12
 : Chornobyl Worker's Day
-"День вшанування учасників ліквідації наслідків аварії на Чорнобильській АЕС"               on december 14
+"День вшанування учасників ліквідації наслідків аварії на Чорнобильській АЕС"               cultural on december 14
 : Court Worker's Day
-"День працівників суду"                                                                     on december 15
+"День працівників суду"                                                                     cultural on december 15
 : Advocasy Day
-"День адвокатури"                                                                           on december 19
+"День адвокатури"                                                                           cultural on december 19
 : Militia Day
-"День міліції"                                                                              on december 20
+"День міліції"                                                                              cultural on december 20
 : Diplomatist's Day
-"День працівників дипломатичної служби"                                                     on december 22
+"День працівників дипломатичної служби"                                                     cultural on december 22
 : Power Engineering Day
-"День енергетика"                                                                           on december 22
+"День енергетика"                                                                           cultural on december 22
 : Archivist's Day
-"День працівників архівних установ"                                                         on december 24
+"День працівників архівних установ"                                                         cultural on december 24
diff --git a/kholidays/holidays/plan2/holiday_us_en-us b/kholidays/holidays/plan2/holiday_us_en-us
index 347fad5..08f5f9a 100644
--- a/kholidays/holidays/plan2/holiday_us_en-us
+++ b/kholidays/holidays/plan2/holiday_us_en-us
@@ -19,54 +19,54 @@ description "National holiday file for USA"
 
 :: Public Holidays
 :: Federal Holidays
-"New Year's Day"                 weekend on january 1
-"Martin Luther King's Birthday"  weekend on third monday in january
-"President's Day"                weekend on third monday in february
-"Memorial Day"                   weekend on last monday in may
-"Independence Day"               weekend on july 4
-"Labor Day"                      weekend on first monday in september
-"Columbus Day"                   weekend on second monday in october
-"Veterans Day"                   weekend on november 11
-"Thanksgiving"                   weekend on fourth thursday in november
-"Christmas Day"                  weekend on december 25
+"New Year's Day"                 public on january 1
+"Martin Luther King's Birthday"  public on third monday in january
+"President's Day"                public on third monday in february
+"Memorial Day"                   public on last monday in may
+"Independence Day"               public on july 4
+"Labor Day"                      public on first monday in september
+"Columbus Day"                   public on second monday in october
+"Veterans Day"                   public on november 11
+"Thanksgiving"                   public on fourth thursday in november
+"Christmas Day"                  public on december 25
 
 :: Religious
-"Easter"                         on easter
-"Ash Wednesday"                  on easter minus 46 days
-"Pentecost"                      on easter plus 49 days
-"Ascension"                      on easter plus 39 days
-"Trinity"                        on easter plus 56 days
-"Corpus Christi"                 on easter plus 53 days
+"Easter"                         religious on easter
+"Ash Wednesday"                  religious on easter minus 46 days
+"Pentecost"                      religious on easter plus 49 days
+"Ascension"                      religious on easter plus 39 days
+"Trinity"                        religious on easter plus 56 days
+"Corpus Christi"                 religious on easter plus 53 days
 
 :: Financial
 
 :: Cultural
-"Groundhog Day"                  on february 2
-"Lincoln's Birthday"             on february 12
-"St. Valentine's Day"            on february 14
-"Susan B. Anthony's Day"         on february 15
-"St. Patrick's Day"              on march 17
-"Arbor Day"                      on last friday in april
-"Loyalty Day"                    on may 1
-"Mother's Day"                   on second sunday in may
-"Armed Forces Day"               on third saturday in may
-"Father's Day"                   on third sunday in june
-"Citizenship Day"                on september 17
-"Child Health Day"               on first monday in september
-"World Poetry Day"               on october 15
-"United Nations' Day"            on october 24
-"Halloween"                      on october 31
-"Bill of Rights' Day"            on december 15
-"Wright Brothers' Day"           on december 17
+"Groundhog Day"                  cultural on february 2
+"Lincoln's Birthday"             cultural on february 12
+"St. Valentine's Day"            cultural on february 14
+"Susan B. Anthony's Day"         cultural on february 15
+"St. Patrick's Day"              cultural on march 17
+"Arbor Day"                      cultural on last friday in april
+"Loyalty Day"                    cultural on may 1
+"Mother's Day"                   cultural on second sunday in may
+"Armed Forces Day"               cultural on third saturday in may
+"Father's Day"                   cultural on third sunday in june
+"Citizenship Day"                cultural on september 17
+"Child Health Day"               cultural on first monday in september
+"World Poetry Day"               cultural on october 15
+"United Nations' Day"            cultural on october 24
+"Halloween"                      cultural on october 31
+"Bill of Rights' Day"            cultural on december 15
+"Wright Brothers' Day"           cultural on december 17
 
 :: School
 
 :: Daylight Saving
 
 :: Seasons
-"Spring Begins"                  on march 22
-"Summer Begins"                  on june 22
-"Fall Begins"                    on september 22
-"Winter Begins"                  on december 22
+"Spring Begins"                  seasonal on march 22
+"Summer Begins"                  seasonal on june 22
+"Fall Begins"                    seasonal on september 22
+"Winter Begins"                  seasonal on december 22
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_uy_es b/kholidays/holidays/plan2/holiday_uy_es
index da78d47..05d513b 100644
--- a/kholidays/holidays/plan2/holiday_uy_es
+++ b/kholidays/holidays/plan2/holiday_uy_es
@@ -21,19 +21,19 @@ language    "es"
 :description "(please add description in source language) National holiday file for Uruguay"
 
 :: Public Holidays
-"Año nuevo"                      weekend on january 1
-"Jura de la constituación"       weekend on july 18
-"Declaratoria de Independencia"  weekend on august 25
-"Día del Trabajo"                weekend on may 1
-"Día de los difuntos"            weekend on november 2
-"Navidad"                        weekend on december 25
+"Año nuevo"                      public on january 1
+"Jura de la constituación"       public on july 18
+"Declaratoria de Independencia"  public on august 25
+"Día del Trabajo"                public on may 1
+"Día de los difuntos"            public on november 2
+"Navidad"                        public religious on december 25
 
 :: Religious
-"Carnaval"                       on easter minus 47 days length 2 days
-"Jueves santo"                   on easter minus 3 days
-"Viernes santo"                  on easter minus 2 days
-"Sábado de gloria"               on easter minus 1 day
-"Domingo de Pascua"              on easter
+"Carnaval"                       religious on easter minus 47 days length 2 days
+"Jueves santo"                   religious on easter minus 3 days
+"Viernes santo"                  religious on easter minus 2 days
+"Sábado de gloria"               religious on easter minus 1 day
+"Domingo de Pascua"              religious on easter
 
 :: Financial
 
@@ -49,9 +49,9 @@ language    "es"
 
 
 :: To be sorted
-"Día de Reyes"                   on january 6
-"Desembarco 33 Orientales"       on april 19
-"Batalla de las Piedras"         on may 18
-"Natalicio de Artigas"           on june 19
-"Día de las Américas"            on october 18
+"Día de Reyes"                   civil on january 6
+"Desembarco 33 Orientales"       civil on april 19
+"Batalla de las Piedras"         civil on may 18
+"Natalicio de Artigas"           civil on june 19
+"Día de las Américas"            civil on october 18
 
diff --git a/kholidays/holidays/plan2/holiday_wf_fr b/kholidays/holidays/plan2/holiday_wf_fr
index 951b9e5..0d788c4 100644
--- a/kholidays/holidays/plan2/holiday_wf_fr
+++ b/kholidays/holidays/plan2/holiday_wf_fr
@@ -33,90 +33,90 @@ description "Fêtes et jours fériés en Wallis-et-Futuna"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
-"St-Pierre-Chanel"          weekend on april 28
-"Fête du Territoire"        weekend on july 29
+"St-Pierre-Chanel"          public on april 28
+"Fête du Territoire"        public on july 29
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on september 23
+"Printemps"                 seasonal on september 23
 : Summer
-"Été"                       on december 21
+"Été"                       seasonal on december 21
 : Fall
-"Automne"                   on march 20
+"Automne"                   seasonal on march 20
 : Winter
-"Hiver"                     on june 21
+"Hiver"                     seasonal on june 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_yt_fr b/kholidays/holidays/plan2/holiday_yt_fr
index 74abba8..5a75c39 100644
--- a/kholidays/holidays/plan2/holiday_yt_fr
+++ b/kholidays/holidays/plan2/holiday_yt_fr
@@ -33,92 +33,92 @@ description "Fêtes et jours fériés en Mayotte"
 
 :: Public Holidays - Fêtes civiles et jours fériés
 : New Year's Day
-"Jour de l'an"              weekend on january 1
+"Jour de l'an"              public on january 1
 : Easter
-"Pâques"                    weekend on easter length 2 days
-"Ascension"                 weekend on easter plus 39 days
-"Pentecôte"                 weekend on easter plus 49 days length 2 days
+"Pâques"                    public religious on easter length 2 days
+"Ascension"                 public religious on easter plus 39 days
+"Pentecôte"                 public religious on easter plus 49 days length 2 days
 : Labor day
-"Fête du Travail"           weekend on may 1
+"Fête du Travail"           public on may 1
 : WW2 armistice
-"Fête de la Victoire"       weekend on may 8
+"Fête de la Victoire"       public on may 8
 : National day
-"Fête nationale"            weekend on july 14
+"Fête nationale"            public on july 14
 : Assumption
-"Assomption"                weekend on august 15
+"Assomption"                public religious on august 15
 : All saints day
-"Toussaint"                 weekend on november 1
+"Toussaint"                 public religious on november 1
 : WW1 armistice
-"Armistice de 1918"         weekend on november 11
+"Armistice de 1918"         public on november 11
 : Christmas day
-"Noël"                      weekend on december 25
+"Noël"                      public religious on december 25
 
 :: Territorial and Regional holidays
 : Abolition of Slavery
-"Abolition de l'esclavage"  weekend on april 27
+"Abolition de l'esclavage"  public on april 27
 : Eid al-Adha
-"Aïd el-Kebir"              weekend on hijri thualhijjah 10
+"Aïd el-Kebir"              public religious on hijri thualhijjah 10
 
 :: Religious - Fêtes religieuses
-"Épiphanie"                 on first sunday in january
+"Épiphanie"                 religious on first sunday in january
 : Presentation of Jesus at the Temple
-"Chandeleur"                on february 2
-"Mardi Gras"                on easter minus 47 days
+"Chandeleur"                religious on february 2
+"Mardi Gras"                religious on easter minus 47 days
 : Ash Wednesday
-"Mercredi des Cendres"      on easter minus 46 days
+"Mercredi des Cendres"      religious on easter minus 46 days
 : Good Friday
-"Vendredi saint"            on easter minus 2 days
+"Vendredi saint"            religious on easter minus 2 days
 : Day of the dead
-"Fête des morts"            on november 2
-"St Étienne"                on december 26
+"Fête des morts"            religious on november 2
+"St Étienne"                religious on december 26
 
 :: Financial
 
 :: Cultural - Fêtes civiles non fériées
 : Valentine's day
-"Fête des amoureux"         on february 14
+"Fête des amoureux"         cultural on february 14
 : Grandmothers' day
-"Fête des grands-mères"     on first sunday in march
+"Fête des grands-mères"     cultural on first sunday in march
 : Remembrance of the Deportees
-"Souvenir des Déportés"     on last sunday in april
+"Souvenir des Déportés"     commemorative on last sunday in april
 : Europe day
-"Journée de l'Europe"       on may 9
+"Journée de l'Europe"       cultural on may 9
 : Remembrance of slavery
-"Mémoire de l'esclavage"    on may 10
+"Mémoire de l'esclavage"    commemorative on may 10
 : Neighbors' day
-"Fête des voisins"          on last tuesday in may
+"Fête des voisins"          cultural on last tuesday in may
 : Mothers' day, move if clashes with Pentecost
-"Fête des mères"            ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Fête des mères"            cultural on ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
 : or 'first sunday in june' if same day as Pentecôte
 : Fathers' day
-"Fête des pères"            on third sunday in june
+"Fête des pères"            cultural on third sunday in june
 : Fatalities in the 1st Indochina war
-"Morts en Indochine"        on june 8
+"Morts en Indochine"        commemorative on june 8
 : Music day
-"Fête de la Musique"        on june 21
+"Fête de la Musique"        cultural on june 21
 : St John
-"Fête de la Saint Jean"     on june 24
+"Fête de la Saint Jean"     cultural on june 24
 : Homage to the Harkis
-"Hommage aux Harkis"        on september 25
+"Hommage aux Harkis"        commemorative on september 25
 : Fatalities in the Algerian war
-"Morts en Algérie"          on december 5
+"Morts en Algérie"          commemorative on december 5
 
 :: School
 
 :: Daylight Saving
 : summer
-"Heure d'été"               on last sunday in march
+"Heure d'été"               seasonal on last sunday in march
 : winter
-"Heure d'hiver"             on last sunday in october
+"Heure d'hiver"             seasonal on last sunday in october
 
 :: Seasons
 : Spring
-"Printemps"                 on september 23
+"Printemps"                 seasonal on september 23
 : Summer
-"Été"                       on december 21
+"Été"                       seasonal on december 21
 : Fall
-"Automne"                   on march 20
+"Automne"                   seasonal on march 20
 : Winter
-"Hiver"                     on june 21
+"Hiver"                     seasonal on june 21
 
 :: Name Days
diff --git a/kholidays/holidays/plan2/holiday_za_en-gb b/kholidays/holidays/plan2/holiday_za_en-gb
index 34c1e0f..1da11e6 100644
--- a/kholidays/holidays/plan2/holiday_za_en-gb
+++ b/kholidays/holidays/plan2/holiday_za_en-gb
@@ -17,18 +17,18 @@ language    "en_GB"
 description "National holiday file for South African"
 
 :: Public Holidays
-"New Year's Day"         weekend on january 1    shift to monday if sunday
-"Human Rights Day"       weekend on march 21     shift to monday if sunday
-"Good Friday"            weekend on easter minus 2 day
-"Family Day"             weekend on easter plus 1 day
-"Freedom Day"            weekend on april 27     shift to monday if sunday
-"Workers Day"            weekend on may 1        shift to monday if sunday
-"Youth Day"              weekend on june 16      shift to monday if sunday
-"National Women's Day"   weekend on august 9     shift to monday if sunday
-"Heritage Day"           weekend on september 24 shift to monday if sunday
-"Day of Reconciliation"  weekend on december 16  shift to monday if sunday
-"Christmas Day"          weekend on december 25  shift to monday if sunday
-"Day of Goodwill"        weekend on december 26  shift to monday if sunday
+"New Year's Day"         public on january 1    shift to monday if sunday
+"Human Rights Day"       public on march 21     shift to monday if sunday
+"Good Friday"            public religious on easter minus 2 day
+"Family Day"             public on easter plus 1 day
+"Freedom Day"            public on april 27     shift to monday if sunday
+"Workers Day"            public on may 1        shift to monday if sunday
+"Youth Day"              public on june 16      shift to monday if sunday
+"National Women's Day"   public on august 9     shift to monday if sunday
+"Heritage Day"           public on september 24 shift to monday if sunday
+"Day of Reconciliation"  public on december 16  shift to monday if sunday
+"Christmas Day"          public religious on december 25  shift to monday if sunday
+"Day of Goodwill"        public on december 26  shift to monday if sunday
 
 :: Religious
 
diff --git a/kholidays/tests/holiday_gb-eaw_en-gb_Test b/kholidays/tests/holiday_gb-eaw_en-gb_Test
index 877dccb..0f3ea6b 100644
--- a/kholidays/tests/holiday_gb-eaw_en-gb_Test
+++ b/kholidays/tests/holiday_gb-eaw_en-gb_Test
@@ -15,38 +15,38 @@ description "A test file for multiple calendar systems"
 
 : Holiday List Section
 
-"New Years Day"                 red on 1/1
-"New Years Day Bank Holiday"    weekend on ((([january 1] == [saturday after ([january 1])]) || ([january 1] == [sunday after ([january 1])])) ? [monday after ([january 1])] : noop)
-"Easter Sunday"                 red on easter
-"Good Friday"                   red on easter minus 2
-"Easter Monday"                 red on easter plus 1
-"May Day"                       red on first monday in may
-"Spring Bank Holiday"           red ((year == 2012) ? [june 4] : [last monday in may])
-"Diamond Jubilee Holiday"       red 5.6.2012
-"Summer Bank Holiday"           red on last monday in august
-"Christmas Day"                 red on december 25
-"Boxing Day"                    red on december 26
-"Boxing Day Bank Holiday"       red on (([december 26] == [saturday after ([december 25])] ) ? [monday after ([december 25])] : (([december 26] == [sunday after ([december 25])] || [december 26] == [monday after ([december 25])]) ? [tuesday after ([december 25])] : noop ))
-
-"Muharram"                      blue hijri on muharram 1 length 2
-"Ashura"                        blue hijri on 1/9 length 2
-"Laylat ul Isra and Miraj"      blue hijri on rajab 27
-"Eid ul-Fitr"                   blue hijri on shawwal 1 length 3
-"Eid al-Adha"                   blue hijri thualhijjah 10 length 4
-
-"Julian New Year"               red julian january 1
-"Iranian New Year"              red jalali farvardin 1
-"Ethiopian New Year"            red ethiopian meskerem 1
-"Coptic New Year"               red coptic thoout 1
-"Indian National New Year"      red indiannational chaitra 1
-"Rosh Hashana"                  red hebrew tishrey 1
-"Lag BaOmer"                    red hebrew iyar 18
-"Purim Katan"                   red hebrew adari 14
-"Purim"                         red hebrew adar 14
-"Purim"                         red hebrew adarii 14
-
-"Leap Day"                      on ((leapyear year) ? [february 29] : noop)
-
-"Fête des mères"                ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
-"Vendredi saint"                on friday before ([easter])
+"New Years Day"                 public on 1/1
+"New Years Day Bank Holiday"    public on ((([january 1] == [saturday after ([january 1])]) || ([january 1] == [sunday after ([january 1])])) ? [monday after ([january 1])] : noop)
+"Easter Sunday"                 public religious on easter
+"Good Friday"                   public religious on easter minus 2
+"Easter Monday"                 public on easter plus 1
+"May Day"                       public on first monday in may
+"Spring Bank Holiday"           public ((year == 2012) ? [june 4] : [last monday in may])
+"Diamond Jubilee Holiday"       public 5.6.2012
+"Summer Bank Holiday"           public on last monday in august
+"Christmas Day"                 public religious on december 25
+"Boxing Day"                    public on december 26
+"Boxing Day Bank Holiday"       public on (([december 26] == [saturday after ([december 25])] ) ? [monday after ([december 25])] : (([december 26] == [sunday after ([december 25])] || [december 26] == [monday after ([december 25])]) ? [tuesday after ([december 25])] : noop ))
+
+"Muharram"                      religious  hijri on muharram 1 length 2
+"Ashura"                        religious  hijri on 1/9 length 2
+"Laylat ul Isra and Miraj"      religious  hijri on rajab 27
+"Eid ul-Fitr"                   religious  hijri on shawwal 1 length 3
+"Eid al-Adha"                   religious  hijri thualhijjah 10 length 4
+
+"Julian New Year"               public julian january 1
+"Iranian New Year"              public jalali farvardin 1
+"Ethiopian New Year"            public ethiopian meskerem 1
+"Coptic New Year"               public coptic thoout 1
+"Indian National New Year"      public indiannational chaitra 1
+"Rosh Hashana"                  public hebrew tishrey 1
+"Lag BaOmer"                    public hebrew iyar 18
+"Purim Katan"                   public religious hebrew adari 14
+"Purim"                         public religious hebrew adar 14
+"Purim"                         public religious hebrew adarii 14
+
+"Leap Day"                      civil on ((leapyear year) ? [february 29] : noop)
+
+"Fête des mères"                civil ( ( [last sunday in may] == ([easter] + 49 days) ) ? [first sunday in june] : [last sunday in may] )
+"Vendredi saint"                religious on friday before ([easter])
 


commit 3aad614411205fe8ffa66ac76865067bd98926c3
Author: John Layt <jlayt at kde.org>
Date:   Wed Jun 18 19:29:06 2014 +0100

    Regenerate Bison/Flex parser for Plan2 format
    
    Regenerate teh parser using teh updated format and the ltest versions
    of Bison and Flex.

diff --git a/kholidays/parsers/plan2/holidayparserplan.cpp b/kholidays/parsers/plan2/holidayparserplan.cpp
index 665abbb..f79e913 100644
--- a/kholidays/parsers/plan2/holidayparserplan.cpp
+++ b/kholidays/parsers/plan2/holidayparserplan.cpp
@@ -1,23 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton implementation for Bison LALR(1) parsers in C++
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Skeleton implementation for Bison LALR(1) parsers in C++
+   
+      Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
+   Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,17 +28,43 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
 // Take the name prefix into account.
 #define yylex   KHolidayslex
 
+/* First part of user declarations.  */
+
+/* Line 311 of lalr1.cc  */
+#line 30 "holidayparserplan.ypp"
+ /*** C/C++ Declarations ***/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <string>
+
+#include <QString>
+
+#include <KCalendarSystem>
+
+
+
+/* Line 311 of lalr1.cc  */
+#line 60 "holidayparserplan.cpp"
+
+
 #include "holidayparserplan.hpp"
 
 /* User implementation prologue.  */
-#line 108 "holidayparserplan.ypp"
+
+/* Line 317 of lalr1.cc  */
+#line 111 "holidayparserplan.ypp"
 
 
 #include "holidayparserdriverplan_p.h"
@@ -52,8 +78,8 @@
 
 
 
-/* Line 317 of lalr1.cc.  */
-#line 57 "holidayparserplan.cpp"
+/* Line 317 of lalr1.cc  */
+#line 83 "holidayparserplan.cpp"
 
 #ifndef YY_
 # if YYENABLE_NLS
@@ -70,14 +96,12 @@
 /* Suppress unused-variable warnings by "using" E.  */
 #define YYUSE(e) ((void) (e))
 
-/* A pseudo ostream that takes yydebug_ into account.  */
-# define YYCDEBUG							\
-  for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false)	\
-    (*yycdebug_)
-
 /* Enable debugging if requested.  */
 #if YYDEBUG
 
+/* A pseudo ostream that takes yydebug_ into account.  */
+# define YYCDEBUG if (yydebug_) (*yycdebug_)
+
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)	\
 do {							\
   if (yydebug_)						\
@@ -102,18 +126,29 @@ do {					\
 
 #else /* !YYDEBUG */
 
+# define YYCDEBUG if (false) std::cerr
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 # define YY_REDUCE_PRINT(Rule)
 # define YY_STACK_PRINT()
 
 #endif /* !YYDEBUG */
 
+#define yyerrok		(yyerrstatus_ = 0)
+#define yyclearin	(yychar = yyempty_)
+
 #define YYACCEPT	goto yyacceptlab
 #define YYABORT		goto yyabortlab
 #define YYERROR		goto yyerrorlab
+#define YYRECOVERING()  (!!yyerrstatus_)
 
-namespace KHolidays
-{
+
+/* Line 380 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+namespace KHolidays {
+
+/* Line 380 of lalr1.cc  */
+#line 152 "holidayparserplan.cpp"
 #if YYERROR_VERBOSE
 
   /* Return YYSTR after stripping away unnecessary quotes and
@@ -157,8 +192,11 @@ namespace KHolidays
 
   /// Build a parser object.
   HolidayParserPlan::HolidayParserPlan (class HolidayParserDriverPlan& driver_yyarg)
-    : yydebug_ (false),
+    :
+#if YYDEBUG
+      yydebug_ (false),
       yycdebug_ (&std::cerr),
+#endif
       driver (driver_yyarg)
   {
   }
@@ -196,7 +234,7 @@ namespace KHolidays
     yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
     *yycdebug_ << ')';
   }
-#endif /* ! YYDEBUG */
+#endif
 
   void
   HolidayParserPlan::yydestruct_ (const char* yymsg,
@@ -210,9 +248,16 @@ namespace KHolidays
 
     switch (yytype)
       {
-    case 7: /* STRING */
-      { free( ((*yyvaluep).sval) ); };
-      break;
+        case 6: /* "STRING" */
+
+/* Line 480 of lalr1.cc  */
+#line 96 "holidayparserplan.ypp"
+	{ free( (yyvaluep->sval) ); };
+
+/* Line 480 of lalr1.cc  */
+#line 259 "holidayparserplan.cpp"
+	break;
+
 	default:
 	  break;
       }
@@ -226,6 +271,7 @@ namespace KHolidays
     yylocation_stack_.pop (n);
   }
 
+#if YYDEBUG
   std::ostream&
   HolidayParserPlan::debug_stream () const
   {
@@ -250,12 +296,12 @@ namespace KHolidays
   {
     yydebug_ = l;
   }
-
+#endif
 
   int
   HolidayParserPlan::parse ()
   {
-    /// Look-ahead and look-ahead in internal form.
+    /// Lookahead and lookahead in internal form.
     int yychar = yyempty_;
     int yytoken = 0;
 
@@ -268,12 +314,12 @@ namespace KHolidays
     int yynerrs_ = 0;
     int yyerrstatus_ = 0;
 
-    /// Semantic value of the look-ahead.
+    /// Semantic value of the lookahead.
     semantic_type yylval;
-    /// Location of the look-ahead.
+    /// Location of the lookahead.
     location_type yylloc;
     /// The locations where the error started and ended.
-    location yyerror_range[2];
+    location_type yyerror_range[2];
 
     /// $$.
     semantic_type yyval;
@@ -286,14 +332,18 @@ namespace KHolidays
 
 
     /* User initialization code.  */
-    #line 70 "holidayparserplan.ypp"
+    
+/* Line 553 of lalr1.cc  */
+#line 70 "holidayparserplan.ypp"
 {
     // initialize the initial location object
     yylloc.begin.filename = driver.fileToParse();
     yylloc.end.filename = yylloc.begin.filename;
 }
-  /* Line 547 of yacc.c.  */
-#line 295 "holidayparserplan.cpp"
+
+/* Line 553 of lalr1.cc  */
+#line 346 "holidayparserplan.cpp"
+
     /* Initialize the stacks.  The initial state will be pushed in
        yynewstate, since the latter expects the semantical and the
        location values to have been already stored, initialize these
@@ -308,17 +358,22 @@ namespace KHolidays
   yynewstate:
     yystate_stack_.push (yystate);
     YYCDEBUG << "Entering state " << yystate << std::endl;
+
+    /* Accept?  */
+    if (yystate == yyfinal_)
+      goto yyacceptlab;
+
     goto yybackup;
 
     /* Backup.  */
   yybackup:
 
-    /* Try to take a decision without look-ahead.  */
+    /* Try to take a decision without lookahead.  */
     yyn = yypact_[yystate];
     if (yyn == yypact_ninf_)
       goto yydefault;
 
-    /* Read a look-ahead token.  */
+    /* Read a lookahead token.  */
     if (yychar == yyempty_)
       {
 	YYCDEBUG << "Reading a token: ";
@@ -354,16 +409,11 @@ namespace KHolidays
 	goto yyreduce;
       }
 
-    /* Accept?  */
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
-    /* Shift the look-ahead token.  */
+    /* Shift the lookahead token.  */
     YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
-    /* Discard the token being shifted unless it is eof.  */
-    if (yychar != yyeof_)
-      yychar = yyempty_;
+    /* Discard the token being shifted.  */
+    yychar = yyempty_;
 
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yylloc);
@@ -409,424 +459,536 @@ namespace KHolidays
     switch (yyn)
       {
 	  case 4:
-#line 129 "holidayparserplan.ypp"
-    { driver.setFileCountryCode( QString() ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 132 "holidayparserplan.ypp"
+    { driver.setFileCountryCode( QString() ); }
     break;
 
   case 5:
-#line 130 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(2) - (2)].sval;
-      driver.setFileCountryCode( QString::fromUtf8( s ) );
-      free( s );
-      yysemantic_stack_[(2) - (2)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 133 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(2) - (2)].sval); driver.setFileCountryCode( QString::fromUtf8( s ) ); free( s ); (yysemantic_stack_[(2) - (2)].sval) = NULL; }
     break;
 
   case 6:
-#line 133 "holidayparserplan.ypp"
-    { driver.setFileLanguageCode( QString() ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 136 "holidayparserplan.ypp"
+    { driver.setFileLanguageCode( QString() ); }
     break;
 
   case 7:
-#line 134 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(2) - (2)].sval;
-      driver.setFileLanguageCode( QString::fromUtf8( s ) );
-      free( s );
-      yysemantic_stack_[(2) - (2)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 137 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(2) - (2)].sval); driver.setFileLanguageCode( QString::fromUtf8( s ) ); free( s ); (yysemantic_stack_[(2) - (2)].sval) = NULL; }
     break;
 
   case 8:
-#line 137 "holidayparserplan.ypp"
-    { driver.setFileName( QString() ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 140 "holidayparserplan.ypp"
+    { driver.setFileName( QString() ); }
     break;
 
   case 9:
-#line 138 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(2) - (2)].sval;
-      driver.setFileName( QString::fromUtf8( s ) );
-      free( s );
-      yysemantic_stack_[(2) - (2)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 141 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(2) - (2)].sval); driver.setFileName( QString::fromUtf8( s ) ); free( s ); (yysemantic_stack_[(2) - (2)].sval) = NULL; }
     break;
 
   case 10:
-#line 141 "holidayparserplan.ypp"
-    { driver.setFileDescription( QString() ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 144 "holidayparserplan.ypp"
+    { driver.setFileDescription( QString() ); }
     break;
 
   case 11:
-#line 142 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(2) - (2)].sval;
-      driver.setFileDescription( QString::fromUtf8( s ) );
-      free( s );
-      yysemantic_stack_[(2) - (2)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 145 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(2) - (2)].sval); driver.setFileDescription( QString::fromUtf8( s ) ); free( s ); (yysemantic_stack_[(2) - (2)].sval) = NULL; }
+    break;
+
+  case 14:
+
+/* Line 678 of lalr1.cc  */
+#line 152 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(1) - (1)].sval); driver.setEventName( QString::fromUtf8( s ) ); free( s ); (yysemantic_stack_[(1) - (1)].sval) = NULL; }
+    break;
+
+  case 15:
+
+/* Line 678 of lalr1.cc  */
+#line 155 "holidayparserplan.ypp"
+    { driver.setEventCategory( (yysemantic_stack_[(1) - (1)].sval) ); }
     break;
 
   case 16:
-#line 153 "holidayparserplan.ypp"
-    { driver.setEventColorName( 0 ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 156 "holidayparserplan.ypp"
+    { driver.setEventCategory( (yysemantic_stack_[(2) - (1)].sval) ); }
     break;
 
   case 17:
-#line 154 "holidayparserplan.ypp"
-    { driver.setEventColorName( (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 159 "holidayparserplan.ypp"
+    { driver.setEventCalendarType( QLatin1String("gregorian") ); }
     break;
 
   case 18:
-#line 157 "holidayparserplan.ypp"
-    { driver.setEventColorDay( 0 ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 160 "holidayparserplan.ypp"
+    { driver.setEventCalendarType( QString::fromUtf8( (yysemantic_stack_[(1) - (1)].sval) ) ); }
     break;
 
   case 19:
-#line 158 "holidayparserplan.ypp"
-    { driver.setEventColorDay( (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 163 "holidayparserplan.ypp"
+    { driver.setFromEaster( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 20:
-#line 161 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(1) - (1)].sval;
-      driver.setEventName( QString::fromUtf8( s ) );
-      free( s );
-      yysemantic_stack_[(1) - (1)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 164 "holidayparserplan.ypp"
+    { driver.setFromPascha( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 21:
-#line 164 "holidayparserplan.ypp"
-    { driver.setEventCalendarType( "gregorian" ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 165 "holidayparserplan.ypp"
+    { driver.setFromDate( (yysemantic_stack_[(4) - (2)].ival), (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (4)].ival) ); }
     break;
 
   case 22:
-#line 165 "holidayparserplan.ypp"
-    { driver.setEventCalendarType( QString::fromUtf8( (yysemantic_stack_[(1) - (1)].sval) ) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 166 "holidayparserplan.ypp"
+    { driver.setFromWeekdayInMonth( 1, (yysemantic_stack_[(3) - (1)].ival), 1, (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 23:
-#line 168 "holidayparserplan.ypp"
-    { driver.setFromEaster( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 167 "holidayparserplan.ypp"
+    { driver.setFromWeekdayInMonth( (yysemantic_stack_[(4) - (1)].ival), (yysemantic_stack_[(4) - (2)].ival), 1, (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (4)].ival) ); }
     break;
 
   case 24:
-#line 169 "holidayparserplan.ypp"
-    { driver.setFromPascha( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 168 "holidayparserplan.ypp"
+    { driver.setFromWeekdayInMonth( (yysemantic_stack_[(6) - (1)].ival), (yysemantic_stack_[(6) - (2)].ival), (yysemantic_stack_[(6) - (4)].ival), (yysemantic_stack_[(6) - (5)].ival), (yysemantic_stack_[(6) - (6)].ival) ); }
     break;
 
   case 25:
-#line 170 "holidayparserplan.ypp"
-    { driver.setFromDate( (yysemantic_stack_[(4) - (2)].ival), (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (4)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 169 "holidayparserplan.ypp"
+    { driver.setFromRelativeWeekday( (yysemantic_stack_[(5) - (2)].ival), (yysemantic_stack_[(5) - (1)].ival), (yysemantic_stack_[(5) - (4)].ival), (yysemantic_stack_[(5) - (5)].ival) ); }
     break;
 
   case 26:
-#line 171 "holidayparserplan.ypp"
-    { driver.setFromWeekdayInMonth( 1, (yysemantic_stack_[(3) - (1)].ival), 1, (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 172 "holidayparserplan.ypp"
+    { (yyval.ival) =   0; }
     break;
 
   case 27:
-#line 172 "holidayparserplan.ypp"
-    { driver.setFromWeekdayInMonth( (yysemantic_stack_[(4) - (1)].ival), (yysemantic_stack_[(4) - (2)].ival), 1, (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (4)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 173 "holidayparserplan.ypp"
+    { (yyval.ival) =  (yysemantic_stack_[(2) - (2)].ival); }
     break;
 
   case 28:
-#line 173 "holidayparserplan.ypp"
-    { driver.setFromWeekdayInMonth( (yysemantic_stack_[(6) - (1)].ival), (yysemantic_stack_[(6) - (2)].ival), (yysemantic_stack_[(6) - (4)].ival), (yysemantic_stack_[(6) - (5)].ival), (yysemantic_stack_[(6) - (6)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 174 "holidayparserplan.ypp"
+    { (yyval.ival) = -(yysemantic_stack_[(2) - (2)].ival); }
     break;
 
   case 29:
-#line 174 "holidayparserplan.ypp"
-    { driver.setFromRelativeWeekday( (yysemantic_stack_[(5) - (2)].ival), (yysemantic_stack_[(5) - (1)].ival), (yysemantic_stack_[(5) - (4)].ival), (yysemantic_stack_[(5) - (5)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 177 "holidayparserplan.ypp"
+    { (yyval.ival) = 0; }
     break;
 
   case 30:
-#line 177 "holidayparserplan.ypp"
-    { (yyval.ival) =   0; ;}
+
+/* Line 678 of lalr1.cc  */
+#line 178 "holidayparserplan.ypp"
+    { (yyval.ival) = ( (yysemantic_stack_[(4) - (2)].ival) << 8 ) | (yysemantic_stack_[(4) - (4)].ival); }
     break;
 
   case 31:
-#line 178 "holidayparserplan.ypp"
-    { (yyval.ival) =  (yysemantic_stack_[(2) - (2)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 181 "holidayparserplan.ypp"
+    { (yyval.ival) = 0; }
     break;
 
   case 32:
-#line 179 "holidayparserplan.ypp"
-    { (yyval.ival) = -(yysemantic_stack_[(2) - (2)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 182 "holidayparserplan.ypp"
+    { (yyval.ival) = ( 1 << (yysemantic_stack_[(1) - (1)].ival) ); }
     break;
 
   case 33:
-#line 182 "holidayparserplan.ypp"
-    { (yyval.ival) = 0; ;}
+
+/* Line 678 of lalr1.cc  */
+#line 183 "holidayparserplan.ypp"
+    { (yyval.ival) = ( 1 << (yysemantic_stack_[(3) - (1)].ival) ) | (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 34:
-#line 183 "holidayparserplan.ypp"
-    { (yyval.ival) = ( (yysemantic_stack_[(4) - (2)].ival) << 8 ) | (yysemantic_stack_[(4) - (4)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 186 "holidayparserplan.ypp"
+    { (yyval.ival) =  1; }
     break;
 
   case 35:
-#line 186 "holidayparserplan.ypp"
-    { (yyval.ival) = 0; ;}
+
+/* Line 678 of lalr1.cc  */
+#line 187 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(2) - (2)].ival); }
     break;
 
   case 36:
-#line 187 "holidayparserplan.ypp"
-    { (yyval.ival) = ( 1 << (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 190 "holidayparserplan.ypp"
+    { driver.setEventDate( -99999, (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival) ); }
     break;
 
   case 37:
-#line 188 "holidayparserplan.ypp"
-    { (yyval.ival) = ( 1 << (yysemantic_stack_[(3) - (1)].ival) ) | (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 191 "holidayparserplan.ypp"
+    { driver.setEventDate( -99999, (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); }
     break;
 
   case 38:
-#line 191 "holidayparserplan.ypp"
-    { (yyval.ival) =  1; ;}
+
+/* Line 678 of lalr1.cc  */
+#line 192 "holidayparserplan.ypp"
+    { driver.setEventDate(     (yysemantic_stack_[(5) - (5)].ival), (yysemantic_stack_[(5) - (3)].ival), (yysemantic_stack_[(5) - (1)].ival) ); }
     break;
 
   case 39:
-#line 192 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(2) - (2)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 193 "holidayparserplan.ypp"
+    { driver.setEventDate( -99999, (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 40:
-#line 195 "holidayparserplan.ypp"
-    { driver.setEventDate( -99999, (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 194 "holidayparserplan.ypp"
+    { driver.setEventDate(     (yysemantic_stack_[(5) - (5)].ival), (yysemantic_stack_[(5) - (1)].ival), (yysemantic_stack_[(5) - (3)].ival) ); }
     break;
 
   case 41:
-#line 196 "holidayparserplan.ypp"
-    { driver.setEventDate( -99999, (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 195 "holidayparserplan.ypp"
+    { driver.setEventDate( -99999, (yysemantic_stack_[(2) - (1)].ival), (yysemantic_stack_[(2) - (2)].ival) ); }
     break;
 
   case 42:
-#line 197 "holidayparserplan.ypp"
-    { driver.setEventDate(     (yysemantic_stack_[(5) - (5)].ival), (yysemantic_stack_[(5) - (3)].ival), (yysemantic_stack_[(5) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 196 "holidayparserplan.ypp"
+    { driver.setEventDate(     (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (2)].ival) ); }
     break;
 
   case 43:
-#line 198 "holidayparserplan.ypp"
-    { driver.setEventDate( -99999, (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 197 "holidayparserplan.ypp"
+    { driver.setEventDate( -99999, (yysemantic_stack_[(2) - (2)].ival), (yysemantic_stack_[(2) - (1)].ival) ); }
     break;
 
   case 44:
-#line 199 "holidayparserplan.ypp"
-    { driver.setEventDate(     (yysemantic_stack_[(5) - (5)].ival), (yysemantic_stack_[(5) - (1)].ival), (yysemantic_stack_[(5) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 198 "holidayparserplan.ypp"
+    { driver.setEventDate(     (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (1)].ival) ); }
     break;
 
   case 45:
-#line 200 "holidayparserplan.ypp"
-    { driver.setEventDate( -99999, (yysemantic_stack_[(2) - (1)].ival), (yysemantic_stack_[(2) - (2)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 199 "holidayparserplan.ypp"
+    { driver.setEventDate(     (yysemantic_stack_[(4) - (4)].ival), (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); }
     break;
 
   case 46:
-#line 201 "holidayparserplan.ypp"
-    { driver.setEventDate(     (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (2)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 200 "holidayparserplan.ypp"
+    { driver.setEventDate( (yysemantic_stack_[(1) - (1)].ival) ); }
     break;
 
   case 47:
-#line 202 "holidayparserplan.ypp"
-    { driver.setEventDate( -99999, (yysemantic_stack_[(2) - (2)].ival), (yysemantic_stack_[(2) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 203 "holidayparserplan.ypp"
+    { char *s = (yysemantic_stack_[(1) - (1)].sval); (yyval.ival) = driver.julianDayFromEventName( s ); free( s ); (yysemantic_stack_[(1) - (1)].sval) = NULL; }
     break;
 
   case 48:
-#line 203 "holidayparserplan.ypp"
-    { driver.setEventDate(     (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 204 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromEaster(); }
     break;
 
   case 49:
-#line 204 "holidayparserplan.ypp"
-    { driver.setEventDate(     (yysemantic_stack_[(4) - (4)].ival), (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 205 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromPascha(); }
     break;
 
   case 50:
-#line 205 "holidayparserplan.ypp"
-    { driver.setEventDate( (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 206 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival) ); }
     break;
 
   case 51:
-#line 208 "holidayparserplan.ypp"
-    {
-      char *s = yysemantic_stack_[(1) - (1)].sval;
-      (yyval.ival) = driver.julianDayFromEventName( s );
-      free( s );
-      yysemantic_stack_[(1) - (1)].sval = NULL;
-    }
+
+/* Line 678 of lalr1.cc  */
+#line 207 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); }
     break;
 
   case 52:
-#line 209 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromEaster(); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 208 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 53:
-#line 210 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromPascha(); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 209 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(2) - (2)].ival), (yysemantic_stack_[(2) - (1)].ival) ); }
     break;
 
   case 54:
-#line 211 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(3) - (3)].ival), (yysemantic_stack_[(3) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 210 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(2) - (1)].ival), (yysemantic_stack_[(2) - (2)].ival) ); }
     break;
 
   case 55:
-#line 212 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(4) - (3)].ival), (yysemantic_stack_[(4) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 211 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromRelativeWeekday( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); }
     break;
 
   case 56:
-#line 213 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
-    break;
 
-  case 57:
-#line 214 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(2) - (2)].ival), (yysemantic_stack_[(2) - (1)].ival) ); ;}
+/* Line 678 of lalr1.cc  */
+#line 212 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.julianDayFromWeekdayInMonth( (yysemantic_stack_[(4) - (1)].ival), (yysemantic_stack_[(4) - (2)].ival), (yysemantic_stack_[(4) - (4)].ival) ); }
     break;
 
   case 58:
-#line 215 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromMonthDay( (yysemantic_stack_[(2) - (1)].ival), (yysemantic_stack_[(2) - (2)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 216 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.adjustedMonthNumber( (yysemantic_stack_[(1) - (1)].ival) ); }
     break;
 
   case 59:
-#line 216 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromRelativeWeekday( (yysemantic_stack_[(3) - (2)].ival), (yysemantic_stack_[(3) - (1)].ival), (yysemantic_stack_[(3) - (3)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 219 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.adjustedMonthNumber( (yysemantic_stack_[(1) - (1)].ival) ); }
     break;
 
   case 60:
-#line 217 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.julianDayFromWeekdayInMonth( (yysemantic_stack_[(4) - (1)].ival), (yysemantic_stack_[(4) - (2)].ival), (yysemantic_stack_[(4) - (4)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 222 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(1) - (1)].ival); }
+    break;
+
+  case 61:
+
+/* Line 678 of lalr1.cc  */
+#line 223 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) || (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 62:
-#line 221 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.adjustedMonthNumber( (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 224 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) && (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 63:
-#line 224 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.adjustedMonthNumber( (yysemantic_stack_[(1) - (1)].ival) ); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 225 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) == (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 64:
-#line 227 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(1) - (1)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 226 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) != (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 65:
-#line 228 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) || (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 227 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) <= (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 66:
-#line 229 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) && (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 228 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) >= (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 67:
-#line 230 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) == (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 229 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) <  (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 68:
-#line 231 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) != (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 230 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) >  (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 69:
-#line 232 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) <= (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 231 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) +  (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 70:
-#line 233 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) >= (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 232 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) -  (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 71:
-#line 234 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) <  (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 233 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) *  (yysemantic_stack_[(3) - (3)].ival); }
     break;
 
   case 72:
-#line 235 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) >  (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 234 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (3)].ival) ?  (yysemantic_stack_[(3) - (1)].ival) / (yysemantic_stack_[(3) - (3)].ival) : 0; }
     break;
 
   case 73:
-#line 236 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) +  (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 235 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (3)].ival) ?  (yysemantic_stack_[(3) - (1)].ival) % (yysemantic_stack_[(3) - (3)].ival) : 0; }
     break;
 
   case 74:
-#line 237 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) -  (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 236 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(5) - (1)].ival) ?  (yysemantic_stack_[(5) - (3)].ival) : (yysemantic_stack_[(5) - (5)].ival); }
     break;
 
   case 75:
-#line 238 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (1)].ival) *  (yysemantic_stack_[(3) - (3)].ival); ;}
+
+/* Line 678 of lalr1.cc  */
+#line 237 "holidayparserplan.ypp"
+    { (yyval.ival) = !(yysemantic_stack_[(2) - (2)].ival); }
     break;
 
   case 76:
-#line 239 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (3)].ival) ?  (yysemantic_stack_[(3) - (1)].ival) / (yysemantic_stack_[(3) - (3)].ival) : 0; ;}
+
+/* Line 678 of lalr1.cc  */
+#line 238 "holidayparserplan.ypp"
+    { (yyval.ival) = (yysemantic_stack_[(3) - (2)].ival); }
     break;
 
   case 77:
-#line 240 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (3)].ival) ?  (yysemantic_stack_[(3) - (1)].ival) % (yysemantic_stack_[(3) - (3)].ival) : 0; ;}
-    break;
 
-  case 78:
+/* Line 678 of lalr1.cc  */
 #line 241 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(5) - (1)].ival) ?  (yysemantic_stack_[(5) - (3)].ival) : (yysemantic_stack_[(5) - (5)].ival); ;}
+    { (yyval.ival) = (yysemantic_stack_[(3) - (2)].ival); }
     break;
 
-  case 79:
+  case 78:
+
+/* Line 678 of lalr1.cc  */
 #line 242 "holidayparserplan.ypp"
-    { (yyval.ival) = !(yysemantic_stack_[(2) - (2)].ival); ;}
+    { (yyval.ival) = (yysemantic_stack_[(1) - (1)].ival); }
     break;
 
   case 80:
-#line 243 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (2)].ival); ;}
-    break;
 
-  case 81:
+/* Line 678 of lalr1.cc  */
 #line 246 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(3) - (2)].ival); ;}
+    { (yyval.ival) = -(yysemantic_stack_[(2) - (2)].ival); }
     break;
 
-  case 82:
+  case 81:
+
+/* Line 678 of lalr1.cc  */
 #line 247 "holidayparserplan.ypp"
-    { (yyval.ival) = (yysemantic_stack_[(1) - (1)].ival); ;}
+    { (yyval.ival) = driver.parseYear(); }
     break;
 
-  case 84:
-#line 251 "holidayparserplan.ypp"
-    { (yyval.ival) = -(yysemantic_stack_[(2) - (2)].ival); ;}
-    break;
+  case 82:
 
-  case 85:
-#line 252 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.parseYear(); ;}
+/* Line 678 of lalr1.cc  */
+#line 248 "holidayparserplan.ypp"
+    { (yyval.ival) = driver.isLeapYear( (yysemantic_stack_[(2) - (2)].ival) ); }
     break;
 
-  case 86:
-#line 253 "holidayparserplan.ypp"
-    { (yyval.ival) = driver.isLeapYear( (yysemantic_stack_[(2) - (2)].ival) ); ;}
-    break;
 
 
-    /* Line 675 of lalr1.cc.  */
-#line 797 "holidayparserplan.cpp"
-	default: break;
+/* Line 678 of lalr1.cc  */
+#line 990 "holidayparserplan.cpp"
+	default:
+          break;
       }
     YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
 
@@ -861,7 +1023,7 @@ namespace KHolidays
     yyerror_range[0] = yylloc;
     if (yyerrstatus_ == 3)
       {
-	/* If just tried and failed to reuse look-ahead token after an
+	/* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
 	if (yychar <= yyeof_)
@@ -877,7 +1039,7 @@ namespace KHolidays
 	  }
       }
 
-    /* Else will try to reuse look-ahead token after shifting the error
+    /* Else will try to reuse lookahead token after shifting the error
        token.  */
     goto yyerrlab1;
 
@@ -934,19 +1096,16 @@ namespace KHolidays
 	YY_STACK_PRINT ();
       }
 
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
     yyerror_range[1] = yylloc;
     // Using YYLLOC is tempting, but would change the location of
-    // the look-ahead.  YYLOC is available though.
+    // the lookahead.  YYLOC is available though.
     YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yyloc);
 
     /* Shift the error token.  */
     YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
-		   &yysemantic_stack_[0], &yylocation_stack_[0]);
+		     &yysemantic_stack_[0], &yylocation_stack_[0]);
 
     yystate = yyn;
     goto yynewstate;
@@ -962,7 +1121,7 @@ namespace KHolidays
     goto yyreturn;
 
   yyreturn:
-    if (yychar != yyeof_ && yychar != yyempty_)
+    if (yychar != yyempty_)
       yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
 
     /* Do not reclaim the symbols of the rule which action triggered
@@ -1032,26 +1191,25 @@ namespace KHolidays
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
-  const short int HolidayParserPlan::yypact_ninf_ = -130;
+  const signed char HolidayParserPlan::yypact_ninf_ = -70;
   const short int
   HolidayParserPlan::yypact_[] =
   {
-       -22,    10,    24,  -130,    -1,  -130,  -130,     6,    29,    12,
-    -130,    25,  -130,    32,    13,  -130,    39,  -130,    60,  -130,
-    -130,    62,  -130,  -130,    72,  -130,   115,  -130,  -130,   128,
-    -130,   131,    -9,    -9,    66,    34,  -130,    -9,    47,   131,
-     117,  -130,    34,    34,    74,    61,  -130,    74,    74,  -130,
-      34,    83,   157,  -130,    77,   131,   131,    11,   122,   131,
-     206,   206,    34,  -130,    -9,   126,  -130,  -130,    50,   131,
-    -130,  -130,  -130,    51,    64,   131,     3,    34,    34,    34,
-      34,    34,    34,    34,    34,    34,    34,    34,    34,    34,
-      34,  -130,    90,    74,    65,  -130,    61,    74,   131,    63,
-    -130,  -130,  -130,   206,    74,   131,  -130,   131,  -130,  -130,
-      93,    61,   248,   248,   248,   248,   248,   248,   227,   248,
-     114,   114,    50,    50,    50,   184,    79,    94,  -130,   131,
-      -9,  -130,  -130,    34,  -130,  -130,  -130,    61,    73,    34,
-      90,    90,  -130,    74,   206,  -130,  -130,  -130,  -130,  -130,
-    -130
+       -24,    -1,    25,   -70,     1,   -70,   -70,    39,    42,    38,
+     -70,    65,   -70,    64,    51,   -70,     5,   -70,    75,   -70,
+     -70,   -70,   114,   -70,   -70,   -70,   129,   -70,     6,    30,
+      30,    84,   134,   -70,    30,    58,     6,    -2,   -70,   134,
+     134,    77,    63,   -70,    77,    77,   -70,   134,    85,   160,
+     -70,    81,     6,     6,    12,   131,     6,   209,   209,   134,
+     -70,    30,    43,   -70,   -70,    62,     6,   -70,   -70,   -70,
+      54,    67,     6,     3,   134,   134,   134,   134,   134,   134,
+     134,   134,   134,   134,   134,   134,   134,   134,   -70,    98,
+      77,    71,   -70,    63,    77,     6,    70,   -70,   -70,   -70,
+     209,    77,     6,   -70,     6,   -70,   -70,   102,    63,   251,
+     251,   251,   251,   251,   251,   230,   251,   116,   116,    62,
+      62,    62,   187,    86,    99,   -70,     6,    30,   -70,   -70,
+     134,   -70,   -70,   -70,    63,    80,   134,    98,    98,   -70,
+      77,   209,   -70,   -70,   -70,   -70,   -70,   -70
   };
 
   /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
@@ -1060,31 +1218,30 @@ namespace KHolidays
   const unsigned char
   HolidayParserPlan::yydefact_[] =
   {
-         4,     0,     0,    12,     6,     5,     1,    14,     0,     8,
-      15,    16,     7,     0,    10,    17,     0,     9,     0,     3,
-      20,    18,    11,    19,    21,    22,     0,    83,    63,    30,
-      85,     0,    30,    30,     0,     0,    13,    30,     0,    61,
-      50,    82,     0,     0,    38,     0,    86,    38,    38,    84,
-       0,     0,     0,    64,    33,     0,    45,    30,     0,    47,
-      31,    32,     0,    26,    30,    50,    23,    24,    79,     0,
-      51,    52,    53,     0,     0,    61,    62,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    81,    35,    38,    43,    46,     0,    38,    63,    40,
-      61,    62,    48,    39,    38,     0,    80,     0,    58,    57,
-       0,     0,    67,    68,    69,    70,    71,    72,    65,    66,
-      74,    73,    75,    76,    77,     0,    36,     0,    25,     0,
-      30,    27,    49,    41,    29,    59,    56,     0,    54,     0,
-      35,    35,    44,    38,    42,    60,    55,    78,    37,    34,
-      28
+         4,     0,     0,    12,     6,     5,     1,     2,     0,     8,
+      14,     0,     7,     0,    10,    15,    17,     9,     0,     3,
+      16,    18,     0,    11,    79,    59,    26,    81,     0,    26,
+      26,     0,     0,    13,    26,     0,    57,    46,    78,     0,
+       0,    34,     0,    82,    34,    34,    80,     0,     0,     0,
+      60,    29,     0,    41,    26,     0,    43,    27,    28,     0,
+      22,    26,    46,    19,    20,    75,     0,    47,    48,    49,
+       0,     0,    57,    58,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    77,    31,
+      34,    39,    42,     0,    34,    59,    36,    57,    58,    44,
+      35,    34,     0,    76,     0,    54,    53,     0,     0,    63,
+      64,    65,    66,    67,    68,    61,    62,    70,    69,    71,
+      72,    73,     0,    32,     0,    21,     0,    26,    23,    45,
+      37,    25,    55,    52,     0,    50,     0,    31,    31,    40,
+      34,    38,    56,    51,    74,    33,    30,    24
   };
 
   /* YYPGOTO[NTERM-NUM].  */
-  const short int
+  const signed char
   HolidayParserPlan::yypgoto_[] =
   {
-      -130,  -130,  -130,  -130,  -130,  -130,  -130,  -130,  -130,  -130,
-    -130,  -130,  -130,  -130,   -23,  -130,  -129,   -20,    68,  -130,
-     -13,   106,   -27,   -26,  -130
+       -70,   -70,   -70,   -70,   -70,   -70,   -70,   -70,   -70,   -70,
+     -70,   -70,   -19,   -70,   -69,   -16,    79,   -70,    -9,   111,
+     -23,   -22,   -70
   };
 
   /* YYDEFGOTO[NTERM-NUM].  */
@@ -1092,81 +1249,81 @@ namespace KHolidays
   HolidayParserPlan::yydefgoto_[] =
   {
         -1,     2,     3,     4,     9,    14,    19,     7,    11,    16,
-      24,    21,    26,    36,    44,    93,   127,    63,    37,    73,
-      38,   100,    52,    53,    41
+      22,    33,    41,    90,   124,    60,    34,    70,    35,    97,
+      49,    50,    38
   };
 
   /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
      positive, shift that token.  If negative, reduce the rule which
      number is the opposite.  If zero, do what YYDEFACT says.  */
-  const signed char HolidayParserPlan::yytable_ninf_ = -63;
+  const signed char HolidayParserPlan::yytable_ninf_ = -59;
   const short int
   HolidayParserPlan::yytable_[] =
   {
-        40,    42,    43,    45,     1,    46,    -2,   109,   110,    47,
-      48,   148,   149,    56,    54,    60,    61,     5,    10,    65,
-      96,    42,    43,    68,     6,    76,     8,    66,    67,    94,
-      95,    15,   101,   102,    97,   103,    12,    27,    74,    17,
-      13,   104,    18,   105,   111,    99,    20,    30,    31,   108,
-     112,   113,   114,   115,   116,   117,   118,   119,   120,   121,
-     122,   123,   124,   125,    27,    28,    34,    22,    23,    49,
-     101,    50,   132,   128,    30,    31,    51,   131,    35,   135,
-      25,   136,    55,   130,   134,   101,    27,    28,    69,    90,
-      70,    62,    92,    34,   106,   126,    30,    31,   138,   107,
-     129,    71,   137,   142,   133,    35,   144,   143,    72,   140,
-     141,   101,   147,    64,   146,    34,     0,     0,    27,    28,
-      29,    28,    57,   150,   145,    27,    98,    35,    30,    31,
-      28,    27,    39,    32,    27,    30,    31,     0,    42,    43,
-      33,    30,    31,     0,    30,    31,    59,    34,    87,    88,
-      89,    39,   -62,    90,    34,     0,     0,    75,    58,    35,
-      34,   -62,     0,    34,     0,     0,    35,    58,     0,     0,
-       0,    59,    35,     0,     0,    35,    77,    78,    79,    80,
-      81,    82,     0,     0,     0,     0,     0,    83,    84,    85,
-      86,    87,    88,    89,     0,     0,    90,     0,     0,     0,
-       0,     0,    91,    77,    78,    79,    80,    81,    82,     0,
-       0,     0,     0,     0,    83,    84,    85,    86,    87,    88,
-      89,     0,     0,    90,   139,    77,    78,    79,    80,    81,
-      82,     0,     0,     0,     0,     0,    83,    84,    85,    86,
-      87,    88,    89,     0,     0,    90,    77,    78,    79,    80,
-      81,    82,     0,     0,     0,     0,     0,     0,    84,    85,
-      86,    87,    88,    89,     0,     0,    90,    77,    78,    79,
-      80,    81,    82,     0,     0,     0,     0,     0,     0,     0,
-      85,    86,    87,    88,    89,     0,     0,    90
+        37,     1,    25,    54,    42,     5,    43,   106,   107,    24,
+      44,    45,    20,    21,    53,    51,    57,    58,    27,    28,
+      62,    93,    39,    40,    65,     6,    73,     8,    63,    64,
+      91,    92,   -58,    98,    99,    94,   100,    31,    55,    71,
+      39,    40,   101,   108,   102,    10,    96,    25,    12,    32,
+     105,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,    13,    24,    25,   145,   146,
+      17,    98,    15,   129,   125,    27,    28,   -58,   128,    18,
+     132,    23,   133,    55,   127,   131,    98,    46,    24,    25,
+      66,    67,    52,    59,    31,    89,   103,    27,    28,   135,
+      87,   104,    68,   123,   139,   126,    32,   141,   140,    69,
+     130,   134,    98,   144,   138,   137,    31,    24,    25,    26,
+     143,    61,     0,     0,   147,   142,    27,    28,    32,     0,
+       0,    29,    24,    36,    24,    95,     0,    24,    30,    39,
+      40,    27,    28,    27,    28,    31,    27,    28,    56,    84,
+      85,    86,     0,    36,    87,     0,     0,    32,     0,    72,
+      31,     0,    31,     0,     0,    31,     0,     0,     0,     0,
+      47,     0,    32,    56,    32,    48,     0,    32,    74,    75,
+      76,    77,    78,    79,     0,     0,     0,     0,     0,    80,
+      81,    82,    83,    84,    85,    86,     0,     0,    87,     0,
+       0,     0,     0,     0,    88,    74,    75,    76,    77,    78,
+      79,     0,     0,     0,     0,     0,    80,    81,    82,    83,
+      84,    85,    86,     0,     0,    87,   136,    74,    75,    76,
+      77,    78,    79,     0,     0,     0,     0,     0,    80,    81,
+      82,    83,    84,    85,    86,     0,     0,    87,    74,    75,
+      76,    77,    78,    79,     0,     0,     0,     0,     0,     0,
+      81,    82,    83,    84,    85,    86,     0,     0,    87,    74,
+      75,    76,    77,    78,    79,     0,     0,     0,     0,     0,
+       0,     0,    82,    83,    84,    85,    86,     0,     0,    87
   };
 
   /* YYCHECK.  */
   const short int
   HolidayParserPlan::yycheck_[] =
   {
-        26,    10,    11,    29,    26,    31,     0,     4,     5,    32,
-      33,   140,   141,    39,    37,    42,    43,     7,    12,    45,
-       9,    10,    11,    50,     0,    51,    27,    47,    48,    55,
-      56,     6,    58,    59,    57,    62,     7,     3,    51,     7,
-      28,    64,    29,    69,    41,    58,     7,    13,    14,    75,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,     3,     4,    32,     7,     6,     3,
-      96,    37,    98,    93,    13,    14,    42,    97,    44,   105,
-       8,   107,    35,    96,   104,   111,     3,     4,     5,    39,
-       7,    17,    15,    32,    43,     5,    13,    14,   111,    35,
-      35,    18,     9,   129,    41,    44,   133,   130,    25,    30,
-      16,   137,   139,    45,    41,    32,    -1,    -1,     3,     4,
-       5,     4,     5,   143,   137,     3,     4,    44,    13,    14,
-       4,     3,    26,    18,     3,    13,    14,    -1,    10,    11,
-      25,    13,    14,    -1,    13,    14,    40,    32,    34,    35,
-      36,    45,    35,    39,    32,    -1,    -1,    51,    41,    44,
-      32,    35,    -1,    32,    -1,    -1,    44,    41,    -1,    -1,
-      -1,    65,    44,    -1,    -1,    44,    19,    20,    21,    22,
-      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
-      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    19,    20,    21,    22,    23,    24,    -1,
-      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
-      36,    -1,    -1,    39,    40,    19,    20,    21,    22,    23,
-      24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,
-      34,    35,    36,    -1,    -1,    39,    19,    20,    21,    22,
-      23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,
-      33,    34,    35,    36,    -1,    -1,    39,    19,    20,    21,
-      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      32,    33,    34,    35,    36,    -1,    -1,    39
+        22,    25,     4,     5,    26,     6,    28,     4,     5,     3,
+      29,    30,     7,     8,    36,    34,    39,    40,    12,    13,
+      42,     9,    10,    11,    47,     0,    48,    26,    44,    45,
+      52,    53,    34,    55,    56,    54,    59,    31,    40,    48,
+      10,    11,    61,    40,    66,     6,    55,     4,     6,    43,
+      72,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    27,     3,     4,   137,   138,
+       6,    93,     7,    95,    90,    12,    13,    34,    94,    28,
+     102,     6,   104,    40,    93,   101,   108,     3,     3,     4,
+       5,     6,    34,    16,    31,    14,    42,    12,    13,   108,
+      38,    34,    17,     5,   126,    34,    43,   130,   127,    24,
+      40,     9,   134,   136,    15,    29,    31,     3,     4,     5,
+      40,    42,    -1,    -1,   140,   134,    12,    13,    43,    -1,
+      -1,    17,     3,    22,     3,     4,    -1,     3,    24,    10,
+      11,    12,    13,    12,    13,    31,    12,    13,    37,    33,
+      34,    35,    -1,    42,    38,    -1,    -1,    43,    -1,    48,
+      31,    -1,    31,    -1,    -1,    31,    -1,    -1,    -1,    -1,
+      36,    -1,    43,    62,    43,    41,    -1,    43,    18,    19,
+      20,    21,    22,    23,    -1,    -1,    -1,    -1,    -1,    29,
+      30,    31,    32,    33,    34,    35,    -1,    -1,    38,    -1,
+      -1,    -1,    -1,    -1,    44,    18,    19,    20,    21,    22,
+      23,    -1,    -1,    -1,    -1,    -1,    29,    30,    31,    32,
+      33,    34,    35,    -1,    -1,    38,    39,    18,    19,    20,
+      21,    22,    23,    -1,    -1,    -1,    -1,    -1,    29,    30,
+      31,    32,    33,    34,    35,    -1,    -1,    38,    18,    19,
+      20,    21,    22,    23,    -1,    -1,    -1,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    -1,    -1,    38,    18,
+      19,    20,    21,    22,    23,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    31,    32,    33,    34,    35,    -1,    -1,    38
   };
 
   /* STOS_[STATE-NUM] -- The (internal number of the) accessing
@@ -1174,22 +1331,21 @@ namespace KHolidays
   const unsigned char
   HolidayParserPlan::yystos_[] =
   {
-         0,    26,    47,    48,    49,     7,     0,    53,    27,    50,
-      12,    54,     7,    28,    51,     6,    55,     7,    29,    52,
-       7,    57,     7,     6,    56,     8,    58,     3,     4,     5,
-      13,    14,    18,    25,    32,    44,    59,    64,    66,    67,
-      69,    70,    10,    11,    60,    69,    69,    60,    60,     3,
-      37,    42,    68,    69,    60,    35,    69,     5,    41,    67,
-      68,    68,    17,    63,    64,    69,    63,    63,    68,     5,
-       7,    18,    25,    65,    66,    67,    69,    19,    20,    21,
-      22,    23,    24,    30,    31,    32,    33,    34,    35,    36,
-      39,    45,    15,    61,    69,    69,     9,    60,     4,    66,
-      67,    69,    69,    68,    60,    69,    43,    35,    69,     4,
-       5,    41,    68,    68,    68,    68,    68,    68,    68,    68,
-      68,    68,    68,    68,    68,    68,     5,    62,    63,    35,
-      66,    63,    69,    41,    63,    69,    69,     9,    66,    40,
-      30,    16,    69,    60,    68,    66,    41,    68,    62,    62,
-      63
+         0,    25,    46,    47,    48,     6,     0,    52,    26,    49,
+       6,    53,     6,    27,    50,     7,    54,     6,    28,    51,
+       7,     8,    55,     6,     3,     4,     5,    12,    13,    17,
+      24,    31,    43,    56,    61,    63,    64,    66,    67,    10,
+      11,    57,    66,    66,    57,    57,     3,    36,    41,    65,
+      66,    57,    34,    66,     5,    40,    64,    65,    65,    16,
+      60,    61,    66,    60,    60,    65,     5,     6,    17,    24,
+      62,    63,    64,    66,    18,    19,    20,    21,    22,    23,
+      29,    30,    31,    32,    33,    34,    35,    38,    44,    14,
+      58,    66,    66,     9,    57,     4,    63,    64,    66,    66,
+      65,    57,    66,    42,    34,    66,     4,     5,    40,    65,
+      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
+      65,    65,    65,     5,    59,    60,    34,    63,    60,    66,
+      40,    60,    66,    66,     9,    63,    39,    29,    15,    66,
+      57,    65,    63,    40,    65,    59,    59,    60
   };
 
 #if YYDEBUG
@@ -1201,8 +1357,8 @@ namespace KHolidays
          0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,    45,    43,    42,    47,    37,    33,   287,    63,
-      58,    46,    91,    93,    40,    41
+     285,    45,    43,    42,    47,    37,    33,   286,    63,    58,
+      46,    91,    93,    40,    41
   };
 #endif
 
@@ -1210,15 +1366,15 @@ namespace KHolidays
   const unsigned char
   HolidayParserPlan::yyr1_[] =
   {
-         0,    46,    47,    48,    49,    49,    50,    50,    51,    51,
-      52,    52,    53,    53,    54,    54,    55,    55,    56,    56,
-      57,    58,    58,    59,    59,    59,    59,    59,    59,    59,
-      60,    60,    60,    61,    61,    62,    62,    62,    63,    63,
-      64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
-      64,    65,    65,    65,    65,    65,    65,    65,    65,    65,
-      65,    66,    66,    67,    68,    68,    68,    68,    68,    68,
-      68,    68,    68,    68,    68,    68,    68,    68,    68,    68,
-      68,    69,    69,    70,    70,    70,    70
+         0,    45,    46,    47,    48,    48,    49,    49,    50,    50,
+      51,    51,    52,    52,    53,    54,    54,    55,    55,    56,
+      56,    56,    56,    56,    56,    56,    57,    57,    57,    58,
+      58,    59,    59,    59,    60,    60,    61,    61,    61,    61,
+      61,    61,    61,    61,    61,    61,    61,    62,    62,    62,
+      62,    62,    62,    62,    62,    62,    62,    63,    63,    64,
+      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
+      65,    65,    65,    65,    65,    65,    65,    66,    66,    67,
+      67,    67,    67
   };
 
   /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1226,14 +1382,14 @@ namespace KHolidays
   HolidayParserPlan::yyr2_[] =
   {
          0,     2,     2,     4,     0,     2,     0,     2,     0,     2,
-       0,     2,     0,     7,     0,     1,     0,     1,     0,     1,
-       1,     0,     1,     3,     3,     4,     3,     4,     6,     5,
-       0,     2,     2,     0,     4,     0,     1,     3,     0,     2,
-       3,     4,     5,     3,     5,     2,     3,     2,     3,     4,
-       1,     1,     1,     1,     3,     4,     3,     2,     2,     3,
-       4,     1,     1,     1,     1,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     5,     2,
-       3,     3,     1,     1,     2,     1,     2
+       0,     2,     0,     5,     1,     1,     2,     0,     1,     3,
+       3,     4,     3,     4,     6,     5,     0,     2,     2,     0,
+       4,     0,     1,     3,     0,     2,     3,     4,     5,     3,
+       5,     2,     3,     2,     3,     4,     1,     1,     1,     1,
+       3,     4,     3,     2,     2,     3,     4,     1,     1,     1,
+       1,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     5,     2,     3,     3,     1,     1,
+       2,     1,     2
   };
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
@@ -1242,16 +1398,16 @@ namespace KHolidays
   const char*
   const HolidayParserPlan::yytname_[] =
   {
-    "END", "error", "$undefined", "NUMBER", "MONTH", "WDAY", "COLOR",
-  "STRING", "CALENDAR", "INOP", "PLUS", "MINUS", "SMALL", "YEAR",
-  "LEAPYEAR", "SHIFT", "IF", "LENGTH", "EASTER", "EQ", "NE", "LE", "GE",
-  "LT", "GT", "PASCHA", "COUNTRY", "LANGUAGE", "NAME", "DESCRIPTION", "OR",
-  "AND", "'-'", "'+'", "'*'", "'/'", "'%'", "'!'", "UMINUS", "'?'", "':'",
-  "'.'", "'['", "']'", "'('", "')'", "$accept", "planfile", "metadata",
-  "countrycode", "languagecode", "name", "description", "list", "small",
-  "stringcolor", "daycolor", "eventname", "calendar", "eventrule",
-  "offset", "conditionaloffset", "wdaycondition", "length", "date",
-  "reldate", "month", "monthnumber", "expr", "pexpr", "number", 0
+    "END", "error", "$undefined", "NUMBER", "MONTH", "WDAY", "STRING",
+  "CATEGORY", "CALENDAR", "INOP", "PLUS", "MINUS", "YEAR", "LEAPYEAR",
+  "SHIFT", "IF", "LENGTH", "EASTER", "EQ", "NE", "LE", "GE", "LT", "GT",
+  "PASCHA", "COUNTRY", "LANGUAGE", "NAME", "DESCRIPTION", "OR", "AND",
+  "'-'", "'+'", "'*'", "'/'", "'%'", "'!'", "UMINUS", "'?'", "':'", "'.'",
+  "'['", "']'", "'('", "')'", "$accept", "planfile", "metadata",
+  "countrycode", "languagecode", "name", "description", "list",
+  "eventname", "categories", "calendar", "eventrule", "offset",
+  "conditionaloffset", "wdaycondition", "length", "date", "reldate",
+  "month", "monthnumber", "expr", "pexpr", "number", 0
   };
 #endif
 
@@ -1260,34 +1416,34 @@ namespace KHolidays
   const HolidayParserPlan::rhs_number_type
   HolidayParserPlan::yyrhs_[] =
   {
-        47,     0,    -1,    48,    53,    -1,    49,    50,    51,    52,
-      -1,    -1,    26,     7,    -1,    -1,    27,     7,    -1,    -1,
-      28,     7,    -1,    -1,    29,     7,    -1,    -1,    53,    54,
-      55,    57,    56,    58,    59,    -1,    -1,    12,    -1,    -1,
-       6,    -1,    -1,     6,    -1,     7,    -1,    -1,     8,    -1,
-      18,    60,    63,    -1,    25,    60,    63,    -1,    64,    60,
-      61,    63,    -1,     5,    60,    63,    -1,    69,     5,    60,
-      63,    -1,    69,     5,     9,    66,    60,    63,    -1,     5,
-      69,    64,    60,    63,    -1,    -1,    10,    68,    -1,    11,
-      68,    -1,    -1,    15,    62,    16,    62,    -1,    -1,     5,
-      -1,     5,    30,    62,    -1,    -1,    17,    68,    -1,    69,
-      41,    66,    -1,    69,    41,    66,    41,    -1,    69,    41,
-      66,    41,    68,    -1,    66,    35,    69,    -1,    66,    35,
-      69,    35,    69,    -1,    67,    69,    -1,    67,    69,    69,
-      -1,    69,    67,    -1,    69,    67,    69,    -1,    69,    41,
-       4,    69,    -1,    69,    -1,     7,    -1,    18,    -1,    25,
-      -1,    69,    41,    66,    -1,    69,    41,    66,    41,    -1,
-      66,    35,    69,    -1,    69,     4,    -1,    67,    69,    -1,
-       5,    69,    69,    -1,    69,     5,     9,    66,    -1,    67,
-      -1,    69,    -1,     4,    -1,    69,    -1,    68,    30,    68,
-      -1,    68,    31,    68,    -1,    68,    19,    68,    -1,    68,
-      20,    68,    -1,    68,    21,    68,    -1,    68,    22,    68,
-      -1,    68,    23,    68,    -1,    68,    24,    68,    -1,    68,
-      33,    68,    -1,    68,    32,    68,    -1,    68,    34,    68,
-      -1,    68,    35,    68,    -1,    68,    36,    68,    -1,    68,
-      39,    68,    40,    68,    -1,    37,    68,    -1,    42,    65,
-      43,    -1,    44,    68,    45,    -1,    70,    -1,     3,    -1,
-      32,     3,    -1,    13,    -1,    14,    69,    -1
+        46,     0,    -1,    47,    52,    -1,    48,    49,    50,    51,
+      -1,    -1,    25,     6,    -1,    -1,    26,     6,    -1,    -1,
+      27,     6,    -1,    -1,    28,     6,    -1,    -1,    52,    53,
+      54,    55,    56,    -1,     6,    -1,     7,    -1,    54,     7,
+      -1,    -1,     8,    -1,    17,    57,    60,    -1,    24,    57,
+      60,    -1,    61,    57,    58,    60,    -1,     5,    57,    60,
+      -1,    66,     5,    57,    60,    -1,    66,     5,     9,    63,
+      57,    60,    -1,     5,    66,    61,    57,    60,    -1,    -1,
+      10,    65,    -1,    11,    65,    -1,    -1,    14,    59,    15,
+      59,    -1,    -1,     5,    -1,     5,    29,    59,    -1,    -1,
+      16,    65,    -1,    66,    40,    63,    -1,    66,    40,    63,
+      40,    -1,    66,    40,    63,    40,    65,    -1,    63,    34,
+      66,    -1,    63,    34,    66,    34,    66,    -1,    64,    66,
+      -1,    64,    66,    66,    -1,    66,    64,    -1,    66,    64,
+      66,    -1,    66,    40,     4,    66,    -1,    66,    -1,     6,
+      -1,    17,    -1,    24,    -1,    66,    40,    63,    -1,    66,
+      40,    63,    40,    -1,    63,    34,    66,    -1,    66,     4,
+      -1,    64,    66,    -1,     5,    66,    66,    -1,    66,     5,
+       9,    63,    -1,    64,    -1,    66,    -1,     4,    -1,    66,
+      -1,    65,    29,    65,    -1,    65,    30,    65,    -1,    65,
+      18,    65,    -1,    65,    19,    65,    -1,    65,    20,    65,
+      -1,    65,    21,    65,    -1,    65,    22,    65,    -1,    65,
+      23,    65,    -1,    65,    32,    65,    -1,    65,    31,    65,
+      -1,    65,    33,    65,    -1,    65,    34,    65,    -1,    65,
+      35,    65,    -1,    65,    38,    65,    39,    65,    -1,    36,
+      65,    -1,    41,    62,    42,    -1,    43,    65,    44,    -1,
+      67,    -1,     3,    -1,    31,     3,    -1,    12,    -1,    13,
+      66,    -1
   };
 
   /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
@@ -1296,29 +1452,29 @@ namespace KHolidays
   HolidayParserPlan::yyprhs_[] =
   {
          0,     0,     3,     6,    11,    12,    15,    16,    19,    20,
-      23,    24,    27,    28,    36,    37,    39,    40,    42,    43,
-      45,    47,    48,    50,    54,    58,    63,    67,    72,    79,
-      85,    86,    89,    92,    93,    98,    99,   101,   105,   106,
-     109,   113,   118,   124,   128,   134,   137,   141,   144,   148,
-     153,   155,   157,   159,   161,   165,   170,   174,   177,   180,
-     184,   189,   191,   193,   195,   197,   201,   205,   209,   213,
-     217,   221,   225,   229,   233,   237,   241,   245,   249,   255,
-     258,   262,   266,   268,   270,   273,   275
+      23,    24,    27,    28,    34,    36,    38,    41,    42,    44,
+      48,    52,    57,    61,    66,    73,    79,    80,    83,    86,
+      87,    92,    93,    95,    99,   100,   103,   107,   112,   118,
+     122,   128,   131,   135,   138,   142,   147,   149,   151,   153,
+     155,   159,   164,   168,   171,   174,   178,   183,   185,   187,
+     189,   191,   195,   199,   203,   207,   211,   215,   219,   223,
+     227,   231,   235,   239,   243,   249,   252,   256,   260,   262,
+     264,   267,   269
   };
 
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
   const unsigned char
   HolidayParserPlan::yyrline_[] =
   {
-         0,   123,   123,   126,   129,   130,   133,   134,   137,   138,
-     141,   142,   145,   146,   149,   150,   153,   154,   157,   158,
-     161,   164,   165,   168,   169,   170,   171,   172,   173,   174,
-     177,   178,   179,   182,   183,   186,   187,   188,   191,   192,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   220,   221,   224,   227,   228,   229,   230,   231,   232,
-     233,   234,   235,   236,   237,   238,   239,   240,   241,   242,
-     243,   246,   247,   250,   251,   252,   253
+         0,   126,   126,   129,   132,   133,   136,   137,   140,   141,
+     144,   145,   148,   149,   152,   155,   156,   159,   160,   163,
+     164,   165,   166,   167,   168,   169,   172,   173,   174,   177,
+     178,   181,   182,   183,   186,   187,   190,   191,   192,   193,
+     194,   195,   196,   197,   198,   199,   200,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   215,   216,   219,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,   234,   235,   236,   237,   238,   241,   242,   245,
+     246,   247,   248
   };
 
   // Print the state stack on the debug stream.
@@ -1340,7 +1496,7 @@ namespace KHolidays
     int yynrhs = yyr2_[yyrule];
     /* Print the symbols being reduced, and their result.  */
     *yycdebug_ << "Reducing stack by rule " << yyrule - 1
-	       << " (line " << yylno << "), ";
+	       << " (line " << yylno << "):" << std::endl;
     /* The symbols being reduced.  */
     for (int yyi = 0; yyi < yynrhs; yyi++)
       YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
@@ -1361,13 +1517,13 @@ namespace KHolidays
            0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    37,     2,     2,     2,    36,     2,     2,
-      44,    45,    34,    33,     2,    32,    41,    35,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    40,     2,
-       2,     2,     2,    39,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    36,     2,     2,     2,    35,     2,     2,
+      43,    44,    33,    32,     2,    31,    40,    34,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    39,     2,
+       2,     2,     2,    38,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    42,     2,    43,     2,     2,     2,     2,     2,     2,
+       2,    41,     2,    42,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1386,7 +1542,7 @@ namespace KHolidays
        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    38
+      25,    26,    27,    28,    29,    30,    37
     };
     if ((unsigned int) t <= yyuser_token_number_max_)
       return translate_table[t];
@@ -1395,20 +1551,29 @@ namespace KHolidays
   }
 
   const int HolidayParserPlan::yyeof_ = 0;
-  const int HolidayParserPlan::yylast_ = 287;
-  const int HolidayParserPlan::yynnts_ = 25;
+  const int HolidayParserPlan::yylast_ = 289;
+  const int HolidayParserPlan::yynnts_ = 23;
   const int HolidayParserPlan::yyempty_ = -2;
   const int HolidayParserPlan::yyfinal_ = 6;
   const int HolidayParserPlan::yyterror_ = 1;
   const int HolidayParserPlan::yyerrcode_ = 256;
-  const int HolidayParserPlan::yyntokens_ = 46;
+  const int HolidayParserPlan::yyntokens_ = 45;
 
-  const unsigned int HolidayParserPlan::yyuser_token_number_max_ = 287;
+  const unsigned int HolidayParserPlan::yyuser_token_number_max_ = 286;
   const HolidayParserPlan::token_number_type HolidayParserPlan::yyundef_token_ = 2;
 
-} // namespace KHolidays
 
-#line 256 "holidayparserplan.ypp"
+/* Line 1054 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+} // KHolidays
+
+/* Line 1054 of lalr1.cc  */
+#line 1573 "holidayparserplan.cpp"
+
+
+/* Line 1056 of lalr1.cc  */
+#line 251 "holidayparserplan.ypp"
 
 
 /*** Private Yacc callbacks and helper functions ***/
diff --git a/kholidays/parsers/plan2/holidayparserplan.hpp b/kholidays/parsers/plan2/holidayparserplan.hpp
index 926a1b7..2fdda16 100644
--- a/kholidays/parsers/plan2/holidayparserplan.hpp
+++ b/kholidays/parsers/plan2/holidayparserplan.hpp
@@ -1,23 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton interface for Bison LALR(1) parsers in C++
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Skeleton interface for Bison LALR(1) parsers in C++
+   
+      Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
+   Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,7 +28,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -37,36 +37,30 @@
 #ifndef PARSER_HEADER_H
 # define PARSER_HEADER_H
 
+
+
 #include <string>
 #include <iostream>
 #include "stack.hh"
 
-namespace KHolidays
-{
-  class position;
-  class location;
-}
-
-/* First part of user declarations.  */
-#line 30 "holidayparserplan.ypp"
- /*** C/C++ Declarations ***/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <limits.h>
-#include <string>
 
-#include <QString>
+/* Line 35 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
 
-#include <KCalendarSystem>
+namespace KHolidays {
 
+/* Line 35 of lalr1.cc  */
+#line 54 "holidayparserplan.hpp"
+  class position;
+  class location;
 
+/* Line 35 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
 
-/* Line 35 of lalr1.cc.  */
-#line 70 "holidayparserplan.hpp"
+} // KHolidays
+
+/* Line 35 of lalr1.cc  */
+#line 64 "holidayparserplan.hpp"
 
 #include "location.hh"
 
@@ -107,8 +101,14 @@ do {							\
 } while (false)
 #endif
 
-namespace KHolidays
-{
+
+/* Line 35 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+namespace KHolidays {
+
+/* Line 35 of lalr1.cc  */
+#line 112 "holidayparserplan.hpp"
 
   /// A Bison parser.
   class HolidayParserPlan
@@ -117,11 +117,16 @@ namespace KHolidays
     /// Symbol semantic values.
 #ifndef YYSTYPE
     union semantic_type
+    {
+
+/* Line 35 of lalr1.cc  */
 #line 86 "holidayparserplan.ypp"
-{ int  ival; char *sval; }
-/* Line 35 of lalr1.cc.  */
-#line 124 "holidayparserplan.hpp"
-	;
+ int  ival; char *sval; 
+
+
+/* Line 35 of lalr1.cc  */
+#line 129 "holidayparserplan.hpp"
+    };
 #else
     typedef YYSTYPE semantic_type;
 #endif
@@ -136,33 +141,32 @@ namespace KHolidays
      NUMBER = 258,
      MONTH = 259,
      WDAY = 260,
-     COLOR = 261,
-     STRING = 262,
+     STRING = 261,
+     CATEGORY = 262,
      CALENDAR = 263,
      INOP = 264,
      PLUS = 265,
      MINUS = 266,
-     SMALL = 267,
-     YEAR = 268,
-     LEAPYEAR = 269,
-     SHIFT = 270,
-     IF = 271,
-     LENGTH = 272,
-     EASTER = 273,
-     EQ = 274,
-     NE = 275,
-     LE = 276,
-     GE = 277,
-     LT = 278,
-     GT = 279,
-     PASCHA = 280,
-     COUNTRY = 281,
-     LANGUAGE = 282,
-     NAME = 283,
-     DESCRIPTION = 284,
-     OR = 285,
-     AND = 286,
-     UMINUS = 287
+     YEAR = 267,
+     LEAPYEAR = 268,
+     SHIFT = 269,
+     IF = 270,
+     LENGTH = 271,
+     EASTER = 272,
+     EQ = 273,
+     NE = 274,
+     LE = 275,
+     GE = 276,
+     LT = 277,
+     GT = 278,
+     PASCHA = 279,
+     COUNTRY = 280,
+     LANGUAGE = 281,
+     NAME = 282,
+     DESCRIPTION = 283,
+     OR = 284,
+     AND = 285,
+     UMINUS = 286
    };
 
     };
@@ -177,6 +181,7 @@ namespace KHolidays
     /// \returns  0 iff parsing succeeded.
     virtual int parse ();
 
+#if YYDEBUG
     /// The current debugging stream.
     std::ostream& debug_stream () const;
     /// Set the current debugging stream.
@@ -188,6 +193,7 @@ namespace KHolidays
     debug_level_type debug_level () const;
     /// Set the current debugging level.
     void set_debug_level (debug_level_type l);
+#endif
 
   private:
     /// Report a syntax error.
@@ -197,7 +203,7 @@ namespace KHolidays
 
     /// Generate an error message.
     /// \param state   the state where the error occurred.
-    /// \param tok     the look-ahead token.
+    /// \param tok     the lookahead token.
     virtual std::string yysyntax_error_ (int yystate, int tok);
 
 #if YYDEBUG
@@ -215,7 +221,7 @@ namespace KHolidays
     virtual void yy_symbol_print_ (int yytype,
 				   const semantic_type* yyvaluep,
 				   const location_type* yylocationp);
-#endif /* ! YYDEBUG */
+#endif
 
 
     /// State numbers.
@@ -239,14 +245,14 @@ namespace KHolidays
     /* Tables.  */
     /// For a state, the index in \a yytable_ of its portion.
     static const short int yypact_[];
-    static const short int yypact_ninf_;
+    static const signed char yypact_ninf_;
 
     /// For a state, default rule to reduce.
     /// Unless\a  yytable_ specifies something else to do.
     /// Zero means the default is an error.
     static const unsigned char yydefact_[];
 
-    static const short int yypgoto_[];
+    static const signed char yypgoto_[];
     static const signed char yydefgoto_[];
 
     /// What to do in a state.
@@ -292,6 +298,10 @@ namespace KHolidays
     virtual void yy_reduce_print_ (int r);
     /// Print the state stack on the debug stream.
     virtual void yystack_print_ ();
+
+    /* Debugging.  */
+    int yydebug_;
+    std::ostream* yycdebug_;
 #endif
 
     /// Convert a scanner token number \a t to a symbol number.
@@ -323,15 +333,18 @@ namespace KHolidays
     static const unsigned int yyuser_token_number_max_;
     static const token_number_type yyundef_token_;
 
-    /* Debugging.  */
-    int yydebug_;
-    std::ostream* yycdebug_;
-
-
     /* User arguments.  */
     class HolidayParserDriverPlan& driver;
   };
-}
+
+/* Line 35 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+} // KHolidays
+
+/* Line 35 of lalr1.cc  */
+#line 347 "holidayparserplan.hpp"
+
 
 
 #endif /* ! defined PARSER_HEADER_H */
diff --git a/kholidays/parsers/plan2/holidayscannerplan.cpp b/kholidays/parsers/plan2/holidayscannerplan.cpp
index 3f04c91..a7c5a72 100644
--- a/kholidays/parsers/plan2/holidayscannerplan.cpp
+++ b/kholidays/parsers/plan2/holidayscannerplan.cpp
@@ -79,7 +79,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -110,6 +109,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 /* %endif */
@@ -119,8 +120,8 @@ typedef unsigned int flex_uint32_t;
 #include <iostream> 
 #include <errno.h>
 #include <cstdlib>
-#include <cstring>
 #include <cstdio>
+#include <cstring>
 /* end standard C++ headers. */
 /* %endif */
 
@@ -191,7 +192,15 @@ typedef unsigned int flex_uint32_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -397,8 +406,8 @@ typedef unsigned char YY_CHAR;
 	(yy_c_buf_p) = yy_cp;
 
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 201
-#define YY_END_OF_BUFFER 202
+#define YY_NUM_RULES 202
+#define YY_END_OF_BUFFER 203
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -406,112 +415,116 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[943] =
+static yyconst flex_int16_t yy_accept[982] =
     {   0,
-        0,    0,  202,  200,    3,    4,    5,  200,  200,    5,
-      200,   10,   10,   10,   10,   10,   10,   41,  200,   42,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,    5,    3,    4,   38,    0,   11,
-        0,    1,   43,   10,    0,    0,    0,    0,    0,   39,
-       37,   40,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  129,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  203,  201,    3,    4,    5,  201,  201,    5,
+      201,   10,   10,   10,   10,   10,   10,   31,  201,   32,
+      201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
+      201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
+      201,  201,  201,  201,    5,    3,    4,   28,    0,   11,
+        0,    1,   33,   10,    0,    0,    0,    0,    0,   29,
+       27,   30,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  130,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,   18,   17,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   18,   17,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   15,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   15,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   16,    0,
-        0,    0,    0,    0,    0,    0,   44,    0,    2,   45,
-       46,   47,   48,   49,    0,    0,    0,    0,   51,    0,
-      115,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   13,    0,  190,    0,    0,    0,
+       16,    0,    0,    0,    0,    0,    0,   34,    0,    2,
+       35,   36,   37,   38,   39,    0,    0,    0,    0,   41,
+        0,  116,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   13,    0,  191,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   61,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   62,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  114,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  103,    0,    0,    0,    0,  185,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  189,  125,    0,    0,    0,    0,    0,    0,  190,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   14,    0,    0,    0,    0,  118,  131,   88,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   29,  113,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  102,    0,
-        0,    0,    0,  184,    0,    0,    0,    0,    0,    0,
+        0,    0,  127,    0,    0,    0,   64,    0,    0,   63,
+        0,    0,    0,    0,    0,    0,    0,   40,    0,    0,
+        0,  172,    0,    0,    0,  188,    0,    0,    0,    0,
+        0,    0,    0,    0,    8,    0,    0,   42,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    0,  188,  124,
-        0,    0,    0,    0,    0,    0,  189,    0,    0,    0,
-        0,   32,    0,    0,    0,    0,    0,   34,   14,    0,
-        0,    0,    0,  117,  130,   87,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  126,    0,    0,
-        0,   63,    0,    0,   62,    0,    0,    0,    0,    0,
-        0,    0,   50,    0,    0,    0,    0,  171,    0,    0,
-        0,  187,    0,    0,    0,    0,    0,    0,    0,    0,
-        8,    0,    0,   52,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   19,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  108,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   82,    0,    0,    0,
+        0,    0,    0,   21,    0,    0,    0,    0,  132,   44,
+        0,   61,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   46,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   12,    0,    0,   39,    0,   35,    0,    0,
+
+        0,    0,    0,    0,  109,  115,    0,    0,  101,    0,
+      141,    0,    0,    0,    0,    0,    0,  198,    0,    0,
+        0,   81,    0,    0,    0,    0,    0,    0,    0,    0,
+       60,    0,    0,    0,   20,    0,    0,    0,    0,    0,
+        0,  126,    0,    0,    0,    0,    0,   87,   79,    0,
+        0,    0,    0,  171,    0,    0,    0,    0,    0,   95,
+       94,    0,    0,    0,  148,    0,    0,    0,  143,    0,
+        0,    0,    0,    0,  112,    0,    0,    0,    0,    0,
+        0,    0,   26,    0,  124,  128,    0,    0,    0,    0,
+      129,    0,  123,   37,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   19,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  107,    0,    0,    0,    0,    0,
+      133,    0,    0,  168,   65,  192,   43,    0,    0,    0,
+        0,    0,   77,    0,    0,    0,    0,    0,   23,  193,
+        0,    0,    0,    0,   38,   74,  107,    0,    0,    0,
+       80,  119,    0,    0,    0,  181,    0,   57,    0,    0,
+      169,    0,  122,    0,    0,    0,   25,    0,    0,    0,
+       83,    0,   89,    0,   70,  186,    0,    0,  110,    0,
+        0,    0,    0,    0,    0,    0,   24,    0,    0,   91,
+        0,    0,    0,   45,  117,    0,    0,    0,    0,    0,
+        0,   48,    0,   36,    0,    0,  149,    0,    0,  199,
+
+        0,    0,    0,    0,   76,  102,    0,   78,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   81,
-        0,    0,    0,    0,    0,    0,    0,    0,   22,    0,
-        0,    0,    0,    0,  131,   54,    0,   60,    0,    0,
-        0,    0,    0,    0,   28,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   12,    0,    0,   49,
-       45,    0,    0,    0,   30,    0,    0,  108,  114,    0,
-
-        0,  100,    0,  140,    0,    0,    0,    0,    0,  197,
-        0,    0,    0,   80,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   59,    0,    0,    0,   20,    0,    0,
-        0,    0,    0,  125,    0,    0,    0,    0,    0,   86,
-       78,    0,    0,    0,    0,  170,    0,    0,    0,    0,
-        0,   94,   93,    0,    0,  147,    0,    0,  142,    0,
-        0,    0,  111,    0,    0,    0,    0,    0,    0,    0,
-       27,    0,  123,  127,   21,    0,    0,    0,    0,  128,
-        0,  122,   47,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   35,    0,    0,    0,    0,    0,    0,    0,
-
-        0,    0,  132,    0,    0,  167,   64,  191,   53,    0,
-        0,    0,    0,   76,    0,    0,    0,    0,   24,  192,
-        0,    0,    0,   48,   73,  106,    0,    0,   79,  118,
-        0,    0,  180,    0,   56,    0,    0,  168,    0,  121,
-        0,    0,    0,   26,    0,    0,    0,    0,   82,    0,
-       88,    0,   69,  185,    0,  109,    0,    0,    0,    0,
-        0,    0,    0,   25,    0,    0,   90,    0,    0,    0,
-      116,    0,    0,    0,    0,    0,   46,    0,    0,  148,
-        0,    0,  198,    0,    0,    0,    0,   75,  101,    0,
-       77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
-        0,    0,    0,    0,   31,    0,    0,    0,    0,    0,
-        0,    0,  164,    0,    0,    0,  161,    6,    0,    0,
-        0,    0,    0,    0,    0,    0,  120,    0,   57,    0,
-        0,  183,    0,    0,    0,  104,   33,    0,    0,    0,
-      105,    0,    0,   66,    0,  110,    0,    0,    0,   85,
-       92,  172,    0,    0,    0,    0,  149,  179,    0,    0,
-        0,    0,  138,    0,  150,    0,    0,    0,   99,    0,
-        0,    0,  119,    0,   70,    0,    0,   36,  103,    0,
+        0,    0,    0,    0,    0,    0,    0,  165,    0,    0,
+        0,  162,    0,    6,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  121,    0,    0,   58,    0,
+        0,  184,    0,    0,    0,  105,    0,    0,    0,  106,
+        0,   54,    0,   67,    0,  111,    0,    0,    0,   86,
+       93,  173,    0,    0,    0,    0,  150,  180,    0,    0,
+        0,    0,    0,    0,  139,    0,  151,    0,    0,    0,
+      100,    0,    0,    0,  120,    0,   71,    0,    0,  104,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   68,    0,  193,    0,
-
-        0,   58,    0,  176,    0,    0,    0,    0,    7,   23,
-      112,  174,   98,  141,   67,    0,    0,    0,   84,    0,
-       91,    0,    0,  178,   74,    0,  194,    0,  165,  173,
-        0,    0,    0,   72,   96,  162,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  135,    0,  133,    0,
-        0,    0,  166,  175,    0,    0,   97,  181,   55,    0,
-        0,  163,    0,    0,    0,    0,   95,    0,    0,   65,
-      186,  177,    0,    0,   71,    0,    0,    0,    0,    0,
-        0,    0,  199,    0,  139,  137,    0,  169,    0,    0,
-        0,    0,    0,   89,    0,  196,   83,  143,    0,    0,
-
-      151,    0,  159,    0,    0,    0,    0,  158,    0,  134,
-        0,    9,    0,    0,    0,  182,    0,  152,    0,  155,
-        0,  157,    0,  136,  195,    0,    0,    0,  144,    0,
-        0,    0,    0,  145,    0,  154,  153,  156,  160,    0,
-      146,    0
+        0,    0,    0,    0,    0,    0,    0,    0,   51,   69,
+        0,  194,    0,    0,   59,    0,    0,    0,  177,    0,
+        0,    0,    0,    0,    7,   22,  113,  175,   99,  142,
+       68,    0,    0,    0,   85,    0,   92,    0,    0,    0,
+      179,   75,   55,    0,  195,    0,  166,  174,    0,    0,
+        0,   73,   97,  163,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  136,    0,  134,    0,    0,    0,
+      167,  176,    0,    0,    0,   98,  182,   50,    0,   56,
+        0,    0,    0,  164,    0,    0,    0,    0,   96,    0,
+
+        0,   47,   66,  187,  178,    0,    0,   72,    0,    0,
+        0,    0,    0,    0,    0,  200,    0,  140,  138,    0,
+      170,    0,    0,    0,   49,   53,    0,    0,    0,   90,
+        0,  197,   84,  144,    0,    0,  152,    0,  160,    0,
+        0,    0,    0,  159,    0,  135,    0,    0,    9,    0,
+        0,    0,  183,    0,  153,    0,  156,    0,  158,    0,
+      137,  196,    0,    0,    0,    0,  145,    0,    0,    0,
+       52,    0,  146,    0,  155,  154,  157,  161,    0,  147,
+        0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -557,223 +570,231 @@ static yyconst flex_int32_t yy_meta[70] =
         1,    1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[946] =
+static yyconst flex_int16_t yy_base[985] =
     {   0,
-        0,  298,  287, 1944,  281,  277,  261,  259,  241, 1944,
-      226,   61,   67,   73,   79,   85,   97,  215,  210,  168,
-      141,   94,   86,   99,  191,  197,  128,  160,  169,  155,
-      233,  102,  224,  242,   95,  282,   78,  248,  327,  373,
-       95,  247,  270,  103,  166,  166,  159, 1944,  150, 1944,
-      151, 1944, 1944,  329,   96,  148,  149,  156,  187, 1944,
-     1944, 1944,  195,  196,  185,  201,  232,  243,  277,  276,
-      282, 1944,  290,  284,  287,  304,  312,  302,  328,  318,
-      336,  317,  367,  324,  325,  325,  326,  345,  346,  347,
-      374,  365,  383,  384,  366,  380,  377,  387,  375,  385,
-
-      418,  386, 1944,  396,  423,  414,  419,  428,  416,  420,
-      442,  417,  425,  441,  459,  457,  457,  460,  442,  459,
-      471,  463,  470,  464, 1944,  483,  511,  505,  487,  468,
-      519,  485,  511,  531,  517,  520,  517,  557,  566,  516,
-      560,  552,  563,  574,  586,  596,  575,  546,  570,  576,
-      582,  610,  601,  610,  626,  607, 1944,  133, 1944, 1944,
-     1944, 1944, 1944, 1944,  608,  605,  619,  624, 1944,  617,
-     1944,  631,  613,  623,  630,  629,  649,  652,  653,  652,
-      656,  641,  653,  656,  652,  667, 1944,  670,  666,  655,
-      672,  665,  665,  681,  675,  669,  666,  673,  673,  675,
-
-      685,  700,  703,  703,  690,  702,  707,  699,  719,  713,
-      704,  715,  707,  725,  706,  729,  736,  726,  723,  714,
-      725,  736,  742,  745,  751,  740,  745,  757,  766,  746,
-      763,  769, 1944,  755,  773,  754,  775,  773,  778,  786,
-      786,  792,  793,  787,  799,  790,  799,  789,  801,  801,
-      809,  817,  802,  803,  810,  814,  808,  829,  817,  819,
-      822,  837,  832,  842,  843,  844, 1944, 1944,  853,  846,
-      837,  845,  847,  859,  845,  859,  868,  865,  871,  872,
-      873,  863,  876,  863,  880,  868,  867,  872, 1944,  889,
-      885,  889,  904, 1944,  900,  892,  906,  895,  896,  903,
-
-      909,  901,  922,  924,  906,  907,  915,  935, 1944,  922,
-      914,  926,  929,  939,  935,  936, 1944,  957,  942,  943,
-      953, 1944,  964,  966,  950,  962,  952, 1944, 1944,  960,
-      956,  974,  971, 1944, 1944, 1944,  963,  966,  958,  983,
-      966,  980,  971,  973,  993,  988,  990,  990,  986, 1005,
-      992,  999, 1010,  999,  998, 1012, 1021, 1944, 1011, 1023,
-     1024, 1944, 1025, 1022, 1944, 1012, 1023, 1030, 1026, 1033,
-     1032, 1022, 1944, 1020, 1033, 1052, 1041, 1944, 1053, 1059,
-     1053, 1944, 1055, 1060, 1049, 1051, 1046, 1071, 1072, 1056,
-     1944, 1056, 1062, 1944, 1064, 1079, 1080, 1071, 1068, 1083,
-
-     1086, 1080, 1079, 1095, 1089, 1097, 1093, 1109, 1104, 1944,
-     1112, 1102, 1096, 1099, 1108, 1121, 1121, 1120, 1124, 1108,
-     1105, 1113, 1118, 1119, 1944, 1132, 1137, 1142, 1123, 1151,
-     1131, 1135, 1136, 1140, 1147, 1152, 1143, 1166, 1169, 1170,
-     1147, 1168, 1154, 1171, 1155, 1165, 1162, 1164, 1175, 1944,
-     1183, 1180, 1186, 1188, 1189, 1183, 1192, 1204, 1944, 1200,
-     1195, 1203, 1212, 1206, 1206, 1944, 1219, 1944, 1214, 1209,
-     1204, 1211, 1221, 1226, 1944, 1209, 1214, 1216, 1234, 1220,
-     1239, 1234, 1230, 1235, 1250, 1239, 1944, 1240, 1259, 1944,
-     1944, 1253, 1240, 1245, 1944, 1249, 1269, 1944, 1944, 1253,
-
-     1249, 1944, 1272, 1944, 1260, 1266, 1258, 1263, 1277, 1944,
-     1274, 1273, 1286, 1944, 1266, 1277, 1292, 1289, 1295, 1295,
-     1285, 1301, 1298, 1944, 1293, 1296, 1310, 1944, 1293, 1296,
-     1317, 1304, 1318, 1944, 1322, 1320, 1321, 1322, 1323, 1944,
-     1944, 1324, 1313, 1336, 1324, 1944, 1326, 1322, 1323, 1352,
-     1349, 1944, 1944, 1350, 1346, 1944, 1359, 1343, 1944, 1363,
-     1361, 1363, 1944, 1357, 1357, 1358, 1372, 1365, 1370, 1375,
-     1944, 1376, 1944, 1944, 1944, 1380, 1360, 1360, 1368, 1944,
-     1375, 1944, 1944, 1371, 1386, 1389, 1399, 1404, 1407, 1409,
-     1392, 1400, 1944, 1406, 1397, 1408, 1420, 1399, 1422, 1402,
-
-     1406, 1422, 1944, 1402, 1431, 1944, 1944, 1944, 1944, 1421,
-     1437, 1422, 1442, 1944, 1420, 1448, 1438, 1453, 1944, 1944,
-     1449, 1456, 1443, 1944, 1944, 1944, 1455, 1447, 1944, 1944,
-     1453, 1456, 1944, 1447, 1944, 1471, 1453, 1944, 1470, 1944,
-     1474, 1469, 1476, 1944, 1461, 1481, 1470, 1465, 1944, 1483,
-     1944, 1490, 1944, 1944, 1492, 1944, 1489, 1485, 1496, 1491,
-     1507, 1495, 1491, 1944, 1495, 1494, 1944, 1503, 1500, 1507,
-     1944, 1521, 1509, 1523, 1507, 1525, 1944, 1525, 1529, 1944,
-     1512, 1512, 1944, 1525, 1524, 1525, 1543, 1944, 1944, 1533,
-     1944, 1545, 1546, 1557, 1536, 1550, 1540, 1554, 1563, 1566,
-
-     1551, 1564, 1590, 1559, 1944, 1564, 1572, 1574, 1573, 1569,
-     1584, 1593, 1944, 1602, 1586, 1597, 1944, 1944, 1590, 1590,
-     1606, 1613, 1606, 1593, 1619, 1620, 1944, 1621, 1944, 1622,
-     1619, 1944, 1629, 1627, 1619, 1944, 1944, 1623, 1640, 1630,
-     1944, 1631, 1631, 1944, 1645, 1944, 1637, 1633, 1649, 1944,
-     1944, 1944, 1640, 1638, 1636, 1652, 1944, 1944, 1660, 1640,
-     1660, 1662, 1944, 1669, 1944, 1670, 1671, 1655, 1944, 1667,
-     1677, 1658, 1944, 1682, 1944, 1680, 1690, 1944, 1944, 1672,
-     1686, 1679, 1679, 1693, 1702, 1703, 1699, 1700, 1695, 1702,
-     1706, 1696, 1703, 1716, 1720, 1721, 1944, 1714, 1944, 1713,
-
-     1717, 1944, 1718, 1944, 1717, 1726, 1740, 1728, 1944, 1944,
-     1944, 1944, 1944, 1944, 1944, 1725, 1747, 1745, 1944, 1737,
-     1944, 1752, 1753, 1944, 1944, 1737, 1944, 1740, 1944, 1944,
-     1758, 1750, 1760, 1944, 1944, 1944, 1740, 1753, 1766, 1768,
-     1763, 1759, 1772, 1775, 1776, 1763, 1944, 1773, 1944, 1779,
-     1783, 1792, 1944, 1944, 1780, 1784, 1944, 1944, 1944, 1791,
-     1800, 1944, 1783, 1796, 1800, 1792, 1944, 1797, 1809, 1944,
-     1944, 1944, 1810, 1806, 1944, 1814, 1813, 1812, 1808, 1810,
-     1814, 1811, 1944, 1824, 1944, 1944, 1828, 1944, 1836, 1827,
-     1828, 1821, 1841, 1944, 1830, 1944, 1944, 1944, 1837, 1845,
-
-     1944, 1834, 1944, 1854, 1857, 1858, 1855, 1944, 1852, 1944,
-     1859, 1944, 1851, 1866, 1869, 1944, 1862, 1944, 1864, 1944,
-     1864, 1944, 1872, 1944, 1944, 1880, 1870, 1886, 1944, 1887,
-     1877, 1874, 1882, 1944, 1885, 1944, 1944, 1944, 1944, 1891,
-     1944, 1944,  102,  101,   99
+        0,  415,  427, 2013,  424,  422,  407,  380,  378, 2013,
+      371,   61,   67,   73,   79,   85,   97,  361,  243,  217,
+      141,   93,   87,   98,  191,  135,  191,  188,  184,   83,
+      238,  105,  239,  240,  249,  292,   95,  290,  338,  384,
+      115,  141,  293,  135,  182,  180,  152, 2013,  147, 2013,
+      133, 2013, 2013,  440,  129,  147,  148,  146,  148, 2013,
+     2013, 2013,  157,  193,  175,  182,  177,  184,  202,  197,
+      236, 2013,  249,  243,  250,  256,  254,  258,  239,  286,
+      250,  265,  287,  282,  284,  288,  289,  312,  334,  336,
+      340,  330,  347,  344,  330,  343,  340,  333,  351,  339,
+
+      377,  384,  381, 2013,  390,  395,  390,  425,  397,  383,
+      425,  440,  421,  429,  443,  463,  439,  436,  437,  438,
+      440,  446,  442,  474,  468, 2013,  486,  515,  488,  490,
+      471,  523,  484,  496,  496,  535,  489,  501,  521,  531,
+      582,  566,  518,  530,  558,  538,  569,  584,  559,  555,
+      579,  585,  586,  603,  606,  618,  609, 2013,  130, 2013,
+     2013, 2013, 2013, 2013, 2013,  611,  610,  626,  632, 2013,
+      625, 2013,  634,  615,  619,  625,  624,  636,  633,  637,
+      634,  635,  629,  637,  635,  648,  664, 2013,  669,  667,
+      657,  674,  667,  665,  682,  675,  667,  664,  669,  668,
+
+      688,  671,  673,  689,  693,  691,  691,  678,  705,  697,
+      689,  718,  714,  707,  707,  719,  711,  730,  712,  725,
+      734,  731,  728,  718,  722,  733,  731,  735,  739,  728,
+      739,  750,  768,  748,  765,  772, 2013,  759,  770,  758,
+      782,  780,  782,  786,  783,  788,  789,  775,  788,  780,
+      787,  777,  789,  791,  812,  819,  800,  806,  814,  817,
+      812,  831,  819,  820,  821,  825,  837,  830,  839,  840,
+      834,  836, 2013,  845,  839,  828,  840,  838,  852,  855,
+      867,  855,  868,  875,  872,  878,  880,  883,  884,  868,
+      883,  869,  869,  870, 2013,  888,  877,  881,  904, 2013,
+
+      891,  889,  912,  900,  906,  912,  926,  927,  911,  912,
+      930, 2013,  925,  917,  928,  925,  934,  930,  922, 2013,
+      942,  927,  928,  954,  956,  947,  957,  967,  966,  956,
+      956, 2013,  965,  961,  980,  978, 2013, 2013, 2013,  970,
+      970,  962,  986,  967,  981,  976,  971,  973,  994,  981,
+      980,  984,  983, 1002,  998, 1004, 1017, 1007, 1004, 1018,
+     1013, 1028, 2013, 1019, 1032, 1033, 2013, 1034, 1031, 2013,
+     1018, 1029, 1035, 1029, 1036, 1034, 1024, 2013, 1022, 1028,
+     1047, 2013, 1050, 1056, 1059, 2013, 1060, 1067, 1057, 1057,
+     1052, 1077, 1078, 1063, 1079, 1065, 1071, 2013, 1073, 1085,
+
+     1086, 1076, 1071, 1086, 1088, 1082, 1081, 1090, 1084, 1097,
+     1092, 1116, 1112, 2013, 1120, 1112, 1105, 1106, 1119, 1116,
+     1130, 1131, 1130, 1134, 1129, 1119, 1116, 1121, 1125, 1126,
+     1129, 1130, 2013, 1141, 1147, 1173, 1137, 1155, 1144, 1149,
+     1150, 1156, 1163, 1156, 1178, 1180, 1182, 1159, 1180, 1166,
+     1183, 1167, 1177, 1171, 1173, 1184, 2013, 1191, 1188, 1193,
+     1185, 1195, 1216, 2013, 1211, 1214, 1219, 1217, 1217, 2013,
+     1226, 2013, 1221, 1217, 1213, 1220, 1230, 1235, 1215, 1220,
+     1221, 2013, 1227, 1238, 1225, 1227, 1244, 1239, 1241, 1239,
+     1263, 1253, 2013, 1254, 1273, 2013, 1272, 2013, 1268, 1253,
+
+     1258, 1265, 1263, 1282, 2013, 2013, 1266, 1262, 2013, 1285,
+     2013, 1269, 1274, 1280, 1272, 1277, 1289, 2013, 1287, 1285,
+     1297, 2013, 1283, 1293, 1316, 1314, 1314, 1315, 1318, 1314,
+     2013, 1309, 1310, 1324, 2013, 1307, 1309, 1330, 1317, 1335,
+     1332, 2013, 1336, 1334, 1335, 1336, 1335, 2013, 2013, 1337,
+     1325, 1347, 1341, 2013, 1342, 1346, 1348, 1371, 1369, 2013,
+     2013, 1372, 1371, 1365, 2013, 1377, 1361, 1372, 2013, 1382,
+     1380, 1373, 1372, 1383, 2013, 1375, 1375, 1376, 1390, 1384,
+     1390, 1395, 2013, 1397, 2013, 2013, 1404, 1385, 1393, 1400,
+     2013, 1409, 2013, 2013, 1404, 1417, 1422, 1422, 1427, 1428,
+
+     1430, 1414, 1426, 1416, 1425, 1437, 1438, 1418, 1422, 1462,
+     2013, 1419, 1444, 2013, 2013, 2013, 2013, 1432, 1454, 1438,
+     1468, 1457, 2013, 1451, 1475, 1472, 1462, 1477, 2013, 2013,
+     1472, 1479, 1466, 1476, 2013, 2013, 2013, 1473, 1478, 1470,
+     2013, 2013, 1475, 1481, 1477, 2013, 1469, 2013, 1494, 1478,
+     2013, 1501, 2013, 1506, 1510, 1518, 2013, 1501, 1508, 1502,
+     2013, 1520, 2013, 1525, 2013, 2013, 1526, 1504, 2013, 1524,
+     1513, 1525, 1520, 1534, 1521, 1517, 2013, 1519, 1518, 2013,
+     1526, 1521, 1529, 2013, 2013, 1547, 1531, 1554, 1542, 1551,
+     1570, 2013, 1571, 2013, 1572, 1573, 2013, 1556, 1555, 2013,
+
+     1566, 1565, 1563, 1582, 2013, 2013, 1564, 2013, 1576, 1577,
+     1586, 1564, 1578, 1566, 1580, 1589, 1575, 1590, 1616, 1591,
+     1594, 1610, 1613, 1608, 1605, 1619, 1628, 2013, 1630, 1615,
+     1626, 2013, 1618, 2013, 1625, 1620, 1619, 1635, 1640, 1634,
+     1621, 1647, 1650, 1656, 1666, 2013, 1666, 1670, 2013, 1671,
+     1666, 2013, 1673, 1671, 1659, 2013, 1663, 1678, 1668, 2013,
+     1670, 2013, 1666, 2013, 1680, 2013, 1672, 1667, 1683, 2013,
+     2013, 2013, 1674, 1670, 1668, 1685, 2013, 2013, 1674, 1697,
+     1681, 1695, 1712, 1714, 2013, 1720, 2013, 1721, 1723, 1707,
+     2013, 1716, 1723, 1704, 2013, 1724, 2013, 1723, 1732, 2013,
+
+     1713, 1727, 1716, 1716, 1730, 1738, 1738, 1732, 1734, 1733,
+     1746, 1749, 1748, 1755, 1767, 1771, 1773, 1774, 2013, 2013,
+     1767, 2013, 1763, 1764, 2013, 1767, 1767, 1769, 2013, 1783,
+     1765, 1774, 1786, 1773, 2013, 2013, 2013, 2013, 2013, 2013,
+     2013, 1770, 1788, 1786, 2013, 1779, 2013, 1794, 1797, 1786,
+     2013, 2013, 2013, 1789, 2013, 1799, 2013, 2013, 1818, 1811,
+     1821, 2013, 2013, 2013, 1800, 1813, 1825, 1825, 1820, 1816,
+     1830, 1831, 1829, 1816, 2013, 1822, 2013, 1828, 1830, 1838,
+     2013, 2013, 1826, 1821, 1828, 2013, 2013, 2013, 1825, 2013,
+     1836, 1846, 1856, 2013, 1847, 1861, 1866, 1856, 2013, 1862,
+
+     1874, 2013, 2013, 2013, 2013, 1876, 1870, 2013, 1878, 1877,
+     1874, 1870, 1872, 1873, 1867, 2013, 1880, 2013, 2013, 1880,
+     2013, 1888, 1882, 1879, 2013, 2013, 1880, 1875, 1897, 2013,
+     1887, 2013, 2013, 2013, 1903, 1911, 2013, 1901, 2013, 1921,
+     1923, 1924, 1921, 2013, 1918, 2013, 1923, 1907, 2013, 1917,
+     1932, 1933, 2013, 1926, 2013, 1928, 2013, 1928, 2013, 1933,
+     2013, 2013, 1934, 1939, 1929, 1942, 2013, 1944, 1934, 1936,
+     2013, 1945, 2013, 1953, 2013, 2013, 2013, 2013, 1960, 2013,
+     2013,  102,  100,   99
     } ;
 
-static yyconst flex_int16_t yy_def[946] =
+static yyconst flex_int16_t yy_def[985] =
     {   0,
-      942,    1,  942,  942,  942,  942,  942,  943,  944,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  945,  942,  942,  942,  943,  942,
-      944,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  945,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,    0,  942,  942,  942
+      981,    1,  981,  981,  981,  981,  981,  982,  983,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  984,  981,  981,  981,  982,  981,
+      983,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  984,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+        0,  981,  981,  981
     } ;
 
-static yyconst flex_int16_t yy_nxt[2014] =
+static yyconst flex_int16_t yy_nxt[2083] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
        14,   15,   16,   17,   10,   18,   19,   20,   21,   22,
@@ -784,222 +805,229 @@ static yyconst flex_int16_t yy_nxt[2014] =
        38,   39,   40,    4,   41,   42,   43,    4,   44,   54,
        54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
        54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,  158,
-
-      133,   51,   49,   55,   56,   54,   54,   54,   54,   54,
-       54,   79,   74,  151,   57,  124,   75,   82,   80,   76,
-      113,   83,   58,   77,  114,  133,  125,   81,   55,   56,
-      126,   84,   78,  160,   59,  159,   79,   74,  151,   57,
-      124,   75,   82,   80,   76,  113,   83,   58,   77,  114,
-       97,  125,   81,   52,   50,  126,   84,   78,  160,   59,
-       63,   47,   64,   98,   65,   66,   99,   46,  159,  161,
-      162,  157,   67,  106,   68,   97,   69,   70,  100,   71,
-       72,  163,  101,   73,   62,   63,  102,   64,   98,   65,
-       66,   99,  103,  107,  161,  162,  108,   67,  106,   68,
-
-      104,   69,   70,  100,   71,   72,  163,  101,   73,   85,
-      105,  102,  164,  165,  166,   92,   86,  103,  107,   93,
-       87,  108,  167,   94,   88,  104,   61,   89,   90,   95,
-       91,   60,   96,   53,   85,  105,  168,  164,  165,  166,
-       92,   86,  115,   52,   93,   87,  116,  167,   94,   88,
-      117,  109,   89,   90,   95,   91,  118,   96,  110,  111,
-      120,  168,  119,   50,  121,  112,  134,  115,  122,  152,
-      135,  116,  153,  169,  123,  117,  109,   48,  170,   47,
-      136,  118,   46,  110,  111,  120,  942,  119,  154,  121,
-      112,  134,  155,  122,  152,  135,  171,  153,  169,  123,
-
-      127,  172,  156,  170,  128,  136,  173,  129,  174,  175,
-      176,  130,   45,  154,  942,  942,  942,  155,  131,  132,
-      942,  171,  177,  180,  942,  127,  172,  156,  942,  128,
-      178,  173,  129,  174,  175,  176,  130,   54,   54,   54,
-       54,   54,   54,  131,  132,  137,  181,  177,  180,  138,
-      179,  182,  139,  140,  184,  178,  183,  141,  185,  142,
-      189,  190,  942,  191,  192,  143,  942,  193,  942,  194,
-      137,  181,  195,  942,  138,  179,  182,  139,  140,  184,
-      942,  183,  141,  185,  142,  189,  190,  186,  191,  192,
-      143,  144,  193,  187,  194,  145,  196,  195,  146,  147,
-
-      197,  148,  198,  188,  201,  149,  202,  199,  203,  204,
-      205,  150,  186,  211,  942,  206,  144,  212,  187,  200,
-      145,  196,  207,  146,  147,  197,  148,  198,  188,  201,
-      149,  202,  199,  203,  204,  205,  150,  208,  211,  209,
-      206,  213,  212,  214,  200,  215,  219,  207,  216,  217,
-      218,  220,  221,  942,  210,  224,  225,  942,  942,  227,
-      222,  226,  208,  942,  209,  942,  213,  240,  214,  942,
-      215,  219,  228,  216,  217,  218,  220,  221,  223,  210,
-      224,  225,  234,  229,  227,  222,  226,  230,  236,  241,
-      231,  238,  240,  235,  232,  239,  242,  228,  237,  243,
-
-      233,  246,  244,  223,  247,  256,  257,  234,  229,  245,
-      942,  261,  230,  236,  241,  231,  238,  942,  235,  232,
-      239,  242,  942,  237,  243,  233,  246,  244,  254,  247,
-      256,  257,  262,  942,  245,  248,  261,  258,  267,  268,
-      269,  255,  249,  250,  259,  942,  251,  252,  270,  253,
-      263,  260,  942,  254,  271,  281,  942,  262,  264,  942,
-      248,  265,  258,  267,  268,  269,  255,  249,  250,  259,
-      266,  251,  252,  270,  253,  263,  260,  272,  282,  271,
-      281,  273,  283,  264,  277,  942,  265,  296,  274,  297,
-      275,  284,  278,  276,  285,  266,  942,  942,  298,  286,
-
-      942,  279,  272,  282,  287,  280,  273,  283,  299,  277,
-      294,  295,  296,  274,  297,  275,  284,  278,  276,  285,
-      288,  289,  291,  298,  286,  290,  279,  302,  292,  287,
-      280,  300,  301,  299,  293,  294,  295,  308,  303,  309,
-      310,  311,  312,  313,  305,  288,  289,  291,  304,  314,
-      290,  316,  302,  292,  306,  307,  300,  301,  317,  293,
-      318,  319,  308,  303,  309,  310,  311,  312,  313,  305,
-      320,  315,  321,  304,  314,  322,  316,  323,  326,  306,
-      307,  324,  325,  317,  327,  318,  319,  328,  329,  330,
-      331,  332,  333,  334,  335,  320,  315,  321,  336,  337,
-
-      322,  338,  323,  326,  339,  340,  324,  325,  341,  327,
-      342,  343,  328,  329,  330,  331,  332,  333,  334,  335,
-      344,  345,  346,  336,  337,  347,  338,  348,  349,  339,
-      340,  350,  352,  341,  353,  342,  343,  354,  355,  356,
-      351,  357,  358,  359,  360,  344,  345,  346,  365,  366,
-      347,  367,  348,  349,  363,  361,  350,  352,  364,  353,
-      368,  369,  354,  355,  356,  351,  357,  358,  359,  360,
-      362,  370,  371,  365,  366,  372,  367,  373,  374,  363,
-      361,  375,  379,  364,  376,  368,  369,  380,  377,  381,
-      382,  378,  386,  387,  388,  362,  370,  371,  383,  389,
-
-      372,  384,  373,  374,  390,  385,  375,  379,  391,  376,
-      392,  393,  380,  377,  381,  382,  378,  386,  387,  388,
-      394,  395,  396,  383,  389,  397,  384,  398,  399,  390,
-      385,  402,  400,  391,  401,  392,  393,  404,  406,  403,
-      407,  408,  405,  409,  410,  394,  395,  396,  411,  412,
-      397,  413,  398,  399,  414,  415,  402,  400,  416,  401,
-      417,  418,  404,  406,  403,  407,  408,  405,  409,  410,
-      419,  420,  421,  411,  412,  422,  413,  423,  424,  414,
-      415,  425,  426,  416,  427,  417,  418,  428,  432,  433,
-      434,  435,  436,  429,  437,  419,  420,  421,  438,  430,
-
-      422,  439,  423,  424,  440,  441,  425,  426,  431,  427,
-      442,  443,  428,  432,  433,  434,  435,  436,  429,  437,
-      444,  445,  446,  438,  430,  448,  439,  449,  450,  440,
-      441,  451,  452,  431,  453,  442,  443,  454,  455,  447,
-      456,  459,  457,  460,  461,  444,  445,  446,  465,  466,
-      448,  467,  449,  450,  458,  462,  451,  452,  468,  453,
-      469,  470,  454,  455,  447,  456,  459,  457,  460,  461,
-      463,  464,  471,  465,  466,  472,  467,  473,  474,  458,
-      462,  475,  476,  468,  477,  469,  470,  478,  479,  480,
-      481,  482,  483,  484,  485,  463,  464,  471,  486,  487,
-
-      472,  488,  473,  474,  489,  490,  475,  476,  491,  477,
-      492,  493,  478,  479,  480,  481,  482,  483,  484,  485,
-      494,  495,  496,  486,  487,  497,  488,  498,  499,  489,
-      490,  500,  501,  491,  502,  492,  493,  503,  504,  505,
-      506,  507,  508,  509,  510,  494,  495,  496,  511,  512,
-      497,  513,  498,  499,  514,  515,  500,  501,  516,  502,
-      517,  518,  503,  504,  505,  506,  507,  508,  509,  510,
-      519,  520,  521,  511,  512,  522,  513,  523,  524,  514,
-      515,  525,  526,  516,  527,  517,  518,  528,  529,  530,
-      531,  532,  533,  534,  535,  519,  520,  521,  536,  537,
-
-      522,  538,  523,  524,  539,  540,  525,  526,  541,  527,
-      542,  543,  528,  529,  530,  531,  532,  533,  534,  535,
-      544,  545,  546,  536,  537,  547,  538,  548,  549,  539,
-      540,  550,  551,  541,  552,  542,  543,  553,  554,  555,
-      556,  557,  558,  559,  560,  544,  545,  546,  561,  562,
-      547,  563,  548,  549,  564,  565,  550,  551,  568,  552,
-      566,  567,  553,  554,  555,  556,  557,  558,  559,  560,
-      569,  570,  571,  561,  562,  572,  563,  573,  574,  564,
-      565,  575,  576,  568,  577,  566,  567,  578,  579,  580,
-      581,  582,  583,  584,  585,  569,  570,  571,  586,  587,
-
-      572,  588,  573,  574,  589,  590,  575,  576,  591,  577,
-      592,  593,  578,  579,  580,  581,  582,  583,  584,  585,
-      594,  595,  596,  586,  587,  597,  588,  598,  599,  589,
-      590,  602,  603,  591,  600,  592,  593,  604,  601,  605,
-      606,  607,  608,  609,  610,  594,  595,  596,  611,  612,
-      597,  613,  598,  599,  614,  615,  602,  603,  616,  600,
-      617,  618,  604,  601,  605,  606,  607,  608,  609,  610,
-      619,  620,  621,  611,  612,  622,  613,  623,  624,  614,
-      615,  625,  626,  616,  627,  617,  618,  628,  629,  630,
-      631,  632,  633,  634,  635,  619,  620,  621,  636,  637,
-
-      622,  638,  623,  624,  639,  640,  625,  626,  641,  627,
-      642,  643,  628,  629,  630,  631,  632,  633,  634,  635,
-      644,  645,  646,  636,  637,  647,  638,  648,  649,  639,
-      640,  650,  651,  641,  652,  642,  643,  653,  654,  655,
-      656,  657,  658,  659,  660,  644,  645,  646,  661,  662,
-      647,  663,  648,  649,  664,  665,  650,  651,  666,  652,
-      667,  668,  653,  654,  655,  656,  657,  658,  659,  660,
-      669,  670,  671,  661,  662,  672,  663,  673,  674,  664,
-      665,  675,  676,  666,  677,  667,  668,  678,  679,  680,
-      681,  682,  683,  684,  685,  669,  670,  671,  686,  687,
-
-      672,  688,  673,  674,  689,  690,  675,  676,  691,  677,
-      694,  692,  678,  679,  680,  681,  682,  683,  684,  685,
-      693,  695,  696,  686,  687,  697,  688,  698,  699,  689,
-      690,  700,  701,  691,  702,  694,  692,  703,  704,  705,
-      706,  707,  708,  712,  709,  693,  695,  696,  710,  713,
-      697,  711,  698,  699,  714,  715,  700,  701,  716,  702,
-      717,  718,  703,  704,  705,  706,  707,  708,  712,  709,
-      719,  720,  721,  710,  713,  722,  711,  723,  724,  714,
-      715,  725,  726,  716,  727,  717,  718,  728,  729,  730,
-      731,  732,  733,  734,  735,  719,  720,  721,  736,  737,
-
-      722,  738,  723,  724,  739,  740,  725,  726,  741,  727,
-      742,  743,  728,  729,  730,  731,  732,  733,  734,  735,
-      744,  745,  746,  736,  737,  747,  738,  748,  749,  739,
-      740,  750,  751,  741,  752,  742,  743,  753,  754,  755,
-      757,  758,  759,  760,  761,  744,  745,  746,  762,  763,
-      747,  764,  748,  749,  765,  766,  750,  751,  756,  752,
-      767,  768,  753,  754,  755,  757,  758,  759,  760,  761,
-      769,  770,  771,  762,  763,  772,  764,  773,  774,  765,
-      766,  775,  776,  756,  777,  767,  768,  778,  779,  780,
-      786,  942,  942,  942,  787,  769,  770,  771,  788,  789,
-
-      772,  942,  773,  774,  790,  791,  775,  776,  781,  777,
-      792,  793,  778,  779,  780,  786,  782,  783,  784,  787,
-      794,  795,  796,  788,  789,  797,  785,  798,  799,  790,
-      791,  800,  801,  781,  802,  792,  793,  803,  804,  805,
-      806,  782,  783,  784,  807,  794,  795,  796,  808,  809,
-      797,  785,  798,  799,  810,  811,  800,  801,  812,  802,
-      813,  814,  803,  804,  805,  806,  815,  816,  817,  807,
-      818,  819,  820,  808,  809,  821,  822,  823,  824,  810,
-      811,  825,  826,  812,  827,  813,  814,  828,  829,  830,
-      831,  815,  816,  817,  832,  818,  819,  820,  833,  834,
-
-      821,  822,  823,  824,  835,  836,  825,  826,  837,  827,
-      838,  839,  828,  829,  830,  831,  841,  842,  843,  832,
-      844,  840,  845,  833,  834,  846,  847,  848,  849,  835,
-      836,  850,  851,  837,  852,  838,  839,  853,  854,  855,
-      856,  841,  842,  843,  857,  844,  840,  845,  858,  859,
-      846,  847,  848,  849,  860,  861,  850,  851,  862,  852,
-      863,  864,  853,  854,  855,  856,  865,  866,  867,  857,
-      868,  869,  870,  858,  859,  871,  872,  873,  874,  860,
-      861,  875,  876,  862,  877,  863,  864,  878,  879,  880,
-      881,  865,  866,  867,  882,  868,  869,  870,  883,  884,
-
-      871,  872,  873,  874,  885,  886,  875,  876,  887,  877,
-      888,  889,  878,  879,  880,  881,  890,  891,  892,  882,
-      894,  895,  896,  883,  884,  897,  898,  899,  900,  885,
-      886,  901,  902,  887,  903,  888,  889,  893,  904,  905,
-      906,  890,  891,  892,  907,  894,  895,  896,  908,  909,
-      897,  898,  899,  900,  910,  911,  901,  902,  912,  903,
-      913,  914,  893,  904,  905,  906,  915,  916,  917,  907,
-      918,  919,  920,  908,  909,  921,  922,  923,  924,  910,
-      911,  925,  926,  912,  927,  913,  914,  928,  929,  930,
-      931,  915,  916,  917,  932,  918,  919,  920,  933,  934,
-
-      921,  922,  923,  924,  935,  936,  925,  926,  937,  927,
-      938,  939,  928,  929,  930,  931,  940,  941,  942,  932,
-      942,  942,  942,  933,  934,  942,  942,  942,  942,  935,
-      936,  942,  942,  937,  942,  938,  939,  942,  942,  942,
-      942,  940,  941,    3,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942
+       54,   54,   54,   54,   54,   54,   54,   54,   54,  159,
+
+       51,  107,   49,   55,   56,   54,   54,   54,   54,   54,
+       54,   74,   78,   79,   57,   75,   82,  135,   76,   80,
+       83,  108,   58,  114,  109,   81,  107,  115,   55,   56,
+       84,   77,  160,  153,   59,   52,   74,   78,   79,   57,
+       75,   82,  135,   76,   80,   83,  108,   58,  114,  109,
+       81,   50,  115,   92,   47,   84,   77,   93,  153,   59,
+       63,   94,   64,  154,   65,   66,  161,   95,  162,  163,
+       96,  164,   67,  165,   68,  166,   69,   70,   92,   71,
+       72,   46,   93,   73,  160,   63,   94,   64,  154,   65,
+       66,  161,   95,  162,  163,   96,  164,   67,  165,   68,
+
+      166,   69,   70,  158,   71,   72,  101,  104,   73,   85,
+      102,  167,  168,   97,  103,  105,   86,  169,  170,  171,
+       87,  172,  173,   98,   88,  106,   99,   89,   90,  100,
+       91,  101,  104,   62,   85,  102,  167,  168,   97,  103,
+      105,   86,  169,  170,  171,   87,  172,  173,   98,   88,
+      106,   99,   89,   90,  100,   91,  110,  116,  121,   61,
+      174,  117,  122,  111,  112,  118,  123,  175,  176,  125,
+      113,  119,  124,  177,  178,  179,  180,  120,  181,  185,
+      126,  110,  116,  121,  127,  174,  117,  122,  111,  112,
+      118,  123,  175,  176,  125,  113,  119,  124,  177,  178,
+
+      179,  180,  120,  181,  185,  126,  186,  187,  136,  127,
+      128,  155,  137,  188,  129,  156,  182,  130,  190,  183,
+      191,  131,  138,  189,  184,  157,  192,  193,  132,  133,
+      134,  186,  187,  136,  194,  128,  155,  137,  188,  129,
+      156,  182,  130,  190,  183,  191,  131,  138,  189,  184,
+      157,  192,  193,  132,  133,  134,  139,  195,  140,  194,
+      141,  196,  197,  142,  143,  198,  199,  200,  203,  204,
+      144,  205,  206,  207,  208,  201,  145,   60,   53,  202,
+       52,  139,  195,  140,   50,  141,  196,  197,  142,  143,
+      198,  199,  200,  203,  204,  144,  205,  206,  207,  208,
+
+      201,  145,  146,  211,  202,  212,  147,  209,  214,  148,
+      149,  216,  150,  217,  210,  223,  151,  215,  224,  218,
+      213,  219,  152,   48,   47,   46,  981,  146,  211,   45,
+      212,  147,  209,  214,  148,  149,  216,  150,  217,  210,
+      223,  151,  215,  224,  218,  213,  219,  152,   54,   54,
+       54,   54,   54,   54,  220,  221,  222,  225,  226,  228,
+      229,  231,  981,  244,  238,  230,  981,  240,  242,  981,
+      245,  246,  243,  981,  232,  239,  227,  241,  247,  220,
+      221,  222,  225,  226,  228,  229,  231,  233,  244,  238,
+      230,  234,  240,  242,  235,  245,  246,  243,  236,  232,
+
+      239,  227,  241,  247,  237,  250,  248,  251,  260,  261,
+      265,  258,  233,  249,  981,  266,  234,  267,  272,  235,
+      273,  981,  981,  236,  259,  981,  981,  981,  981,  237,
+      250,  248,  251,  260,  261,  265,  258,  981,  249,  252,
+      266,  262,  267,  272,  274,  273,  253,  254,  263,  259,
+      255,  256,  275,  257,  268,  264,  277,  288,  276,  981,
+      289,  981,  269,  292,  252,  270,  262,  981,  293,  274,
+      981,  253,  254,  263,  271,  255,  256,  275,  257,  268,
+      264,  277,  288,  276,  284,  289,  290,  269,  292,  291,
+      270,  981,  285,  293,  300,  301,  302,  981,  303,  271,
+
+      278,  286,  279,  294,  295,  287,  280,  304,  296,  284,
+      297,  290,  305,  281,  291,  282,  298,  285,  283,  300,
+      301,  302,  299,  303,  306,  278,  286,  279,  294,  295,
+      287,  280,  304,  296,  307,  297,  309,  305,  281,  311,
+      282,  298,  312,  283,  308,  313,  310,  299,  314,  306,
+      315,  316,  317,  319,  320,  321,  322,  323,  324,  307,
+      327,  309,  325,  326,  311,  328,  329,  312,  330,  308,
+      313,  310,  331,  314,  318,  315,  316,  317,  319,  320,
+      321,  322,  323,  324,  332,  327,  333,  325,  326,  334,
+      328,  329,  335,  330,  336,  337,  338,  331,  339,  318,
+
+      340,  341,  342,  343,  344,  345,  346,  347,  348,  332,
+      349,  333,  350,  351,  334,  352,  353,  335,  981,  336,
+      337,  338,  356,  339,  357,  340,  341,  342,  343,  344,
+      345,  346,  347,  348,  354,  349,  358,  350,  351,  359,
+      352,  353,  360,  355,  361,  362,  363,  356,  364,  357,
+      365,  366,  368,  370,  371,  372,  369,  373,  374,  354,
+      375,  358,  376,  377,  359,  378,  367,  360,  355,  361,
+      362,  363,  379,  364,  380,  365,  366,  368,  370,  371,
+      372,  369,  373,  374,  383,  375,  381,  376,  377,  384,
+      378,  367,  385,  382,  386,  387,  390,  379,  388,  380,
+
+      391,  392,  389,  393,  394,  395,  396,  397,  398,  383,
+      399,  381,  400,  401,  384,  402,  403,  385,  382,  386,
+      387,  390,  404,  388,  405,  391,  392,  389,  393,  394,
+      395,  396,  397,  398,  406,  399,  410,  400,  401,  408,
+      402,  403,  407,  411,  409,  412,  413,  404,  414,  405,
+      415,  416,  417,  418,  419,  420,  421,  422,  423,  406,
+      424,  410,  425,  426,  408,  427,  428,  407,  411,  409,
+      412,  413,  429,  414,  430,  415,  416,  417,  418,  419,
+      420,  421,  422,  423,  431,  424,  432,  425,  426,  433,
+      427,  428,  434,  435,  436,  440,  441,  429,  442,  430,
+
+      437,  443,  444,  445,  446,  447,  438,  448,  449,  431,
+      450,  432,  451,  452,  433,  439,  455,  434,  435,  436,
+      440,  441,  453,  442,  456,  437,  443,  444,  445,  446,
+      447,  438,  448,  449,  457,  450,  458,  451,  452,  454,
+      439,  455,  459,  460,  461,  462,  464,  453,  465,  456,
+      466,  469,  470,  471,  472,  473,  474,  463,  475,  457,
+      476,  458,  477,  478,  454,  467,  468,  459,  460,  461,
+      462,  464,  479,  465,  480,  466,  469,  470,  471,  472,
+      473,  474,  463,  475,  481,  476,  482,  477,  478,  483,
+      467,  468,  484,  485,  486,  487,  488,  479,  489,  480,
+
+      490,  491,  492,  493,  494,  495,  496,  497,  498,  481,
+      499,  482,  500,  501,  483,  502,  503,  484,  485,  486,
+      487,  488,  504,  489,  505,  490,  491,  492,  493,  494,
+      495,  496,  497,  498,  506,  499,  507,  500,  501,  508,
+      502,  503,  509,  510,  511,  512,  513,  504,  514,  505,
+      515,  516,  517,  518,  519,  520,  521,  522,  523,  506,
+      524,  507,  525,  526,  508,  527,  528,  509,  510,  511,
+      512,  513,  529,  514,  530,  515,  516,  517,  518,  519,
+      520,  521,  522,  523,  531,  524,  532,  525,  526,  533,
+      527,  528,  534,  535,  536,  537,  538,  529,  539,  530,
+
+      540,  541,  542,  543,  544,  545,  546,  547,  548,  531,
+      549,  532,  550,  551,  533,  552,  553,  534,  535,  536,
+      537,  538,  554,  539,  555,  540,  541,  542,  543,  544,
+      545,  546,  547,  548,  556,  549,  557,  550,  551,  558,
+      552,  553,  559,  560,  561,  562,  563,  554,  564,  555,
+      565,  566,  567,  568,  569,  570,  571,  572,  573,  556,
+      574,  557,  575,  576,  558,  577,  981,  559,  560,  561,
+      562,  563,  580,  564,  581,  565,  566,  567,  568,  569,
+      570,  571,  572,  573,  582,  574,  583,  575,  576,  584,
+      577,  578,  579,  585,  586,  587,  588,  580,  589,  581,
+
+      590,  591,  592,  593,  594,  595,  596,  597,  598,  582,
+      599,  583,  600,  601,  584,  602,  578,  579,  585,  586,
+      587,  588,  603,  589,  604,  590,  591,  592,  593,  594,
+      595,  596,  597,  598,  605,  599,  606,  600,  601,  607,
+      602,  608,  610,  611,  612,  609,  613,  603,  614,  604,
+      615,  616,  617,  618,  619,  620,  621,  622,  623,  605,
+      624,  606,  625,  626,  607,  627,  608,  610,  611,  612,
+      609,  613,  628,  614,  629,  615,  616,  617,  618,  619,
+      620,  621,  622,  623,  630,  624,  631,  625,  626,  632,
+      627,  633,  634,  635,  636,  637,  638,  628,  639,  629,
+
+      640,  641,  642,  643,  644,  645,  646,  647,  648,  630,
+      649,  631,  650,  651,  632,  652,  633,  634,  635,  636,
+      637,  638,  653,  639,  654,  640,  641,  642,  643,  644,
+      645,  646,  647,  648,  655,  649,  656,  650,  651,  657,
+      652,  658,  659,  660,  661,  662,  663,  653,  664,  654,
+      665,  666,  667,  668,  669,  670,  671,  672,  673,  655,
+      674,  656,  675,  676,  657,  677,  658,  659,  660,  661,
+      662,  663,  678,  664,  679,  665,  666,  667,  668,  669,
+      670,  671,  672,  673,  680,  674,  681,  675,  676,  682,
+      677,  683,  684,  685,  686,  687,  688,  678,  689,  679,
+
+      690,  691,  692,  693,  694,  695,  696,  697,  698,  680,
+      699,  681,  700,  701,  682,  702,  683,  684,  685,  686,
+      687,  688,  703,  689,  704,  690,  691,  692,  693,  694,
+      695,  696,  697,  698,  705,  699,  706,  700,  701,  707,
+      702,  708,  709,  711,  712,  713,  714,  703,  715,  704,
+      716,  710,  717,  718,  719,  720,  721,  722,  723,  705,
+      727,  706,  728,  981,  707,  729,  708,  709,  711,  712,
+      713,  714,  730,  715,  731,  716,  710,  717,  718,  719,
+      720,  721,  722,  723,  724,  727,  732,  728,  725,  733,
+      729,  726,  734,  735,  736,  737,  738,  730,  739,  731,
+
+      740,  741,  742,  743,  744,  745,  746,  747,  748,  724,
+      749,  732,  750,  725,  733,  751,  726,  734,  735,  736,
+      737,  738,  752,  739,  753,  740,  741,  742,  743,  744,
+      745,  746,  747,  748,  754,  749,  755,  750,  756,  757,
+      751,  758,  759,  760,  761,  762,  763,  752,  764,  753,
+      765,  766,  767,  768,  769,  770,  771,  772,  773,  754,
+      774,  755,  777,  756,  757,  775,  758,  759,  760,  761,
+      762,  763,  778,  764,  779,  765,  766,  767,  768,  769,
+      770,  771,  772,  773,  776,  774,  780,  777,  781,  782,
+      775,  783,  784,  785,  786,  787,  788,  778,  789,  779,
+
+      790,  791,  792,  793,  794,  795,  796,  797,  798,  776,
+      799,  780,  800,  781,  782,  801,  783,  784,  785,  786,
+      787,  788,  807,  789,  808,  790,  791,  792,  793,  794,
+      795,  796,  797,  798,  802,  799,  809,  800,  810,  811,
+      801,  812,  803,  804,  805,  813,  814,  807,  815,  808,
+      816,  817,  806,  818,  819,  820,  821,  822,  823,  802,
+      824,  809,  825,  810,  811,  826,  812,  803,  804,  805,
+      813,  814,  827,  815,  828,  816,  817,  806,  818,  819,
+      820,  821,  822,  823,  829,  824,  830,  825,  831,  832,
+      826,  833,  834,  835,  836,  837,  838,  827,  839,  828,
+
+      840,  841,  842,  843,  844,  845,  846,  847,  848,  829,
+      849,  830,  850,  831,  832,  851,  833,  834,  835,  836,
+      837,  838,  852,  839,  853,  840,  841,  842,  843,  844,
+      845,  846,  847,  848,  854,  849,  855,  850,  856,  857,
+      851,  858,  859,  860,  861,  862,  863,  852,  864,  853,
+      865,  866,  867,  869,  870,  871,  872,  873,  874,  854,
+      875,  855,  868,  856,  857,  876,  858,  859,  860,  861,
+      862,  863,  877,  864,  878,  865,  866,  867,  869,  870,
+      871,  872,  873,  874,  879,  875,  880,  868,  881,  882,
+      876,  883,  884,  885,  886,  887,  888,  877,  889,  878,
+
+      890,  891,  892,  893,  894,  895,  896,  897,  898,  879,
+      899,  880,  900,  881,  882,  901,  883,  884,  885,  886,
+      887,  888,  902,  889,  903,  890,  891,  892,  893,  894,
+      895,  896,  897,  898,  904,  899,  905,  900,  906,  907,
+      901,  908,  909,  910,  911,  912,  913,  902,  914,  903,
+      915,  916,  917,  918,  919,  920,  921,  922,  923,  904,
+      924,  905,  925,  906,  907,  926,  908,  909,  910,  911,
+      912,  913,  927,  914,  928,  915,  916,  917,  918,  919,
+      920,  921,  922,  923,  930,  924,  931,  925,  932,  933,
+      926,  934,  935,  929,  936,  937,  938,  927,  939,  928,
+
+      940,  941,  942,  943,  944,  945,  946,  947,  948,  930,
+      949,  931,  950,  932,  933,  951,  934,  935,  929,  936,
+      937,  938,  952,  939,  953,  940,  941,  942,  943,  944,
+      945,  946,  947,  948,  954,  949,  955,  950,  956,  957,
+      951,  958,  959,  960,  961,  962,  963,  952,  964,  953,
+      965,  966,  967,  968,  969,  970,  971,  972,  973,  954,
+      974,  955,  975,  956,  957,  976,  958,  959,  960,  961,
+      962,  963,  977,  964,  978,  965,  966,  967,  968,  969,
+      970,  971,  972,  973,  979,  974,  980,  975,  981,  981,
+      976,  981,  981,  981,  981,  981,  981,  977,  981,  978,
+
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  979,
+      981,  980,    3,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981
     } ;
 
-static yyconst flex_int16_t yy_chk[2014] =
+static yyconst flex_int16_t yy_chk[2083] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1010,245 +1038,253 @@ static yyconst flex_int16_t yy_chk[2014] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,   12,
        12,   12,   12,   12,   12,   13,   13,   13,   13,   13,
        13,   14,   14,   14,   14,   14,   14,   15,   15,   15,
-       15,   15,   15,   16,   16,   16,   16,   16,   16,  945,
-
-       37,  944,  943,   13,   14,   17,   17,   17,   17,   17,
-       17,   23,   22,   41,   15,   35,   22,   24,   23,   22,
-       32,   24,   16,   22,   32,   37,   35,   23,   13,   14,
-       35,   24,   22,   55,   17,  158,   23,   22,   41,   15,
-       35,   22,   24,   23,   22,   32,   24,   16,   22,   32,
-       27,   35,   23,   51,   49,   35,   24,   22,   55,   17,
-       21,   47,   21,   27,   21,   21,   27,   46,   45,   56,
-       57,   44,   21,   30,   21,   27,   21,   21,   28,   21,
-       21,   58,   28,   21,   20,   21,   28,   21,   27,   21,
-       21,   27,   29,   30,   56,   57,   30,   21,   30,   21,
-
-       29,   21,   21,   28,   21,   21,   58,   28,   21,   25,
-       29,   28,   59,   63,   64,   26,   25,   29,   30,   26,
-       25,   30,   65,   26,   25,   29,   19,   25,   25,   26,
-       25,   18,   26,   11,   25,   29,   66,   59,   63,   64,
-       26,   25,   33,    9,   26,   25,   33,   65,   26,   25,
-       33,   31,   25,   25,   26,   25,   33,   26,   31,   31,
-       34,   66,   33,    8,   34,   31,   38,   33,   34,   42,
-       38,   33,   42,   67,   34,   33,   31,    7,   68,    6,
-       38,   33,    5,   31,   31,   34,    3,   33,   43,   34,
-       31,   38,   43,   34,   42,   38,   69,   42,   67,   34,
-
-       36,   70,   43,   68,   36,   38,   71,   36,   73,   74,
-       75,   36,    2,   43,    0,    0,    0,   43,   36,   36,
-        0,   69,   76,   78,    0,   36,   70,   43,    0,   36,
-       77,   71,   36,   73,   74,   75,   36,   54,   54,   54,
-       54,   54,   54,   36,   36,   39,   79,   76,   78,   39,
-       77,   80,   39,   39,   81,   77,   80,   39,   82,   39,
-       84,   85,    0,   86,   87,   39,    0,   88,    0,   89,
-       39,   79,   90,    0,   39,   77,   80,   39,   39,   81,
-        0,   80,   39,   82,   39,   84,   85,   83,   86,   87,
-       39,   40,   88,   83,   89,   40,   91,   90,   40,   40,
-
-       92,   40,   93,   83,   95,   40,   96,   94,   97,   98,
-       99,   40,   83,  102,    0,  100,   40,  104,   83,   94,
-       40,   91,  100,   40,   40,   92,   40,   93,   83,   95,
-       40,   96,   94,   97,   98,   99,   40,  101,  102,  101,
-      100,  105,  104,  106,   94,  106,  108,  100,  107,  107,
-      107,  109,  110,    0,  101,  112,  113,    0,    0,  114,
-      111,  113,  101,    0,  101,    0,  105,  119,  106,    0,
-      106,  108,  114,  107,  107,  107,  109,  110,  111,  101,
-      112,  113,  116,  115,  114,  111,  113,  115,  117,  120,
-      115,  118,  119,  116,  115,  118,  121,  114,  117,  122,
-
-      115,  124,  123,  111,  126,  129,  130,  116,  115,  123,
-        0,  132,  115,  117,  120,  115,  118,    0,  116,  115,
-      118,  121,    0,  117,  122,  115,  124,  123,  128,  126,
-      129,  130,  133,    0,  123,  127,  132,  131,  135,  136,
-      137,  128,  127,  127,  131,    0,  127,  127,  137,  127,
-      134,  131,    0,  128,  137,  140,    0,  133,  134,    0,
-      127,  134,  131,  135,  136,  137,  128,  127,  127,  131,
-      134,  127,  127,  137,  127,  134,  131,  138,  141,  137,
-      140,  138,  142,  134,  139,    0,  134,  148,  138,  149,
-      138,  143,  139,  138,  143,  134,    0,    0,  150,  144,
-
-        0,  139,  138,  141,  144,  139,  138,  142,  151,  139,
-      147,  147,  148,  138,  149,  138,  143,  139,  138,  143,
-      145,  145,  146,  150,  144,  145,  139,  153,  146,  144,
-      139,  152,  152,  151,  146,  147,  147,  156,  154,  165,
-      166,  167,  168,  170,  155,  145,  145,  146,  154,  172,
-      145,  173,  153,  146,  155,  155,  152,  152,  174,  146,
-      175,  176,  156,  154,  165,  166,  167,  168,  170,  155,
-      177,  172,  178,  154,  172,  179,  173,  180,  182,  155,
-      155,  181,  181,  174,  183,  175,  176,  184,  185,  186,
-      188,  189,  190,  191,  192,  177,  172,  178,  193,  194,
-
-      179,  195,  180,  182,  196,  197,  181,  181,  198,  183,
-      199,  200,  184,  185,  186,  188,  189,  190,  191,  192,
-      201,  202,  203,  193,  194,  204,  195,  204,  205,  196,
-      197,  206,  207,  198,  208,  199,  200,  209,  210,  211,
-      206,  212,  213,  214,  215,  201,  202,  203,  218,  219,
-      204,  220,  204,  205,  217,  216,  206,  207,  217,  208,
-      221,  222,  209,  210,  211,  206,  212,  213,  214,  215,
-      216,  223,  224,  218,  219,  225,  220,  226,  227,  217,
-      216,  228,  230,  217,  229,  221,  222,  231,  229,  232,
-      234,  229,  236,  237,  238,  216,  223,  224,  235,  239,
-
-      225,  235,  226,  227,  240,  235,  228,  230,  241,  229,
-      242,  243,  231,  229,  232,  234,  229,  236,  237,  238,
-      244,  245,  246,  235,  239,  247,  235,  248,  249,  240,
-      235,  251,  250,  241,  250,  242,  243,  252,  253,  251,
-      254,  255,  252,  256,  257,  244,  245,  246,  258,  259,
-      247,  260,  248,  249,  261,  262,  251,  250,  263,  250,
-      264,  265,  252,  253,  251,  254,  255,  252,  256,  257,
-      266,  269,  270,  258,  259,  271,  260,  272,  273,  261,
-      262,  274,  275,  263,  276,  264,  265,  277,  278,  279,
-      280,  281,  282,  277,  283,  266,  269,  270,  284,  277,
-
-      271,  285,  272,  273,  286,  287,  274,  275,  277,  276,
-      288,  290,  277,  278,  279,  280,  281,  282,  277,  283,
-      291,  292,  293,  284,  277,  295,  285,  296,  297,  286,
-      287,  298,  299,  277,  300,  288,  290,  301,  302,  293,
-      303,  305,  304,  306,  307,  291,  292,  293,  310,  311,
-      295,  312,  296,  297,  304,  308,  298,  299,  313,  300,
-      314,  315,  301,  302,  293,  303,  305,  304,  306,  307,
-      308,  308,  316,  310,  311,  318,  312,  319,  320,  304,
-      308,  321,  323,  313,  324,  314,  315,  325,  326,  327,
-      330,  331,  332,  333,  337,  308,  308,  316,  338,  339,
-
-      318,  340,  319,  320,  341,  342,  321,  323,  343,  324,
-      344,  345,  325,  326,  327,  330,  331,  332,  333,  337,
-      346,  347,  348,  338,  339,  349,  340,  350,  351,  341,
-      342,  352,  353,  343,  354,  344,  345,  355,  356,  357,
-      359,  360,  361,  363,  364,  346,  347,  348,  366,  367,
-      349,  368,  350,  351,  369,  370,  352,  353,  371,  354,
-      372,  374,  355,  356,  357,  359,  360,  361,  363,  364,
-      375,  376,  377,  366,  367,  379,  368,  380,  381,  369,
-      370,  383,  384,  371,  385,  372,  374,  386,  387,  388,
-      389,  390,  392,  393,  395,  375,  376,  377,  396,  397,
-
-      379,  398,  380,  381,  399,  400,  383,  384,  401,  385,
-      402,  403,  386,  387,  388,  389,  390,  392,  393,  395,
-      404,  405,  406,  396,  397,  407,  398,  408,  409,  399,
-      400,  411,  412,  401,  413,  402,  403,  414,  415,  416,
-      417,  418,  419,  420,  421,  404,  405,  406,  422,  423,
-      407,  424,  408,  409,  426,  427,  411,  412,  429,  413,
-      428,  428,  414,  415,  416,  417,  418,  419,  420,  421,
-      430,  431,  432,  422,  423,  433,  424,  434,  435,  426,
-      427,  436,  437,  429,  438,  428,  428,  439,  440,  441,
-      442,  443,  444,  445,  446,  430,  431,  432,  447,  448,
-
-      433,  449,  434,  435,  451,  452,  436,  437,  453,  438,
-      454,  455,  439,  440,  441,  442,  443,  444,  445,  446,
-      456,  457,  458,  447,  448,  460,  449,  461,  462,  451,
-      452,  464,  465,  453,  463,  454,  455,  467,  463,  469,
-      470,  471,  472,  473,  474,  456,  457,  458,  476,  477,
-      460,  478,  461,  462,  479,  480,  464,  465,  481,  463,
-      482,  483,  467,  463,  469,  470,  471,  472,  473,  474,
-      484,  485,  486,  476,  477,  488,  478,  489,  492,  479,
-      480,  493,  494,  481,  496,  482,  483,  497,  500,  501,
-      503,  505,  506,  507,  508,  484,  485,  486,  509,  511,
-
-      488,  512,  489,  492,  513,  515,  493,  494,  516,  496,
-      517,  518,  497,  500,  501,  503,  505,  506,  507,  508,
-      519,  520,  521,  509,  511,  522,  512,  523,  525,  513,
-      515,  526,  527,  516,  529,  517,  518,  530,  531,  532,
-      533,  535,  536,  537,  538,  519,  520,  521,  539,  542,
-      522,  543,  523,  525,  544,  545,  526,  527,  547,  529,
-      548,  549,  530,  531,  532,  533,  535,  536,  537,  538,
-      550,  551,  554,  539,  542,  555,  543,  557,  558,  544,
-      545,  560,  561,  547,  562,  548,  549,  564,  565,  566,
-      567,  568,  569,  570,  572,  550,  551,  554,  576,  577,
-
-      555,  578,  557,  558,  579,  581,  560,  561,  584,  562,
-      586,  585,  564,  565,  566,  567,  568,  569,  570,  572,
-      585,  587,  588,  576,  577,  589,  578,  590,  591,  579,
-      581,  592,  594,  584,  595,  586,  585,  596,  597,  598,
-      599,  600,  601,  604,  602,  585,  587,  588,  602,  605,
-      589,  602,  590,  591,  610,  611,  592,  594,  612,  595,
-      613,  615,  596,  597,  598,  599,  600,  601,  604,  602,
-      616,  617,  618,  602,  605,  621,  602,  622,  623,  610,
-      611,  627,  628,  612,  631,  613,  615,  632,  634,  636,
-      637,  639,  641,  642,  643,  616,  617,  618,  645,  646,
-
-      621,  647,  622,  623,  648,  650,  627,  628,  652,  631,
-      655,  657,  632,  634,  636,  637,  639,  641,  642,  643,
-      658,  659,  660,  645,  646,  661,  647,  662,  663,  648,
-      650,  665,  666,  652,  668,  655,  657,  669,  670,  672,
-      673,  674,  675,  676,  678,  658,  659,  660,  679,  681,
-      661,  682,  662,  663,  684,  685,  665,  666,  672,  668,
-      686,  687,  669,  670,  672,  673,  674,  675,  676,  678,
-      690,  692,  693,  679,  681,  694,  682,  695,  696,  684,
-      685,  697,  698,  672,  699,  686,  687,  700,  701,  702,
-      704,    0,    0,    0,  706,  690,  692,  693,  707,  708,
-
-      694,    0,  695,  696,  709,  710,  697,  698,  703,  699,
-      711,  712,  700,  701,  702,  704,  703,  703,  703,  706,
-      714,  715,  716,  707,  708,  719,  703,  720,  721,  709,
-      710,  722,  723,  703,  724,  711,  712,  725,  726,  728,
-      730,  703,  703,  703,  731,  714,  715,  716,  733,  734,
-      719,  703,  720,  721,  735,  738,  722,  723,  739,  724,
-      740,  742,  725,  726,  728,  730,  743,  745,  747,  731,
-      748,  749,  753,  733,  734,  754,  755,  756,  759,  735,
-      738,  760,  761,  739,  762,  740,  742,  764,  766,  767,
-      768,  743,  745,  747,  770,  748,  749,  753,  771,  772,
-
-      754,  755,  756,  759,  774,  776,  760,  761,  777,  762,
-      780,  781,  764,  766,  767,  768,  782,  783,  784,  770,
-      785,  781,  786,  771,  772,  787,  788,  789,  790,  774,
-      776,  791,  792,  777,  793,  780,  781,  794,  795,  796,
-      798,  782,  783,  784,  800,  785,  781,  786,  801,  803,
-      787,  788,  789,  790,  805,  806,  791,  792,  807,  793,
-      808,  816,  794,  795,  796,  798,  817,  818,  820,  800,
-      822,  823,  826,  801,  803,  828,  831,  832,  833,  805,
-      806,  837,  838,  807,  839,  808,  816,  840,  841,  842,
-      843,  817,  818,  820,  844,  822,  823,  826,  845,  846,
-
-      828,  831,  832,  833,  848,  850,  837,  838,  851,  839,
-      852,  855,  840,  841,  842,  843,  856,  860,  861,  844,
-      863,  864,  865,  845,  846,  866,  868,  869,  873,  848,
-      850,  874,  876,  851,  877,  852,  855,  861,  878,  879,
-      880,  856,  860,  861,  881,  863,  864,  865,  882,  884,
-      866,  868,  869,  873,  887,  889,  874,  876,  890,  877,
-      891,  892,  861,  878,  879,  880,  893,  895,  899,  881,
-      900,  902,  904,  882,  884,  905,  906,  907,  909,  887,
-      889,  911,  913,  890,  914,  891,  892,  915,  917,  919,
-      921,  893,  895,  899,  923,  900,  902,  904,  926,  927,
-
-      905,  906,  907,  909,  928,  930,  911,  913,  931,  914,
-      932,  933,  915,  917,  919,  921,  935,  940,    0,  923,
-        0,    0,    0,  926,  927,    0,    0,    0,    0,  928,
-      930,    0,    0,  931,    0,  932,  933,    0,    0,    0,
-        0,  935,  940,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-
-      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
-      942,  942,  942
+       15,   15,   15,   16,   16,   16,   16,   16,   16,  984,
+
+      983,   30,  982,   13,   14,   17,   17,   17,   17,   17,
+       17,   22,   23,   23,   15,   22,   24,   37,   22,   23,
+       24,   30,   16,   32,   30,   23,   30,   32,   13,   14,
+       24,   22,  159,   41,   17,   51,   22,   23,   23,   15,
+       22,   24,   37,   22,   23,   24,   30,   16,   32,   30,
+       23,   49,   32,   26,   47,   24,   22,   26,   41,   17,
+       21,   26,   21,   42,   21,   21,   55,   26,   56,   57,
+       26,   58,   21,   59,   21,   63,   21,   21,   26,   21,
+       21,   46,   26,   21,   45,   21,   26,   21,   42,   21,
+       21,   55,   26,   56,   57,   26,   58,   21,   59,   21,
+
+       63,   21,   21,   44,   21,   21,   28,   29,   21,   25,
+       28,   64,   65,   27,   28,   29,   25,   66,   67,   68,
+       25,   69,   70,   27,   25,   29,   27,   25,   25,   27,
+       25,   28,   29,   20,   25,   28,   64,   65,   27,   28,
+       29,   25,   66,   67,   68,   25,   69,   70,   27,   25,
+       29,   27,   25,   25,   27,   25,   31,   33,   34,   19,
+       71,   33,   34,   31,   31,   33,   34,   73,   74,   35,
+       31,   33,   34,   75,   76,   77,   78,   33,   79,   81,
+       35,   31,   33,   34,   35,   71,   33,   34,   31,   31,
+       33,   34,   73,   74,   35,   31,   33,   34,   75,   76,
+
+       77,   78,   33,   79,   81,   35,   82,   83,   38,   35,
+       36,   43,   38,   83,   36,   43,   80,   36,   84,   80,
+       85,   36,   38,   83,   80,   43,   86,   87,   36,   36,
+       36,   82,   83,   38,   88,   36,   43,   38,   83,   36,
+       43,   80,   36,   84,   80,   85,   36,   38,   83,   80,
+       43,   86,   87,   36,   36,   36,   39,   89,   39,   88,
+       39,   90,   91,   39,   39,   92,   93,   94,   95,   96,
+       39,   97,   98,   99,  100,   94,   39,   18,   11,   94,
+        9,   39,   89,   39,    8,   39,   90,   91,   39,   39,
+       92,   93,   94,   95,   96,   39,   97,   98,   99,  100,
+
+       94,   39,   40,  102,   94,  102,   40,  101,  103,   40,
+       40,  105,   40,  106,  101,  109,   40,  103,  110,  107,
+      102,  107,   40,    7,    6,    5,    3,   40,  102,    2,
+      102,   40,  101,  103,   40,   40,  105,   40,  106,  101,
+      109,   40,  103,  110,  107,  102,  107,   40,   54,   54,
+       54,   54,   54,   54,  108,  108,  108,  111,  112,  113,
+      114,  115,    0,  120,  117,  114,    0,  118,  119,    0,
+      121,  122,  119,    0,  115,  117,  112,  118,  123,  108,
+      108,  108,  111,  112,  113,  114,  115,  116,  120,  117,
+      114,  116,  118,  119,  116,  121,  122,  119,  116,  115,
+
+      117,  112,  118,  123,  116,  125,  124,  127,  130,  131,
+      133,  129,  116,  124,    0,  134,  116,  135,  137,  116,
+      138,    0,    0,  116,  129,    0,    0,    0,    0,  116,
+      125,  124,  127,  130,  131,  133,  129,    0,  124,  128,
+      134,  132,  135,  137,  139,  138,  128,  128,  132,  129,
+      128,  128,  139,  128,  136,  132,  140,  143,  139,    0,
+      144,    0,  136,  146,  128,  136,  132,    0,  146,  139,
+        0,  128,  128,  132,  136,  128,  128,  139,  128,  136,
+      132,  140,  143,  139,  142,  144,  145,  136,  146,  145,
+      136,    0,  142,  146,  149,  149,  150,    0,  151,  136,
+
+      141,  142,  141,  147,  147,  142,  141,  152,  147,  142,
+      148,  145,  153,  141,  145,  141,  148,  142,  141,  149,
+      149,  150,  148,  151,  154,  141,  142,  141,  147,  147,
+      142,  141,  152,  147,  155,  148,  156,  153,  141,  157,
+      141,  148,  166,  141,  155,  167,  156,  148,  168,  154,
+      169,  171,  173,  174,  175,  176,  177,  178,  179,  155,
+      181,  156,  180,  180,  157,  182,  183,  166,  184,  155,
+      167,  156,  185,  168,  173,  169,  171,  173,  174,  175,
+      176,  177,  178,  179,  186,  181,  187,  180,  180,  189,
+      182,  183,  190,  184,  191,  192,  193,  185,  194,  173,
+
+      195,  196,  197,  198,  199,  200,  201,  202,  203,  186,
+      204,  187,  205,  206,  189,  207,  208,  190,    0,  191,
+      192,  193,  210,  194,  211,  195,  196,  197,  198,  199,
+      200,  201,  202,  203,  209,  204,  212,  205,  206,  213,
+      207,  208,  214,  209,  215,  216,  217,  210,  218,  211,
+      219,  220,  221,  222,  223,  224,  221,  225,  226,  209,
+      227,  212,  228,  229,  213,  230,  220,  214,  209,  215,
+      216,  217,  231,  218,  232,  219,  220,  221,  222,  223,
+      224,  221,  225,  226,  234,  227,  233,  228,  229,  235,
+      230,  220,  236,  233,  238,  239,  240,  231,  239,  232,
+
+      241,  242,  239,  243,  244,  245,  246,  247,  248,  234,
+      249,  233,  250,  251,  235,  252,  253,  236,  233,  238,
+      239,  240,  254,  239,  254,  241,  242,  239,  243,  244,
+      245,  246,  247,  248,  255,  249,  257,  250,  251,  256,
+      252,  253,  255,  258,  256,  259,  260,  254,  261,  254,
+      262,  263,  264,  265,  266,  267,  268,  269,  270,  255,
+      271,  257,  272,  274,  256,  275,  276,  255,  258,  256,
+      259,  260,  277,  261,  278,  262,  263,  264,  265,  266,
+      267,  268,  269,  270,  279,  271,  280,  272,  274,  281,
+      275,  276,  282,  283,  284,  285,  286,  277,  287,  278,
+
+      284,  288,  289,  290,  291,  292,  284,  293,  294,  279,
+      296,  280,  297,  298,  281,  284,  301,  282,  283,  284,
+      285,  286,  299,  287,  302,  284,  288,  289,  290,  291,
+      292,  284,  293,  294,  303,  296,  304,  297,  298,  299,
+      284,  301,  305,  306,  307,  308,  309,  299,  310,  302,
+      311,  313,  314,  315,  316,  317,  318,  308,  319,  303,
+      321,  304,  322,  323,  299,  311,  311,  305,  306,  307,
+      308,  309,  324,  310,  325,  311,  313,  314,  315,  316,
+      317,  318,  308,  319,  326,  321,  327,  322,  323,  328,
+      311,  311,  329,  330,  331,  333,  334,  324,  335,  325,
+
+      336,  340,  341,  342,  343,  344,  345,  346,  347,  326,
+      348,  327,  349,  350,  328,  351,  352,  329,  330,  331,
+      333,  334,  353,  335,  354,  336,  340,  341,  342,  343,
+      344,  345,  346,  347,  355,  348,  356,  349,  350,  357,
+      351,  352,  358,  359,  360,  361,  362,  353,  364,  354,
+      365,  366,  368,  369,  371,  372,  373,  374,  375,  355,
+      376,  356,  377,  379,  357,  380,  381,  358,  359,  360,
+      361,  362,  383,  364,  384,  365,  366,  368,  369,  371,
+      372,  373,  374,  375,  385,  376,  387,  377,  379,  388,
+      380,  381,  389,  390,  391,  392,  393,  383,  394,  384,
+
+      395,  396,  397,  399,  400,  401,  402,  403,  404,  385,
+      405,  387,  406,  407,  388,  408,  409,  389,  390,  391,
+      392,  393,  410,  394,  411,  395,  396,  397,  399,  400,
+      401,  402,  403,  404,  412,  405,  413,  406,  407,  415,
+      408,  409,  416,  417,  418,  419,  420,  410,  421,  411,
+      422,  423,  424,  425,  426,  427,  428,  429,  430,  412,
+      431,  413,  432,  434,  415,  435,    0,  416,  417,  418,
+      419,  420,  437,  421,  438,  422,  423,  424,  425,  426,
+      427,  428,  429,  430,  439,  431,  440,  432,  434,  441,
+      435,  436,  436,  442,  443,  444,  445,  437,  446,  438,
+
+      447,  448,  449,  450,  451,  452,  453,  454,  455,  439,
+      456,  440,  458,  459,  441,  460,  436,  436,  442,  443,
+      444,  445,  461,  446,  462,  447,  448,  449,  450,  451,
+      452,  453,  454,  455,  463,  456,  465,  458,  459,  466,
+      460,  467,  468,  469,  471,  467,  473,  461,  474,  462,
+      475,  476,  477,  478,  479,  480,  481,  483,  484,  463,
+      485,  465,  486,  487,  466,  488,  467,  468,  469,  471,
+      467,  473,  489,  474,  490,  475,  476,  477,  478,  479,
+      480,  481,  483,  484,  491,  485,  492,  486,  487,  494,
+      488,  495,  497,  499,  500,  501,  502,  489,  503,  490,
+
+      504,  507,  508,  510,  512,  513,  514,  515,  516,  491,
+      517,  492,  519,  520,  494,  521,  495,  497,  499,  500,
+      501,  502,  523,  503,  524,  504,  507,  508,  510,  512,
+      513,  514,  515,  516,  525,  517,  526,  519,  520,  527,
+      521,  528,  529,  530,  532,  533,  534,  523,  536,  524,
+      537,  538,  539,  540,  541,  543,  544,  545,  546,  525,
+      547,  526,  550,  551,  527,  552,  528,  529,  530,  532,
+      533,  534,  553,  536,  555,  537,  538,  539,  540,  541,
+      543,  544,  545,  546,  556,  547,  557,  550,  551,  558,
+      552,  559,  562,  563,  564,  566,  567,  553,  568,  555,
+
+      570,  571,  572,  573,  574,  576,  577,  578,  579,  556,
+      580,  557,  581,  582,  558,  584,  559,  562,  563,  564,
+      566,  567,  587,  568,  588,  570,  571,  572,  573,  574,
+      576,  577,  578,  579,  589,  580,  590,  581,  582,  592,
+      584,  595,  596,  597,  598,  599,  600,  587,  601,  588,
+      602,  596,  603,  604,  605,  606,  607,  608,  609,  589,
+      612,  590,  613,    0,  592,  618,  595,  596,  597,  598,
+      599,  600,  619,  601,  620,  602,  596,  603,  604,  605,
+      606,  607,  608,  609,  610,  612,  621,  613,  610,  622,
+      618,  610,  624,  625,  626,  627,  628,  619,  631,  620,
+
+      632,  633,  634,  638,  639,  640,  643,  644,  645,  610,
+      647,  621,  649,  610,  622,  650,  610,  624,  625,  626,
+      627,  628,  652,  631,  654,  632,  633,  634,  638,  639,
+      640,  643,  644,  645,  655,  647,  656,  649,  658,  659,
+      650,  660,  662,  664,  667,  668,  670,  652,  671,  654,
+      672,  673,  674,  675,  676,  678,  679,  681,  682,  655,
+      683,  656,  687,  658,  659,  686,  660,  662,  664,  667,
+      668,  670,  688,  671,  689,  672,  673,  674,  675,  676,
+      678,  679,  681,  682,  686,  683,  690,  687,  691,  693,
+      686,  695,  696,  698,  699,  701,  702,  688,  703,  689,
+
+      704,  707,  709,  710,  711,  712,  713,  714,  715,  686,
+      716,  690,  717,  691,  693,  718,  695,  696,  698,  699,
+      701,  702,  720,  703,  721,  704,  707,  709,  710,  711,
+      712,  713,  714,  715,  719,  716,  722,  717,  723,  724,
+      718,  725,  719,  719,  719,  726,  727,  720,  729,  721,
+      730,  731,  719,  733,  735,  736,  737,  738,  739,  719,
+      740,  722,  741,  723,  724,  742,  725,  719,  719,  719,
+      726,  727,  743,  729,  744,  730,  731,  719,  733,  735,
+      736,  737,  738,  739,  745,  740,  747,  741,  748,  750,
+      742,  751,  753,  754,  755,  757,  758,  743,  759,  744,
+
+      761,  763,  765,  767,  768,  769,  773,  774,  775,  745,
+      776,  747,  779,  748,  750,  780,  751,  753,  754,  755,
+      757,  758,  781,  759,  782,  761,  763,  765,  767,  768,
+      769,  773,  774,  775,  783,  776,  784,  779,  786,  788,
+      780,  789,  790,  792,  793,  794,  796,  781,  798,  782,
+      799,  801,  802,  803,  804,  805,  806,  807,  808,  783,
+      809,  784,  802,  786,  788,  810,  789,  790,  792,  793,
+      794,  796,  811,  798,  812,  799,  801,  802,  803,  804,
+      805,  806,  807,  808,  813,  809,  814,  802,  815,  816,
+      810,  817,  818,  821,  823,  824,  826,  811,  827,  812,
+
+      828,  830,  831,  832,  833,  834,  842,  843,  844,  813,
+      846,  814,  848,  815,  816,  849,  817,  818,  821,  823,
+      824,  826,  850,  827,  854,  828,  830,  831,  832,  833,
+      834,  842,  843,  844,  856,  846,  859,  848,  860,  861,
+      849,  865,  866,  867,  868,  869,  870,  850,  871,  854,
+      872,  873,  874,  876,  878,  879,  880,  883,  884,  856,
+      885,  859,  889,  860,  861,  891,  865,  866,  867,  868,
+      869,  870,  892,  871,  893,  872,  873,  874,  876,  878,
+      879,  880,  883,  884,  895,  885,  896,  889,  897,  898,
+      891,  900,  901,  893,  906,  907,  909,  892,  910,  893,
+
+      911,  912,  913,  914,  915,  917,  920,  922,  923,  895,
+      924,  896,  927,  897,  898,  928,  900,  901,  893,  906,
+      907,  909,  929,  910,  931,  911,  912,  913,  914,  915,
+      917,  920,  922,  923,  935,  924,  936,  927,  938,  940,
+      928,  941,  942,  943,  945,  947,  948,  929,  950,  931,
+      951,  952,  954,  956,  958,  960,  963,  964,  965,  935,
+      966,  936,  968,  938,  940,  969,  941,  942,  943,  945,
+      947,  948,  970,  950,  972,  951,  952,  954,  956,  958,
+      960,  963,  964,  965,  974,  966,  979,  968,    0,    0,
+      969,    0,    0,    0,    0,    0,    0,  970,    0,  972,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  974,
+        0,  979,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+      981,  981
     } ;
 
-static yyconst flex_int16_t yy_rule_linenum[201] =
+static yyconst flex_int16_t yy_rule_linenum[202] =
     {   0,
        89,   90,   91,   92,   93,   95,   96,   97,   98,  100,
       102,  106,  107,  108,  109,  110,  111,  112,  113,  114,
-      115,  116,  117,  118,  119,  120,  121,  123,  124,  125,
-      126,  127,  128,  129,  130,  131,  133,  134,  135,  136,
-      137,  138,  139,  140,  142,  143,  144,  145,  146,  147,
-      148,  149,  151,  152,  154,  155,  157,  158,  159,  160,
-      161,  162,  163,  164,  165,  166,  167,  168,  170,  171,
-      172,  173,  174,  175,  176,  178,  180,  181,  182,  183,
-      184,  185,  186,  187,  188,  189,  190,  191,  192,  194,
-      195,  196,  197,  198,  199,  200,  202,  204,  205,  206,
+      115,  116,  117,  118,  119,  120,  122,  123,  124,  125,
+      126,  127,  128,  129,  131,  132,  133,  134,  135,  136,
+      137,  138,  140,  141,  143,  144,  145,  146,  147,  148,
+      149,  150,  151,  152,  153,  155,  156,  158,  159,  160,
+      161,  162,  163,  164,  165,  166,  167,  168,  169,  171,
+      172,  173,  174,  175,  176,  177,  179,  181,  182,  183,
+      184,  185,  186,  187,  188,  189,  190,  191,  192,  193,
+      195,  196,  197,  198,  199,  200,  201,  203,  205,  206,
 
       207,  208,  209,  210,  211,  212,  213,  214,  215,  216,
-      218,  219,  220,  221,  222,  223,  224,  226,  228,  229,
+      217,  219,  220,  221,  222,  223,  224,  225,  227,  229,
       230,  231,  232,  233,  234,  235,  236,  237,  238,  239,
-      240,  241,  243,  244,  245,  246,  247,  248,  249,  251,
-      253,  254,  255,  256,  257,  258,  259,  260,  261,  262,
-      263,  264,  266,  267,  268,  269,  270,  271,  272,  274,
-      276,  277,  278,  279,  280,  281,  282,  283,  284,  285,
-      286,  287,  289,  290,  291,  292,  293,  294,  295,  297,
-      299,  300,  301,  302,  303,  304,  305,  306,  307,  308,
-      309,  310,  312,  313,  314,  315,  316,  317,  318,  320
-
+      240,  241,  242,  244,  245,  246,  247,  248,  249,  250,
+      252,  254,  255,  256,  257,  258,  259,  260,  261,  262,
+      263,  264,  265,  267,  268,  269,  270,  271,  272,  273,
+      275,  277,  278,  279,  280,  281,  282,  283,  284,  285,
+      286,  287,  288,  290,  291,  292,  293,  294,  295,  296,
+      298,  300,  301,  302,  303,  304,  305,  306,  307,  308,
+      309,  310,  311,  313,  314,  315,  316,  317,  318,  319,
+
+      321
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1319,7 +1355,7 @@ typedef KHolidays::HolidayParserPlan::token_type token_type;
  * yylex is invoked, the begin position is moved onto the end position. */
 #line 78 "holidayscannerplan.lpp"
 # define YY_USER_ACTION  yylloc->columns( yyleng );
-#line 1323 "holidayscannerplan.cpp"
+#line 1359 "holidayscannerplan.cpp"
 
 #define INITIAL 0
 
@@ -1376,7 +1412,12 @@ static int yy_flex_strlen (yyconst char * );
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -1488,7 +1529,7 @@ YY_DECL
     yylloc->step();
 
 
-#line 1492 "holidayscannerplan.cpp"
+#line 1533 "holidayscannerplan.cpp"
 
 	if ( !(yy_init) )
 		{
@@ -1552,13 +1593,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 943 )
+				if ( yy_current_state >= 982 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 942 );
+		while ( yy_current_state != 981 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1577,12 +1618,12 @@ do_action:	/* This label is used only to access EOF actions. */
 			{
 			if ( yy_act == 0 )
 				std::cerr << "--scanner backing up\n";
-			else if ( yy_act < 201 )
+			else if ( yy_act < 202 )
 				std::cerr << "--accepting rule at line " << yy_rule_linenum[yy_act] <<
 				         "(\"" << yytext << "\")\n";
-			else if ( yy_act == 201 )
-				std::cerr << "--accepting default rule (\"" << yytext << "\")\n";
 			else if ( yy_act == 202 )
+				std::cerr << "--accepting default rule (\"" << yytext << "\")\n";
+			else if ( yy_act == 203 )
 				std::cerr << "--(end of buffer or a NUL)\n";
 			else
 				std::cerr << "--EOF (start condition " << YY_START << ")\n";
@@ -1707,909 +1748,914 @@ YY_RULE_SETUP
 case 21:
 YY_RULE_SETUP
 #line 115 "holidayscannerplan.lpp"
-{ return token::SMALL; }
+{ return token::YEAR; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 116 "holidayscannerplan.lpp"
-{ return token::YEAR; }
+{ return token::LEAPYEAR; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
 #line 117 "holidayscannerplan.lpp"
-{ return token::LEAPYEAR; }
+{ return token::EASTER; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
 #line 118 "holidayscannerplan.lpp"
-{ return token::EASTER; }
+{ return token::PASCHA; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 119 "holidayscannerplan.lpp"
-{ return token::PASCHA; }
+{ return token::LENGTH; }
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 120 "holidayscannerplan.lpp"
-{ return token::LENGTH; }
+{ return token::SHIFT; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 121 "holidayscannerplan.lpp"
-{ return token::SHIFT; }
+#line 122 "holidayscannerplan.lpp"
+{ return token::EQ; }
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 123 "holidayscannerplan.lpp"
-{ yylval->ival = 1; return token::COLOR; }
+{ return token::NE; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 124 "holidayscannerplan.lpp"
-{ yylval->ival = 2; return token::COLOR; }
+{ return token::LE; }
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 125 "holidayscannerplan.lpp"
-{ yylval->ival = 3; return token::COLOR; }
+{ return token::GE; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
 #line 126 "holidayscannerplan.lpp"
-{ yylval->ival = 4; return token::COLOR; }
+{ return token::LT; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
 #line 127 "holidayscannerplan.lpp"
-{ yylval->ival = 5; return token::COLOR; }
+{ return token::GT; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 128 "holidayscannerplan.lpp"
-{ yylval->ival = 6; return token::COLOR; }
+{ return token::AND;}
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 129 "holidayscannerplan.lpp"
-{ yylval->ival = 7; return token::COLOR; }
+{ return token::OR; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 130 "holidayscannerplan.lpp"
-{ yylval->ival = 8; return token::COLOR; }
+#line 131 "holidayscannerplan.lpp"
+{ yylval->ival =      1; return token::NUMBER; }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 131 "holidayscannerplan.lpp"
-{ yylval->ival = 9; return token::COLOR; }
+#line 132 "holidayscannerplan.lpp"
+{ yylval->ival =      2; return token::NUMBER; }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 133 "holidayscannerplan.lpp"
-{ return token::EQ; }
+{ yylval->ival =      3; return token::NUMBER; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 134 "holidayscannerplan.lpp"
-{ return token::NE; }
+{ yylval->ival =      4; return token::NUMBER; }
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 135 "holidayscannerplan.lpp"
-{ return token::LE; }
+{ yylval->ival =      5; return token::NUMBER; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 136 "holidayscannerplan.lpp"
-{ return token::GE; }
+{ yylval->ival =  99999; return token::NUMBER; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 137 "holidayscannerplan.lpp"
-{ return token::LT; }
+{ yylval->ival = -99999; return token::NUMBER; }
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
 #line 138 "holidayscannerplan.lpp"
-{ return token::GT; }
+{ yylval->ival =      0; return token::NUMBER; }
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 139 "holidayscannerplan.lpp"
-{ return token::AND;}
+#line 140 "holidayscannerplan.lpp"
+{ yylval->ival =  -1; return token::NUMBER; }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 140 "holidayscannerplan.lpp"
-{ return token::OR; }
+#line 141 "holidayscannerplan.lpp"
+{ yylval->ival =   1; return token::NUMBER; }
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 142 "holidayscannerplan.lpp"
-{ yylval->ival =      1; return token::NUMBER; }
+#line 143 "holidayscannerplan.lpp"
+{ yylval->sval = "public"; return token::CATEGORY; }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 143 "holidayscannerplan.lpp"
-{ yylval->ival =      2; return token::NUMBER; }
+#line 144 "holidayscannerplan.lpp"
+{ yylval->sval = "civil"; return token::CATEGORY; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 144 "holidayscannerplan.lpp"
-{ yylval->ival =      3; return token::NUMBER; }
+#line 145 "holidayscannerplan.lpp"
+{ yylval->sval = "religious"; return token::CATEGORY; }
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 145 "holidayscannerplan.lpp"
-{ yylval->ival =      4; return token::NUMBER; }
+#line 146 "holidayscannerplan.lpp"
+{ yylval->sval = "school"; return token::CATEGORY; }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 146 "holidayscannerplan.lpp"
-{ yylval->ival =      5; return token::NUMBER; }
+#line 147 "holidayscannerplan.lpp"
+{ yylval->sval = "government"; return token::CATEGORY; }
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 147 "holidayscannerplan.lpp"
-{ yylval->ival =  99999; return token::NUMBER; }
+#line 148 "holidayscannerplan.lpp"
+{ yylval->sval = "financial"; return token::CATEGORY; }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 148 "holidayscannerplan.lpp"
-{ yylval->ival = -99999; return token::NUMBER; }
+#line 149 "holidayscannerplan.lpp"
+{ yylval->sval = "cultural"; return token::CATEGORY; }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 149 "holidayscannerplan.lpp"
-{ yylval->ival =      0; return token::NUMBER; }
+#line 150 "holidayscannerplan.lpp"
+{ yylval->sval = "commemorative"; return token::CATEGORY; }
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 151 "holidayscannerplan.lpp"
-{ yylval->ival =  -1; return token::NUMBER; }
+{ yylval->sval = "historical"; return token::CATEGORY; }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 152 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::NUMBER; }
+{ yylval->sval = "nameday"; return token::CATEGORY; }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 154 "holidayscannerplan.lpp"
-{ yylval->sval = "gregorian"; return token::CALENDAR; }
+#line 153 "holidayscannerplan.lpp"
+{ yylval->sval = "seasonal"; return token::CATEGORY; }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 155 "holidayscannerplan.lpp"
-{ yylval->sval = "julian"; return token::CALENDAR; }
+{ yylval->sval = "gregorian"; return token::CALENDAR; }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 157 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 156 "holidayscannerplan.lpp"
+{ yylval->sval = "julian"; return token::CALENDAR; }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 158 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 159 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 160 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 161 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 162 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 163 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 164 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 165 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 166 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 167 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 168 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 170 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 169 "holidayscannerplan.lpp"
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 171 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 172 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 173 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
 #line 174 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
 #line 175 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
 #line 176 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 178 "holidayscannerplan.lpp"
-{ yylval->sval = "coptic"; return token::CALENDAR; }
+#line 177 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 180 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 179 "holidayscannerplan.lpp"
+{ yylval->sval = "coptic"; return token::CALENDAR; }
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
 #line 181 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
 #line 182 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
 #line 183 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
 #line 184 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
 #line 185 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
 #line 186 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
 #line 187 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
 #line 188 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
 #line 189 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
 #line 190 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
 #line 191 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
 #line 192 "holidayscannerplan.lpp"
-{ yylval->ival =  13; return token::MONTH; }
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 194 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 193 "holidayscannerplan.lpp"
+{ yylval->ival =  13; return token::MONTH; }
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
 #line 195 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
 #line 196 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
 #line 197 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
 #line 198 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
 #line 199 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
 #line 200 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 202 "holidayscannerplan.lpp"
-{ yylval->sval = "ethiopian"; return token::CALENDAR; }
+#line 201 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 204 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 203 "holidayscannerplan.lpp"
+{ yylval->sval = "ethiopian"; return token::CALENDAR; }
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
 #line 205 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
 #line 206 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
 #line 207 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
 #line 208 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
 #line 209 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 210 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 211 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 212 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 213 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
 #line 214 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 109:
 YY_RULE_SETUP
 #line 215 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 110:
 YY_RULE_SETUP
 #line 216 "holidayscannerplan.lpp"
-{ yylval->ival =  13; return token::MONTH; }
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 218 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 217 "holidayscannerplan.lpp"
+{ yylval->ival =  13; return token::MONTH; }
 	YY_BREAK
 case 112:
 YY_RULE_SETUP
 #line 219 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 113:
 YY_RULE_SETUP
 #line 220 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
 #line 221 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 115:
 YY_RULE_SETUP
 #line 222 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
 #line 223 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 117:
 YY_RULE_SETUP
 #line 224 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 226 "holidayscannerplan.lpp"
-{ yylval->sval = "hebrew"; return token::CALENDAR; }
+#line 225 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 228 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 227 "holidayscannerplan.lpp"
+{ yylval->sval = "hebrew"; return token::CALENDAR; }
 	YY_BREAK
 case 120:
 YY_RULE_SETUP
 #line 229 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
 #line 230 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 122:
 YY_RULE_SETUP
 #line 231 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 123:
 YY_RULE_SETUP
 #line 232 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 124:
 YY_RULE_SETUP
 #line 233 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
 #line 234 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
 #line 235 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
 #line 236 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
 #line 237 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
 #line 238 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
 #line 239 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 131:
 YY_RULE_SETUP
 #line 240 "holidayscannerplan.lpp"
-{ yylval->ival =  13; return token::MONTH; }
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
 #line 241 "holidayscannerplan.lpp"
-{ yylval->ival =  14; return token::MONTH; }
+{ yylval->ival =  13; return token::MONTH; }
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 243 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 242 "holidayscannerplan.lpp"
+{ yylval->ival =  14; return token::MONTH; }
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
 #line 244 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
 #line 245 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
 #line 246 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 137:
 YY_RULE_SETUP
 #line 247 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 138:
 YY_RULE_SETUP
 #line 248 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 139:
 YY_RULE_SETUP
 #line 249 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 251 "holidayscannerplan.lpp"
-{ yylval->sval = "hijri"; return token::CALENDAR; }
+#line 250 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 253 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 252 "holidayscannerplan.lpp"
+{ yylval->sval = "hijri"; return token::CALENDAR; }
 	YY_BREAK
 case 142:
 YY_RULE_SETUP
 #line 254 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 143:
 YY_RULE_SETUP
 #line 255 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 144:
 YY_RULE_SETUP
 #line 256 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 145:
 YY_RULE_SETUP
 #line 257 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 146:
 YY_RULE_SETUP
 #line 258 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 147:
 YY_RULE_SETUP
 #line 259 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 148:
 YY_RULE_SETUP
 #line 260 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 149:
 YY_RULE_SETUP
 #line 261 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 150:
 YY_RULE_SETUP
 #line 262 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 151:
 YY_RULE_SETUP
 #line 263 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 152:
 YY_RULE_SETUP
 #line 264 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 266 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 265 "holidayscannerplan.lpp"
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 154:
 YY_RULE_SETUP
 #line 267 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 155:
 YY_RULE_SETUP
 #line 268 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 156:
 YY_RULE_SETUP
 #line 269 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 157:
 YY_RULE_SETUP
 #line 270 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 158:
 YY_RULE_SETUP
 #line 271 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 159:
 YY_RULE_SETUP
 #line 272 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 274 "holidayscannerplan.lpp"
-{ yylval->sval = "indian-national"; return token::CALENDAR; }
+#line 273 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 161:
 YY_RULE_SETUP
-#line 276 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 275 "holidayscannerplan.lpp"
+{ yylval->sval = "indian-national"; return token::CALENDAR; }
 	YY_BREAK
 case 162:
 YY_RULE_SETUP
 #line 277 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 163:
 YY_RULE_SETUP
 #line 278 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 164:
 YY_RULE_SETUP
 #line 279 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 165:
 YY_RULE_SETUP
 #line 280 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 166:
 YY_RULE_SETUP
 #line 281 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 167:
 YY_RULE_SETUP
 #line 282 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 168:
 YY_RULE_SETUP
 #line 283 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 169:
 YY_RULE_SETUP
 #line 284 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 170:
 YY_RULE_SETUP
 #line 285 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 171:
 YY_RULE_SETUP
 #line 286 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 172:
 YY_RULE_SETUP
 #line 287 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 289 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 288 "holidayscannerplan.lpp"
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 174:
 YY_RULE_SETUP
 #line 290 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 175:
 YY_RULE_SETUP
 #line 291 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 176:
 YY_RULE_SETUP
 #line 292 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 177:
 YY_RULE_SETUP
 #line 293 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 178:
 YY_RULE_SETUP
 #line 294 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 179:
 YY_RULE_SETUP
 #line 295 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 297 "holidayscannerplan.lpp"
-{ yylval->sval = "jalali"; return token::CALENDAR; }
+#line 296 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 299 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::MONTH; }
+#line 298 "holidayscannerplan.lpp"
+{ yylval->sval = "jalali"; return token::CALENDAR; }
 	YY_BREAK
 case 182:
 YY_RULE_SETUP
 #line 300 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::MONTH; }
+{ yylval->ival =   1; return token::MONTH; }
 	YY_BREAK
 case 183:
 YY_RULE_SETUP
 #line 301 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::MONTH; }
+{ yylval->ival =   2; return token::MONTH; }
 	YY_BREAK
 case 184:
 YY_RULE_SETUP
 #line 302 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::MONTH; }
+{ yylval->ival =   3; return token::MONTH; }
 	YY_BREAK
 case 185:
 YY_RULE_SETUP
 #line 303 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::MONTH; }
+{ yylval->ival =   4; return token::MONTH; }
 	YY_BREAK
 case 186:
 YY_RULE_SETUP
 #line 304 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::MONTH; }
+{ yylval->ival =   5; return token::MONTH; }
 	YY_BREAK
 case 187:
 YY_RULE_SETUP
 #line 305 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::MONTH; }
+{ yylval->ival =   6; return token::MONTH; }
 	YY_BREAK
 case 188:
 YY_RULE_SETUP
 #line 306 "holidayscannerplan.lpp"
-{ yylval->ival =   8; return token::MONTH; }
+{ yylval->ival =   7; return token::MONTH; }
 	YY_BREAK
 case 189:
 YY_RULE_SETUP
 #line 307 "holidayscannerplan.lpp"
-{ yylval->ival =   9; return token::MONTH; }
+{ yylval->ival =   8; return token::MONTH; }
 	YY_BREAK
 case 190:
 YY_RULE_SETUP
 #line 308 "holidayscannerplan.lpp"
-{ yylval->ival =  10; return token::MONTH; }
+{ yylval->ival =   9; return token::MONTH; }
 	YY_BREAK
 case 191:
 YY_RULE_SETUP
 #line 309 "holidayscannerplan.lpp"
-{ yylval->ival =  11; return token::MONTH; }
+{ yylval->ival =  10; return token::MONTH; }
 	YY_BREAK
 case 192:
 YY_RULE_SETUP
 #line 310 "holidayscannerplan.lpp"
-{ yylval->ival =  12; return token::MONTH; }
+{ yylval->ival =  11; return token::MONTH; }
 	YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 312 "holidayscannerplan.lpp"
-{ yylval->ival =   1; return token::WDAY; }
+#line 311 "holidayscannerplan.lpp"
+{ yylval->ival =  12; return token::MONTH; }
 	YY_BREAK
 case 194:
 YY_RULE_SETUP
 #line 313 "holidayscannerplan.lpp"
-{ yylval->ival =   2; return token::WDAY; }
+{ yylval->ival =   1; return token::WDAY; }
 	YY_BREAK
 case 195:
 YY_RULE_SETUP
 #line 314 "holidayscannerplan.lpp"
-{ yylval->ival =   3; return token::WDAY; }
+{ yylval->ival =   2; return token::WDAY; }
 	YY_BREAK
 case 196:
 YY_RULE_SETUP
 #line 315 "holidayscannerplan.lpp"
-{ yylval->ival =   4; return token::WDAY; }
+{ yylval->ival =   3; return token::WDAY; }
 	YY_BREAK
 case 197:
 YY_RULE_SETUP
 #line 316 "holidayscannerplan.lpp"
-{ yylval->ival =   5; return token::WDAY; }
+{ yylval->ival =   4; return token::WDAY; }
 	YY_BREAK
 case 198:
 YY_RULE_SETUP
 #line 317 "holidayscannerplan.lpp"
-{ yylval->ival =   6; return token::WDAY; }
+{ yylval->ival =   5; return token::WDAY; }
 	YY_BREAK
 case 199:
 YY_RULE_SETUP
 #line 318 "holidayscannerplan.lpp"
-{ yylval->ival =   7; return token::WDAY; }
+{ yylval->ival =   6; return token::WDAY; }
 	YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 320 "holidayscannerplan.lpp"
-{ LexerError( yytext ); }
+#line 319 "holidayscannerplan.lpp"
+{ yylval->ival =   7; return token::WDAY; }
 	YY_BREAK
 case 201:
 YY_RULE_SETUP
-#line 322 "holidayscannerplan.lpp"
+#line 321 "holidayscannerplan.lpp"
+{ LexerError( yytext ); }
+	YY_BREAK
+case 202:
+YY_RULE_SETUP
+#line 323 "holidayscannerplan.lpp"
 ECHO;
 	YY_BREAK
-#line 2613 "holidayscannerplan.cpp"
+#line 2659 "holidayscannerplan.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -3012,7 +3058,7 @@ int yyFlexLexer::yy_get_next_buffer()
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 943 )
+			if ( yy_current_state >= 982 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3045,11 +3091,11 @@ int yyFlexLexer::yy_get_next_buffer()
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 943 )
+		if ( yy_current_state >= 982 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 942);
+	yy_is_jam = (yy_current_state == 981);
 
 	return yy_is_jam ? 0 : yy_current_state;
 }
@@ -3660,7 +3706,7 @@ void HolidayScannerfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 322 "holidayscannerplan.lpp"
+#line 323 "holidayscannerplan.lpp"
 
 
 
diff --git a/kholidays/parsers/plan2/location.hh b/kholidays/parsers/plan2/location.hh
index 8f2a6d4..0840aa4 100644
--- a/kholidays/parsers/plan2/location.hh
+++ b/kholidays/parsers/plan2/location.hh
@@ -1,23 +1,22 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Locations for Bison parsers in C++
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Locations for Bison parsers in C++
+   
+      Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,7 +27,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -44,8 +43,14 @@
 # include <string>
 # include "position.hh"
 
-namespace KHolidays
-{
+
+/* Line 162 of location.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+namespace KHolidays {
+
+/* Line 162 of location.cc  */
+#line 54 "location.hh"
 
   /// Abstract a location.
   class location
@@ -119,6 +124,20 @@ namespace KHolidays
     return res;
   }
 
+  /// Compare two location objects.
+  inline bool
+  operator== (const location& loc1, const location& loc2)
+  {
+    return loc1.begin == loc2.begin && loc1.end == loc2.end;
+  }
+
+  /// Compare two location objects.
+  inline bool
+  operator!= (const location& loc1, const location& loc2)
+  {
+    return !(loc1 == loc2);
+  }
+
   /** \brief Intercept output stream redirection.
    ** \param ostr the destination output stream
    ** \param loc a reference to the location to redirect
@@ -140,6 +159,13 @@ namespace KHolidays
     return ostr;
   }
 
-}
+
+/* Line 271 of location.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+} // KHolidays
+
+/* Line 271 of location.cc  */
+#line 170 "location.hh"
 
 #endif // not BISON_LOCATION_HH
diff --git a/kholidays/parsers/plan2/position.hh b/kholidays/parsers/plan2/position.hh
index d76aa92..ef250ec 100644
--- a/kholidays/parsers/plan2/position.hh
+++ b/kholidays/parsers/plan2/position.hh
@@ -1,23 +1,22 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Positions for Bison parsers in C++
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Positions for Bison parsers in C++
+   
+      Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,7 +27,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -42,9 +41,16 @@
 
 # include <iostream>
 # include <string>
+# include <algorithm>
+
+
+/* Line 38 of location.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+namespace KHolidays {
 
-namespace KHolidays
-{
+/* Line 38 of location.cc  */
+#line 54 "position.hh"
   /// Abstract a position.
   class position
   {
@@ -52,7 +58,7 @@ namespace KHolidays
 
     /// Construct a position.
     position ()
-      : filename (0), line (1), column (0)
+      : filename (0), line (1), column (1)
     {
     }
 
@@ -62,7 +68,7 @@ namespace KHolidays
     {
       filename = fn;
       line = 1;
-      column = 0;
+      column = 1;
     }
 
     /** \name Line and Column related manipulators
@@ -71,19 +77,14 @@ namespace KHolidays
     /// (line related) Advance to the COUNT next lines.
     inline void lines (int count = 1)
     {
-      column = 0;
+      column = 1;
       line += count;
     }
 
     /// (column related) Advance to the COUNT next columns.
     inline void columns (int count = 1)
     {
-      int leftmost = 0;
-      int current  = column;
-      if (leftmost <= current + count)
-	column += count;
-      else
-	column = 0;
+      column = std::max (1u, column + count);
     }
     /** \} */
 
@@ -126,6 +127,23 @@ namespace KHolidays
     return begin + -width;
   }
 
+  /// Compare two position objects.
+  inline bool
+  operator== (const position& pos1, const position& pos2)
+  {
+    return
+      (pos1.filename == pos2.filename
+       || pos1.filename && pos2.filename && *pos1.filename == *pos2.filename)
+      && pos1.line == pos2.line && pos1.column == pos2.column;
+  }
+
+  /// Compare two position objects.
+  inline bool
+  operator!= (const position& pos1, const position& pos2)
+  {
+    return !(pos1 == pos2);
+  }
+
   /** \brief Intercept output stream redirection.
    ** \param ostr the destination output stream
    ** \param pos a reference to the position to redirect
@@ -138,5 +156,12 @@ namespace KHolidays
     return ostr << pos.line << '.' << pos.column;
   }
 
-}
+
+/* Line 144 of location.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+} // KHolidays
+
+/* Line 144 of location.cc  */
+#line 167 "position.hh"
 #endif // not BISON_POSITION_HH
diff --git a/kholidays/parsers/plan2/stack.hh b/kholidays/parsers/plan2/stack.hh
index ce978b9..f4b53eb 100644
--- a/kholidays/parsers/plan2/stack.hh
+++ b/kholidays/parsers/plan2/stack.hh
@@ -1,23 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Stack handling for Bison parsers in C++
-
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Stack handling for Bison parsers in C++
+   
+      Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
+   Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,7 +28,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -37,8 +37,14 @@
 
 #include <deque>
 
-namespace KHolidays
-{
+
+/* Line 1067 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+namespace KHolidays {
+
+/* Line 1067 of lalr1.cc  */
+#line 48 "stack.hh"
   template <class T, class S = std::deque<T> >
   class stack
   {
@@ -124,6 +130,14 @@ namespace KHolidays
     const S& stack_;
     unsigned int range_;
   };
-}
 
-#endif // not BISON_STACK_HH
+/* Line 1153 of lalr1.cc  */
+#line 1 "[Bison:b4_percent_define_default]"
+
+} // KHolidays
+
+/* Line 1153 of lalr1.cc  */
+#line 141 "stack.hh"
+
+#endif // not BISON_STACK_HH[]dnl
+


commit 02b1e2ba99a8c993840bc902b301ae8e16dbbf27
Author: John Layt <jlayt at kde.org>
Date:   Wed Jun 18 22:28:05 2014 +0100

    Fix Plan2 format parser bugs
    
    Fix a couple of bugs that the more recent Bison doesn't tolerate.

diff --git a/kholidays/parsers/plan2/holidayparserdriverplan.cpp b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
index 3afb53f..aef729c 100644
--- a/kholidays/parsers/plan2/holidayparserdriverplan.cpp
+++ b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
@@ -38,6 +38,7 @@
 
 #include <QFileInfo>
 
+#include <KCalendarSystem>
 #include <kdebug.h>
 
 #include "holiday_p.h"
diff --git a/kholidays/parsers/plan2/holidayparserplan.ypp b/kholidays/parsers/plan2/holidayparserplan.ypp
index 1da12bb..bd34500 100644
--- a/kholidays/parsers/plan2/holidayparserplan.ypp
+++ b/kholidays/parsers/plan2/holidayparserplan.ypp
@@ -149,7 +149,7 @@ list :
      | list eventname categories calendar eventrule
 ;
 
-eventname : STRING { driver.setEventName( char *s = $1; QString::fromUtf8( s ) ); free( s ); $1 = NULL; }
+eventname : STRING { char *s = $1; driver.setEventName( QString::fromUtf8( s ) ); free( s ); $1 = NULL; }
 ;
 
 categories : CATEGORY { driver.setEventCategory( $1 ); }
@@ -200,7 +200,7 @@ date : pexpr '.' month            { driver.setEventDate( -99999, $3, $1 ); }
      | pexpr                      { driver.setEventDate( $1 ); }
 ;
 
-reldate : STRING                 { char *s = $1; $$ = driver.julianDayFromEventName( s ); free( s ); $1 = NULL}
+reldate : STRING                 { char *s = $1; $$ = driver.julianDayFromEventName( s ); free( s ); $1 = NULL; }
         | EASTER                 { $$ = driver.julianDayFromEaster(); }
         | PASCHA                 { $$ = driver.julianDayFromPascha(); }
         | pexpr '.' month        { $$ = driver.julianDayFromMonthDay( $3, $1 ); }


commit 9a68a37cde3c6c6cbc3143294098a910407156b2
Author: John Layt <jlayt at kde.org>
Date:   Wed Jun 18 18:27:12 2014 +0100

    Add Category support to the Plan2 format
    
    Add support for assigning categories to a holiday.  A holiday must have
    one or more categories.

diff --git a/kholidays/parsers/plan2/holidayparserdriverplan.cpp b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
index 6e810b0..3afb53f 100644
--- a/kholidays/parsers/plan2/holidayparserdriverplan.cpp
+++ b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
@@ -397,9 +397,16 @@ void  HolidayParserDriverPlan::setFileDescription( const QString &description )
 
 void  HolidayParserDriverPlan::setEventName( const QString &eventName )
 {
+    // Assume if setting an event name then is start of new event line, so clear categories
+    m_eventCategories.clear();
     m_eventName = eventName;
 }
 
+void  HolidayParserDriverPlan::setEventCategory( const QString &category )
+{
+    m_eventCategories.append( category );
+}
+
 void  HolidayParserDriverPlan::setEventCalendarType( const QString &calendarType )
 {
     m_eventCalendarType = calendarType;
@@ -697,8 +704,7 @@ void  HolidayParserDriverPlan::addHoliday( const QDate &observedDate, int durati
         holiday.d->mDuration = duration;
         holiday.d->mText = m_eventName;
         holiday.d->mShortText = m_eventName;
-        // TODO If category == "public" then NonWorkday
-        if ( false ) {
+        if ( m_eventCategories.contains( "public" ) ) {
             holiday.d->mDayType = KHolidays::Holiday::NonWorkday;
         } else {
             holiday.d->mDayType = KHolidays::Holiday::Workday;
diff --git a/kholidays/parsers/plan2/holidayparserdriverplan_p.h b/kholidays/parsers/plan2/holidayparserdriverplan_p.h
index e678649..dd86e07 100644
--- a/kholidays/parsers/plan2/holidayparserdriverplan_p.h
+++ b/kholidays/parsers/plan2/holidayparserdriverplan_p.h
@@ -117,6 +117,7 @@ protected:
     void  setFileName( const QString &ame );
     void  setFileDescription( const QString &description );
     void  setEventName( const QString &eventName );
+    void  setEventCategory( const QString &category );
     void  setEventCalendarType( const QString &calendarType = "gregorian" );
     void  setEventDate( int eventYear, int eventMonth, int eventDay );
     void  setEventDate( int jd );
@@ -157,6 +158,7 @@ private:
     QDate               m_parseYearEaster;          // Easter in the parse year, Gregorian only
     QDate               m_parseYearPascha;          // Orthodox Easter in the parse year, Gregorian only
 
+    QStringList         m_eventCategories;          // Event categories
     QString             m_eventCalendarType;        // Calendar System for event rule
     QString             m_eventName;                // Event name text
     int                 m_eventYear;                // Event date fields
diff --git a/kholidays/parsers/plan2/holidayparserplan.ypp b/kholidays/parsers/plan2/holidayparserplan.ypp
index d2d4d8a..1da12bb 100644
--- a/kholidays/parsers/plan2/holidayparserplan.ypp
+++ b/kholidays/parsers/plan2/holidayparserplan.ypp
@@ -86,9 +86,10 @@
 %union { int  ival; char *sval; }
 
 %type   <ival> offset conditionaloffset length expr pexpr number month reldate wdaycondition monthnumber
+%type   <sval> categories
 %token  END 0
 %token  <ival> NUMBER MONTH WDAY
-%token  <sval> STRING CALENDAR
+%token  <sval> STRING CATEGORY CALENDAR
 %token  INOP PLUS MINUS YEAR LEAPYEAR SHIFT IF
 %token  LENGTH EASTER EQ NE LE GE LT GT PASCHA COUNTRY LANGUAGE NAME DESCRIPTION
 
@@ -145,12 +146,16 @@ description :                    { driver.setFileDescription( QString() ); }
 ;
 
 list :
-     | list eventname calendar eventrule
+     | list eventname categories calendar eventrule
 ;
 
 eventname : STRING { driver.setEventName( char *s = $1; QString::fromUtf8( s ) ); free( s ); $1 = NULL; }
 ;
 
+categories : CATEGORY { driver.setEventCategory( $1 ); }
+           | categories CATEGORY { driver.setEventCategory( $1 ); }
+;
+
 calendar :           { driver.setEventCalendarType( QLatin1String("gregorian") ); }
          | CALENDAR  { driver.setEventCalendarType( QString::fromUtf8( $1 ) ); }
 ;
diff --git a/kholidays/parsers/plan2/holidayscannerplan.lpp b/kholidays/parsers/plan2/holidayscannerplan.lpp
index 89b41a9..dbdc0d1 100644
--- a/kholidays/parsers/plan2/holidayscannerplan.lpp
+++ b/kholidays/parsers/plan2/holidayscannerplan.lpp
@@ -140,6 +140,18 @@ noop                { yylval->ival =      0; return token::NUMBER; }
 before              { yylval->ival =  -1; return token::NUMBER; }
 after               { yylval->ival =   1; return token::NUMBER; }
 
+public              { yylval->sval = "public"; return token::CATEGORY; }
+civil               { yylval->sval = "civil"; return token::CATEGORY; }
+religious           { yylval->sval = "religious"; return token::CATEGORY; }
+school              { yylval->sval = "school"; return token::CATEGORY; }
+government          { yylval->sval = "government"; return token::CATEGORY; }
+financial           { yylval->sval = "financial"; return token::CATEGORY; }
+cultural            { yylval->sval = "cultural"; return token::CATEGORY; }
+commemorative       { yylval->sval = "commemorative"; return token::CATEGORY; }
+historical          { yylval->sval = "historical"; return token::CATEGORY; }
+nameday             { yylval->sval = "nameday"; return token::CATEGORY; }
+seasonal            { yylval->sval = "seasonal"; return token::CATEGORY; }
+
 gregorian           { yylval->sval = "gregorian"; return token::CALENDAR; }
 julian              { yylval->sval = "julian"; return token::CALENDAR; }
 


commit a9cb1169ae6b0ec05c03818531d05d7f22a20cc4
Author: John Layt <jlayt at kde.org>
Date:   Wed Jun 18 01:20:16 2014 +0100

    Remove color support from Plan2 format
    
    Remove the color options from the Plan2 format as it is mostly unused
    except for "weekend", which will be replaced by proper category support.

diff --git a/kholidays/parsers/plan2/holidayparserdriverplan.cpp b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
index e0dd53d..6e810b0 100644
--- a/kholidays/parsers/plan2/holidayparserdriverplan.cpp
+++ b/kholidays/parsers/plan2/holidayparserdriverplan.cpp
@@ -400,16 +400,6 @@ void  HolidayParserDriverPlan::setEventName( const QString &eventName )
     m_eventName = eventName;
 }
 
-void  HolidayParserDriverPlan::setEventColorName( int nameColor )
-{
-    m_eventColorName = nameColor;
-}
-
-void  HolidayParserDriverPlan::setEventColorDay( int dayColor )
-{
-    m_eventColorDay = dayColor;
-}
-
 void  HolidayParserDriverPlan::setEventCalendarType( const QString &calendarType )
 {
     m_eventCalendarType = calendarType;
@@ -707,8 +697,8 @@ void  HolidayParserDriverPlan::addHoliday( const QDate &observedDate, int durati
         holiday.d->mDuration = duration;
         holiday.d->mText = m_eventName;
         holiday.d->mShortText = m_eventName;
-        if ( m_eventColorName == 2 || m_eventColorName == 9 ||
-             m_eventColorDay == 2 || m_eventColorDay == 9 ) {
+        // TODO If category == "public" then NonWorkday
+        if ( false ) {
             holiday.d->mDayType = KHolidays::Holiday::NonWorkday;
         } else {
             holiday.d->mDayType = KHolidays::Holiday::Workday;
diff --git a/kholidays/parsers/plan2/holidayparserdriverplan_p.h b/kholidays/parsers/plan2/holidayparserdriverplan_p.h
index 1ab77c3..e678649 100644
--- a/kholidays/parsers/plan2/holidayparserdriverplan_p.h
+++ b/kholidays/parsers/plan2/holidayparserdriverplan_p.h
@@ -117,8 +117,6 @@ protected:
     void  setFileName( const QString &ame );
     void  setFileDescription( const QString &description );
     void  setEventName( const QString &eventName );
-    void  setEventColorName( int nameColor );
-    void  setEventColorDay( int dayColor );
     void  setEventCalendarType( const QString &calendarType = "gregorian" );
     void  setEventDate( int eventYear, int eventMonth, int eventDay );
     void  setEventDate( int jd );
@@ -164,8 +162,6 @@ private:
     int                 m_eventYear;                // Event date fields
     int                 m_eventMonth;               // Event date fields
     int                 m_eventDay;                 // Event date fields
-    int                 m_eventColorName;           // Color of event name text
-    int                 m_eventColorDay;            // Color of event day number
 
     std::string        *m_fileToParse;
 };
diff --git a/kholidays/parsers/plan2/holidayparserplan.ypp b/kholidays/parsers/plan2/holidayparserplan.ypp
index 779f53e..d2d4d8a 100644
--- a/kholidays/parsers/plan2/holidayparserplan.ypp
+++ b/kholidays/parsers/plan2/holidayparserplan.ypp
@@ -85,9 +85,9 @@
 
 %union { int  ival; char *sval; }
 
-%type   <ival> stringcolor daycolor offset conditionaloffset length expr pexpr number month reldate wdaycondition monthnumber
+%type   <ival> offset conditionaloffset length expr pexpr number month reldate wdaycondition monthnumber
 %token  END 0
-%token  <ival> NUMBER MONTH WDAY COLOR
+%token  <ival> NUMBER MONTH WDAY
 %token  <sval> STRING CALENDAR
 %token  INOP PLUS MINUS YEAR LEAPYEAR SHIFT IF
 %token  LENGTH EASTER EQ NE LE GE LT GT PASCHA COUNTRY LANGUAGE NAME DESCRIPTION
@@ -145,15 +145,7 @@ description :                    { driver.setFileDescription( QString() ); }
 ;
 
 list :
-     | list stringcolor eventname daycolor calendar eventrule
-;
-
-stringcolor :        { driver.setEventColorName( 0 ); }
-            | COLOR  { driver.setEventColorName( $1 ); }
-;
-
-daycolor :        { driver.setEventColorDay( 0 ); }
-         | COLOR  { driver.setEventColorDay( $1 ); }
+     | list eventname calendar eventrule
 ;
 
 eventname : STRING { driver.setEventName( char *s = $1; QString::fromUtf8( s ) ); free( s ); $1 = NULL; }
diff --git a/kholidays/parsers/plan2/holidayscannerplan.lpp b/kholidays/parsers/plan2/holidayscannerplan.lpp
index 1aa53be..89b41a9 100644
--- a/kholidays/parsers/plan2/holidayscannerplan.lpp
+++ b/kholidays/parsers/plan2/holidayscannerplan.lpp
@@ -119,16 +119,6 @@ pascha              { return token::PASCHA; }
 length              { return token::LENGTH; }
 shift               { return token::SHIFT; }
 
-black               { yylval->ival = 1; return token::COLOR; }
-red                 { yylval->ival = 2; return token::COLOR; }
-green               { yylval->ival = 3; return token::COLOR; }
-yellow              { yylval->ival = 4; return token::COLOR; }
-blue                { yylval->ival = 5; return token::COLOR; }
-magenta             { yylval->ival = 6; return token::COLOR; }
-cyan                { yylval->ival = 7; return token::COLOR; }
-white               { yylval->ival = 8; return token::COLOR; }
-weekend             { yylval->ival = 9; return token::COLOR; }
-
 "=="                { return token::EQ; }
 "!="                { return token::NE; }
 "<="                { return token::LE; }


commit 62bde18a351f68c6bb3b38f968c1b3af503c62a0
Author: John Layt <jlayt at kde.org>
Date:   Wed Jun 18 00:32:23 2014 +0100

    Remove small keyword from Plan2 format
    
    Remove small as it is unused in KHolidays.  The parser code will be
    regenerated once all format changes are completed.

diff --git a/kholidays/parsers/plan2/holidayparserplan.ypp b/kholidays/parsers/plan2/holidayparserplan.ypp
index 387d345..779f53e 100644
--- a/kholidays/parsers/plan2/holidayparserplan.ypp
+++ b/kholidays/parsers/plan2/holidayparserplan.ypp
@@ -89,7 +89,7 @@
 %token  END 0
 %token  <ival> NUMBER MONTH WDAY COLOR
 %token  <sval> STRING CALENDAR
-%token  INOP PLUS MINUS SMALL YEAR LEAPYEAR SHIFT IF
+%token  INOP PLUS MINUS YEAR LEAPYEAR SHIFT IF
 %token  LENGTH EASTER EQ NE LE GE LT GT PASCHA COUNTRY LANGUAGE NAME DESCRIPTION
 
 %destructor { free( $$ ); } STRING
@@ -145,11 +145,7 @@ description :                    { driver.setFileDescription( QString() ); }
 ;
 
 list :
-     | list small stringcolor eventname daycolor calendar eventrule
-;
-
-small :
-      | SMALL
+     | list stringcolor eventname daycolor calendar eventrule
 ;
 
 stringcolor :        { driver.setEventColorName( 0 ); }
diff --git a/kholidays/parsers/plan2/holidayscannerplan.lpp b/kholidays/parsers/plan2/holidayscannerplan.lpp
index 1793de5..1aa53be 100644
--- a/kholidays/parsers/plan2/holidayscannerplan.lpp
+++ b/kholidays/parsers/plan2/holidayscannerplan.lpp
@@ -112,7 +112,6 @@ in                  { return token::INOP; }
 if                  { return token::IF; }
 plus                { return token::PLUS; }
 minus               { return token::MINUS; }
-small               { return token::SMALL; }
 year                { return token::YEAR; }
 leapyear            { return token::LEAPYEAR; }
 easter              { return token::EASTER; }


commit 0cf5949705a1294664cb7e73b952f17d5ab4e2f8
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Fri Jun 20 16:20:42 2014 +0200

    StandardActionManager: New subcollection of a virtual collection should be virtual too
    
    When a virtual collection has a special virtual mime type, then newly a
    created subcollection should be virtual too.

diff --git a/akonadi/standardactionmanager.cpp b/akonadi/standardactionmanager.cpp
index 72a1d81..ebaa306 100644
--- a/akonadi/standardactionmanager.cpp
+++ b/akonadi/standardactionmanager.cpp
@@ -650,6 +650,12 @@ public:
                 collection.setContentMimeTypes(mts);
             }
         }
+        if (parentCollection.contentMimeTypes().contains(Collection::virtualMimeType())) {
+            collection.setVirtual(true);
+            collection.setContentMimeTypes(collection.contentMimeTypes()
+                                           << Collection::virtualMimeType());
+        }
+
         CollectionCreateJob *job = new CollectionCreateJob(collection);
         q->connect(job, SIGNAL(result(KJob*)), q, SLOT(collectionCreationResult(KJob*)));
     }


commit dcb8feeaee06171947b03ee2db8a5825731742cd
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Jun 19 19:59:52 2014 +0200

    Implement client-side support for Virtual References in ItemFetchJob
    
    When fetchVirtualReferences is enabled in ItemFetchScope, the resulting Items
    will have their virtualReferences() populated by list of collections that they
    are linked to.
    
    Conflicts:
    	CMakeLists.txt

diff --git a/akonadi/item.cpp b/akonadi/item.cpp
index b2e7815..a1d024e 100644
--- a/akonadi/item.cpp
+++ b/akonadi/item.cpp
@@ -342,6 +342,16 @@ QString Item::gid() const
     return d_func()->mGid;
 }
 
+void Item::setVirtualReferences(const Collection::List &collections)
+{
+    d_func()->mVirtualReferences = collections;
+}
+
+Collection::List Item::virtualReferences() const
+{
+    return d_func()->mVirtualReferences;
+}
+
 bool Item::hasPayload() const
 {
     return d_func()->hasMetaTypeId(-1);
diff --git a/akonadi/item.h b/akonadi/item.h
index 9aace94..73c8225 100644
--- a/akonadi/item.h
+++ b/akonadi/item.h
@@ -26,6 +26,7 @@
 #include <akonadi/entity.h>
 #include <akonadi/exception.h>
 #include <akonadi/tag.h>
+#include <akonadi/collection.h>
 #include "itempayloadinternals_p.h"
 
 #include <QtCore/QByteArray>
@@ -323,6 +324,28 @@ public:
     QString gid() const;
 
     /**
+     * Sets the virtual @p collections that this item is linked into.
+     *
+     * @note Note that changing this value makes no effect on what collections
+     * this item is linked to. To link or unlink an item to/from a virtual
+     * collection, use LinkJob and UnlinkJob.
+     *
+     * @since 4.14
+     */
+    void setVirtualReferences(const Collection::List &collections);
+
+    /**
+     * Lists virtual collections that this item is linked to.
+     *
+     * @note This value is populated only when this item was retrieved by
+     * ItemFetchJob with fetchVirtualReferences set to true in ItemFetchScope,
+     * otherwise this list is always empty.
+     *
+     * @since 4.14
+     */
+    Collection::List virtualReferences() const;
+
+    /**
      * Returns a list of metatype-ids, describing the different
      * variants of payload that are currently contained in this item.
      *
diff --git a/akonadi/item_p.h b/akonadi/item_p.h
index bb7ee83..d05ca44 100644
--- a/akonadi/item_p.h
+++ b/akonadi/item_p.h
@@ -415,6 +415,7 @@ public:
     Item::Flags mFlags;
     Tag::List mTags;
     Entity::Id mCollectionId;
+    Collection::List mVirtualReferences;
     qint64 mSize;
     QDateTime mModificationTime;
     QString mMimeType;
diff --git a/akonadi/itemfetchscope.cpp b/akonadi/itemfetchscope.cpp
index 6eeae0a..b5677df 100644
--- a/akonadi/itemfetchscope.cpp
+++ b/akonadi/itemfetchscope.cpp
@@ -98,7 +98,7 @@ void ItemFetchScope::fetchAllAttributes(bool fetch)
 
 bool ItemFetchScope::isEmpty() const
 {
-    return d->mPayloadParts.isEmpty() && d->mAttributes.isEmpty() && !d->mFullPayload && !d->mAllAttributes && !d->mFetchTags;
+    return d->mPayloadParts.isEmpty() && d->mAttributes.isEmpty() && !d->mFullPayload && !d->mAllAttributes && !d->mFetchTags && !d->mFetchVRefs;
 }
 
 bool ItemFetchScope::cacheOnly() const
@@ -193,3 +193,13 @@ bool ItemFetchScope::fetchTags() const
 {
     return d->mFetchTags;
 }
+
+void ItemFetchScope::setFetchVirtualReferences(bool fetchVRefs)
+{
+    d->mFetchVRefs = fetchVRefs;
+}
+
+bool ItemFetchScope::fetchVirtualReferences() const
+{
+    return d->mFetchVRefs;
+}
diff --git a/akonadi/itemfetchscope.h b/akonadi/itemfetchscope.h
index 109dfad..7200ad9 100644
--- a/akonadi/itemfetchscope.h
+++ b/akonadi/itemfetchscope.h
@@ -345,6 +345,22 @@ public:
      */
     bool fetchTags() const;
 
+    /**
+     * Returns whether to fetch list of virtual collections the item is linked to
+     *
+     * @param fetchVRefs whether or not to fetch virtualc references
+     * @since 4.14
+     */
+    void setFetchVirtualReferences(bool fetchVRefs);
+
+    /**
+     * Returns whether virtual references should be retrieved.
+     *
+     * @see setFetchVirtualReferences()
+     * @since 4.14
+     */
+    bool fetchVirtualReferences() const;
+
 private:
     //@cond PRIVATE
     QSharedDataPointer<ItemFetchScopePrivate> d;
diff --git a/akonadi/itemfetchscope_p.h b/akonadi/itemfetchscope_p.h
index 5a34939..d3668d4 100644
--- a/akonadi/itemfetchscope_p.h
+++ b/akonadi/itemfetchscope_p.h
@@ -44,6 +44,7 @@ public:
         , mFetchRid(true)
         , mFetchGid(false)
         , mFetchTags(false)
+        , mFetchVRefs(false)
     {
     }
 
@@ -63,6 +64,7 @@ public:
         mFetchRid = other.mFetchRid;
         mFetchGid = other.mFetchGid;
         mFetchTags = other.mFetchTags;
+        mFetchVRefs = other.mFetchVRefs;
     }
 
 public:
@@ -79,6 +81,7 @@ public:
     bool mFetchRid;
     bool mFetchGid;
     bool mFetchTags;
+    bool mFetchVRefs;
 };
 
 }
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index b7980ee..53bb5a9 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -447,6 +447,8 @@ QByteArray ProtocolHelper::itemFetchScopeToByteArray( const ItemFetchScope &fetc
     command += " GID";
   if ( fetchScope.fetchTags() )
     command += " TAGS";
+  if ( fetchScope.fetchVirtualReferences() )
+    command += " VIRTREF";
   if ( fetchScope.fetchModificationTime() )
     command += " DATETIME";
   foreach ( const QByteArray &part, fetchScope.payloadParts() )
@@ -546,6 +548,18 @@ void ProtocolHelper::parseItemFetchResult( const QList<QByteArray> &lineTokens,
         }
       }
       item.setTags( tags );
+    } else if ( key == "VIRTREF" ) {
+      ImapSet set;
+      ImapParser::parseSequenceSet( lineTokens[i + 1], set );
+      Collection::List collections;
+      Q_FOREACH ( const ImapInterval &interval, set.intervals() ) {
+        Q_ASSERT( interval.hasDefinedBegin() );
+        Q_ASSERT( interval.hasDefinedEnd() );
+        for ( qint64 i = interval.begin(); i <= interval.end(); i++ ) {
+          collections << Collection(i);
+        }
+      }
+      item.setVirtualReferences(collections);
     } else if ( key == "CACHEDPARTS" ) {
       QSet<QByteArray> partsSet;
       QList<QByteArray> parts;
diff --git a/akonadi/session_p.h b/akonadi/session_p.h
index 40e3fe6..93bfe70 100644
--- a/akonadi/session_p.h
+++ b/akonadi/session_p.h
@@ -116,7 +116,7 @@ public:
 
     static int minimumProtocolVersion()
     {
-        return 39;
+        return 44;
     }
 
     /**


commit 83339d6ce0ceaebc535f8e52bcdc3b36729d77f1
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Jun 19 16:52:09 2014 +0200

    CollectionPathResolver: add API to specify collection to resolve relatively to
    
    Top-level collections don't have to have a unique name (for instance one can have
    a calendar and a mail account both called 'Work'), but CPR is too stupid for that
    and will try to resolve the path from the first matching collection it finds,
    which can lead to false or wrong results.
    
    The new constructor allows specifying a collection that the CPR should resolve the
    path relatively to. This can be used by resources for example, which can set their
    root collection (which they usually now) and then resolve relatively to it.

diff --git a/akonadi/collectionpathresolver.cpp b/akonadi/collectionpathresolver.cpp
index 8cd5f90..f15147c 100644
--- a/akonadi/collectionpathresolver.cpp
+++ b/akonadi/collectionpathresolver.cpp
@@ -39,6 +39,23 @@ public:
     {
     }
 
+    void init(const QString &path, const Collection &rootCollection)
+    {
+        Q_Q(CollectionPathResolver);
+
+        mPathToId = true;
+        mPath = path;
+        if (mPath.startsWith(q->pathDelimiter())) {
+            mPath = mPath.right(mPath.length() - q->pathDelimiter().length());
+        }
+        if (mPath.endsWith(q->pathDelimiter())) {
+            mPath = mPath.left(mPath.length() - q->pathDelimiter().length());
+        }
+
+        mPathParts = splitPath(mPath);
+        mCurrentNode = rootCollection;
+    }
+
     void jobResult(KJob *);
 
     QStringList splitPath(const QString &path)
@@ -136,18 +153,14 @@ CollectionPathResolver::CollectionPathResolver(const QString &path, QObject *par
     : Job(new CollectionPathResolverPrivate(this), parent)
 {
     Q_D(CollectionPathResolver);
+    d->init(path, Collection::root());
+}
 
-    d->mPathToId = true;
-    d->mPath = path;
-    if (d->mPath.startsWith(pathDelimiter())) {
-        d->mPath = d->mPath.right(d->mPath.length() - pathDelimiter().length());
-    }
-    if (d->mPath.endsWith(pathDelimiter())) {
-        d->mPath = d->mPath.left(d->mPath.length() - pathDelimiter().length());
-    }
-
-    d->mPathParts = d->splitPath(d->mPath);
-    d->mCurrentNode = Collection::root();
+CollectionPathResolver::CollectionPathResolver(const QString &path, const Collection &parentCollection, QObject *parent)
+    : Job(new CollectionPathResolverPrivate(this), parent)
+{
+    Q_D(CollectionPathResolver);
+    d->init(path, parentCollection);
 }
 
 CollectionPathResolver::CollectionPathResolver(const Collection &collection, QObject *parent)
diff --git a/akonadi/collectionpathresolver_p.h b/akonadi/collectionpathresolver_p.h
index 03c7060..81af58d 100644
--- a/akonadi/collectionpathresolver_p.h
+++ b/akonadi/collectionpathresolver_p.h
@@ -47,12 +47,28 @@ public:
     /**
      * Creates a new collection path resolver to convert a path into a id.
      *
+     * Equivalent to calling CollectionPathResolver(path, Collection:root(), parent)
+     *
      * @param path The collection path.
      * @param parent The parent object.
      */
     explicit CollectionPathResolver(const QString &path, QObject *parent = 0);
 
     /**
+     * Create a new collection path resolver to convert a path into an id.
+     *
+     * The @p path is resolved relatively to @p parentCollection. This can be
+     * useful for resource, which now the root collection.
+     *
+     * @param path The collection path.
+     * @param parentCollection Collection relatively to which the path will be resolved.
+     * @param parent The parent object.
+     *
+     * @since 4.14
+     */
+    explicit CollectionPathResolver(const QString &path, const Collection &parentCollection, QObject *parent = 0);
+
+    /**
      * Creates a new collection path resolver to determine the path of
      * the given collection.
      *


commit b3c2552e5b290f3af693ed471449ce286add01b5
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Thu Jun 19 15:58:52 2014 +0200

    CollectionPathResolver: always return invalid collection ID if the job fails

diff --git a/akonadi/collectionpathresolver.cpp b/akonadi/collectionpathresolver.cpp
index 0c821c7..8cd5f90 100644
--- a/akonadi/collectionpathresolver.cpp
+++ b/akonadi/collectionpathresolver.cpp
@@ -35,6 +35,7 @@ class Akonadi::CollectionPathResolverPrivate : public JobPrivate
 public:
     CollectionPathResolverPrivate(CollectionPathResolver *parent)
         : JobPrivate(parent)
+        , mColId(-1)
     {
     }
 
@@ -87,6 +88,7 @@ void CollectionPathResolverPrivate::jobResult(KJob *job)
     CollectionFetchJob *nextJob = 0;
     const Collection::List cols = list->collections();
     if (cols.isEmpty()) {
+        mColId = -1;
         q->setError(CollectionPathResolver::Unknown);
         q->setErrorText(i18n("No such collection."));
         q->emitResult();
@@ -104,6 +106,8 @@ void CollectionPathResolverPrivate::jobResult(KJob *job)
             }
         }
         if (!found) {
+            kWarning() <<  "No such collection" << currentPart << "with parent" << mCurrentNode.id();
+            mColId = -1;
             q->setError(CollectionPathResolver::Unknown);
             q->setErrorText(i18n("No such collection."));
             q->emitResult();


commit 8d8ac4b73cf46497ea261b07adca9c0f120bccce
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 19 10:58:55 2014 +0200

    ETMPopulationTest: Fix after recent change.
    
    We cannot use isCollectionTreeFetched anymore for that.

diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index c637ca7..3de03c0 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -241,10 +241,9 @@ void EtmPopulationTest::testAddMonitoringCollections()
 
     model->setCollectionMonitored(col3, true);
 
-    QTRY_VERIFY(model->isCollectionTreeFetched());
     QVERIFY(getIndex("col1", model).isValid());
     QVERIFY(getIndex("col2", model).isValid());
-    QVERIFY(getIndex("col3", model).isValid());
+    QTRY_VERIFY(getIndex("col3", model).isValid());
     QVERIFY(getIndex("col4", model).isValid());
     QVERIFY(getIndex(mainCollectionName, model).isValid());
 


commit 48e51620c489507f83e180a04ebcae0f037b12d7
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 19 10:02:08 2014 +0200

    ETM: Never reset the collectionTreeFetched state.
    
    This state is only there to evaluate if the initial collection tree
    fetch is complete (it's mostly used to restore the view state).
    Later changes to the monitored collections should not reset that state.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 648b38e..7880950 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -604,8 +604,6 @@ void EntityTreeModelPrivate::monitoredCollectionsChanged(const Akonadi::Collecti
     Q_UNUSED(collection)
     Q_UNUSED(monitored)
     if (monitored) {
-        m_collectionTreeFetched = false;
-
         const CollectionFetchJob::Type fetchType = getFetchType(m_collectionFetchStrategy);
         fetchCollections(collection, CollectionFetchJob::Base);
         fetchCollections(collection, fetchType);


commit eeee043fd1ac834f11ad30129fcfbf7162c13813
Author: l10n daemon script <scripty at kde.org>
Date:   Thu Jun 19 07:17:17 2014 +0000

    SVN_SILENT made messages (.desktop file)

diff --git a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
index 1015ff8..3e81a6d 100644
--- a/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
+++ b/akonadi/contact/editor/im/protocols/googletalkprotocol.desktop
@@ -11,6 +11,7 @@ Comment[cs]=Google Talk
 Comment[da]=Google Talk
 Comment[de]=Google Talk
 Comment[el]=Google Talk
+Comment[en_GB]=Google Talk
 Comment[es]=Google Talk
 Comment[et]=Google Talk
 Comment[fi]=Google Talk
@@ -50,6 +51,7 @@ Name[cs]=Google Talk
 Name[da]=Google Talk
 Name[de]=Google Talk
 Name[el]=Google Talk
+Name[en_GB]=Google Talk
 Name[es]=Google Talk
 Name[et]=Google Talk
 Name[fi]=Google Talk
diff --git a/akonadi/contact/kcm/akonadicontact_actions.desktop b/akonadi/contact/kcm/akonadicontact_actions.desktop
index 891444d..9e31c5b 100644
--- a/akonadi/contact/kcm/akonadicontact_actions.desktop
+++ b/akonadi/contact/kcm/akonadicontact_actions.desktop
@@ -117,6 +117,7 @@ X-KDE-Keywords[ca at valencia]=kaddressbook, configuració, arranjament, contacte,
 X-KDE-Keywords[da]=kaddressbook, indstil, indstillinger, kontakt, handlinger
 X-KDE-Keywords[de]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[el]=kaddressbook, διαμόρφωση, ρυθμίσεις, επαφή, ενέργειες
+X-KDE-Keywords[en_GB]=kaddressbook, configure, settings, contact, actions
 X-KDE-Keywords[es]=kaddressbook, configurar, preferencias, contacto, acciones
 X-KDE-Keywords[et]=kde aadressiraamat, seadistamine, seadistused, kontakt, toimingud
 X-KDE-Keywords[fi]=kaddressbook, asetukset, yhteystieto, toiminnot
diff --git a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
index e27bc82..dfce256 100644
--- a/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
+++ b/akonadi/socialutils/serializer/akonadi_serializer_socialfeeditem.desktop
@@ -6,6 +6,7 @@ Name[ca at valencia]=Serialitzador «SocialFeedItem»
 Name[da]=SocialFeedItem-serializer
 Name[de]=SocialFeedItem-Serialisierung
 Name[el]=Πρόγραμμα γραμμικής διάταξης SocialFeedItem
+Name[en_GB]=SocialFeedItem Serializer
 Name[es]=Serializador SocialFeedItem
 Name[et]=SocialFeedItemi jadasti
 Name[fi]=SocialFeedItem-serialisoija
@@ -43,6 +44,7 @@ Comment[ca at valencia]=Un connector de serialització de l'Akonadi per a «SocialF
 Comment[da]=Et Akonadi serializer-plugin til SocialFeedItem
 Comment[de]=Akonadi-Modul zur Serialisierung für SocialFeedItem
 Comment[el]=ένα πρόσθετο γραμμικής διάταξης του Akonadi για το SocialFeedItem
+Comment[en_GB]=An Akonadi serializer plugin for SocialFeedItem
 Comment[es]=Un complemento de serializador Akonadi para SocialFeedItem
 Comment[et]=Akonadi SocialFeedItemi jadastamisplugin
 Comment[fi]=Akonadi-serialisoijaliitännäinen SocialFeedItemille
diff --git a/akonadi/tests/testresource/knutresource.desktop b/akonadi/tests/testresource/knutresource.desktop
index 07e74ed..c6277a6 100644
--- a/akonadi/tests/testresource/knutresource.desktop
+++ b/akonadi/tests/testresource/knutresource.desktop
@@ -7,6 +7,7 @@ Name[cs]=Knut
 Name[da]=Knut
 Name[de]=Knut
 Name[el]=Knut
+Name[en_GB]=Knut
 Name[es]=Knut
 Name[fi]=Knut
 Name[fr]=Knut
@@ -42,6 +43,7 @@ Comment[cs]=Agent pro ladicí účely
 Comment[da]=En agent til fejlretningsformål
 Comment[de]=Agent für die Fehlersuche
 Comment[el]=Πράκτορας για αποσφαλμάτωση
+Comment[en_GB]=An agent for debugging purpose
 Comment[es]=Un agente para el propósito de depuración
 Comment[fi]=Vianjäljitykseen tarkoitettu agentti
 Comment[fr]=Un agent à des fins de débogage
diff --git a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
index bfb67a5..c9085ce 100644
--- a/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
+++ b/akonadi/tests/testsearchplugin/akonaditestsearchplugin.desktop
@@ -7,6 +7,7 @@ Name[cs]=Modul pro testování hledání v Akonadi
 Name[da]=Testsøge-plugin til Akonadi
 Name[de]=Akonadi-Testsuchmodul
 Name[el]=Πρόσθετο δοκιμαστικής αναζήτησης Akonadi
+Name[en_GB]=Akonadi Test Search Plugin
 Name[es]=Complemento de prueba de búsqueda de Akonadi
 Name[fi]=Akonadin hakuliitännäinen testaustarkoituksiin
 Name[fr]=Module externe de test pour les recherches Akonadi
diff --git a/kabc/plugins/dir/dir.desktop b/kabc/plugins/dir/dir.desktop
index 24338c2..6338a2e 100644
--- a/kabc/plugins/dir/dir.desktop
+++ b/kabc/plugins/dir/dir.desktop
@@ -59,6 +59,7 @@ Comment[cs]=Poskytuje přístup ke kontaktům, každém uloženém v jednom soub
 Comment[da]=Giver adgang til kontakter, hver lagret i en enkelt fil, i en given mappe. Understøtter standard vCard-fil og andre formater afhængigt af tilgængeligheden af plugins.
 Comment[de]=Ermöglicht Zugriff auf Kontakte, die in einzelnen Dateien in einem vorgegebenen Ordner gespeichert sind. Unterstützt Standard-vCard-Dateien und andere Formate abhängig von den verfügbaren Modulen.
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε ξεχωριστά αρχεία, σε ένα δοσμένο φάκελο. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
+Comment[en_GB]=Provides access to contacts, each stored in a single file, in a given folder. Supports standard vCard file and other formats depending on availability of plugins.
 Comment[es]=Proporciona acceso a los contactos, cada uno almacenado en un archivo diferente, dentro de una carpeta determinada. Admite archivos vCard estándar y otros formatos dependiendo de la disponibilidad de los complementos.
 Comment[fi]=Tarjoaa pääsyn annetun kansion yksittäisiin tiedostoihin tallennettuihin yhteystietoihin. Tukee vakiomuotoista vCard-tiedostoa sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts dont chacun est enregistré dans un fichier, dans le dossier indiqué. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
diff --git a/kabc/plugins/file/file.desktop b/kabc/plugins/file/file.desktop
index 397ca0b..553f017 100644
--- a/kabc/plugins/file/file.desktop
+++ b/kabc/plugins/file/file.desktop
@@ -64,6 +64,7 @@ Comment[cs]=Poskytuje přístup ke kontaktům uloženým v jednom lokálním sou
 Comment[da]=Giver adgang til kontakter, hver lagret i en enkelt fil. Understøtter standard vCard-fil og andre formater afhængigt af tilgængelige af plugins.
 Comment[de]=Ermöglicht Zugriff auf Kontakte, die in einer einzigen Datei lokal gespeichert sind. Unterstützt Standard-vCard-Dateien und andere Formate abhängig von den verfügbaren Modulen.
 Comment[el]=Προσφέρει πρόσβαση σε επαφές, αποθηκευμένες σε ένα τοπικό αρχείο. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
+Comment[en_GB]=Provides access to contacts stored in a single local file. Supports standard vCard files and other formats depending on available plugins.
 Comment[es]=Proporciona acceso a los contactos almacenados en un único archivo local. Admite archivos vCard estándar y otros formatos dependiendo de la disponibilidad de los complementos.
 Comment[fi]=Tarjoaa pääsyn yksittäiseen paikalliseen tiedostoon tallennettuihin yhteystietoihin. Tukee vakiomuotoisia vCard-tiedostoja sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts enregistrés dans un unique fichier local. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
diff --git a/kabc/plugins/net/net.desktop b/kabc/plugins/net/net.desktop
index 43c2d3e..54a3df3 100644
--- a/kabc/plugins/net/net.desktop
+++ b/kabc/plugins/net/net.desktop
@@ -64,6 +64,7 @@ Comment[cs]=Poskytuje přístup ke vzdáleným kontaktům pomocí síťového fr
 Comment[da]=Giver adgang til kontakter i eksterne filer med brug af KDE's netværks-framework KIO. Understøtter standard vCard-filer og andre formater afhængigt af tilgængelige plugins.
 Comment[de]=Ermöglicht Zugriff auf Kontakte in entfernten Dateien durch das KIO-Netzwerksystem von KDE. Unterstützt Standard-vCard-Dateien und andere Formate abhängig von den verfügbaren Modulen.
 Comment[el]=Προσφέρει πρόσβαση σε επαφές σε απομακρυσμένα αρχεία με τη χρήση του συστήματος KIO του KDE. Υποστηρίζει τυπικά αρχεία vCard και άλλες μορφές αρχείων ανάλογα με τη διαθεσιμότητα των πρόσθετων.
+Comment[en_GB]=Provides access to contacts in remote files using KDE's network framework KIO. Supports standard vCard files and other formats depending on available plugins.
 Comment[es]=Proporciona acceso a los contactos en un archivo remoto utilizando la infraestructura de red KIO de KDE. Admite archivos vCard estándar y otros formatos dependiendo en la disponibilidad de los complementos.
 Comment[fi]=Tarjoaa pääsyn etätiedostoissa oleviin yhteystietoihin KDE:n verkkokehyksen KIOn välityksellä. Tukee vakiomuotoisia vCard-tiedostoja sekä muita tiedostomuotoja liitännäisistä riippuen.
 Comment[fr]=Fournit un accès aux contacts enregistrés dans des fichiers distants en utilisant le mécanisme réseau KIO de KDE. Le format « vCard » et d'autres formats sont pris en charge selon les modules externes disponibles.
diff --git a/kresources/kresources.desktop b/kresources/kresources.desktop
index 9c48f8e..5ebe021 100644
--- a/kresources/kresources.desktop
+++ b/kresources/kresources.desktop
@@ -124,6 +124,7 @@ X-KDE-Keywords[ca at valencia]=recursos,recurs de konnector,recurs de contactes,rec
 X-KDE-Keywords[da]=ressourcer,konnector-ressource,kontakt-ressource,kalender-ressource,note-ressource,alarm-ressource,imap
 X-KDE-Keywords[de]=resources,konnector resource,contact resource,calendar resource,notes resource,alarm resource,imap
 X-KDE-Keywords[el]=πόροι,πόρος konnector,επαφή,πόρος,πόρος ημερολογίου,πόρος σημειώσεων,πόρος ειδοποιήσεων,imap
+X-KDE-Keywords[en_GB]=resources,connector resource,contact resource,calendar resource,notes resource,alarm resource,imap
 X-KDE-Keywords[es]=recursos,recurso de conector,recurso de contacto,recurso de calendario,recurso de notas,recurso de alarma,imap
 X-KDE-Keywords[et]=ressursid,konnektor,ressurss,kontaktiressurss,kalendriressurss,märkmeressurss,häireressurss,imap
 X-KDE-Keywords[fi]=resurssit,konnector-resurssi,yhteystietoresurssi,kalenteriresurssi,muistiinpanoresurssi,hälytysresurssi,imap


commit 2959973a8f85dadc4ff66a93149dc6df138c8a32
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 18 09:55:41 2014 +0200

    Collection: setShouldList for symmetry with shouldList.

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index e6e4b39..153e4bc 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -328,6 +328,15 @@ bool Collection::shouldList(Collection::ListPurpose purpose) const
     return (localListPreference(purpose) == ListEnabled);
 }
 
+void Collection::setShouldList(ListPurpose purpose, bool list)
+{
+    if (localListPreference(purpose) == ListDefault) {
+        setEnabled(list);
+    } else {
+        setLocalListPreference(purpose, list ? ListEnabled : ListDisabled);
+    }
+}
+
 void Collection::setReferenced(bool referenced)
 {
     Q_D(Collection);
diff --git a/akonadi/collection.h b/akonadi/collection.h
index 2f8f396..0c6d6c8 100644
--- a/akonadi/collection.h
+++ b/akonadi/collection.h
@@ -305,7 +305,7 @@ public:
      * E.g. an imap resource may synchronize this with the subscription state.
      *
      * @since 4.14
-     * @see setLocalListPreference
+     * @see setLocalListPreference, setShouldList
      */
     void setEnabled(bool enabled);
 
@@ -368,6 +368,18 @@ public:
     bool shouldList(ListPurpose purpose) const;
 
     /**
+     * Sets wether the collection should be listed or not for the specified purpose.
+     * Takes enabled state and local preference into account.
+     *
+     * Use this instead of sestEnabled and setLocalListPreference to automatically set
+     * the right setting.
+     *
+     * @since 4.14
+     * @see setLocalListPreference, setEnabled
+     */
+    void setShouldList(ListPurpose purpose, bool shouldList);
+
+    /**
      * Sets a collection to be referenced.
      *
      * A referenced collection is temporarily shown and synchronized even when disabled.


commit 698db9600f7940189667b36621d21cce20e64046
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 12 00:51:14 2014 +0200

    EntityTreeModelTest: Cleanup.
    
    The full test passes now.

diff --git a/akonadi/tests/entitytreemodeltest.cpp b/akonadi/tests/entitytreemodeltest.cpp
index 19145ae..fc6e3be 100644
--- a/akonadi/tests/entitytreemodeltest.cpp
+++ b/akonadi/tests/entitytreemodeltest.cpp
@@ -17,7 +17,7 @@
     02110-1301, USA.
 */
 
-#include <qtest_kde.h>
+#include <qtest_akonadi.h>
 
 #include <QTimer>
 
@@ -66,8 +66,12 @@ static const QString serverContent1 =
 
 /**
  * This test verifies that the ETM reacts as expected to signals from the monitor.
- * 
+ *
  * The tested ETM is only talking to fake components so the reaction of the ETM to each signal can be tested.
+ *
+ * WARNING: This test does no handle jobs issued by the model. It simply shortcuts (calls emitResult) them, and the connected
+ * slots are never executed (because the eventloop is not run after emitResult is called).
+ * This test therefore only tests the reaction of the model to signals of the monitor and not the overall behaviour.
  */
 class EntityTreeModelTest : public QObject
 {
@@ -212,18 +216,25 @@ void EntityTreeModelTest::testInitialFetch()
   expectedSignals << getExpectedSignal( RowsInserted, 0, 1, "Col 6" );
   expectedSignals << getExpectedSignal( RowsAboutToBeInserted, 0, 3, "Col 7" );
   expectedSignals << getExpectedSignal( RowsInserted, 0, 3, "Col 7" );
+  expectedSignals << getExpectedSignal( DataChanged, 0, 0, QVariantList() << "Col 1" );
+  expectedSignals << getExpectedSignal( DataChanged, 3, 3, QVariantList() << "Col 3" );
+  expectedSignals << getExpectedSignal( DataChanged, 0, 0, QVariantList() << "Col 4" );
+  expectedSignals << getExpectedSignal( DataChanged, 0, 0, QVariantList() << "Col 5" );
+  expectedSignals << getExpectedSignal( DataChanged, 2, 2, QVariantList() << "Col 2" );
+  expectedSignals << getExpectedSignal( DataChanged, 1, 1, QVariantList() << "Col 6" );
+  expectedSignals << getExpectedSignal( DataChanged, 0, 0, QVariantList() << "Col 7" );
 
   m_modelSpy->setExpectedSignals( expectedSignals );
 
   // Give the model a chance to run the event loop to process the signals.
-  QTest::qWait(0);
+  QTest::qWait(10);
 
   // We get all the signals we expected.
-  QVERIFY(m_modelSpy->expectedSignals().isEmpty());
+  QTRY_VERIFY(m_modelSpy->expectedSignals().isEmpty());
 
+  QTest::qWait(10);
   // We didn't get signals we didn't expect.
-  // TODO: Currently we get data changed signals about fetch completed etc which are not handled by the test currently.
-//   QVERIFY( m_modelSpy->isEmpty() );
+  QVERIFY( m_modelSpy->isEmpty() );
 }
 
 void EntityTreeModelTest::testCollectionMove_data()
@@ -304,7 +315,6 @@ void EntityTreeModelTest::testCollectionAdded()
 
   QPair<FakeServerData*, Akonadi::EntityTreeModel*> testDrivers = populateModel( serverContent );
   FakeServerData *serverData = testDrivers.first;
-  Akonadi::EntityTreeModel *model = testDrivers.second;
 
   FakeCollectionAddedCommand *addCommand = new FakeCollectionAddedCommand( addedCollection, parentCollection, serverData );
 


commit 9f82df5c0db0d7dd53f7158e9c4069e7503b4f4c
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 12 00:40:42 2014 +0200

    ETM: Removed unused code

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 660cc2a..648b38e 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -1386,6 +1386,7 @@ void EntityTreeModelPrivate::updateJobDone(KJob *job)
         kWarning() << "Job error:" << job->errorString();
     } else {
 
+        //FIXME: This seems pretty pointless since we'll get an update through the monitor anyways
         ItemModifyJob *modifyJob = qobject_cast<ItemModifyJob *>(job);
         if (!modifyJob) {
             return;
@@ -1401,11 +1402,6 @@ void EntityTreeModelPrivate::updateJobDone(KJob *job)
         foreach (const QModelIndex &index, list) {
             dataChanged(index, index);
         }
-
-        // TODO: Is this trying to do the job of collectionstatisticschanged?
-//     CollectionStatisticsJob *csjob = static_cast<CollectionStatisticsJob*>( job );
-//     Collection result = csjob->collection();
-//     collectionStatisticsChanged( result.id(), csjob->statistics() );
     }
 }
 


commit e2fe3ead65ae3f4ec9b11abaaa575abba95f6db7
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 12 00:40:05 2014 +0200

    ETM: The corresponding collection could have been removed while a fetch job is in progress.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 9ff0f27..660cc2a 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -508,6 +508,11 @@ void EntityTreeModelPrivate::itemsFetched(const Collection::Id collectionId, con
 {
     Q_Q(EntityTreeModel);
 
+    if (!m_collections.contains(collectionId)) {
+        kWarning() << "Collection has been removed while fetching items";
+        return;
+    }
+
     Item::List itemsToInsert;
 
     const Collection collection = m_collections.value(collectionId);
@@ -1319,6 +1324,10 @@ void EntityTreeModelPrivate::itemFetchJobDone(KJob *job)
         kWarning() << "Job error: " << job->errorString() << "for collection:" << collectionId << endl;
         return;
     }
+    if (!m_collections.contains(collectionId)) {
+        kWarning() << "Collection has been removed while fetching items";
+        return;
+    }
     ItemFetchJob *iJob = static_cast<ItemFetchJob *>(job);
 
 #ifdef DBG_TRACK_JOB_TIMES


commit 2edaec5d7d74f773c1d9034e2427eafbd9a166be
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 17:53:10 2014 +0200

    ETMPopulationTest: Fixed waiting for signals with isFullyPopulated.

diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index a688fc9..c637ca7 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -314,13 +314,11 @@ void EtmPopulationTest::testReferenceCollection()
     model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
     model->setListFilter(Akonadi::CollectionFetchScope::Display);
 
-    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QTRY_VERIFY(model->isFullyPopulated());
     QVERIFY(!getIndex("col5", model).isValid());
     //Check that this random other collection is actually available
     QVERIFY(getIndex("col1", model).isValid());
 
-    QTest::qWait(0);
-
     ModelSignalSpy spy(*model);
 
     //Reference the collection and it should appear in the model
@@ -330,12 +328,14 @@ void EtmPopulationTest::testReferenceCollection()
     QTRY_VERIFY(getIndex("col5", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
     //Check that this random other collection is still available
     QVERIFY(getIndex("col1", model).isValid());
+    //Verify the etms collection has been updated accordingly
+    QTRY_VERIFY(getIndex("col5", model).data(Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>().referenced());
 
     //Ensure all signals have been delivered to the spy
     QTest::qWait(0);
     QCOMPARE(spy.mSignals.count("rowsInserted"), 1);
-    //Changes twice why?
-    QCOMPARE(spy.mSignals.count("dataChanged"), 2);
+    //Signals for item fetch state and a data-changed signal from the referencing
+    QCOMPARE(spy.mSignals.count("dataChanged"), 3);
 
     //Dereference the collection and it should dissapear again
     model->setCollectionReferenced(col5, false);


commit 22bdd80ac326b29e03d11ff280fe36d6235fcaa0
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 17:51:19 2014 +0200

    ETM: Provide isFullyPopulated to include population of collections and items.
    
    This returns only true once all collections and items have been fetched.
    This is primarily important for tests to ensure no further signals are emitted
    by the initial population.

diff --git a/akonadi/entitytreemodel.cpp b/akonadi/entitytreemodel.cpp
index 72af61e..98f4e84 100644
--- a/akonadi/entitytreemodel.cpp
+++ b/akonadi/entitytreemodel.cpp
@@ -962,6 +962,12 @@ bool EntityTreeModel::isCollectionPopulated(Collection::Id id) const
     return d->m_populatedCols.contains(id);
 }
 
+bool EntityTreeModel::isFullyPopulated() const
+{
+    Q_D(const EntityTreeModel);
+    return d->m_collectionTreeFetched && d->m_pendingCollectionRetrieveJobs.isEmpty();
+}
+
 bool EntityTreeModel::entityMatch(const Item &item, const QVariant &value, Qt::MatchFlags flags) const
 {
     Q_UNUSED(item);
diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index 504058c..a58668e 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -579,6 +579,17 @@ public:
     bool isCollectionPopulated(Akonadi::Collection::Id) const;
 
     /**
+     * Returns whether the model is fully populated.
+     *
+     * Returns true once the collection tree has been fetched and all collections have been populated.
+     *
+     * @see isCollectionPopulated
+     * @see isCollectionTreeFetched
+     * @since 4.14
+     */
+    bool isFullyPopulated() const;
+
+    /**
      * Reimplemented to handle the AmazingCompletionRole.
      */
     virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith | Qt::MatchWrap)) const;


commit 30dda3fcaca714f8415032b5bb20372f05ff9a7f
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 17:50:01 2014 +0200

    ETM: Split fetchJobDone + correctly emit dataChanged signals.
    
    Split fetchJobDone into separate versions for Item/Collection fetch jobs.
    Having a combined slot was confusing since the codepaths were separate anyways.
    Additionally dataChanged was emitted in the wrong slot, as it is required
    to notify about the changed fetch state, so it has to be emitted after the
    itemFetchJob.

diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index d7e19ef..504058c 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -709,7 +709,8 @@ private:
     Q_PRIVATE_SLOT(d_func(), void startFirstListJob())
     Q_PRIVATE_SLOT(d_func(), void serverStarted())
 
-    Q_PRIVATE_SLOT(d_func(), void fetchJobDone(KJob *job))
+    Q_PRIVATE_SLOT(d_func(), void itemFetchJobDone(KJob *job))
+    Q_PRIVATE_SLOT(d_func(), void collectionFetchJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void rootFetchJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void pasteJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void updateJobDone(KJob *job))
diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index aeba25c..9ff0f27 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -278,7 +278,7 @@ void EntityTreeModelPrivate::fetchItems(const Collection &parent)
     q->connect(itemFetchJob, SIGNAL(itemsReceived(Akonadi::Item::List)),
                q, SLOT(itemsFetched(Akonadi::Item::List)));
     q->connect(itemFetchJob, SIGNAL(result(KJob*)),
-               q, SLOT(fetchJobDone(KJob*)));
+               q, SLOT(itemFetchJobDone(KJob*)));
     ifDebug(kDebug() << "collection:" << parent.name(); jobTimeTracker[itemFetchJob].start();)
 }
 
@@ -298,10 +298,10 @@ void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job)
         q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
                     q, SLOT(collectionsFetched(Akonadi::Collection::List)));
         q->connect(job, SIGNAL(result(KJob*)),
-                    q, SLOT(fetchJobDone(KJob*)));
-        q->connect(job, SIGNAL(result(KJob*)),
                     q, SLOT(finalCollectionFetchJobDone(KJob*)));
     }
+    q->connect(job, SIGNAL(result(KJob*)),
+                q, SLOT(collectionFetchJobDone(KJob*)));
     ifDebug(kDebug() << "collection:" << collection.name(); jobTimeTracker[job].start();)
 }
 
@@ -314,7 +314,6 @@ void EntityTreeModelPrivate::fetchCollections(const Collection &collection, Coll
 {
     Q_ASSERT(collection.isValid());
     CollectionFetchJob *job = new CollectionFetchJob(collection, type, m_session);
-    job->setProperty(FetchCollectionId(), QVariant(collection.id()));
     fetchCollections(job);
 }
 
@@ -659,7 +658,7 @@ void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collec
         q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
                    q, SLOT(ancestorsFetched(Akonadi::Collection::List)));
         q->connect(job, SIGNAL(result(KJob*)),
-                   q, SLOT(fetchJobDone(KJob*)));
+                   q, SLOT(collectionFetchJobDone(KJob*)));
     }
 
 //  Q_ASSERT( parentCollection != m_rootCollection );
@@ -1294,55 +1293,58 @@ void EntityTreeModelPrivate::monitoredItemUnlinked(const Akonadi::Item &item, co
     q->endRemoveRows();
 }
 
-void EntityTreeModelPrivate::fetchJobDone(KJob *job)
+void EntityTreeModelPrivate::collectionFetchJobDone(KJob *job)
+{
+    CollectionFetchJob *cJob = static_cast<CollectionFetchJob *>(job);
+    if (job->error()) {
+        kWarning() << "Job error: " << job->errorString() << "for collection:" << cJob->collections() << endl;
+        return;
+    }
+
+#ifdef DBG_TRACK_JOB_TIMES
+    kDebug() << "Fetch job took " << jobTimeTracker.take(job).elapsed() << "msec";
+    kDebug() << "was collection fetch job: collections:" << cJob->collections().size();
+    if (!cJob->collections().isEmpty()) {
+        kDebug() << "first fetched collection:" << cJob->collections().first().name();
+    }
+#endif
+}
+
+void EntityTreeModelPrivate::itemFetchJobDone(KJob *job)
 {
-    //This id is only valid for single collection fetchJobs
     const Collection::Id collectionId = job->property(FetchCollectionId()).value<Collection::Id>();
+    m_pendingCollectionRetrieveJobs.remove(collectionId);
 
     if (job->error()) {
         kWarning() << "Job error: " << job->errorString() << "for collection:" << collectionId << endl;
-        return; // let's be safe, otherwise emitting dataChanged will get us into loops
+        return;
     }
+    ItemFetchJob *iJob = static_cast<ItemFetchJob *>(job);
 
 #ifdef DBG_TRACK_JOB_TIMES
     kDebug() << "Fetch job took " << jobTimeTracker.take(job).elapsed() << "msec";
-    if (CollectionFetchJob *cJob = dynamic_cast<CollectionFetchJob *>(job)) {
-        kDebug() << "was collection fetch job: collections:" << cJob->collections().size();
-        if (!cJob->collections().isEmpty()) {
-            kDebug() << "first fetched collection:" << cJob->collections().first().name();
-        }
-    } else if (ItemFetchJob *iJob = dynamic_cast<ItemFetchJob *>(job)) {
-        kDebug() << "was item fetch job: items:" << iJob->items().size();
-        if (!iJob->items().isEmpty()) {
-            kDebug() << "first item collection:" << iJob->items().first().parentCollection().name();
-        }
+    kDebug() << "was item fetch job: items:" << iJob->items().size();
+    if (!iJob->items().isEmpty()) {
+        kDebug() << "first item collection:" << iJob->items().first().parentCollection().name();
     }
 #endif
-    if (ItemFetchJob *iJob = dynamic_cast<ItemFetchJob *>(job)) {
-        if (!iJob->count()) {
-            m_collectionsWithoutItems.insert(collectionId);
-        } else {
-            m_collectionsWithoutItems.remove(collectionId);
-        }
 
-        m_populatedCols.insert(collectionId);
-        emit q_ptr->collectionPopulated(collectionId);
-        m_pendingCollectionRetrieveJobs.remove(collectionId);
+    if (!iJob->count()) {
+        m_collectionsWithoutItems.insert(collectionId);
     } else {
-        CollectionFetchJob *collectionFetchJob = static_cast<CollectionFetchJob*>(job);
-        Q_FOREACH (const Akonadi::Collection &col, collectionFetchJob->collections()) {
-            if (!m_showRootCollection &&
-                collectionId == m_rootCollection.id()) {
-                continue;
-            }
-            // If collections are not in the model, there will be no valid index for them.
-            if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
-                (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
-                const QModelIndex index = indexForCollection(col);
-                Q_ASSERT(index.isValid());
-                emit dataChanged(index, index);
-            }
-        }
+        m_collectionsWithoutItems.remove(collectionId);
+    }
+
+    m_populatedCols.insert(collectionId);
+    emit q_ptr->collectionPopulated(collectionId);
+
+    // If collections are not in the model, there will be no valid index for them.
+    if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
+        (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
+        const QModelIndex index = indexForCollection(Collection(collectionId));
+        Q_ASSERT(index.isValid());
+        //To notify about the changed fetch and population state
+        emit dataChanged(index, index);
     }
 }
 
@@ -1504,7 +1506,7 @@ void EntityTreeModelPrivate::fetchTopLevelCollections() const
     q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
                q, SLOT(topLevelCollectionsFetched(Akonadi::Collection::List)));
     q->connect(job, SIGNAL(result(KJob*)),
-               q, SLOT(fetchJobDone(KJob*)));
+               q, SLOT(collectionFetchJobDone(KJob*)));
     ifDebug(kDebug() << ""; jobTimeTracker[job].start();)
 }
 
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index 10146ab..98919ed 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -167,7 +167,8 @@ public:
 
     void monitoredItemsRetrieved(KJob *job);
     void rootFetchJobDone(KJob *job);
-    void fetchJobDone(KJob *job);
+    void collectionFetchJobDone(KJob *job);
+    void itemFetchJobDone(KJob *job);
     void finalCollectionFetchJobDone(KJob *job);
     void updateJobDone(KJob *job);
     void pasteJobDone(KJob *job);


commit 10d37bf833fea71f0b3b4e93d406be5d442d720f
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 16:39:08 2014 +0200

    ETM: removed unused code.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 56130ab..aeba25c 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -185,52 +185,6 @@ void EntityTreeModelPrivate::serverStarted()
     endResetModel();
 }
 
-ItemFetchJob *EntityTreeModelPrivate::getItemFetchJob(const Collection &parent, const ItemFetchScope &scope) const
-{
-    Q_ASSERT(parent.isValid());
-    ItemFetchJob *itemJob = new Akonadi::ItemFetchJob(parent, m_session);
-    itemJob->setFetchScope(scope);
-    itemJob->fetchScope().setAncestorRetrieval(ItemFetchScope::All);
-    itemJob->fetchScope().setIgnoreRetrievalErrors(true);
-    itemJob->setDeliveryOption(ItemFetchJob::EmitItemsInBatches);
-    return itemJob;
-}
-
-ItemFetchJob *EntityTreeModelPrivate::getItemFetchJob(const Item &item, const ItemFetchScope &scope) const
-{
-    ItemFetchJob *itemJob = new Akonadi::ItemFetchJob(item, m_session);
-    itemJob->setFetchScope(scope);
-    itemJob->fetchScope().setIgnoreRetrievalErrors(true);
-    return itemJob;
-}
-
-void EntityTreeModelPrivate::runItemFetchJob(ItemFetchJob *itemFetchJob, const Collection &parent) const
-{
-    Q_Q(const EntityTreeModel);
-    itemFetchJob->setProperty(FetchCollectionId(), QVariant(parent.id()));
-
-    if (m_showRootCollection || parent != m_rootCollection) {
-        m_pendingCollectionRetrieveJobs.insert(parent.id());
-
-        // If collections are not in the model, there will be no valid index for them.
-        if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
-            (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
-            // We need to invoke this delayed because we would otherwise be emitting a sequence like
-            // - beginInsertRows
-            // - dataChanged
-            // - endInsertRows
-            // which would confuse proxies.
-            QMetaObject::invokeMethod(const_cast<EntityTreeModel *>(q), "changeFetchState", Qt::QueuedConnection, Q_ARG(Akonadi::Collection, parent));
-        }
-    }
-
-    q->connect(itemFetchJob, SIGNAL(itemsReceived(Akonadi::Item::List)),
-               q, SLOT(itemsFetched(Akonadi::Item::List)));
-    q->connect(itemFetchJob, SIGNAL(result(KJob*)),
-               q, SLOT(fetchJobDone(KJob*)));
-    ifDebug(kDebug() << "collection:" << parent.name(); jobTimeTracker[itemFetchJob].start();)
-}
-
 void EntityTreeModelPrivate::changeFetchState(const Collection &parent)
 {
     Q_Q(EntityTreeModel);
@@ -294,12 +248,38 @@ void EntityTreeModelPrivate::agentInstanceAdvancedStatusChanged(const QString &,
 
 void EntityTreeModelPrivate::fetchItems(const Collection &parent)
 {
+    Q_Q(const EntityTreeModel);
     Q_ASSERT(parent.isValid());
     Q_ASSERT(m_collections.contains(parent.id()));
     // TODO: Use a more specific fetch scope to get only the envelope for mails etc.
-    ItemFetchJob *itemJob = getItemFetchJob(parent, m_monitor->itemFetchScope());
+    ItemFetchJob *itemFetchJob = new Akonadi::ItemFetchJob(parent, m_session);
+    itemFetchJob->setFetchScope(m_monitor->itemFetchScope());
+    itemFetchJob->fetchScope().setAncestorRetrieval(ItemFetchScope::All);
+    itemFetchJob->fetchScope().setIgnoreRetrievalErrors(true);
+    itemFetchJob->setDeliveryOption(ItemFetchJob::EmitItemsInBatches);
+
+    itemFetchJob->setProperty(FetchCollectionId(), QVariant(parent.id()));
+
+    if (m_showRootCollection || parent != m_rootCollection) {
+        m_pendingCollectionRetrieveJobs.insert(parent.id());
+
+        // If collections are not in the model, there will be no valid index for them.
+        if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
+            (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
+            // We need to invoke this delayed because we would otherwise be emitting a sequence like
+            // - beginInsertRows
+            // - dataChanged
+            // - endInsertRows
+            // which would confuse proxies.
+            QMetaObject::invokeMethod(const_cast<EntityTreeModel *>(q), "changeFetchState", Qt::QueuedConnection, Q_ARG(Akonadi::Collection, parent));
+        }
+    }
 
-    runItemFetchJob(itemJob, parent);
+    q->connect(itemFetchJob, SIGNAL(itemsReceived(Akonadi::Item::List)),
+               q, SLOT(itemsFetched(Akonadi::Item::List)));
+    q->connect(itemFetchJob, SIGNAL(result(KJob*)),
+               q, SLOT(fetchJobDone(KJob*)));
+    ifDebug(kDebug() << "collection:" << parent.name(); jobTimeTracker[itemFetchJob].start();)
 }
 
 void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job)
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index 61bc5ea..10146ab 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -123,9 +123,6 @@ public:
      */
     void fillModel();
 
-    ItemFetchJob *getItemFetchJob(const Collection &parent, const ItemFetchScope &scope) const;
-    ItemFetchJob *getItemFetchJob(const Item &item, const ItemFetchScope &scope) const;
-    void runItemFetchJob(ItemFetchJob *itemFetchJob, const Collection &parent) const;
     void changeFetchState(const Collection &parent);
     void agentInstanceAdvancedStatusChanged(const QString &, const QVariantMap &);
     void agentInstanceRemoved(const Akonadi::AgentInstance &instace);


commit 212963476e33b8545455f42d5d4666fa196f6486
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 16:12:38 2014 +0200

    ETM: Don't use reinterpret_cast to cast void* to class.
    
    static_cast is what we want, reinterpret_cast in the best case does the same
    and in the worst case breaks something.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 93bad7c..56130ab 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -1706,7 +1706,7 @@ void EntityTreeModelPrivate::dataChanged(const QModelIndex &top, const QModelInd
 
     QModelIndex rightIndex;
 
-    Node *node = reinterpret_cast<Node *>(bottom.internalPointer());
+    Node *node = static_cast<Node *>(bottom.internalPointer());
 
     if (!node) {
         return;
@@ -1740,7 +1740,7 @@ QModelIndex EntityTreeModelPrivate::indexForCollection(const Collection &collect
 
     if ((collection == m_rootCollection)) {
         if (m_showRootCollection) {
-            return q->createIndex(0, 0, reinterpret_cast<void *>(m_rootNode));
+            return q->createIndex(0, 0, static_cast<void *>(m_rootNode));
         }
         return QModelIndex();
     }
@@ -1759,7 +1759,7 @@ QModelIndex EntityTreeModelPrivate::indexForCollection(const Collection &collect
             }
 
             Node *node = it.value().at(row);
-            return q->createIndex(row, 0, reinterpret_cast<void *>(node));
+            return q->createIndex(row, 0, static_cast<void *>(node));
         }
         return QModelIndex();
     }
@@ -1772,7 +1772,7 @@ QModelIndex EntityTreeModelPrivate::indexForCollection(const Collection &collect
 
     Node *node = m_childEntities.value(parentId).at(row);
 
-    return q->createIndex(row, 0, reinterpret_cast<void *>(node));
+    return q->createIndex(row, 0, static_cast<void *>(node));
 }
 
 QModelIndexList EntityTreeModelPrivate::indexesForItem(const Item &item) const
@@ -1788,7 +1788,7 @@ QModelIndexList EntityTreeModelPrivate::indexesForItem(const Item &item) const
         Q_ASSERT(row < nodeList.size());
         Node *node = nodeList.at(row);
 
-        indexes << q->createIndex(row, 0, reinterpret_cast<void *>(node));
+        indexes << q->createIndex(row, 0, static_cast<void *>(node));
         return indexes;
     }
 
@@ -1802,7 +1802,7 @@ QModelIndexList EntityTreeModelPrivate::indexesForItem(const Item &item) const
         Q_ASSERT(row < nodeList.size());
         Node *node = nodeList.at(row);
 
-        indexes << q->createIndex(row, 0, reinterpret_cast<void *>(node));
+        indexes << q->createIndex(row, 0, static_cast<void *>(node));
     }
 
     return indexes;


commit 679ed5b3229f3290f408e8a48e6a64446e8d7cdb
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 14:28:49 2014 +0200

    ETMPopulationTest: Test signals while referencing.

diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index fac7f51..a688fc9 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -34,6 +34,55 @@
 
 using namespace Akonadi;
 
+class ModelSignalSpy : public QObject {
+    Q_OBJECT
+public:
+    explicit ModelSignalSpy(QAbstractItemModel &model) {
+        connect(&model, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(onRowsInserted(QModelIndex,int,int)));
+        connect(&model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(onRowsRemoved(QModelIndex,int,int)));
+        connect(&model, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)), this, SLOT(onRowsMoved(QModelIndex,int,int, QModelIndex, int)));
+        connect(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
+        connect(&model, SIGNAL(layoutChanged()), this, SLOT(onLayoutChanged()));
+        connect(&model, SIGNAL(modelReset()), this, SLOT(onModelReset()));
+    }
+
+    QStringList mSignals;
+    QModelIndex parent;
+    int start;
+    int end;
+
+public Q_SLOTS:
+    void onRowsInserted(QModelIndex p, int s, int e) {
+        kDebug() << p << s << e;
+        kDebug() << p.data().toString();
+        mSignals << QLatin1String("rowsInserted");
+        parent = p;
+        start = s;
+        end = e;
+    }
+    void onRowsRemoved(QModelIndex p, int s, int e) {
+        mSignals << QLatin1String("rowsRemoved");
+        parent = p;
+        start = s;
+        end = e;
+    }
+    void onRowsMoved(QModelIndex,int,int,QModelIndex,int) {
+        mSignals << QLatin1String("rowsMoved");
+    }
+    void onDataChanged(QModelIndex s, QModelIndex e) {
+        kDebug() << s << e;
+        kDebug() << s.data().toString();
+        kDebug() << e.data().toString();
+        mSignals << QLatin1String("dataChanged");
+    }
+    void onLayoutChanged() {
+        mSignals << QLatin1String("layoutChanged");
+    }
+    void onModelReset() {
+        mSignals << QLatin1String("modelReset");
+    }
+};
+
 class InspectableETM: public EntityTreeModel
 {
 public:
@@ -270,6 +319,10 @@ void EtmPopulationTest::testReferenceCollection()
     //Check that this random other collection is actually available
     QVERIFY(getIndex("col1", model).isValid());
 
+    QTest::qWait(0);
+
+    ModelSignalSpy spy(*model);
+
     //Reference the collection and it should appear in the model
     model->setCollectionReferenced(col5, true);
 
@@ -278,6 +331,12 @@ void EtmPopulationTest::testReferenceCollection()
     //Check that this random other collection is still available
     QVERIFY(getIndex("col1", model).isValid());
 
+    //Ensure all signals have been delivered to the spy
+    QTest::qWait(0);
+    QCOMPARE(spy.mSignals.count("rowsInserted"), 1);
+    //Changes twice why?
+    QCOMPARE(spy.mSignals.count("dataChanged"), 2);
+
     //Dereference the collection and it should dissapear again
     model->setCollectionReferenced(col5, false);
     QTRY_VERIFY(!getIndex("col5", model).isValid());


commit 0dc0c06d7491526a6eba2508eda378dff8e2e3b3
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 14:26:23 2014 +0200

    ETM: only emit rowsInserted when we actually insert a new row.
    
    And otherwise emit the signal individually for the subrows
    
    ETM: use the correct parent for inserted ancestors.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 1817805..93bad7c 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -688,11 +688,11 @@ void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collec
     // Still prepending all collections for now.
     int row = 0;
 
-    // Although we insert several Collections here, we only need to notify though the model
-    // about the top-level one. The rest will be found auotmatically by the view.
-    q->beginInsertRows(parent, row, row);
 
     if (insertBaseCollection) {
+        // Although we insert several Collections here, we only need to notify though the model
+        // about the top-level one. The rest will be found auotmatically by the view.
+        q->beginInsertRows(parent, row, row);
         m_collections.insert(collection.id(), collection);
         Node *node = new Node;
         node->id = collection.id();
@@ -707,17 +707,26 @@ void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collec
 
     for (; it != end; ++it) {
         const Collection ancestor = *it;
+        Q_ASSERT(ancestor.parentCollection().isValid());
+        if (!insertBaseCollection) {
+            const QModelIndex ancestorParent = indexForCollection(ancestor.parentCollection());
+            q->beginInsertRows(ancestorParent, 0, 0);
+        }
         m_collections.insert(ancestor.id(), ancestor);
 
         Node *node = new Node;
         node->id = ancestor.id();
-        Q_ASSERT(ancestor.parentCollection().isValid());
         node->parent = ancestor.parentCollection().id();
         node->type = Node::Collection;
         m_childEntities[node->parent].prepend(node);
+        if (!insertBaseCollection) {
+            q->endInsertRows();
+        }
     }
 
-    q->endInsertRows();
+    if (insertBaseCollection) {
+        q->endInsertRows();
+    }
 }
 
 void EntityTreeModelPrivate::ancestorsFetched(const Akonadi::Collection::List &collectionList)


commit 25a1693eeaf6b7eec694e1fd054d65c325896265
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Jun 10 13:32:58 2014 +0200

    ETM: Removed FirstList hack.
    
    This was never working with a mimetype filter because the toplevel collections
    would never match the filter and the initial fetch was thus always empty.
    It used to be fixed automatically because the second fetch used to be
    a recursive fetch from root anyways.
    
    Simply listing all collections right away should be fast enough, and removing
    the hack allowed me to fold a bunch of codepaths into one.

diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index ecad2f4..d7e19ef 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -713,12 +713,10 @@ private:
     Q_PRIVATE_SLOT(d_func(), void rootFetchJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void pasteJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void updateJobDone(KJob *job))
-    Q_PRIVATE_SLOT(d_func(), void firstFetchJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void finalCollectionFetchJobDone(KJob *job))
 
     Q_PRIVATE_SLOT(d_func(), void itemsFetched(Akonadi::Item::List))
     Q_PRIVATE_SLOT(d_func(), void collectionsFetched(Akonadi::Collection::List))
-    Q_PRIVATE_SLOT(d_func(), void firstCollectionsFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void collectionListFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void topLevelCollectionsFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void ancestorsFetched(Akonadi::Collection::List))
diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 1166c59..1817805 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -62,6 +62,20 @@ QMap<KJob *, QTime> jobTimeTracker;
 
 using namespace Akonadi;
 
+static CollectionFetchJob::Type getFetchType(EntityTreeModel::CollectionFetchStrategy strategy)
+{
+    switch(strategy) {
+        case EntityTreeModel::FetchFirstLevelChildCollections:
+            return CollectionFetchJob::FirstLevel;
+        case EntityTreeModel::InvisibleCollectionFetch:
+        case EntityTreeModel::FetchCollectionsRecursive:
+        default:
+            break;
+    }
+    return CollectionFetchJob::Recursive;
+}
+
+
 EntityTreeModelPrivate::EntityTreeModelPrivate(EntityTreeModel *parent)
     : q_ptr(parent)
     , m_rootNode(0)
@@ -288,7 +302,7 @@ void EntityTreeModelPrivate::fetchItems(const Collection &parent)
     runItemFetchJob(itemJob, parent);
 }
 
-void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job, EntityTreeModelPrivate::ListingOrder listing)
+void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job)
 {
     Q_Q(EntityTreeModel);
 
@@ -301,38 +315,27 @@ void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job,
     } else {
         job->fetchScope().setIncludeStatistics(m_includeStatistics);
         job->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
-        if (listing != FirstListing) {
-            q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
-                       q, SLOT(collectionsFetched(Akonadi::Collection::List)));
-            q->connect(job, SIGNAL(result(KJob*)),
-                       q, SLOT(fetchJobDone(KJob*)));
-            q->connect(job, SIGNAL(result(KJob*)),
-                       q, SLOT(finalCollectionFetchJobDone(KJob*)));
-        } else {
-            q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
-                       q, SLOT(firstCollectionsFetched(Akonadi::Collection::List)));
-            q->connect(job, SIGNAL(result(KJob*)),
-                       q, SLOT(firstFetchJobDone(KJob*)));
-        }
+        q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
+                    q, SLOT(collectionsFetched(Akonadi::Collection::List)));
+        q->connect(job, SIGNAL(result(KJob*)),
+                    q, SLOT(fetchJobDone(KJob*)));
+        q->connect(job, SIGNAL(result(KJob*)),
+                    q, SLOT(finalCollectionFetchJobDone(KJob*)));
     }
     ifDebug(kDebug() << "collection:" << collection.name(); jobTimeTracker[job].start();)
 }
 
-void EntityTreeModelPrivate::fetchCollections(const Collection::List &collections, CollectionFetchJob::Type type, const ListingOrder listing)
+void EntityTreeModelPrivate::fetchCollections(const Collection::List &collections, CollectionFetchJob::Type type)
 {
-    Q_Q(EntityTreeModel);
-    CollectionFetchJob *job = new CollectionFetchJob(collections, type, m_session);
-    fetchCollections(job, listing);
+    fetchCollections(new CollectionFetchJob(collections, type, m_session));
 }
 
-void EntityTreeModelPrivate::fetchCollections(const Collection &collection, CollectionFetchJob::Type type, const ListingOrder listing)
+void EntityTreeModelPrivate::fetchCollections(const Collection &collection, CollectionFetchJob::Type type)
 {
-    kDebug() << collection.id() << type << listing;
-    Q_Q(EntityTreeModel);
     Q_ASSERT(collection.isValid());
     CollectionFetchJob *job = new CollectionFetchJob(collection, type, m_session);
     job->setProperty(FetchCollectionId(), QVariant(collection.id()));
-    fetchCollections(job, listing);
+    fetchCollections(job);
 }
 
 // Specialization needs to be in the same namespace as the definition
@@ -441,6 +444,11 @@ void EntityTreeModelPrivate::collectionsFetched(const Akonadi::Collection::List
             continue;
         }
 
+        //If we're monitoring collections somewhere in the tree we need to retrieve their ancestors now
+        if (collection.parentCollection() != m_rootCollection && m_monitor->collectionsMonitored().contains(collection)) {
+            retrieveAncestors(collection, false);
+        }
+
         Collection parent = collection;
 
         while (!m_collections.contains(parent.parentCollection().id())) {
@@ -613,8 +621,10 @@ void EntityTreeModelPrivate::monitoredCollectionsChanged(const Akonadi::Collecti
     Q_UNUSED(monitored)
     if (monitored) {
         m_collectionTreeFetched = false;
-        //TODO m_collectionFetchStrategy;
-        fetchCollections(collection, CollectionFetchJob::Base, EntityTreeModelPrivate::FirstListing);
+
+        const CollectionFetchJob::Type fetchType = getFetchType(m_collectionFetchStrategy);
+        fetchCollections(collection, CollectionFetchJob::Base);
+        fetchCollections(collection, fetchType);
     } else {
         monitoredCollectionRemoved(collection);
     }
@@ -1449,33 +1459,18 @@ void EntityTreeModelPrivate::startFirstListJob()
     const bool multipleCollections = m_monitor->collectionsMonitored().size() > 1;
     const bool generalPopulation = !noMimetypes || (noMimetypes && noResources);
 
+    const CollectionFetchJob::Type fetchType = getFetchType(m_collectionFetchStrategy);
+
     //Collections can only be monitored if no resources and no mimetypes are monitored
     if (multipleCollections && noMimetypes && noResources) {
-        fetchCollections(m_monitor->collectionsMonitored(), CollectionFetchJob::Base, Akonadi::EntityTreeModelPrivate::FirstListing);
+        fetchCollections(m_monitor->collectionsMonitored(), CollectionFetchJob::Base);
+        fetchCollections(m_monitor->collectionsMonitored(), fetchType);
         return;
     }
 
     kDebug() << "GEN" << generalPopulation << noMimetypes << noResources;
-    // Includes recursive trees. Lower levels are fetched in the onRowsInserted slot if
-    // necessary.
-    // HACK: fix this for recursive listing if we filter on mimetypes that only exist deeper
-    // in the hierarchy
-    if ((m_collectionFetchStrategy == EntityTreeModel::FetchFirstLevelChildCollections &&
-         generalPopulation)
-        /*|| ( m_collectionFetchStrategy == EntityTreeModel::FetchCollectionsRecursive )*/) {
-        fetchCollections(m_rootCollection, CollectionFetchJob::FirstLevel);
-    }
-
-    // On start we first fetch the top-level collections to give a more convincing
-    // illusion of speed. That's what the FirstListing stuff is for.
-    if ((m_collectionFetchStrategy == EntityTreeModel::FetchCollectionsRecursive) &&
-        generalPopulation) {
-        fetchCollections(m_rootCollection, CollectionFetchJob::FirstLevel, FirstListing);
-    }
-
-    if ((m_collectionFetchStrategy == EntityTreeModel::InvisibleCollectionFetch) &&
-        generalPopulation) {
-        fetchCollections(m_rootCollection, CollectionFetchJob::Recursive, FirstListing);
+    if (generalPopulation) {
+        fetchCollections(m_rootCollection, fetchType);
     }
 
     // If the root collection is not collection::root, then it could have items, and they will need to be
@@ -1506,33 +1501,8 @@ void EntityTreeModelPrivate::finalCollectionFetchJobDone(KJob *job)
     }
 
     Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job);
-    m_collectionTreeFetched = true;
-    emit q_ptr->collectionTreeFetched(fetchJob->collections());
-}
-
-void EntityTreeModelPrivate::firstCollectionsFetched(const Akonadi::Collection::List &collections)
-{
-    Q_FOREACH (const Akonadi::Collection &collection, collections) {
-        //If we're monitoring collections somewhere in the tree we need to retrieve their ancestors now
-        if (collection.parentCollection() != m_rootCollection) {
-            retrieveAncestors(collection, false);
-        }
-    }
-    collectionsFetched(collections);
-}
-
-void EntityTreeModelPrivate::firstFetchJobDone(KJob *job)
-{
-    if (job->error()) {
-        kWarning() << job->errorString();
-        return;
-    }
-
-    Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job);
-    //Fetch the remainder of the monitored tree
-    if (!fetchJob->collections().isEmpty()) {
-        fetchCollections(fetchJob->collections(), CollectionFetchJob::Recursive);
-    } else {
+    //Can happen when monitoring resources
+    if (!m_collectionTreeFetched) {
         m_collectionTreeFetched = true;
         emit q_ptr->collectionTreeFetched(fetchJob->collections());
     }
@@ -1581,16 +1551,7 @@ void EntityTreeModelPrivate::topLevelCollectionsFetched(const Akonadi::Collectio
             }
 
             Q_ASSERT(collection.isValid());
-            CollectionFetchJob *job = new CollectionFetchJob(collection, CollectionFetchJob::Recursive, m_session);
-            job->fetchScope().setListFilter(m_listFilter);
-
-            job->fetchScope().setIncludeStatistics(m_includeStatistics);
-            job->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
-            q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
-                       q, SLOT(collectionsFetched(Akonadi::Collection::List)));
-            q->connect(job, SIGNAL(result(KJob*)),
-                       q, SLOT(fetchJobDone(KJob*)));
-            ifDebug(kDebug() << "collection:" << collection.name(); jobTimeTracker[job].start();)
+            fetchCollections(collection, CollectionFetchJob::Recursive);
         }
     }
 }
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index fcc7277..61bc5ea 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -69,19 +69,13 @@ public:
         Recursive
     };
 
-    enum ListingOrder {
-        NotFirstListing,
-        FirstListing
-    };
-
     void init(ChangeRecorder *monitor);
 
-    void fetchCollections(const Collection &collection, CollectionFetchJob::Type = CollectionFetchJob::FirstLevel, ListingOrder = NotFirstListing);
-    void fetchCollections(const Collection::List &collections, CollectionFetchJob::Type = CollectionFetchJob::FirstLevel, ListingOrder = NotFirstListing);
-    void fetchCollections(Akonadi::CollectionFetchJob *job, ListingOrder = NotFirstListing);
+    void fetchCollections(const Collection &collection, CollectionFetchJob::Type type = CollectionFetchJob::FirstLevel);
+    void fetchCollections(const Collection::List &collections, CollectionFetchJob::Type type = CollectionFetchJob::FirstLevel);
+    void fetchCollections(Akonadi::CollectionFetchJob *job);
     void fetchItems(const Collection &collection);
     void collectionsFetched(const Akonadi::Collection::List &);
-    void firstCollectionsFetched(const Akonadi::Collection::List &);
     void collectionListFetched(const Akonadi::Collection::List &);
     void itemsFetched(const Akonadi::Item::List &items);
     void itemsFetched(const Collection::Id collectionId, const Akonadi::Item::List &items);
@@ -175,7 +169,6 @@ public:
     void serverStarted();
 
     void monitoredItemsRetrieved(KJob *job);
-    void firstFetchJobDone(KJob *job);
     void rootFetchJobDone(KJob *job);
     void fetchJobDone(KJob *job);
     void finalCollectionFetchJobDone(KJob *job);
diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index 6866049..fac7f51 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -51,12 +51,14 @@ QModelIndex getIndex(const QString &string, EntityTreeModel *model)
     return list.first();
 }
 
-Akonadi::Collection createCollection(const QString &name, const Akonadi::Collection &parent, bool enabled = true)
+Akonadi::Collection createCollection(const QString &name, const Akonadi::Collection &parent, bool enabled = true, const QStringList &mimeTypes = QStringList())
 {
     Akonadi::Collection col;
     col.setParentCollection(parent);
     col.setName(name);
     col.setEnabled(enabled);
+    col.setContentMimeTypes(mimeTypes);
+
     CollectionCreateJob *create = new CollectionCreateJob(col);
     create->exec();
     Q_ASSERT(!create->error());
@@ -72,16 +74,17 @@ class EtmPopulationTest : public QObject
 
 private Q_SLOTS:
     void initTestCase();
+    void testMonitoringCollectionsPreset();
     void testMonitoringCollections();
     void testFullPopulation();
     void testAddMonitoringCollections();
     void testRemoveMonitoringCollections();
     void testDisplayFilter();
     void testReferenceCollection();
+    void testLoadingOfHiddenCollection();
 
 private:
     Collection res;
-    static const int numberOfRootCollections = 4;
     QString mainCollectionName;
     Collection monitorCol;
     Collection col1;
@@ -99,20 +102,34 @@ void EtmPopulationTest::initTestCase()
     res = Collection( collectionIdFromPath( "res3" ) );
 
     mainCollectionName = QLatin1String("main");
-    {
-        monitorCol.setParentCollection(res);
-        monitorCol.setName(mainCollectionName);
-        CollectionCreateJob *create = new CollectionCreateJob(monitorCol, this);
-        AKVERIFYEXEC(create);
-        monitorCol = create->collection();
-    }
-
+    monitorCol = createCollection(mainCollectionName, res);
     col1 = createCollection(QLatin1String("col1"), monitorCol);
     col2 = createCollection(QLatin1String("col2"), monitorCol);
     col3 = createCollection(QLatin1String("col3"), monitorCol);
     col4 = createCollection(QLatin1String("col4"), col2);
 }
 
+void EtmPopulationTest::testMonitoringCollectionsPreset()
+{
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    changeRecorder->setCollectionMonitored(col1, true);
+    changeRecorder->setCollectionMonitored(col2, true);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QTRY_VERIFY(getIndex("col1", model).isValid());
+    QTRY_VERIFY(getIndex("col2", model).isValid());
+    QTRY_VERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(!getIndex("col3", model).isValid());
+    QVERIFY(getIndex("col4", model).isValid());
+
+    QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex(mainCollectionName, model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+}
 
 
 void EtmPopulationTest::testMonitoringCollections()
@@ -128,7 +145,7 @@ void EtmPopulationTest::testMonitoringCollections()
     QTRY_VERIFY(model->isCollectionTreeFetched());
     QVERIFY(getIndex("col1", model).isValid());
     QVERIFY(getIndex("col2", model).isValid());
-    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QTRY_VERIFY(getIndex(mainCollectionName, model).isValid());
     QVERIFY(!getIndex("col3", model).isValid());
     QVERIFY(getIndex("col4", model).isValid());
 
@@ -141,12 +158,11 @@ void EtmPopulationTest::testMonitoringCollections()
 void EtmPopulationTest::testFullPopulation()
 {
     ChangeRecorder *changeRecorder = new ChangeRecorder(this);
-    changeRecorder->setCollectionMonitored(Akonadi::Collection::root());
+    // changeRecorder->setCollectionMonitored(Akonadi::Collection::root());
+    changeRecorder->setAllMonitored(true);
     InspectableETM *model = new InspectableETM(changeRecorder, this);
     model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
     model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
-    Akonadi::Collection::List monitored;
-    monitored << col1 << col2;
 
     QTRY_VERIFY(model->isCollectionTreeFetched());
     QVERIFY(getIndex("col1", model).isValid());
@@ -164,22 +180,24 @@ void EtmPopulationTest::testFullPopulation()
 void EtmPopulationTest::testAddMonitoringCollections()
 {
     ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    changeRecorder->setCollectionMonitored(col1, true);
+    changeRecorder->setCollectionMonitored(col2, true);
     InspectableETM *model = new InspectableETM(changeRecorder, this);
     model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
     model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
-    Akonadi::Collection::List monitored;
-    monitored << col1 << col2;
-    model->setCollectionsMonitored(monitored);
 
     QTRY_VERIFY(model->isCollectionTreeFetched());
+    //The main collection may be loaded a little later since it is in the fetchAncestors path
+    QTRY_VERIFY(getIndex(mainCollectionName, model).isValid());
+
     model->setCollectionMonitored(col3, true);
 
     QTRY_VERIFY(model->isCollectionTreeFetched());
     QVERIFY(getIndex("col1", model).isValid());
     QVERIFY(getIndex("col2", model).isValid());
-    QVERIFY(getIndex(mainCollectionName, model).isValid());
     QVERIFY(getIndex("col3", model).isValid());
     QVERIFY(getIndex("col4", model).isValid());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
 
     QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
     QTRY_VERIFY(getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
@@ -191,17 +209,18 @@ void EtmPopulationTest::testAddMonitoringCollections()
 void EtmPopulationTest::testRemoveMonitoringCollections()
 {
     ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    changeRecorder->setCollectionMonitored(col1, true);
+    changeRecorder->setCollectionMonitored(col2, true);
     InspectableETM *model = new InspectableETM(changeRecorder, this);
     model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
     model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
-    Akonadi::Collection::List monitored;
-    monitored << col1 << col2;
-    model->setCollectionsMonitored(monitored);
 
     QTRY_VERIFY(model->isCollectionTreeFetched());
+    //The main collection may be loaded a little later since it is in the fetchAncestors path
+    QTRY_VERIFY(getIndex(mainCollectionName, model).isValid());
+
     model->setCollectionMonitored(col2, false);
 
-    QTRY_VERIFY(model->isCollectionTreeFetched());
     QVERIFY(getIndex("col1", model).isValid());
     QVERIFY(!getIndex("col2", model).isValid());
     QVERIFY(getIndex(mainCollectionName, model).isValid());
@@ -269,6 +288,26 @@ void EtmPopulationTest::testReferenceCollection()
     AKVERIFYEXEC(deleteJob);
 }
 
+/*
+ * Col5 and it's ancestors should be included although the ancestors don't match the mimetype filter.
+ */
+void EtmPopulationTest::testLoadingOfHiddenCollection()
+{
+    Collection col5 = createCollection(QLatin1String("col5"), monitorCol, false, QStringList() << QLatin1String("application/test"));
+
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    changeRecorder->setMimeTypeMonitored(QLatin1String("application/test"), true);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex("col5", model).isValid());
+
+    Akonadi::CollectionDeleteJob *deleteJob = new Akonadi::CollectionDeleteJob(col5);
+    AKVERIFYEXEC(deleteJob);
+}
+
 #include "etmpopulationtest.moc"
 
 QTEST_AKONADIMAIN(EtmPopulationTest, NoGUI)


commit 9c9a496374780f3c66444cd848ead80c4985b643
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Jun 10 01:32:46 2014 +0200

    ETMPopulationTest: displayfilter test

diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index c5c8078..6866049 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -76,6 +76,7 @@ private Q_SLOTS:
     void testFullPopulation();
     void testAddMonitoringCollections();
     void testRemoveMonitoringCollections();
+    void testDisplayFilter();
     void testReferenceCollection();
 
 private:
@@ -213,6 +214,28 @@ void EtmPopulationTest::testRemoveMonitoringCollections()
     QTRY_VERIFY(!getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
 }
 
+void EtmPopulationTest::testDisplayFilter()
+{
+    Collection col5 = createCollection(QLatin1String("col5"), monitorCol, false);
+
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    model->setListFilter(Akonadi::CollectionFetchScope::Display);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(getIndex("col1", model).isValid());
+    QVERIFY(getIndex("col2", model).isValid());
+    QVERIFY(getIndex("col3", model).isValid());
+    QVERIFY(getIndex("col4", model).isValid());
+    QVERIFY(!getIndex("col5", model).isValid());
+
+    Akonadi::CollectionDeleteJob *deleteJob = new Akonadi::CollectionDeleteJob(col5);
+    AKVERIFYEXEC(deleteJob);
+}
+
 void EtmPopulationTest::testReferenceCollection()
 {
     Collection col5 = createCollection(QLatin1String("col5"), monitorCol, false);


commit e9e095952e5b2391e7994b7693456e54e0c60005
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Jun 9 23:27:57 2014 +0200

    ETM: Support for referencing collections.

diff --git a/akonadi/entitytreemodel.cpp b/akonadi/entitytreemodel.cpp
index d9cdede..72af61e 100644
--- a/akonadi/entitytreemodel.cpp
+++ b/akonadi/entitytreemodel.cpp
@@ -130,6 +130,16 @@ void EntityTreeModel::setCollectionMonitored(const Collection &col, bool monitor
     d->m_monitor->setCollectionMonitored(col, monitored);
 }
 
+void EntityTreeModel::setCollectionReferenced(const Akonadi::Collection &col, bool referenced)
+{
+    Q_D(EntityTreeModel);
+    d->m_monitor->setCollectionMonitored(col, referenced);
+    Akonadi::Collection referencedCollection = col;
+    referencedCollection.setReferenced(referenced);
+    //We have to use the same session as the monitor, so the monitor can fetch the collection afterwards
+    new Akonadi::CollectionModifyJob(referencedCollection, d->m_monitor->session());
+}
+
 bool EntityTreeModel::systemEntitiesShown() const
 {
     Q_D(const EntityTreeModel);
diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index e1bb376..ecad2f4 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -476,6 +476,15 @@ public:
     void setCollectionMonitored(const Akonadi::Collection &col, bool monitored = true);
 
     /**
+     * References a collection and starts to monitor it.
+     *
+     * Use this to temporarily include a collection that is not enabled.
+     *
+     * @since 4.14
+     */
+    void setCollectionReferenced(const Akonadi::Collection &col, bool referenced = true);
+
+    /**
      * Sets the item population @p strategy of the model.
      */
     void setItemPopulationStrategy(ItemPopulationStrategy strategy);
diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
index 8af53a2..c5c8078 100644
--- a/akonadi/tests/etmpopulationtest.cpp
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -29,6 +29,7 @@
 #include <akonadi/changerecorder_p.h>
 #include <akonadi/qtest_akonadi.h>
 #include <akonadi/collectioncreatejob.h>
+#include <akonadi/collectiondeletejob.h>
 #include <akonadi/itemcreatejob.h>
 
 using namespace Akonadi;
@@ -50,11 +51,12 @@ QModelIndex getIndex(const QString &string, EntityTreeModel *model)
     return list.first();
 }
 
-Akonadi::Collection createCollection(const QString &name, const Akonadi::Collection &parent)
+Akonadi::Collection createCollection(const QString &name, const Akonadi::Collection &parent, bool enabled = true)
 {
     Akonadi::Collection col;
     col.setParentCollection(parent);
     col.setName(name);
+    col.setEnabled(enabled);
     CollectionCreateJob *create = new CollectionCreateJob(col);
     create->exec();
     Q_ASSERT(!create->error());
@@ -74,6 +76,7 @@ private Q_SLOTS:
     void testFullPopulation();
     void testAddMonitoringCollections();
     void testRemoveMonitoringCollections();
+    void testReferenceCollection();
 
 private:
     Collection res;
@@ -210,6 +213,40 @@ void EtmPopulationTest::testRemoveMonitoringCollections()
     QTRY_VERIFY(!getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
 }
 
+void EtmPopulationTest::testReferenceCollection()
+{
+    Collection col5 = createCollection(QLatin1String("col5"), monitorCol, false);
+
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    model->setListFilter(Akonadi::CollectionFetchScope::Display);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(!getIndex("col5", model).isValid());
+    //Check that this random other collection is actually available
+    QVERIFY(getIndex("col1", model).isValid());
+
+    //Reference the collection and it should appear in the model
+    model->setCollectionReferenced(col5, true);
+
+    QTRY_VERIFY(getIndex("col5", model).isValid());
+    QTRY_VERIFY(getIndex("col5", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    //Check that this random other collection is still available
+    QVERIFY(getIndex("col1", model).isValid());
+
+    //Dereference the collection and it should dissapear again
+    model->setCollectionReferenced(col5, false);
+    QTRY_VERIFY(!getIndex("col5", model).isValid());
+    //Check that this random other collection is still available
+    QVERIFY(getIndex("col1", model).isValid());
+
+    Akonadi::CollectionDeleteJob *deleteJob = new Akonadi::CollectionDeleteJob(col5);
+    AKVERIFYEXEC(deleteJob);
+}
+
 #include "etmpopulationtest.moc"
 
 QTEST_AKONADIMAIN(EtmPopulationTest, NoGUI)
+


commit 607f3613ba6b9a3cddbdcb297471cd16a30d7b32
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Jun 9 19:09:34 2014 +0200

    ETM: Monitoring specific collections only.

diff --git a/akonadi/entitytreemodel.cpp b/akonadi/entitytreemodel.cpp
index 7fb35f5..d9cdede 100644
--- a/akonadi/entitytreemodel.cpp
+++ b/akonadi/entitytreemodel.cpp
@@ -111,6 +111,25 @@ void EntityTreeModel::setListFilter(CollectionFetchScope::ListFilter filter)
     d->endResetModel();
 }
 
+void EntityTreeModel::setCollectionsMonitored(const Collection::List &collections)
+{
+    Q_D(EntityTreeModel);
+    d->beginResetModel();
+    foreach(const Akonadi::Collection &col, d->m_monitor->collectionsMonitored()) {
+        d->m_monitor->setCollectionMonitored(col, false);
+    }
+    foreach(const Akonadi::Collection &col, collections) {
+        d->m_monitor->setCollectionMonitored(col, true);
+    }
+    d->endResetModel();
+}
+
+void EntityTreeModel::setCollectionMonitored(const Collection &col, bool monitored)
+{
+    Q_D(EntityTreeModel);
+    d->m_monitor->setCollectionMonitored(col, monitored);
+}
+
 bool EntityTreeModel::systemEntitiesShown() const
 {
     Q_D(const EntityTreeModel);
diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index 2d52a3d..e1bb376 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -460,6 +460,22 @@ public:
     void setListFilter(Akonadi::CollectionFetchScope::ListFilter filter);
 
     /**
+     * Monitors the specified collections and resets the model.
+     *
+     * @since 4.14
+     */
+    void setCollectionsMonitored(const Akonadi::Collection::List &collections);
+
+    /**
+     * Adds or removes a specific collection from the monitored set without resetting the model.
+     * Only call this if you're monitoring specific collections (not mimetype/resources/items).
+     *
+     * @since 4.14
+     * @see setCollectionsMonitored()
+     */
+    void setCollectionMonitored(const Akonadi::Collection &col, bool monitored = true);
+
+    /**
      * Sets the item population @p strategy of the model.
      */
     void setItemPopulationStrategy(ItemPopulationStrategy strategy);
@@ -689,10 +705,10 @@ private:
     Q_PRIVATE_SLOT(d_func(), void pasteJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void updateJobDone(KJob *job))
     Q_PRIVATE_SLOT(d_func(), void firstFetchJobDone(KJob *job))
+    Q_PRIVATE_SLOT(d_func(), void finalCollectionFetchJobDone(KJob *job))
 
     Q_PRIVATE_SLOT(d_func(), void itemsFetched(Akonadi::Item::List))
     Q_PRIVATE_SLOT(d_func(), void collectionsFetched(Akonadi::Collection::List))
-    Q_PRIVATE_SLOT(d_func(), void allCollectionsFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void firstCollectionsFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void collectionListFetched(Akonadi::Collection::List))
     Q_PRIVATE_SLOT(d_func(), void topLevelCollectionsFetched(Akonadi::Collection::List))
diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index f12f96f..1166c59 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -288,13 +288,9 @@ void EntityTreeModelPrivate::fetchItems(const Collection &parent)
     runItemFetchJob(itemJob, parent);
 }
 
-void EntityTreeModelPrivate::fetchCollections(const Collection &collection, CollectionFetchJob::Type type, const ListingOrder listing)
+void EntityTreeModelPrivate::fetchCollections(Akonadi::CollectionFetchJob *job, EntityTreeModelPrivate::ListingOrder listing)
 {
     Q_Q(EntityTreeModel);
-    Q_ASSERT(collection.isValid());
-    CollectionFetchJob *job = new CollectionFetchJob(collection, type, m_session);
-
-    job->setProperty(FetchCollectionId(), QVariant(collection.id()));
 
     job->fetchScope().setListFilter(m_listFilter);
     job->fetchScope().setContentMimeTypes(m_monitor->mimeTypesMonitored());
@@ -307,9 +303,11 @@ void EntityTreeModelPrivate::fetchCollections(const Collection &collection, Coll
         job->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
         if (listing != FirstListing) {
             q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
-                       q, SLOT(allCollectionsFetched(Akonadi::Collection::List)));
+                       q, SLOT(collectionsFetched(Akonadi::Collection::List)));
             q->connect(job, SIGNAL(result(KJob*)),
                        q, SLOT(fetchJobDone(KJob*)));
+            q->connect(job, SIGNAL(result(KJob*)),
+                       q, SLOT(finalCollectionFetchJobDone(KJob*)));
         } else {
             q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
                        q, SLOT(firstCollectionsFetched(Akonadi::Collection::List)));
@@ -320,6 +318,23 @@ void EntityTreeModelPrivate::fetchCollections(const Collection &collection, Coll
     ifDebug(kDebug() << "collection:" << collection.name(); jobTimeTracker[job].start();)
 }
 
+void EntityTreeModelPrivate::fetchCollections(const Collection::List &collections, CollectionFetchJob::Type type, const ListingOrder listing)
+{
+    Q_Q(EntityTreeModel);
+    CollectionFetchJob *job = new CollectionFetchJob(collections, type, m_session);
+    fetchCollections(job, listing);
+}
+
+void EntityTreeModelPrivate::fetchCollections(const Collection &collection, CollectionFetchJob::Type type, const ListingOrder listing)
+{
+    kDebug() << collection.id() << type << listing;
+    Q_Q(EntityTreeModel);
+    Q_ASSERT(collection.isValid());
+    CollectionFetchJob *job = new CollectionFetchJob(collection, type, m_session);
+    job->setProperty(FetchCollectionId(), QVariant(collection.id()));
+    fetchCollections(job, listing);
+}
+
 // Specialization needs to be in the same namespace as the definition
 namespace Akonadi {
 
@@ -596,8 +611,13 @@ void EntityTreeModelPrivate::monitoredCollectionsChanged(const Akonadi::Collecti
 {
     Q_UNUSED(collection)
     Q_UNUSED(monitored)
-    beginResetModel();
-    endResetModel();
+    if (monitored) {
+        m_collectionTreeFetched = false;
+        //TODO m_collectionFetchStrategy;
+        fetchCollections(collection, CollectionFetchJob::Base, EntityTreeModelPrivate::FirstListing);
+    } else {
+        monitoredCollectionRemoved(collection);
+    }
 }
 
 void EntityTreeModelPrivate::monitoredItemsChanged(const Akonadi::Item &item, bool monitored)
@@ -616,7 +636,7 @@ void EntityTreeModelPrivate::monitoredResourcesChanged(const QByteArray &resourc
     endResetModel();
 }
 
-void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collection)
+void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collection, bool insertBaseCollection)
 {
     Q_Q(EntityTreeModel);
 
@@ -662,13 +682,15 @@ void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collec
     // about the top-level one. The rest will be found auotmatically by the view.
     q->beginInsertRows(parent, row, row);
 
-    m_collections.insert(collection.id(), collection);
-    Node *node = new Node;
-    node->id = collection.id();
-    // Can't just use parentCollection because that doesn't necessarily refer to collection.
-    node->parent = collection.parentCollection().id();
-    node->type = Node::Collection;
-    m_childEntities[node->parent].prepend(node);
+    if (insertBaseCollection) {
+        m_collections.insert(collection.id(), collection);
+        Node *node = new Node;
+        node->id = collection.id();
+        // Can't just use parentCollection because that doesn't necessarily refer to collection.
+        node->parent = collection.parentCollection().id();
+        node->type = Node::Collection;
+        m_childEntities[node->parent].prepend(node);
+    }
 
     Collection::List::const_iterator it = ancestors.constBegin();
     const Collection::List::const_iterator end = ancestors.constEnd();
@@ -741,6 +763,11 @@ bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) c
         return true;
     }
 
+    //Explicitly monitored collection
+    if (m_monitor->collectionsMonitored().contains(collection)) {
+        return true;
+    }
+
     // Some collection trees contain multiple mimetypes. Even though server side filtering ensures we
     // only get the ones we're interested in from the job, we have to filter on collections received through signals too.
     if (!m_mimeChecker.wantedMimeTypes().isEmpty() &&
@@ -1270,6 +1297,7 @@ void EntityTreeModelPrivate::monitoredItemUnlinked(const Akonadi::Item &item, co
 
 void EntityTreeModelPrivate::fetchJobDone(KJob *job)
 {
+    //This id is only valid for single collection fetchJobs
     const Collection::Id collectionId = job->property(FetchCollectionId()).value<Collection::Id>();
 
     if (job->error()) {
@@ -1300,27 +1328,23 @@ void EntityTreeModelPrivate::fetchJobDone(KJob *job)
 
         m_populatedCols.insert(collectionId);
         emit q_ptr->collectionPopulated(collectionId);
+        m_pendingCollectionRetrieveJobs.remove(collectionId);
     } else {
-        if (!m_showRootCollection &&
-            collectionId == m_rootCollection.id()) {
-            return;
-        }
-        // If collections are not in the model, there will be no valid index for them.
-        if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
-            (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
-            const QModelIndex index = indexForCollection(Collection(collectionId));
-            Q_ASSERT(index.isValid());
-            emit dataChanged(index, index);
+        CollectionFetchJob *collectionFetchJob = static_cast<CollectionFetchJob*>(job);
+        Q_FOREACH (const Akonadi::Collection &col, collectionFetchJob->collections()) {
+            if (!m_showRootCollection &&
+                collectionId == m_rootCollection.id()) {
+                continue;
+            }
+            // If collections are not in the model, there will be no valid index for them.
+            if ((m_collectionFetchStrategy != EntityTreeModel::InvisibleCollectionFetch) &&
+                (m_collectionFetchStrategy != EntityTreeModel::FetchNoCollections)) {
+                const QModelIndex index = indexForCollection(col);
+                Q_ASSERT(index.isValid());
+                emit dataChanged(index, index);
+            }
         }
     }
-
-    if (!m_showRootCollection &&
-        collectionId == m_rootCollection.id()) {
-        return;
-    }
-
-    m_pendingCollectionRetrieveJobs.remove(collectionId);
-
 }
 
 void EntityTreeModelPrivate::pasteJobDone(KJob *job)
@@ -1422,8 +1446,15 @@ void EntityTreeModelPrivate::startFirstListJob()
 
     const bool noMimetypes = m_mimeChecker.wantedMimeTypes().isEmpty();
     const bool noResources = m_monitor->resourcesMonitored().isEmpty();
+    const bool multipleCollections = m_monitor->collectionsMonitored().size() > 1;
     const bool generalPopulation = !noMimetypes || (noMimetypes && noResources);
 
+    //Collections can only be monitored if no resources and no mimetypes are monitored
+    if (multipleCollections && noMimetypes && noResources) {
+        fetchCollections(m_monitor->collectionsMonitored(), CollectionFetchJob::Base, Akonadi::EntityTreeModelPrivate::FirstListing);
+        return;
+    }
+
     kDebug() << "GEN" << generalPopulation << noMimetypes << noResources;
     // Includes recursive trees. Lower levels are fetched in the onRowsInserted slot if
     // necessary.
@@ -1467,15 +1498,26 @@ void EntityTreeModelPrivate::startFirstListJob()
     }
 }
 
-void EntityTreeModelPrivate::allCollectionsFetched(const Akonadi::Collection::List &collections)
+void EntityTreeModelPrivate::finalCollectionFetchJobDone(KJob *job)
 {
-    collectionsFetched(collections);
+    if (job->error()) {
+        kWarning() << job->errorString();
+        return;
+    }
+
+    Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job);
     m_collectionTreeFetched = true;
-    emit q_ptr->collectionTreeFetched(collections);
+    emit q_ptr->collectionTreeFetched(fetchJob->collections());
 }
 
 void EntityTreeModelPrivate::firstCollectionsFetched(const Akonadi::Collection::List &collections)
 {
+    Q_FOREACH (const Akonadi::Collection &collection, collections) {
+        //If we're monitoring collections somewhere in the tree we need to retrieve their ancestors now
+        if (collection.parentCollection() != m_rootCollection) {
+            retrieveAncestors(collection, false);
+        }
+    }
     collectionsFetched(collections);
 }
 
@@ -1486,9 +1528,14 @@ void EntityTreeModelPrivate::firstFetchJobDone(KJob *job)
         return;
     }
 
-    // It is quicker to recursively list from the root again than to do
-    // individual listings for each top level item from the first fetch.
-    fetchCollections(m_rootCollection, CollectionFetchJob::Recursive);
+    Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job);
+    //Fetch the remainder of the monitored tree
+    if (!fetchJob->collections().isEmpty()) {
+        fetchCollections(fetchJob->collections(), CollectionFetchJob::Recursive);
+    } else {
+        m_collectionTreeFetched = true;
+        emit q_ptr->collectionTreeFetched(fetchJob->collections());
+    }
 }
 
 void EntityTreeModelPrivate::fetchTopLevelCollections() const
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index 9af6c7d..fcc7277 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -77,9 +77,10 @@ public:
     void init(ChangeRecorder *monitor);
 
     void fetchCollections(const Collection &collection, CollectionFetchJob::Type = CollectionFetchJob::FirstLevel, ListingOrder = NotFirstListing);
+    void fetchCollections(const Collection::List &collections, CollectionFetchJob::Type = CollectionFetchJob::FirstLevel, ListingOrder = NotFirstListing);
+    void fetchCollections(Akonadi::CollectionFetchJob *job, ListingOrder = NotFirstListing);
     void fetchItems(const Collection &collection);
     void collectionsFetched(const Akonadi::Collection::List &);
-    void allCollectionsFetched(const Akonadi::Collection::List &);
     void firstCollectionsFetched(const Akonadi::Collection::List &);
     void collectionListFetched(const Akonadi::Collection::List &);
     void itemsFetched(const Akonadi::Item::List &items);
@@ -115,7 +116,7 @@ public:
     /**
      * Fetch parent collections and insert this @p collection and its parents into the node tree
      */
-    void retrieveAncestors(const Akonadi::Collection &collection);
+    void retrieveAncestors(const Akonadi::Collection &collection, bool insertBaseCollection = true);
     void ancestorsFetched(const Akonadi::Collection::List &collectionList);
     void insertCollection(const Akonadi::Collection &collection, const Akonadi::Collection &parent);
     void insertPendingCollection(const Akonadi::Collection &collection, const Akonadi::Collection &parent, QMutableListIterator<Collection> &it);
@@ -177,6 +178,7 @@ public:
     void firstFetchJobDone(KJob *job);
     void rootFetchJobDone(KJob *job);
     void fetchJobDone(KJob *job);
+    void finalCollectionFetchJobDone(KJob *job);
     void updateJobDone(KJob *job);
     void pasteJobDone(KJob *job);
 
diff --git a/akonadi/tests/CMakeLists.txt b/akonadi/tests/CMakeLists.txt
index 107cea3..a67b635 100644
--- a/akonadi/tests/CMakeLists.txt
+++ b/akonadi/tests/CMakeLists.txt
@@ -152,3 +152,4 @@ add_akonadi_isolated_test(lazypopulationtest.cpp)
 add_akonadi_isolated_test(favoriteproxytest.cpp)
 add_akonadi_isolated_test_advanced(itemsearchjobtest.cpp testsearchplugin/testsearchplugin.cpp "")
 add_akonadi_isolated_test(tagtest.cpp)
+add_akonadi_isolated_test(etmpopulationtest.cpp)
diff --git a/akonadi/tests/etmpopulationtest.cpp b/akonadi/tests/etmpopulationtest.cpp
new file mode 100644
index 0000000..8af53a2
--- /dev/null
+++ b/akonadi/tests/etmpopulationtest.cpp
@@ -0,0 +1,215 @@
+/*
+    Copyright (c) 2013 Christian Mollekopf <mollekopf at kolabsys.com>
+
+    This library is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Library General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    This library is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
+    License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to the
+    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA.
+*/
+
+#include <QObject>
+
+#include "test_utils.h"
+
+#include <KStandardDirs>
+#include <akonadi/entitytreemodel.h>
+#include <akonadi/control.h>
+#include <akonadi/entitytreemodel_p.h>
+#include <akonadi/monitor_p.h>
+#include <akonadi/changerecorder_p.h>
+#include <akonadi/qtest_akonadi.h>
+#include <akonadi/collectioncreatejob.h>
+#include <akonadi/itemcreatejob.h>
+
+using namespace Akonadi;
+
+class InspectableETM: public EntityTreeModel
+{
+public:
+  explicit InspectableETM(ChangeRecorder* monitor, QObject* parent = 0)
+  :EntityTreeModel(monitor, parent) {}
+  EntityTreeModelPrivate *etmPrivate() { return d_ptr; };
+};
+
+QModelIndex getIndex(const QString &string, EntityTreeModel *model)
+{
+    QModelIndexList list = model->match( model->index( 0, 0 ), Qt::DisplayRole, string, 1, Qt::MatchRecursive );
+    if ( list.isEmpty() ) {
+        return QModelIndex();
+    }
+    return list.first();
+}
+
+Akonadi::Collection createCollection(const QString &name, const Akonadi::Collection &parent)
+{
+    Akonadi::Collection col;
+    col.setParentCollection(parent);
+    col.setName(name);
+    CollectionCreateJob *create = new CollectionCreateJob(col);
+    create->exec();
+    Q_ASSERT(!create->error());
+    return create->collection();
+}
+
+/**
+ * This is a test for the initial population of the ETM.
+ */
+class EtmPopulationTest : public QObject
+{
+  Q_OBJECT
+
+private Q_SLOTS:
+    void initTestCase();
+    void testMonitoringCollections();
+    void testFullPopulation();
+    void testAddMonitoringCollections();
+    void testRemoveMonitoringCollections();
+
+private:
+    Collection res;
+    static const int numberOfRootCollections = 4;
+    QString mainCollectionName;
+    Collection monitorCol;
+    Collection col1;
+    Collection col2;
+    Collection col3;
+    Collection col4;
+};
+
+void EtmPopulationTest::initTestCase()
+{
+    qRegisterMetaType<Akonadi::Collection::Id>("Akonadi::Collection::Id");
+    AkonadiTest::checkTestIsIsolated();
+    AkonadiTest::setAllResourcesOffline();
+
+    res = Collection( collectionIdFromPath( "res3" ) );
+
+    mainCollectionName = QLatin1String("main");
+    {
+        monitorCol.setParentCollection(res);
+        monitorCol.setName(mainCollectionName);
+        CollectionCreateJob *create = new CollectionCreateJob(monitorCol, this);
+        AKVERIFYEXEC(create);
+        monitorCol = create->collection();
+    }
+
+    col1 = createCollection(QLatin1String("col1"), monitorCol);
+    col2 = createCollection(QLatin1String("col2"), monitorCol);
+    col3 = createCollection(QLatin1String("col3"), monitorCol);
+    col4 = createCollection(QLatin1String("col4"), col2);
+}
+
+
+
+void EtmPopulationTest::testMonitoringCollections()
+{
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    Akonadi::Collection::List monitored;
+    monitored << col1 << col2;
+    model->setCollectionsMonitored(monitored);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex("col1", model).isValid());
+    QVERIFY(getIndex("col2", model).isValid());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(!getIndex("col3", model).isValid());
+    QVERIFY(getIndex("col4", model).isValid());
+
+    QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex(mainCollectionName, model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+}
+
+void EtmPopulationTest::testFullPopulation()
+{
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    changeRecorder->setCollectionMonitored(Akonadi::Collection::root());
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    Akonadi::Collection::List monitored;
+    monitored << col1 << col2;
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex("col1", model).isValid());
+    QVERIFY(getIndex("col2", model).isValid());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(getIndex("col3", model).isValid());
+    QVERIFY(getIndex("col4", model).isValid());
+
+    QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex(mainCollectionName, model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+}
+
+void EtmPopulationTest::testAddMonitoringCollections()
+{
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    Akonadi::Collection::List monitored;
+    monitored << col1 << col2;
+    model->setCollectionsMonitored(monitored);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    model->setCollectionMonitored(col3, true);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex("col1", model).isValid());
+    QVERIFY(getIndex("col2", model).isValid());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(getIndex("col3", model).isValid());
+    QVERIFY(getIndex("col4", model).isValid());
+
+    QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col3", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex(mainCollectionName, model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+}
+
+void EtmPopulationTest::testRemoveMonitoringCollections()
+{
+    ChangeRecorder *changeRecorder = new ChangeRecorder(this);
+    InspectableETM *model = new InspectableETM(changeRecorder, this);
+    model->setItemPopulationStrategy(EntityTreeModel::ImmediatePopulation);
+    model->setCollectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive);
+    Akonadi::Collection::List monitored;
+    monitored << col1 << col2;
+    model->setCollectionsMonitored(monitored);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    model->setCollectionMonitored(col2, false);
+
+    QTRY_VERIFY(model->isCollectionTreeFetched());
+    QVERIFY(getIndex("col1", model).isValid());
+    QVERIFY(!getIndex("col2", model).isValid());
+    QVERIFY(getIndex(mainCollectionName, model).isValid());
+    QVERIFY(!getIndex("col3", model).isValid());
+    QVERIFY(!getIndex("col4", model).isValid());
+
+    QTRY_VERIFY(getIndex("col1", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex("col2", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex(mainCollectionName, model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+    QTRY_VERIFY(!getIndex("col4", model).data(Akonadi::EntityTreeModel::IsPopulatedRole).toBool());
+}
+
+#include "etmpopulationtest.moc"
+
+QTEST_AKONADIMAIN(EtmPopulationTest, NoGUI)


commit f20db7060f6b5f8e212672b2f462861e1fbe7448
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Jun 9 19:02:13 2014 +0200

    Referenced support for CollectionModifyJob & Collection
    
    Including CollectionJobTest.

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index 7086db0..e6e4b39 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -328,5 +328,21 @@ bool Collection::shouldList(Collection::ListPurpose purpose) const
     return (localListPreference(purpose) == ListEnabled);
 }
 
+void Collection::setReferenced(bool referenced)
+{
+    Q_D(Collection);
+
+    if (d->referenced != referenced) {
+        d->referencedChanged = true;
+    }
+    d->referenced = referenced;
+}
+
+bool Collection::referenced() const
+{
+    Q_D(const Collection);
+
+    return d->referenced;
+}
 
 AKONADI_DEFINE_PRIVATE(Akonadi::Collection)
diff --git a/akonadi/collection.h b/akonadi/collection.h
index ac25488..2f8f396 100644
--- a/akonadi/collection.h
+++ b/akonadi/collection.h
@@ -367,6 +367,24 @@ public:
      */
     bool shouldList(ListPurpose purpose) const;
 
+    /**
+     * Sets a collection to be referenced.
+     *
+     * A referenced collection is temporarily shown and synchronized even when disabled.
+     * A reference is only valid for the duration of a session, and is automatically removed afterwards.
+     *
+     * Referenced collections are only visible if explicitly monitored in the ETM.
+     *
+     * @since 4.14
+     */
+    void setReferenced(bool referenced);
+
+    /**
+     * Returns the referenced state of the collection.
+     * @since 4.14
+     */
+    bool referenced() const;
+
 private:
     AKONADI_DECLARE_PRIVATE(Collection)
     friend class CollectionFetchJob;
diff --git a/akonadi/collection_p.h b/akonadi/collection_p.h
index 5ff173e..2a1bb53 100644
--- a/akonadi/collection_p.h
+++ b/akonadi/collection_p.h
@@ -46,6 +46,8 @@ public:
         , syncPreference(Collection::ListDefault)
         , indexPreference(Collection::ListDefault)
         , listPreferenceChanged(false)
+        , referenced(false)
+        , referencedChanged(false)
     {}
 
     CollectionPrivate(const CollectionPrivate &other)
@@ -65,6 +67,8 @@ public:
         syncPreference = other.syncPreference;
         indexPreference = other.indexPreference;
         listPreferenceChanged = other.listPreferenceChanged;
+        referenced = other.referenced;
+        referencedChanged = other.referencedChanged;
     }
 
     ~CollectionPrivate()
@@ -82,6 +86,7 @@ public:
         cachePolicyChanged = false;
         enabledChanged = false;
         listPreferenceChanged = false;
+        referencedChanged = false;
         EntityPrivate::resetChangeLog();
     }
 
@@ -109,6 +114,8 @@ public:
     Collection::ListPreference syncPreference;
     Collection::ListPreference indexPreference;
     bool listPreferenceChanged;
+    bool referenced;
+    bool referencedChanged;
 };
 
 #endif
diff --git a/akonadi/collectionmodifyjob.cpp b/akonadi/collectionmodifyjob.cpp
index 6ae772e..afc8578 100644
--- a/akonadi/collectionmodifyjob.cpp
+++ b/akonadi/collectionmodifyjob.cpp
@@ -101,6 +101,9 @@ void CollectionModifyJob::doStart()
         changes += ' ' + ProtocolHelper::listPreference(Collection::ListSync, d->mCollection.localListPreference(Collection::ListSync));
         changes += ' ' + ProtocolHelper::listPreference(Collection::ListIndex, d->mCollection.localListPreference(Collection::ListIndex));
     }
+    if (d->mCollection.d_func()->referencedChanged) {
+        changes += ' ' + ProtocolHelper::referenced(d->mCollection.referenced());
+    }
     if (d->mCollection.attributes().count() > 0) {
         changes += ' ' + ProtocolHelper::attributesToByteArray(d->mCollection);
     }
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index 7e98b77..b7980ee 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -215,6 +215,8 @@ int ProtocolHelper::parseCollection(const QByteArray & data, Collection & collec
       collection.setLocalListPreference( Collection::ListSync, parsePreference( value ) );
     } else if ( key == "INDEX" ) {
       collection.setLocalListPreference( Collection::ListIndex, parsePreference( value ) );
+    } else if ( key == "REFERENCED" ) {
+      collection.setReferenced( value == "TRUE" );
     } else {
       Attribute* attr = AttributeFactory::createAttribute( key );
       Q_ASSERT( attr );
@@ -729,3 +731,11 @@ QByteArray ProtocolHelper::enabled(bool state)
     }
     return "ENABLED FALSE";
 }
+
+QByteArray ProtocolHelper::referenced(bool state)
+{
+    if (state) {
+      return "REFERENCED TRUE";
+    }
+    return "REFERENCED FALSE";
+}
diff --git a/akonadi/protocolhelper_p.h b/akonadi/protocolhelper_p.h
index b0303a3..844d636 100644
--- a/akonadi/protocolhelper_p.h
+++ b/akonadi/protocolhelper_p.h
@@ -236,6 +236,7 @@ public:
 
     static QByteArray listPreference(Collection::ListPurpose purpose, Collection::ListPreference preference);
     static QByteArray enabled(bool);
+    static QByteArray referenced(bool);
 };
 
 }
diff --git a/akonadi/tests/collectionjobtest.cpp b/akonadi/tests/collectionjobtest.cpp
index 566398d..59155dd 100644
--- a/akonadi/tests/collectionjobtest.cpp
+++ b/akonadi/tests/collectionjobtest.cpp
@@ -860,5 +860,54 @@ void CollectionJobTest::testListPreference()
   AKVERIFYEXEC(deleteJob);
 }
 
+void CollectionJobTest::testReference()
+{
+  Akonadi::Collection baseCol;
+  {
+    baseCol.setParentCollection(Akonadi::Collection(res1ColId));
+    baseCol.setName("base");
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(baseCol);
+    AKVERIFYEXEC(create);
+    baseCol = create->collection();
+  }
+
+  {
+    Akonadi::Collection col;
+    col.setParentCollection(baseCol);
+    col.setName("referenced");
+    col.setEnabled(false);
+    {
+      Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(col);
+      AKVERIFYEXEC(create);
+      CollectionFetchJob *job = new CollectionFetchJob(create->collection(), CollectionFetchJob::Base);
+      AKVERIFYEXEC(job);
+      col = job->collections().first();
+    }
+    {
+      col.setReferenced(true);
+      Akonadi::CollectionModifyJob *modify = new Akonadi::CollectionModifyJob(col);
+      AKVERIFYEXEC(modify);
+      CollectionFetchJob *job = new CollectionFetchJob(col, CollectionFetchJob::Base);
+      AKVERIFYEXEC(job);
+      Akonadi::Collection result = job->collections().first();
+      QCOMPARE(result.enabled(), false);
+      QCOMPARE(result.referenced(), true);
+    }
+    {
+      col.setReferenced(false);
+      Akonadi::CollectionModifyJob *modify = new Akonadi::CollectionModifyJob(col);
+      AKVERIFYEXEC(modify);
+      CollectionFetchJob *job = new CollectionFetchJob(col, CollectionFetchJob::Base);
+      AKVERIFYEXEC(job);
+      Akonadi::Collection result = job->collections().first();
+      QCOMPARE(result.enabled(), false);
+      QCOMPARE(result.referenced(), false);
+    }
+  }
+
+  //Cleanup
+  CollectionDeleteJob *deleteJob = new CollectionDeleteJob(baseCol);
+  AKVERIFYEXEC(deleteJob);
+}
 
-#include "collectionjobtest.moc"
\ No newline at end of file
+#include "collectionjobtest.moc"
diff --git a/akonadi/tests/collectionjobtest.h b/akonadi/tests/collectionjobtest.h
index 233bf0d..14b0fd0 100644
--- a/akonadi/tests/collectionjobtest.h
+++ b/akonadi/tests/collectionjobtest.h
@@ -53,6 +53,7 @@ class CollectionJobTest : public QObject
     void testRidCreateDelete();
     void testAncestorRetrieval();
     void testListPreference();
+    void testReference();
 };
 
 #endif


commit d1911e709db801b224b9196a5e2e1bd7bb1a8d11
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sat Jun 7 00:05:51 2014 +0200

    ETM-Test: Only trigger the event loop but don't wait any longer.

diff --git a/akonadi/tests/entitytreemodeltest.cpp b/akonadi/tests/entitytreemodeltest.cpp
index dd8bcbe..19145ae 100644
--- a/akonadi/tests/entitytreemodeltest.cpp
+++ b/akonadi/tests/entitytreemodeltest.cpp
@@ -64,6 +64,11 @@ static const QString serverContent1 =
     "- - - I message/rfc822                 'Item 14'"
     "- - - I message/rfc822                 'Item 15'";
 
+/**
+ * This test verifies that the ETM reacts as expected to signals from the monitor.
+ * 
+ * The tested ETM is only talking to fake components so the reaction of the ETM to each signal can be tested.
+ */
 class EntityTreeModelTest : public QObject
 {
   Q_OBJECT
@@ -211,7 +216,7 @@ void EntityTreeModelTest::testInitialFetch()
   m_modelSpy->setExpectedSignals( expectedSignals );
 
   // Give the model a chance to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   // We get all the signals we expected.
   QVERIFY(m_modelSpy->expectedSignals().isEmpty());
@@ -271,7 +276,7 @@ void EntityTreeModelTest::testCollectionMove()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -315,7 +320,7 @@ void EntityTreeModelTest::testCollectionAdded()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -364,7 +369,7 @@ void EntityTreeModelTest::testCollectionRemoved()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -416,7 +421,7 @@ void EntityTreeModelTest::testCollectionChanged()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(100);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -475,7 +480,7 @@ void EntityTreeModelTest::testItemMove()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -524,7 +529,7 @@ void EntityTreeModelTest::testItemAdded()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -580,7 +585,7 @@ void EntityTreeModelTest::testItemRemoved()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }
@@ -635,7 +640,7 @@ void EntityTreeModelTest::testItemChanged()
   serverData->processNotifications();
 
   // Give the model a change to run the event loop to process the signals.
-  QTest::qWait(10);
+  QTest::qWait(0);
 
   QVERIFY( m_modelSpy->isEmpty() );
 }


commit a2940129c6a2209a1cfcabad9541e4cf92955522
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sat Jun 7 00:04:53 2014 +0200

    ETM: Only keep collection if it has subcollections.
    
    Otherwise a disabled collection that contains items is never removed.

diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index b4d292b..f12f96f 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -719,6 +719,16 @@ void EntityTreeModelPrivate::insertCollection(const Akonadi::Collection &collect
     q->endInsertRows();
 }
 
+bool EntityTreeModelPrivate::hasChildCollection(const Collection &collection) const
+{
+    foreach (Node *node, m_childEntities[collection.id()]) {
+        if (node->type == Node::Collection) {
+            return true;
+        }
+    }
+    return false;
+}
+
 bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) const
 {
     if (isHidden(collection)) {
@@ -727,7 +737,7 @@ bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) c
 
     // We want a parent collection if it has at least one child that matches the
     // wanted mimetype
-    if (m_childEntities.contains(collection.id())) {
+    if (hasChildCollection(collection)) {
         return true;
     }
 
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index ecd3c67..9af6c7d 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -303,6 +303,7 @@ public:
      * * content mime types
      */
     bool shouldBePartOfModel(const Collection &collection) const;
+    bool hasChildCollection(const Collection &collection) const;
 };
 
 }
diff --git a/akonadi/tests/entitytreemodeltest.cpp b/akonadi/tests/entitytreemodeltest.cpp
index d98df38..dd8bcbe 100644
--- a/akonadi/tests/entitytreemodeltest.cpp
+++ b/akonadi/tests/entitytreemodeltest.cpp
@@ -88,6 +88,7 @@ private Q_SLOTS:
   void testItemRemoved();
   void testItemChanged_data();
   void testItemChanged();
+  void testRemoveCollectionOnChanged();
 
 private:
   ExpectedSignal getExpectedSignal( SignalType type, int start, int end, const QVariantList newData)
@@ -639,6 +640,44 @@ void EntityTreeModelTest::testItemChanged()
   QVERIFY( m_modelSpy->isEmpty() );
 }
 
+void EntityTreeModelTest::testRemoveCollectionOnChanged()
+{
+  const QString serverContent =
+    "- C (inode/directory, text/directory)  'Col 1'     1"
+    "- - C (text/directory)                 'Col 2'     2"
+    "- - - I text/directory                 'Item 1'";
+  const QString collectionName = "Col 2";
+  const QString monitoredMimeType = QString::fromLatin1("text/directory");
+
+  QPair<FakeServerData*, Akonadi::EntityTreeModel*> testDrivers = populateModel( serverContent, monitoredMimeType );
+  FakeServerData *serverData = testDrivers.first;
+  Akonadi::EntityTreeModel *model = testDrivers.second;
+
+  QModelIndexList list = model->match( model->index( 0, 0 ), Qt::DisplayRole, collectionName, 1, Qt::MatchRecursive );
+  Q_ASSERT( !list.isEmpty() );
+  QModelIndex changedIndex = list.first();
+  Akonadi::Collection changedCol = changedIndex.data(Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>();
+  changedCol.setContentMimeTypes(QStringList() << "foobar");
+  QString parentCollection = changedIndex.parent().data().toString();
+
+  FakeCollectionChangedCommand *changeCommand = new FakeCollectionChangedCommand( changedCol, serverData );
+
+  m_modelSpy->startSpying();
+  serverData->setCommands( QList<FakeAkonadiServerCommand*>() << changeCommand );
+
+  QList<ExpectedSignal> expectedSignals;
+  expectedSignals << getExpectedSignal( RowsAboutToBeRemoved, changedIndex.row(), changedIndex.row(), parentCollection, QVariantList() << collectionName );
+  expectedSignals << getExpectedSignal( RowsRemoved, changedIndex.row(), changedIndex.row(), parentCollection, QVariantList() << collectionName );
+
+  m_modelSpy->setExpectedSignals( expectedSignals );
+  serverData->processNotifications();
+
+  // Give the model a chance to run the event loop to process the signals.
+  QTest::qWait(0);
+
+  QVERIFY( m_modelSpy->isEmpty() );
+}
+
 #include "entitytreemodeltest.moc"
 
 QTEST_KDEMAIN(EntityTreeModelTest, NoGUI)
diff --git a/akonadi/tests/fakeakonadiservercommand.cpp b/akonadi/tests/fakeakonadiservercommand.cpp
index e715595..ad30f40 100644
--- a/akonadi/tests/fakeakonadiservercommand.cpp
+++ b/akonadi/tests/fakeakonadiservercommand.cpp
@@ -303,6 +303,10 @@ void FakeCollectionRemovedCommand::doCommand()
 
 void FakeCollectionChangedCommand::doCommand()
 {
+  if ( m_collection.isValid() ) {
+    emit_monitoredCollectionChanged( m_collection );
+    return;
+  }
   Collection collection = getCollectionByDisplayName( m_collectionName );
   Collection parent = getCollectionByDisplayName( m_parentName );
 
diff --git a/akonadi/tests/fakeakonadiservercommand.h b/akonadi/tests/fakeakonadiservercommand.h
index 3dd928c..88ee35c 100644
--- a/akonadi/tests/fakeakonadiservercommand.h
+++ b/akonadi/tests/fakeakonadiservercommand.h
@@ -157,11 +157,18 @@ public:
 
   }
 
+  FakeCollectionChangedCommand( const Akonadi::Collection &collection, FakeServerData *serverData )
+    : FakeMonitorCommand( serverData ), m_collection( collection )
+  {
+
+  }
+
   virtual ~FakeCollectionChangedCommand() {}
 
   /* reimp */ void doCommand();
 
 private:
+  Akonadi::Collection m_collection;
   QString m_collectionName;
   QString m_parentName;
 };


commit 01e473cd2c5810413797c2849c7ca81eac2eab64
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 11 14:27:21 2014 +0200

    Collection: Only set enabledChanged if it has changed.
    
    The code before would reset enabledChanged to false should we i.e. call
    setEnabled(true) twice

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index 42f1f0a..7086db0 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -274,7 +274,9 @@ void Collection::setEnabled(bool enabled)
 {
     Q_D(Collection);
 
-    d->enabledChanged = (enabled != d->enabled);
+    if (enabled != d->enabled) {
+        d->enabledChanged = true;
+    }
     d->enabled = enabled;
 }
 


commit 67f978cac69bf5c58225108fd08e487a6b8da64b
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Mon Jun 16 11:00:56 2014 +0200

    Exclude mailtransport-messagequeuejobtest from default test suite
    
    messagequeuejobtest requires akonadi_maildispatcher_agent from
    kdepim-runtime, which is not available on Jenkins when kdepimlibs
    is being built.
    
    To enable the test locally, run cmake with
    -DKDEPIMLIBS_RUN_KDEPIMRUNTIME_ISOLATED_TESTS=TRUE

diff --git a/mailtransport/tests/CMakeLists.txt b/mailtransport/tests/CMakeLists.txt
index c3ba0b6..e2e2c3c 100644
--- a/mailtransport/tests/CMakeLists.txt
+++ b/mailtransport/tests/CMakeLists.txt
@@ -67,5 +67,7 @@ target_link_libraries( abort ${KDE4_KDEUI_LIBS} mailtransport akonadi-kde)
 # Akonadi testrunner-based tests:
 
 add_akonadi_isolated_test( attributetest.cpp unittestenv )
-add_akonadi_isolated_test( messagequeuejobtest.cpp unittestenv )
 add_akonadi_isolated_test( filteractiontest.cpp unittestenv_akonadi )
+if (KDEPIMLIBS_RUN_KDEPIMRUNTIME_ISOLATED_TESTS)
+    add_akonadi_isolated_test( messagequeuejobtest.cpp unittestenv )
+endif ()
\ No newline at end of file


commit f487f7dca7b657d65814cfffcb9a6f98f2dab462
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Mon Jun 16 10:28:45 2014 +0200

    MonitorTest: Toggle resource offline after resolving the test collection

diff --git a/akonadi/tests/monitortest.cpp b/akonadi/tests/monitortest.cpp
index 839612f..d046153 100644
--- a/akonadi/tests/monitortest.cpp
+++ b/akonadi/tests/monitortest.cpp
@@ -57,9 +57,10 @@ void MonitorTest::initTestCase()
 {
   AkonadiTest::checkTestIsIsolated();
   Control::start();
-  AkonadiTest::setAllResourcesOffline();
 
   res3 = Collection( collectionIdFromPath( "res3" ) );
+
+  AkonadiTest::setAllResourcesOffline();
 }
 
 void MonitorTest::testMonitor_data()
@@ -106,7 +107,7 @@ void MonitorTest::testMonitor()
   qRegisterMetaType<Akonadi::CollectionStatistics>();
   qRegisterMetaType<QSet<QByteArray> >();
   QSignalSpy caddspy( monitor, SIGNAL(collectionAdded(Akonadi::Collection,Akonadi::Collection)) );
-  QSignalSpy cmodspy( monitor, SIGNAL(collectionChanged(Akonadi::Collection)) );
+  QSignalSpy cmodspy( monitor, SIGNAL(collectionChanged(Akonadi::Collection,QSet<QByteArray>)) );
   QSignalSpy cmvspy( monitor, SIGNAL(collectionMoved(Akonadi::Collection,Akonadi::Collection,Akonadi::Collection)) );
   QSignalSpy crmspy( monitor, SIGNAL(collectionRemoved(Akonadi::Collection)) );
   QSignalSpy cstatspy( monitor, SIGNAL(collectionStatisticsChanged(Akonadi::Collection::Id,Akonadi::CollectionStatistics)) );


commit d27058932fbfd1bbeedce9f9144dae42804fddb4
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 19:48:18 2014 +0200

    Run akonadi/kmime unit-tests only when KDEPIMLIBS_RUN_KDEPIMRUNTIME_ISOLATED_TESTS is defined
    
    These tests depend on the akonadi_maildir_resource, which is provided by
    kdepim-runtime, so they cannot be run in Jenkins, where kdepim-runtime is
    not available during kdepimlibs compilation, as that would create circular
    dependencies.
    
    Also the KMime tests are quite broken (since a long time) and I don't really
    understand how to fix them.

diff --git a/akonadi/kmime/tests/CMakeLists.txt b/akonadi/kmime/tests/CMakeLists.txt
index 1a2cfc2..1f1e4b6 100644
--- a/akonadi/kmime/tests/CMakeLists.txt
+++ b/akonadi/kmime/tests/CMakeLists.txt
@@ -54,9 +54,8 @@ macro(add_akonadi_isolated_test _source)
 endmacro()
 
 
-
-
-add_akonadi_isolated_test( localfolderstest.cpp )
-add_akonadi_isolated_test( localfoldersrequestjobtest.cpp )
-add_akonadi_isolated_test( racetest.cpp )
-
+if (KDEPIMLIBS_RUN_KDEPIMRUNTIME_ISOLATED_TESTS)
+  add_akonadi_isolated_test( localfolderstest.cpp )
+  add_akonadi_isolated_test( localfoldersrequestjobtest.cpp )
+  add_akonadi_isolated_test( racetest.cpp )
+endif()


commit fc74b3e27fe4cb637c689c46760a28401f3085dd
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 19:45:27 2014 +0200

    LocalFoldersTest: reset the defaultResourceId config value
    
    From previous testcases, the defaultResourceId is set to akonadi_knut_resource,
    but this test-case expects maildir.

diff --git a/akonadi/kmime/tests/localfolderstest.cpp b/akonadi/kmime/tests/localfolderstest.cpp
index 4a85cb1..e4792ca 100644
--- a/akonadi/kmime/tests/localfolderstest.cpp
+++ b/akonadi/kmime/tests/localfolderstest.cpp
@@ -494,10 +494,15 @@ void LocalFoldersTest::testResourceScan()
     AKVERIFYEXEC(djob);
     djob = new CollectionDeleteJob(intruder, this);
     AKVERIFYEXEC(djob);
+
+    SpecialMailCollections::self()->destroy();
 }
 
 void LocalFoldersTest::testDefaultResourceJob()
 {
+    SpecialMailCollectionsTesting *scmt = SpecialMailCollectionsTesting::_t_self();
+    scmt->_t_setDefaultResourceId(QLatin1String("akonadi_maildir_resource"));
+
     // Initially the defaut maildir does not exist.
     QVERIFY(!QFile::exists(KGlobal::dirs()->localxdgdatadir() + QLatin1String("local-mail")));
 


commit 7a16af2ee47df03e44eb2277c2c358ec2c687f34
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 19:44:28 2014 +0200

    LocalFoldersTest: include Akonadi instance name in org.kde.pim service name

diff --git a/akonadi/kmime/tests/localfolderstest.cpp b/akonadi/kmime/tests/localfolderstest.cpp
index a7c6015..4a85cb1 100644
--- a/akonadi/kmime/tests/localfolderstest.cpp
+++ b/akonadi/kmime/tests/localfolderstest.cpp
@@ -38,6 +38,7 @@
 #include <akonadi/collectionfetchjob.h>
 #include <akonadi/collectionmodifyjob.h>
 #include <akonadi/control.h>
+#include <akonadi/servermanager.h>
 #include <akonadi/qtest_akonadi.h>
 #include "../../specialcollectionattribute_p.h"
 #include "../../specialcollections_p.h"
@@ -87,7 +88,11 @@ void LocalFoldersTest::initTestCase()
 
 void LocalFoldersTest::testLock()
 {
-    const QString dbusName = QString::fromLatin1("org.kde.pim.SpecialCollections");
+    QString dbusName = QString::fromLatin1("org.kde.pim.SpecialCollections");
+    if (ServerManager::hasInstanceIdentifier()) {
+      dbusName += Akonadi::ServerManager::instanceIdentifier();
+    }
+
 
     // Initially not locked.
     QVERIFY(!DBusConnectionPool::threadConnection().interface()->isServiceRegistered(dbusName));


commit d589301ab99a5074abcb88f93fd3113006f209cf
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 19:11:24 2014 +0200

    SpecialMailCollectionsTesting: write settings directly to file
    
    SMCT and SMC use different instances of KConfigSkeleton, so just storing
    the configuration in variable is not enough, we need to actually write it
    to the config file, to make sure that SMC picks up the changes.

diff --git a/akonadi/kmime/specialmailcollectionstesting.cpp b/akonadi/kmime/specialmailcollectionstesting.cpp
index ebbc459..0b24971 100644
--- a/akonadi/kmime/specialmailcollectionstesting.cpp
+++ b/akonadi/kmime/specialmailcollectionstesting.cpp
@@ -38,7 +38,8 @@ SpecialMailCollectionsTesting *SpecialMailCollectionsTesting::_t_self()
 
 void SpecialMailCollectionsTesting::_t_setDefaultResourceId(const QString &resourceId)
 {
-    Settings::setDefaultResourceId(resourceId);
+    Settings::self()->defaultResourceIdItem()->setValue(resourceId);
+    Settings::self()->writeConfig();
 }
 
 void SpecialMailCollectionsTesting::_t_forgetFoldersForResource(const QString &resourceId)


commit 438ebe5d642fed76957e373e838257c3308867a1
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 18:00:01 2014 +0200

    Comparing two invalid Entities should always return true
    
    Every time a new invalid Entity is constructed, it's assigned a decremental
    negative number. Since two invalid Entities always have different negative
    numbers, simple Item() == Item() comparision would return false, as internally
    only IDs were compared. From logical point of view it makes however sense
    for invalid Entities to be considered equal.
    
    As of now, operator==() and operator!=() takes entity validity in consideration,
    so Item() == Item() is always true and Item() != Item() is always false.

diff --git a/akonadi/entity.cpp b/akonadi/entity.cpp
index bf5ce5c..6bade85 100644
--- a/akonadi/entity.cpp
+++ b/akonadi/entity.cpp
@@ -101,12 +101,13 @@ bool Entity::isValid() const
 
 bool Entity::operator==(const Entity &other) const
 {
-    return (d_ptr->mId == other.d_ptr->mId);
+    // Invalid items are the same, no matter what their internal ID is
+    return (!isValid() && !other.isValid()) || (d_ptr->mId == other.d_ptr->mId);
 }
 
 bool Akonadi::Entity::operator!=(const Entity &other) const
 {
-    return d_ptr->mId != other.d_ptr->mId;
+    return (isValid() || other.isValid()) && (d_ptr->mId != other.d_ptr->mId);
 }
 
 Entity &Entity ::operator=(const Entity &other)
diff --git a/akonadi/tests/itemtest.cpp b/akonadi/tests/itemtest.cpp
index 5eaf57c..9fec0be 100644
--- a/akonadi/tests/itemtest.cpp
+++ b/akonadi/tests/itemtest.cpp
@@ -93,3 +93,31 @@ void ItemTest::testParentCollection ()
   b = g;
   QCOMPARE( b.parentCollection(), col );
 }
+
+void ItemTest::testComparision_data()
+{
+    QTest::addColumn<Akonadi::Item>("itemA");
+    QTest::addColumn<Akonadi::Item>("itemB");
+    QTest::addColumn<bool>("match");
+
+    QTest::newRow("both invalid, same invalid IDs") << Item(-10) << Item(-10) << true;
+    QTest::newRow("both invalid, different invalid IDs") << Item(-11) << Item(-12) << true;
+    QTest::newRow("one valid") << Item(1) << Item() << false;
+    QTest::newRow("both valid, same IDs") << Item(2) << Item(2) << true;
+    QTest::newRow("both valid, different IDs") << Item(3) << Item(4) << false;
+}
+
+void ItemTest::testComparision()
+{
+    QFETCH(Akonadi::Item, itemA);
+    QFETCH(Akonadi::Item, itemB);
+    QFETCH(bool, match);
+
+    if (match) {
+        QVERIFY(itemA == itemB);
+        QVERIFY(!(itemA != itemB));
+    } else {
+        QVERIFY(itemA != itemB);
+        QVERIFY(!(itemA == itemB));
+    }
+}
diff --git a/akonadi/tests/itemtest.h b/akonadi/tests/itemtest.h
index 16f2595..b598ff2 100644
--- a/akonadi/tests/itemtest.h
+++ b/akonadi/tests/itemtest.h
@@ -29,6 +29,9 @@ class ItemTest : public QObject
     void testMultipart();
     void testInheritance();
     void testParentCollection();
+
+    void testComparision_data();
+    void testComparision();
 };
 
 #endif


commit b80ad5009c38d87379079ef82cae793101ca1a37
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 16:04:31 2014 +0200

    Run akonadi/kmime isolated test against SQLite, not MySQL
    
    There's really no reason to start MySQL for a unit-test if we can use
    SQLite now just fine.

diff --git a/akonadi/kmime/tests/unittestenv/config.xml b/akonadi/kmime/tests/unittestenv/config.xml
index 88cdde8..57e05d3 100644
--- a/akonadi/kmime/tests/unittestenv/config.xml
+++ b/akonadi/kmime/tests/unittestenv/config.xml
@@ -4,4 +4,6 @@
   <datahome>xdglocal</datahome>
   <agent synchronize="true">akonadi_knut_resource</agent>
   <envvar name="AKONADI_DISABLE_AGENT_AUTOSTART">true</envvar>
+  <envvar name="TESTRUNNER_DB_ENVIRONMENT">sqlite</envvar>
+  <envvar name="AKONADI_OVERRIDE_SEARCHPLUGIN">akonadi_test_searchplugin</envvar>
 </config>
diff --git a/akonadi/kmime/tests/unittestenv/xdgconfig/akonadi/akonadiserverrc b/akonadi/kmime/tests/unittestenv/xdgconfig/akonadi/akonadiserverrc
index 7f738ce..1790d7e 100644
--- a/akonadi/kmime/tests/unittestenv/xdgconfig/akonadi/akonadiserverrc
+++ b/akonadi/kmime/tests/unittestenv/xdgconfig/akonadi/akonadiserverrc
@@ -1,4 +1,7 @@
 [%General]
+# This is a slightly adjusted version of the QSQLITE driver from Qt
+# It is provided by akonadi itself
+Driver=QSQLITE3
 
 [Search]
 Manager=Dummy


commit 9f5cbb10975f3b27f06cd1a24f212378e4a68bf0
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 15:57:06 2014 +0200

    Disable itembenchmarktest for now
    
    Benchmarks are cool, but only if you have anything to compare the results
    again, which we don't. Any major performance regressions will be spotted
    by devs anyway, so there's little point running the benchmark, which takes
    over 40 seconds, on Jenkins.
    
    Developers can run it locally if they wish.

diff --git a/akonadi/tests/CMakeLists.txt b/akonadi/tests/CMakeLists.txt
index e2a4e24..107cea3 100644
--- a/akonadi/tests/CMakeLists.txt
+++ b/akonadi/tests/CMakeLists.txt
@@ -139,9 +139,14 @@ add_akonadi_isolated_test(linktest.cpp)
 add_akonadi_isolated_test(cachetest.cpp)
 # starting/stopping the server in the testenvironment doesn't seem to work, 
 # and the test is not very critical (we'll notice if we can't start the server), so we disable it for now.
-# add_akonadi_isolated_test(servermanagertest.cpp)
+#add_akonadi_isolated_test(servermanagertest.cpp)
 add_akonadi_isolated_test(collectioncreator.cpp)
-add_akonadi_isolated_test(itembenchmark.cpp)
+
+
+# Having a benchmark is cool if you have any reference to compare against, but this
+# benchmark takes over 40 seconds and does not have any real value to us atm. Major
+# performance regressions would be spotted by devs anyway, so disabling for now.
+#add_akonadi_isolated_test(itembenchmark.cpp)
 add_akonadi_isolated_test(gidtest.cpp)
 add_akonadi_isolated_test(lazypopulationtest.cpp)
 add_akonadi_isolated_test(favoriteproxytest.cpp)


commit 2a150aba64d1ffc4828027ccf01fe7d4bcdf7a49
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Wed Jun 11 15:41:55 2014 +0200

    Fix MonitorTest's metatype issues and adapt to changes in signal order
    
    This test was broken for a long time due to Qt not supporting qRegisterMetaType
    for typedefs correctly. This has been fixed in Qt 4.7, so we can use the test now.
    
    Slight modifications to the test were needed: the order of collectionStatisticsChanged
    notifications is reversed in case of item move, and collection(Un)Subscribed signals are
    now preceded by collectionChanged() signal.

diff --git a/akonadi/tests/monitortest.cpp b/akonadi/tests/monitortest.cpp
index 6356125..839612f 100644
--- a/akonadi/tests/monitortest.cpp
+++ b/akonadi/tests/monitortest.cpp
@@ -80,7 +80,28 @@ void MonitorTest::testMonitor()
 
   // monitor signals
   qRegisterMetaType<Akonadi::Collection>();
-  qRegisterMetaType<Akonadi::Collection::Id>();
+  /*
+     qRegisterMetaType<Akonadi::Collection::Id>() registers the type with a
+     name of "qlonglong".  Doing
+     qRegisterMetaType<Akonadi::Collection::Id>( "Akonadi::Collection::Id" )
+     doesn't help. (works now , see QTBUG-937 and QTBUG-6833, -- dvratil)
+
+     The problem here is that Akonadi::Collection::Id is a typedef to qlonglong,
+     and qlonglong is already a registered meta type.  So the signal spy will
+     give us a QVariant of type Akonadi::Collection::Id, but calling
+     .value<Akonadi::Collection::Id>() on that variant will in fact end up
+     calling qvariant_cast<qlonglong>.  From the point of view of QMetaType,
+     Akonadi::Collection::Id and qlonglong are different types, so QVariant
+     can't convert, and returns a default-constructed qlonglong, zero.
+
+     When connecting to a real slot (without QSignalSpy), this problem is
+     avoided, because the casting is done differently (via a lot of void
+     pointers).
+
+     The docs say nothing about qRegisterMetaType -ing a typedef, so I'm not
+     sure if this is a bug or not. (cberzan)
+   */
+  qRegisterMetaType<Akonadi::Collection::Id>("Akonadi::Collection::Id");
   qRegisterMetaType<Akonadi::Item>();
   qRegisterMetaType<Akonadi::CollectionStatistics>();
   qRegisterMetaType<QSet<QByteArray> >();
@@ -149,31 +170,8 @@ void MonitorTest::testMonitor()
 
   QCOMPARE( cstatspy.count(), 1 );
   arg = cstatspy.takeFirst();
-  QEXPECT_FAIL( "", "Don't know how to handle 'Akonadi::Collection::Id', use qRegisterMetaType to register it. <-- I did this, but it still doesn't work!", Continue );
   QCOMPARE( arg.at(0).value<Akonadi::Collection::Id>(), monitorCol.id() );
 
-  /*
-     qRegisterMetaType<Akonadi::Collection::Id>() registers the type with a
-     name of "qlonglong".  Doing
-     qRegisterMetaType<Akonadi::Collection::Id>( "Akonadi::Collection::Id" )
-     doesn't help.
-
-     The problem here is that Akonadi::Collection::Id is a typedef to qlonglong,
-     and qlonglong is already a registered meta type.  So the signal spy will
-     give us a QVariant of type Akonadi::Collection::Id, but calling
-     .value<Akonadi::Collection::Id>() on that variant will in fact end up
-     calling qvariant_cast<qlonglong>.  From the point of view of QMetaType,
-     Akonadi::Collection::Id and qlonglong are different types, so QVariant
-     can't convert, and returns a default-constructed qlonglong, zero.
-
-     When connecting to a real slot (without QSignalSpy), this problem is
-     avoided, because the casting is done differently (via a lot of void
-     pointers).
-
-     The docs say nothing about qRegisterMetaType -ing a typedef, so I'm not
-     sure if this is a bug or not. (cberzan)
-   */
-
   QCOMPARE( iaddspy.count(), 1 );
   arg = iaddspy.takeFirst();
   Item item = arg.at( 0 ).value<Item>();
@@ -200,7 +198,6 @@ void MonitorTest::testMonitor()
 
   QCOMPARE( cstatspy.count(), 1 );
   arg = cstatspy.takeFirst();
-  QEXPECT_FAIL( "", "Don't know how to handle 'Akonadi::Collection::Id', use qRegisterMetaType to register it. <-- I did this, but it still doesn't work!", Continue );
   QCOMPARE( arg.at(0).value<Collection::Id>(), monitorCol.id() );
 
   QCOMPARE( imodspy.count(), 1 );
@@ -226,15 +223,11 @@ void MonitorTest::testMonitor()
   ItemMoveJob *move = new ItemMoveJob( item, res3 );
   AKVERIFYEXEC( move );
   QVERIFY( QTest::kWaitForSignal( monitor, SIGNAL(collectionStatisticsChanged(Akonadi::Collection::Id,Akonadi::CollectionStatistics)), 1000 ) );
-
   QCOMPARE( cstatspy.count(), 2 );
-  arg = cstatspy.takeFirst();
-  ///TODO: maybe the order is random, i.e. first res3 then monitorCol - fix it once the MetaType issue is resolved
-  QEXPECT_FAIL( "", "Don't know how to handle 'Akonadi::Collection::Id', use qRegisterMetaType to register it. <-- I did this, but it still doesn't work!", Continue );
-  QCOMPARE( arg.at(0).value<Collection::Id>(), monitorCol.id() );
-  arg = cstatspy.takeLast();
-  QEXPECT_FAIL( "", "Don't know how to handle 'Akonadi::Collection::Id', use qRegisterMetaType to register it. <-- I did this, but it still doesn't work!", Continue );
+  arg = cstatspy.takeFirst();       // the destination collection
   QCOMPARE( arg.at(0).value<Collection::Id>(), res3.id() );
+  arg = cstatspy.takeLast();        // the source collection
+  QCOMPARE( arg.at(0).value<Collection::Id>(), monitorCol.id() );
 
   QCOMPARE( imvspy.count(), 1 );
   arg = imvspy.takeFirst();
@@ -262,8 +255,7 @@ void MonitorTest::testMonitor()
 
   QCOMPARE( cstatspy.count(), 1 );
   arg = cstatspy.takeFirst();
-  QEXPECT_FAIL( "", "Don't know how to handle 'Akonadi::Collection::Id', use qRegisterMetaType to register it. <-- I did this, but it still doesn't work!", Continue );
-  QCOMPARE( arg.at(0).value<Collection::Id>(), monitorCol.id() );
+  QCOMPARE( arg.at(0).value<Collection::Id>(), res3.id() );
   cmodspy.clear();
 
   QCOMPARE( irmspy.count(), 1 );
@@ -291,7 +283,13 @@ void MonitorTest::testMonitor()
   SubscriptionJob *subscribeJob = new SubscriptionJob( this );
   subscribeJob->unsubscribe( Collection::List() << subCollection );
   AKVERIFYEXEC( subscribeJob );
+  // Wait for unsubscribed signal, it goes after changed, so we can check for both
   QVERIFY( QTest::kWaitForSignal( monitor, SIGNAL(collectionUnsubscribed(Akonadi::Collection)), 1000 ) );
+  QCOMPARE( cmodspy.size(), 1 );
+  arg = cmodspy.takeFirst();
+  col = arg.at( 0 ).value<Collection>();
+  QCOMPARE( col.id(), subCollection.id() );
+
   QVERIFY( cSubscribedSpy.isEmpty() );
   QCOMPARE( cUnsubscribedSpy.size(), 1 );
   arg = cUnsubscribedSpy.takeFirst();
@@ -301,7 +299,13 @@ void MonitorTest::testMonitor()
   subscribeJob = new SubscriptionJob( this );
   subscribeJob->subscribe( Collection::List() << subCollection );
   AKVERIFYEXEC( subscribeJob );
+  // Wait for subscribed signal, it goes after changed, so we can check for both
   QVERIFY( QTest::kWaitForSignal( monitor, SIGNAL(collectionSubscribed(Akonadi::Collection,Akonadi::Collection)), 1000 ) );
+  QCOMPARE( cmodspy.size(), 1 );
+  arg = cmodspy.takeFirst();
+  col = arg.at( 0 ).value<Collection>();
+  QCOMPARE( col.id(), subCollection.id() );
+
   QVERIFY( cUnsubscribedSpy.isEmpty() );
   QCOMPARE( cSubscribedSpy.size(), 1 );
   arg = cSubscribedSpy.takeFirst();


commit 467468471dbec2bc36c7d8eb20f336345be15722
Author: Montel Laurent <montel at kde.org>
Date:   Wed Jun 11 09:26:19 2014 +0200

    Pedantic

diff --git a/akonadi/tagmanagementdialog.cpp b/akonadi/tagmanagementdialog.cpp
index e762359..cdc5dfc 100644
--- a/akonadi/tagmanagementdialog.cpp
+++ b/akonadi/tagmanagementdialog.cpp
@@ -32,7 +32,7 @@ struct TagManagementDialog::Private {
     Private(KDialog *parent)
         : d(parent)
     {
-    };
+    }
     void writeConfig();
     void readConfig();
     KDialog *d;


commit b07f02e1b6035dbc59af4dab4f58c04b09f829a0
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Tue Jun 10 14:41:43 2014 +0200

    Fix ItemDeleteTest
    
    Take into account new rules for Tag creation (tag with RID can only
    be created by a resource).

diff --git a/akonadi/tests/itemdeletetest.cpp b/akonadi/tests/itemdeletetest.cpp
index b5bcdf3..14b7acc 100644
--- a/akonadi/tests/itemdeletetest.cpp
+++ b/akonadi/tests/itemdeletetest.cpp
@@ -125,7 +125,6 @@ class ItemDeleteTest : public QObject
       // Create tag
       Tag tag;
       tag.setName( QLatin1String( "Tag1" ) );
-      tag.setRemoteId( "Tag1" );
       tag.setGid( "Tag1" );
       TagCreateJob *tjob = new TagCreateJob( tag, this );
       AKVERIFYEXEC( tjob );


commit 6a29956a090fb71c9277ebcc5798d463a45fa4ea
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Mon Jun 9 11:46:37 2014 +0200

    Fix ResourceSchedulerTest
    
    The AttributesSync task type now has a higher priority, reflect it in the test.

diff --git a/akonadi/tests/resourceschedulertest.cpp b/akonadi/tests/resourceschedulertest.cpp
index 543cdb7..7a38c8d 100644
--- a/akonadi/tests/resourceschedulertest.cpp
+++ b/akonadi/tests/resourceschedulertest.cpp
@@ -332,21 +332,21 @@ void ResourceSchedulerTest::testPriorities()
   scheduler.taskDone();
 
   QTest::qWait( 1 );
-  QCOMPARE( collectionTreeSyncSpy.count(), 1 );
+  QCOMPARE( collectionTreeSyncSpy.count(), 0 );
   QCOMPARE( changeReplaySpy.count(), 1 );
   QCOMPARE( syncSpy.count(), 0 );
   QCOMPARE( fullSyncSpy.count(), 0 );
   QCOMPARE( fetchSpy.count(), 1 );
-  QCOMPARE( attributesSyncSpy.count(), 0 );
+  QCOMPARE( attributesSyncSpy.count(), 1 );
   scheduler.taskDone();
 
   QTest::qWait( 1 );
   QCOMPARE( collectionTreeSyncSpy.count(), 1 );
   QCOMPARE( changeReplaySpy.count(), 1 );
-  QCOMPARE( syncSpy.count(), 1 );
+  QCOMPARE( syncSpy.count(), 0 );
   QCOMPARE( fullSyncSpy.count(), 0 );
   QCOMPARE( fetchSpy.count(), 1 );
-  QCOMPARE( attributesSyncSpy.count(), 0 );
+  QCOMPARE( attributesSyncSpy.count(), 1 );
   scheduler.taskDone();
 
   QTest::qWait( 1 );


commit a5052d22053dab185e1415c613ed95c2df331f96
Author: David Faure <faure at kde.org>
Date:   Sat Jun 7 10:47:22 2014 +0200

    Speed up opening the folder properties dialog in kmail.
    
    An IMAP mail check schedules a large number of tasks.
    Tasks that the user is waiting for, such as ItemFetch (reading one mail)
    or SyncCollectionAttributes (as called by the folder properties dialog)
    should have priority over that.
    
    There might be more types of tasks that the user could potentially be waiting for.
    Maybe we could even blacklist instead of whitelist, i.e. put folder-sync tasks
    in a low-prio queue, while the default queue would be above it. Not sure.
    
    BUG: 314876 325756
    REVIEW: 118602
    
    Conflicts:
    	akonadi/resourcescheduler_p.h

diff --git a/akonadi/resourcescheduler.cpp b/akonadi/resourcescheduler.cpp
index 0c57a09..dad51a6 100644
--- a/akonadi/resourcescheduler.cpp
+++ b/akonadi/resourcescheduler.cpp
@@ -462,7 +462,8 @@ ResourceScheduler::QueueType ResourceScheduler::queueTypeForTaskType( TaskType t
   case RecursiveMoveReplay:
     return ChangeReplayQueue;
   case FetchItem:
-    return ItemFetchQueue;
+  case SyncCollectionAttributes:
+    return UserActionQueue;
   default:
     return GenericTaskQueue;
   }
diff --git a/akonadi/resourcescheduler_p.h b/akonadi/resourcescheduler_p.h
index 8ea8987..3dfaa5f 100644
--- a/akonadi/resourcescheduler_p.h
+++ b/akonadi/resourcescheduler_p.h
@@ -244,19 +244,21 @@ private:
     void signalTaskToTracker(const Task &task, const QByteArray &taskType, const QString &debugString = QString());
 
     // We have a number of task queues, by order of priority.
+    // * PrependTaskQueue is for deferring the current task
     // * ChangeReplay must be first:
     //    change replays have to happen before we pull changes from the backend, otherwise
     //    we will overwrite our still unsaved local changes if the backend can't do
     //    incremental retrieval
     //
     // * then the stuff that is "immediately after change replay", like writeFile calls.
-    // * then ItemFetch tasks, because they are made by blocking DBus calls
-    // * then everything else.
+    // * then tasks which the user is waiting for, like ItemFetch (clicking on a mail) or
+    //        SyncCollectionAttributes (folder properties dialog in kmail)
+    // * then everything else (which includes the background email checking, which can take quite some time).
     enum QueueType {
         PrependTaskQueue,
         ChangeReplayQueue, // one task at most
         AfterChangeReplayQueue, // also one task at most, currently
-        ItemFetchQueue,
+      UserActionQueue,
         GenericTaskQueue,
         NQueueCount
     };


commit 3526ca92527cc1093ee8e7175ecb81f5617b133e
Author: Sergio Martins <iamsergio at gmail.com>
Date:   Sat Jun 7 18:48:39 2014 +0100

    Relax this organizer check when creating a new event.
    
    It can happen during normal usage, like when copy-pasting an event.
    
    Not sure if we should allow copy-pasting such events though, and if we
    do, should we make us the organizer ?
    
    CCMAIL: dfaure at kde.org

diff --git a/akonadi/calendar/itiphandlerhelper_p.cpp b/akonadi/calendar/itiphandlerhelper_p.cpp
index 6eaf5f5..ee3b68a 100644
--- a/akonadi/calendar/itiphandlerhelper_p.cpp
+++ b/akonadi/calendar/itiphandlerhelper_p.cpp
@@ -179,10 +179,9 @@ ITIPHandlerHelper::sendIncidenceCreatedMessage(KCalCore::iTIPMethod method,
     /// When we created the incidence, we *must* be the organizer.
 
     if (!weAreOrganizerOf(incidence)) {
-        kError() << "We should be the organizer of this incidence!"
+        kWarning() << "Creating incidence which has another organizer! Will skip sending invitations."
                  << "; email= "       << incidence->organizer()->email()
                  << "; thatIsMe() = " << Akonadi::CalendarUtils::thatIsMe(incidence->organizer()->email());
-        Q_ASSERT(false);
         return ITIPHandlerHelper::ResultFailAbortUpdate;
     }
 


commit a406f9337e519a87b2838b6f8bc68ea8a9fc2be6
Author: David Jarvie <djarvie at kde.org>
Date:   Thu Jun 5 23:12:42 2014 +0100

    Add tests at time zone shift boundary

diff --git a/kcalcore/tests/testicaltimezones.cpp b/kcalcore/tests/testicaltimezones.cpp
index fadffbb..27c5bb1 100644
--- a/kcalcore/tests/testicaltimezones.cpp
+++ b/kcalcore/tests/testicaltimezones.cpp
@@ -335,6 +335,10 @@ void ICalTimeZonesTest::offsetAtZoneTime()
     QVERIFY(tz.isValid());
 
     // Standard time: start of definitions at 2:00:00 local time
+    QCOMPARE(tz.offsetAtZoneTime(QDTLocal(1967,10,29, 0,59,59), &offset2), -4 * 3600);
+    QCOMPARE(offset2, -4 * 3600);
+    QCOMPARE(tz.offsetAtZoneTime(QDTLocal(1967,10,29, 1,0,0), &offset2), -4 * 3600);
+    QCOMPARE(offset2, -5 * 3600);
     QCOMPARE(tz.offsetAtZoneTime(QDTLocal(1967,10,29, 1,59,59), &offset2), -4 * 3600);
     QCOMPARE(offset2, -5 * 3600);
     QCOMPARE(tz.offsetAtZoneTime(QDTLocal(1967,10,29, 2,0,0), &offset2), -5 * 3600);


commit b93c27f9dfba4f382c02b8c5fc9d91e89c8c9d40
Author: David Jarvie <djarvie at kde.org>
Date:   Thu Jun 5 01:33:48 2014 +0100

    Fix macros setting up date/times

diff --git a/kcalcore/tests/testicaltimezones.cpp b/kcalcore/tests/testicaltimezones.cpp
index ceaaf03..fadffbb 100644
--- a/kcalcore/tests/testicaltimezones.cpp
+++ b/kcalcore/tests/testicaltimezones.cpp
@@ -40,8 +40,8 @@ using namespace KCalCore;
 static icalcomponent *loadCALENDAR(const char *vcal);
 static icalcomponent *loadVTIMEZONE(const char *vtz);
 
-#define QDTUtc(y,mo,d,h,mi,s)  QDateTime(QDate(y,mo,d), QTime(h,mi,d), Qt::UTC)
-#define QDTLocal(y,mo,d,h,mi,s)  QDateTime(QDate(y,mo,d), QTime(h,mi,d), Qt::LocalTime)
+#define QDTUtc(y,mo,d,h,mi,s)  QDateTime(QDate(y,mo,d), QTime(h,mi,s), Qt::UTC)
+#define QDTLocal(y,mo,d,h,mi,s)  QDateTime(QDate(y,mo,d), QTime(h,mi,s), Qt::LocalTime)
 
 static QDateTime start(QDate(1967,10,29), QTime(6,0,0), Qt::UTC);
 static QDateTime daylight87(QDate(1987,4,5),   QTime(7,0,0), Qt::UTC);


commit d6dbd0d3a6ddab6df63974b694fca48128702bb1
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Jun 5 17:54:41 2014 +0200

    Cleanup of support for enabled state.
    
    Includes comments by David Jarvie, thanks!
    
    REVIEW: 118525

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index 61073a2..42f1f0a 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -274,7 +274,7 @@ void Collection::setEnabled(bool enabled)
 {
     Q_D(Collection);
 
-    d->enabledChanged = true;
+    d->enabledChanged = (enabled != d->enabled);
     d->enabled = enabled;
 }
 
diff --git a/akonadi/collection.h b/akonadi/collection.h
index e5917a6..ac25488 100644
--- a/akonadi/collection.h
+++ b/akonadi/collection.h
@@ -297,6 +297,13 @@ public:
      * This can be used in conjunction with the local list preference for finer grained control
      * to define if a collection should be included depending on the purpose.
      *
+     * For example: A collection is by default enabled, meaning it is displayed to the user, synchronized by the resource,
+     * and indexed by the indexer. A disabled collection on the other hand is not displayed, sychronized or indexed.
+     * The local list preference allows to locally override that default value for each purpose individually.
+     *
+     * The enabled state can be synchronized by backends.
+     * E.g. an imap resource may synchronize this with the subscription state.
+     *
      * @since 4.14
      * @see setLocalListPreference
      */
@@ -352,7 +359,7 @@ public:
     ListPreference localListPreference(ListPurpose purpose) const;
 
     /**
-     * Returns wether the collection should be listed or not for the specified purpose
+     * Returns whether the collection should be listed or not for the specified purpose
      * Takes enabled state and local preference into account.
      *
      * @since 4.14
diff --git a/akonadi/collectionfetchscope.h b/akonadi/collectionfetchscope.h
index 0f14960..a857930 100644
--- a/akonadi/collectionfetchscope.h
+++ b/akonadi/collectionfetchscope.h
@@ -140,7 +140,7 @@ public:
     /**
      * Sets a filter for the collections to be listed.
      *
-     * Note that collections that are required to complete the tree, but are not part of the collection are still included in the listing.
+     * Note that collections that do not match the filter are included if required to complete the tree.
      *
      * @since 4.14
      */
diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index 76f405f..b4d292b 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -738,19 +738,19 @@ bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) c
         return false;
     }
 
-    if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Enabled) {
+    if (m_listFilter == CollectionFetchScope::Enabled) {
         if (!collection.enabled()) {
             return false;
         }
-    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Display) {
+    } else if (m_listFilter == CollectionFetchScope::Display) {
         if (!collection.shouldList(Collection::ListDisplay)) {
             return false;
         }
-    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Sync) {
+    } else if (m_listFilter == CollectionFetchScope::Sync) {
         if (!collection.shouldList(Collection::ListSync)) {
             return false;
         }
-    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Index) {
+    } else if (m_listFilter == CollectionFetchScope::Index) {
         if (!collection.shouldList(Collection::ListIndex)) {
             return false;
         }


commit 82f4ecf8d7c181a18e9727309175920b90879694
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jun 4 21:23:06 2014 +0200

    Support for enabled state and local preference.
    
    This patch replaces local subscriptions with the enabled state + local preferences.

diff --git a/akonadi/collection.cpp b/akonadi/collection.cpp
index 9b12f93..61073a2 100644
--- a/akonadi/collection.cpp
+++ b/akonadi/collection.cpp
@@ -270,4 +270,61 @@ void Akonadi::Collection::setVirtual(bool isVirtual)
     d->isVirtual = isVirtual;
 }
 
+void Collection::setEnabled(bool enabled)
+{
+    Q_D(Collection);
+
+    d->enabledChanged = true;
+    d->enabled = enabled;
+}
+
+bool Collection::enabled() const
+{
+    Q_D(const Collection);
+
+    return d->enabled;
+}
+
+void Collection::setLocalListPreference(Collection::ListPurpose purpose, Collection::ListPreference preference)
+{
+    Q_D(Collection);
+
+    switch(purpose) {
+    case ListDisplay:
+        d->displayPreference = preference;
+        break;
+    case ListSync:
+        d->syncPreference = preference;
+        break;
+    case ListIndex:
+        d->indexPreference = preference;
+        break;
+    }
+    d->listPreferenceChanged = true;
+}
+
+Collection::ListPreference Collection::localListPreference(Collection::ListPurpose purpose) const
+{
+    Q_D(const Collection);
+
+    switch(purpose) {
+    case ListDisplay:
+        return d->displayPreference;
+    case ListSync:
+        return d->syncPreference;
+    case ListIndex:
+        return d->indexPreference;
+    }
+    return ListDefault;
+}
+
+bool Collection::shouldList(Collection::ListPurpose purpose) const
+{
+    if (localListPreference(purpose) == ListDefault) {
+        return enabled();
+    }
+    return (localListPreference(purpose) == ListEnabled);
+}
+
+
 AKONADI_DEFINE_PRIVATE(Akonadi::Collection)
diff --git a/akonadi/collection.h b/akonadi/collection.h
index 8539a37..e5917a6 100644
--- a/akonadi/collection.h
+++ b/akonadi/collection.h
@@ -288,6 +288,78 @@ public:
      */
     void setVirtual(bool isVirtual);
 
+    /**
+     * Sets the collection's enabled state.
+     *
+     * Use this mechanism to set if a collection should be available
+     * to the user or not.
+     *
+     * This can be used in conjunction with the local list preference for finer grained control
+     * to define if a collection should be included depending on the purpose.
+     *
+     * @since 4.14
+     * @see setLocalListPreference
+     */
+    void setEnabled(bool enabled);
+
+    /**
+     * Returns the collection's enabled state.
+     * @since 4.14
+     * @see localListPreference
+     */
+    bool enabled() const;
+
+    /**
+     * Describes the list preference value
+     *
+     * @since 4.14
+     */
+    enum ListPreference {
+        ListEnabled,  ///< Enable collection for specified purpose
+        ListDisabled, ///< Disable collectoin for specified purpose
+        ListDefault   ///< Fallback to enabled state
+    };
+
+    /**
+     * Describes the purpose of the listing
+     *
+     * @since 4.14
+     */
+    enum ListPurpose {
+        ListSync,     ///< Listing for synchronization
+        ListDisplay,  ///< Listing for display to the user
+        ListIndex     ///< Listing for indexing the content
+    };
+
+    /**
+     * Sets the local list preference for the specified purpose.
+     *
+     * The local list preference overrides the enabled state unless set to ListDefault.
+     * In case of ListDefault the enabled state should be taken as fallback (shouldList() implements this logic).
+     *
+     * The default value is ListDefault.
+     *
+     * @since 4.14
+     * @see shouldList, setEnabled
+     */
+    void setLocalListPreference(ListPurpose purpose, ListPreference preference);
+
+    /**
+     * Returns the local list preference for the specified purpose.
+     * @since 4.14
+     * @see setLocalListPreference
+     */
+    ListPreference localListPreference(ListPurpose purpose) const;
+
+    /**
+     * Returns wether the collection should be listed or not for the specified purpose
+     * Takes enabled state and local preference into account.
+     *
+     * @since 4.14
+     * @see setLocalListPreference, setEnabled
+     */
+    bool shouldList(ListPurpose purpose) const;
+
 private:
     AKONADI_DECLARE_PRIVATE(Collection)
     friend class CollectionFetchJob;
diff --git a/akonadi/collection_p.h b/akonadi/collection_p.h
index a3e4872..5ff173e 100644
--- a/akonadi/collection_p.h
+++ b/akonadi/collection_p.h
@@ -40,6 +40,12 @@ public:
         , contentTypesChanged(false)
         , cachePolicyChanged(false)
         , isVirtual(false)
+        , enabled(true)
+        , enabledChanged(false)
+        , displayPreference(Collection::ListDefault)
+        , syncPreference(Collection::ListDefault)
+        , indexPreference(Collection::ListDefault)
+        , listPreferenceChanged(false)
     {}
 
     CollectionPrivate(const CollectionPrivate &other)
@@ -53,6 +59,12 @@ public:
         contentTypesChanged = other.contentTypesChanged;
         cachePolicyChanged = other.cachePolicyChanged;
         isVirtual = other.isVirtual;
+        enabled = other.enabled;
+        enabledChanged = other.enabledChanged;
+        displayPreference = other.displayPreference;
+        syncPreference = other.syncPreference;
+        indexPreference = other.indexPreference;
+        listPreferenceChanged = other.listPreferenceChanged;
     }
 
     ~CollectionPrivate()
@@ -68,6 +80,8 @@ public:
     {
         contentTypesChanged = false;
         cachePolicyChanged = false;
+        enabledChanged = false;
+        listPreferenceChanged = false;
         EntityPrivate::resetChangeLog();
     }
 
@@ -89,6 +103,12 @@ public:
     bool contentTypesChanged: 1;
     bool cachePolicyChanged: 1;
     bool isVirtual: 1;
+    bool enabled;
+    bool enabledChanged;
+    Collection::ListPreference displayPreference;
+    Collection::ListPreference syncPreference;
+    Collection::ListPreference indexPreference;
+    bool listPreferenceChanged;
 };
 
 #endif
diff --git a/akonadi/collectioncreatejob.cpp b/akonadi/collectioncreatejob.cpp
index 7b2f373..c1fd45a 100644
--- a/akonadi/collectioncreatejob.cpp
+++ b/akonadi/collectioncreatejob.cpp
@@ -81,6 +81,10 @@ void CollectionCreateJob::doStart()
     command += " REMOTEID " + ImapParser::quote(d->mCollection.remoteId().toUtf8());
     command += " REMOTEREVISION " + ImapParser::quote(d->mCollection.remoteRevision().toUtf8());
     command += " VIRTUAL " + QByteArray::number(d->mCollection.isVirtual());
+    command += ' ' + ProtocolHelper::enabled(d->mCollection.enabled());
+    command += ' ' + ProtocolHelper::listPreference(Collection::ListDisplay, d->mCollection.localListPreference(Collection::ListDisplay));
+    command += ' ' + ProtocolHelper::listPreference(Collection::ListSync, d->mCollection.localListPreference(Collection::ListSync));
+    command += ' ' + ProtocolHelper::listPreference(Collection::ListIndex, d->mCollection.localListPreference(Collection::ListIndex));
     foreach (Attribute *attr, d->mCollection.attributes()) {
         command += ' ' + attr->type() + ' ' + ImapParser::quote(attr->serialized());
     }
diff --git a/akonadi/collectionfetchjob.cpp b/akonadi/collectionfetchjob.cpp
index 5b17eb8..0d70dea 100644
--- a/akonadi/collectionfetchjob.cpp
+++ b/akonadi/collectionfetchjob.cpp
@@ -220,11 +220,7 @@ void CollectionFetchJob::doStart()
             command += " " AKONADI_CMD_RID;
         }
     }
-    if (d->mScope.includeUnsubscribed()) {
-        command += " LIST ";
-    } else {
-        command += " LSUB ";
-    }
+    command += " LIST ";
 
     if (d->mBase.isValid()) {
         command += QByteArray::number(d->mBase.id());
@@ -266,6 +262,25 @@ void CollectionFetchJob::doStart()
         filter.append('(' + ImapParser::join(mts, " ") + ')');
     }
 
+    switch (d->mScope.listFilter()) {
+    case CollectionFetchScope::Display:
+        filter.append("DISPLAY TRUE");
+        break;
+    case CollectionFetchScope::Sync:
+        filter.append("SYNC TRUE");
+        break;
+    case CollectionFetchScope::Index:
+        filter.append("INDEX TRUE");
+        break;
+    case CollectionFetchScope::Enabled:
+        filter.append("ENABLED TRUE");
+        break;
+    case CollectionFetchScope::NoFilter:
+        break;
+    default:
+        Q_ASSERT(false);
+    }
+
     QList<QByteArray> options;
     if (d->mScope.includeStatistics()) {
         options.append("STATISTICS");
diff --git a/akonadi/collectionfetchscope.cpp b/akonadi/collectionfetchscope.cpp
index 9636e25..c4232df 100644
--- a/akonadi/collectionfetchscope.cpp
+++ b/akonadi/collectionfetchscope.cpp
@@ -30,8 +30,8 @@ class CollectionFetchScopePrivate : public QSharedData
 public:
     CollectionFetchScopePrivate()
         : ancestorDepth(CollectionFetchScope::None)
-        , unsubscribed(false)
         , statistics(false)
+        , listFilter(CollectionFetchScope::Enabled)
     {
     }
 
@@ -41,7 +41,6 @@ public:
         resource = other.resource;
         contentMimeTypes = other.contentMimeTypes;
         ancestorDepth = other.ancestorDepth;
-        unsubscribed = other.unsubscribed;
         statistics = other.statistics;
     }
 
@@ -49,8 +48,8 @@ public:
     QString resource;
     QStringList contentMimeTypes;
     CollectionFetchScope::AncestorRetrieval ancestorDepth;
-    bool unsubscribed;
     bool statistics;
+    CollectionFetchScope::ListFilter listFilter;
 };
 
 CollectionFetchScope::CollectionFetchScope()
@@ -78,7 +77,7 @@ CollectionFetchScope &CollectionFetchScope::operator=(const CollectionFetchScope
 
 bool CollectionFetchScope::isEmpty() const
 {
-    return d->resource.isEmpty() && d->contentMimeTypes.isEmpty() && !d->statistics && !d->unsubscribed && d->ancestorDepth == None;
+    return d->resource.isEmpty() && d->contentMimeTypes.isEmpty() && !d->statistics && d->ancestorDepth == None && d->listFilter == Enabled;
 }
 
 bool CollectionFetchScope::includeUnubscribed() const
@@ -88,12 +87,16 @@ bool CollectionFetchScope::includeUnubscribed() const
 
 bool CollectionFetchScope::includeUnsubscribed() const
 {
-    return d->unsubscribed;
+    return (d->listFilter == NoFilter);
 }
 
 void CollectionFetchScope::setIncludeUnsubscribed(bool include)
 {
-    d->unsubscribed = include;
+    if (include) {
+        d->listFilter = NoFilter;
+    } else {
+        d->listFilter = Enabled;
+    }
 }
 
 bool CollectionFetchScope::includeStatistics() const
@@ -136,4 +139,15 @@ void CollectionFetchScope::setAncestorRetrieval(AncestorRetrieval ancestorDepth)
     d->ancestorDepth = ancestorDepth;
 }
 
+CollectionFetchScope::ListFilter CollectionFetchScope::listFilter() const
+{
+    return d->listFilter;
+}
+
+void CollectionFetchScope::setListFilter(CollectionFetchScope::ListFilter listFilter)
+{
+    d->listFilter = listFilter;
+}
+
+
 }
diff --git a/akonadi/collectionfetchscope.h b/akonadi/collectionfetchscope.h
index 80184ed..0f14960 100644
--- a/akonadi/collectionfetchscope.h
+++ b/akonadi/collectionfetchscope.h
@@ -112,15 +112,47 @@ public:
      *
      * @see setIncludeUnsubscribed()
      * @since 4.5
+     * @deprecated use listFilter() instead
      */
-    bool includeUnsubscribed() const;
+    AKONADI_DEPRECATED bool includeUnsubscribed() const;
 
     /**
      * Sets whether unsubscribed collections should be included in the collection listing.
      *
      * @param include @c true to include unsubscribed collections, @c false otherwise (the default).
+     * @deprecated use setListFilter() instead
      */
-    void setIncludeUnsubscribed(bool include);
+    AKONADI_DEPRECATED void setIncludeUnsubscribed(bool include);
+
+    /**
+     * Describes the list filter
+     *
+     * @since 4.14
+     */
+    enum ListFilter {
+        NoFilter, ///< No filtering, retrieve all collections
+        Display,  ///< Only retrieve collections for display, taking the local preference and enabled into account.
+        Sync,     ///< Only retrieve collections for synchronization, taking the local preference and enabled into account.
+        Index,    ///< Only retrieve collections for indxing, taking the local preference and enabled into account.
+        Enabled   ///< Only retrieve enabled collections, ignoring the local preference. This is the same as setIncludeUnsubscribed(false).
+    };
+
+    /**
+     * Sets a filter for the collections to be listed.
+     *
+     * Note that collections that are required to complete the tree, but are not part of the collection are still included in the listing.
+     *
+     * @since 4.14
+     */
+    void setListFilter(ListFilter);
+
+    /**
+     * Returns the list filter.
+     *
+     * @see setListFilter()
+     * @since 4.14
+     */
+    ListFilter listFilter() const;
 
     /**
      * Returns whether collection statistics should be included in the retrieved results.
diff --git a/akonadi/collectionmodifyjob.cpp b/akonadi/collectionmodifyjob.cpp
index f735106..6ae772e 100644
--- a/akonadi/collectionmodifyjob.cpp
+++ b/akonadi/collectionmodifyjob.cpp
@@ -93,6 +93,14 @@ void CollectionModifyJob::doStart()
     if (d->mCollection.d_func()->cachePolicyChanged) {
         changes += ' ' + ProtocolHelper::cachePolicyToByteArray(d->mCollection.cachePolicy());
     }
+    if (d->mCollection.d_func()->enabledChanged) {
+        changes += ' ' + ProtocolHelper::enabled(d->mCollection.enabled());
+    }
+    if (d->mCollection.d_func()->listPreferenceChanged) {
+        changes += ' ' + ProtocolHelper::listPreference(Collection::ListDisplay, d->mCollection.localListPreference(Collection::ListDisplay));
+        changes += ' ' + ProtocolHelper::listPreference(Collection::ListSync, d->mCollection.localListPreference(Collection::ListSync));
+        changes += ' ' + ProtocolHelper::listPreference(Collection::ListIndex, d->mCollection.localListPreference(Collection::ListIndex));
+    }
     if (d->mCollection.attributes().count() > 0) {
         changes += ' ' + ProtocolHelper::attributesToByteArray(d->mCollection);
     }
diff --git a/akonadi/entitytreemodel.cpp b/akonadi/entitytreemodel.cpp
index ef496c6..7fb35f5 100644
--- a/akonadi/entitytreemodel.cpp
+++ b/akonadi/entitytreemodel.cpp
@@ -84,16 +84,30 @@ EntityTreeModel::~EntityTreeModel()
 
 bool EntityTreeModel::includeUnsubscribed() const
 {
-    Q_D(const EntityTreeModel);
-    return d->m_includeUnsubscribed;
+    return (listFilter() == CollectionFetchScope::NoFilter);
 }
 
 void EntityTreeModel::setIncludeUnsubscribed(bool show)
 {
+    if (show) {
+        setListFilter(CollectionFetchScope::NoFilter);
+    } else {
+        setListFilter(CollectionFetchScope::Enabled);
+    }
+}
+
+CollectionFetchScope::ListFilter EntityTreeModel::listFilter() const
+{
+    Q_D(const EntityTreeModel);
+    return d->m_listFilter;
+}
+
+void EntityTreeModel::setListFilter(CollectionFetchScope::ListFilter filter)
+{
     Q_D(EntityTreeModel);
     d->beginResetModel();
-    d->m_includeUnsubscribed = show;
-    d->m_monitor->setAllMonitored(show);
+    d->m_listFilter = filter;
+    d->m_monitor->setAllMonitored(filter == CollectionFetchScope::NoFilter);
     d->endResetModel();
 }
 
diff --git a/akonadi/entitytreemodel.h b/akonadi/entitytreemodel.h
index d7f40e3..2d52a3d 100644
--- a/akonadi/entitytreemodel.h
+++ b/akonadi/entitytreemodel.h
@@ -23,6 +23,7 @@
 #include "akonadi_export.h"
 
 #include <akonadi/collection.h>
+#include <akonadi/collectionfetchscope.h>
 #include <akonadi/item.h>
 
 #include <QtCore/QAbstractItemModel>
@@ -427,8 +428,9 @@ public:
      * Returns whether unsubscribed entities will be included in the listing.
      *
      * @since 4.5
+     * @deprecated use listFilter instead
      */
-    bool includeUnsubscribed() const;
+    AKONADI_DEPRECATED bool includeUnsubscribed() const;
 
     /**
      * Sets whether unsubscribed entities will be included in the listing.
@@ -439,8 +441,23 @@ public:
      *  this method for turning on/off listing of subscribed folders.
      *
      * @since 4.5
+     * @deprecated use setListFilter instead
      */
-    void setIncludeUnsubscribed(bool show);
+    AKONADI_DEPRECATED void setIncludeUnsubscribed(bool show);
+
+    /**
+     * Returns the currently used listfilter.
+     *
+     * @since 4.14
+     */
+    Akonadi::CollectionFetchScope::ListFilter listFilter() const;
+
+    /**
+     * Sets the currently used listfilter.
+     *
+     * @since 4.14
+     */
+    void setListFilter(Akonadi::CollectionFetchScope::ListFilter filter);
 
     /**
      * Sets the item population @p strategy of the model.
@@ -691,8 +708,6 @@ private:
     Q_PRIVATE_SLOT(d_func(), void monitoredCollectionChanged(const Akonadi::Collection &))
     Q_PRIVATE_SLOT(d_func(), void monitoredCollectionMoved(const Akonadi::Collection &, const Akonadi::Collection &,
                                                            const Akonadi::Collection &))
-    Q_PRIVATE_SLOT(d_func(), void collectionSubscribed(const Akonadi::Collection &, const Akonadi::Collection &))
-    Q_PRIVATE_SLOT(d_func(), void monitoredCollectionUnsubscribed(const Akonadi::Collection &))
 
     Q_PRIVATE_SLOT(d_func(), void monitoredItemAdded(const Akonadi::Item &, const Akonadi::Collection &))
     Q_PRIVATE_SLOT(d_func(), void monitoredItemRemoved(const Akonadi::Item &))
diff --git a/akonadi/entitytreemodel_p.cpp b/akonadi/entitytreemodel_p.cpp
index ebf4973..76f405f 100644
--- a/akonadi/entitytreemodel_p.cpp
+++ b/akonadi/entitytreemodel_p.cpp
@@ -67,7 +67,7 @@ EntityTreeModelPrivate::EntityTreeModelPrivate(EntityTreeModel *parent)
     , m_rootNode(0)
     , m_collectionFetchStrategy(EntityTreeModel::FetchCollectionsRecursive)
     , m_itemPopulation(EntityTreeModel::ImmediatePopulation)
-    , m_includeUnsubscribed(true)
+    , m_listFilter(CollectionFetchScope::NoFilter)
     , m_includeStatistics(false)
     , m_showRootCollection(false)
     , m_collectionTreeFetched(false)
@@ -128,10 +128,6 @@ void EntityTreeModelPrivate::init(ChangeRecorder *monitor)
                SLOT(monitoredCollectionAdded(Akonadi::Collection,Akonadi::Collection)));
     q->connect(monitor, SIGNAL(collectionRemoved(Akonadi::Collection)),
                SLOT(monitoredCollectionRemoved(Akonadi::Collection)));
-    q->connect(monitor, SIGNAL(collectionSubscribed(Akonadi::Collection,Akonadi::Collection)),
-               SLOT(collectionSubscribed(Akonadi::Collection,Akonadi::Collection)));
-    q->connect(monitor, SIGNAL(collectionUnsubscribed(Akonadi::Collection)),
-               SLOT(monitoredCollectionUnsubscribed(Akonadi::Collection)));
     q->connect(monitor,
                SIGNAL(collectionMoved(Akonadi::Collection,Akonadi::Collection,Akonadi::Collection)),
                SLOT(monitoredCollectionMoved(Akonadi::Collection,Akonadi::Collection,Akonadi::Collection)));
@@ -300,7 +296,7 @@ void EntityTreeModelPrivate::fetchCollections(const Collection &collection, Coll
 
     job->setProperty(FetchCollectionId(), QVariant(collection.id()));
 
-    job->fetchScope().setIncludeUnsubscribed(m_includeUnsubscribed);
+    job->fetchScope().setListFilter(m_listFilter);
     job->fetchScope().setContentMimeTypes(m_monitor->mimeTypesMonitored());
 
     if (m_collectionFetchStrategy == EntityTreeModel::InvisibleCollectionFetch) {
@@ -648,7 +644,7 @@ void EntityTreeModelPrivate::retrieveAncestors(const Akonadi::Collection &collec
     if (!ancestors.isEmpty()) {
         // Fetch the real ancestors
         CollectionFetchJob *job = new CollectionFetchJob(ancestors, CollectionFetchJob::Base, m_session);
-        job->fetchScope().setIncludeUnsubscribed(m_includeUnsubscribed);
+        job->fetchScope().setListFilter(m_listFilter);
         job->fetchScope().setIncludeStatistics(m_includeStatistics);
         q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
                    q, SLOT(ancestorsFetched(Akonadi::Collection::List)));
@@ -741,6 +737,25 @@ bool EntityTreeModelPrivate::shouldBePartOfModel(const Collection &collection) c
         !m_mimeChecker.isWantedCollection(collection)) {
         return false;
     }
+
+    if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Enabled) {
+        if (!collection.enabled()) {
+            return false;
+        }
+    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Display) {
+        if (!collection.shouldList(Collection::ListDisplay)) {
+            return false;
+        }
+    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Sync) {
+        if (!collection.shouldList(Collection::ListSync)) {
+            return false;
+        }
+    } else if (m_listFilter == CollectionFetchScope::CollectionFetchScope::Index) {
+        if (!collection.shouldList(Collection::ListIndex)) {
+            return false;
+        }
+    }
+
     return true;
 }
 
@@ -842,34 +857,6 @@ void EntityTreeModelPrivate::monitoredCollectionRemoved(const Akonadi::Collectio
     }
 }
 
-void EntityTreeModelPrivate::collectionSubscribed(const Akonadi::Collection &col, const Akonadi::Collection &parent)
-{
-    // If we are including unsubscribed, we don't need to deal with subscribed / unsubscribed signals.
-    //  We shouldn't even be getting them as Monitor should only send them if we are watching subscribed-only,
-    //  but this is just in case.
-    if (m_includeUnsubscribed || m_collections.contains(col.id())) {
-        return;
-    }
-
-    // Otherwise, it's a valid subscription notice. Let's add it to the collection.
-    monitoredCollectionAdded(col, parent);
-}
-
-void EntityTreeModelPrivate::monitoredCollectionUnsubscribed(const Akonadi::Collection &col)
-{
-    // If we are including unsubscribed, we don't need to deal with subscribed / unsubscribed signals.
-    //  We shouldn't even be getting them as Monitor should only send them if we are watching subscribed-only,
-    //  but this is just in case.
-    //
-    // We don't want to remove a collection if we are including all of them.
-    if (m_includeUnsubscribed || !m_collections.contains(col.id())) {
-        return;
-    }
-
-    // Otherwise, it's a valid unsubscription notice.
-    monitoredCollectionRemoved(col);
-}
-
 void EntityTreeModelPrivate::removeChildEntities(Collection::Id collectionId)
 {
     QList<Node *> childList = m_childEntities.value(collectionId);
@@ -1538,7 +1525,8 @@ void EntityTreeModelPrivate::topLevelCollectionsFetched(const Akonadi::Collectio
 
             Q_ASSERT(collection.isValid());
             CollectionFetchJob *job = new CollectionFetchJob(collection, CollectionFetchJob::Recursive, m_session);
-            job->fetchScope().setIncludeUnsubscribed(m_includeUnsubscribed);
+            job->fetchScope().setListFilter(m_listFilter);
+
             job->fetchScope().setIncludeStatistics(m_includeStatistics);
             job->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
             q->connect(job, SIGNAL(collectionsReceived(Akonadi::Collection::List)),
diff --git a/akonadi/entitytreemodel_p.h b/akonadi/entitytreemodel_p.h
index d50dc55..ecd3c67 100644
--- a/akonadi/entitytreemodel_p.h
+++ b/akonadi/entitytreemodel_p.h
@@ -91,9 +91,6 @@ public:
     void monitoredCollectionStatisticsChanged(Akonadi::Collection::Id, const Akonadi::CollectionStatistics &);
     void monitoredCollectionMoved(const Akonadi::Collection &, const Akonadi::Collection &, const Akonadi::Collection &);
 
-    void collectionSubscribed(const Akonadi::Collection &, const Akonadi::Collection &);
-    void monitoredCollectionUnsubscribed(const Akonadi::Collection &);
-
     void monitoredItemAdded(const Akonadi::Item &, const Akonadi::Collection &);
     void monitoredItemRemoved(const Akonadi::Item &);
     void monitoredItemChanged(const Akonadi::Item &, const QSet<QByteArray> &);
@@ -156,7 +153,7 @@ public:
     MimeTypeChecker m_mimeChecker;
     EntityTreeModel::CollectionFetchStrategy m_collectionFetchStrategy;
     EntityTreeModel::ItemPopulationStrategy m_itemPopulation;
-    bool m_includeUnsubscribed;
+    CollectionFetchScope::ListFilter m_listFilter;
     bool m_includeStatistics;
     bool m_showRootCollection;
     bool m_collectionTreeFetched;
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index 63d3f7f..7e98b77 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -130,6 +130,17 @@ void ProtocolHelper::parseAncestors( const QByteArray &data, Entity *entity, int
   }
 }
 
+static Collection::ListPreference parsePreference( const QByteArray &value )
+{
+  if ( value == "TRUE" ) {
+    return Collection::ListEnabled;
+  }
+  if ( value == "FALSE" ) {
+    return Collection::ListDisabled;
+  }
+  return Collection::ListDefault;
+}
+
 int ProtocolHelper::parseCollection(const QByteArray & data, Collection & collection, int start)
 {
   int pos = start;
@@ -196,6 +207,14 @@ int ProtocolHelper::parseCollection(const QByteArray & data, Collection & collec
       collection.setCachePolicy( policy );
     } else if ( key == "ANCESTORS" ) {
       parseAncestors( value, &collection );
+    } else if ( key == "ENABLED" ) {
+      collection.setEnabled( value == "TRUE" );
+    } else if ( key == "DISPLAY" ) {
+      collection.setLocalListPreference( Collection::ListDisplay, parsePreference( value ) );
+    } else if ( key == "SYNC" ) {
+      collection.setLocalListPreference( Collection::ListSync, parsePreference( value ) );
+    } else if ( key == "INDEX" ) {
+      collection.setLocalListPreference( Collection::ListIndex, parsePreference( value ) );
     } else {
       Attribute* attr = AttributeFactory::createAttribute( key );
       Q_ASSERT( attr );
@@ -673,3 +692,40 @@ bool ProtocolHelper::streamPayloadToFile(const QByteArray &command, const QByteA
     file.close();
     return true;
 }
+
+
+QByteArray ProtocolHelper::listPreference(Collection::ListPurpose purpose, Collection::ListPreference preference)
+{
+    QByteArray command;
+    switch(purpose) {
+    case Collection::ListDisplay:
+        command += "DISPLAY ";
+        break;
+    case Collection::ListSync:
+        command += "SYNC ";
+        break;
+    case Collection::ListIndex:
+        command += "INDEX ";
+        break;
+    }
+    switch(preference) {
+    case Collection::ListEnabled:
+        command += "TRUE";
+        break;
+    case Collection::ListDisabled:
+        command += "FALSE";
+        break;
+    case Collection::ListDefault:
+        command += "DEFAULT";
+        break;
+    }
+    return command;
+}
+
+QByteArray ProtocolHelper::enabled(bool state)
+{
+    if (state) {
+      return "ENABLED TRUE";
+    }
+    return "ENABLED FALSE";
+}
diff --git a/akonadi/protocolhelper_p.h b/akonadi/protocolhelper_p.h
index ddbb973..b0303a3 100644
--- a/akonadi/protocolhelper_p.h
+++ b/akonadi/protocolhelper_p.h
@@ -233,6 +233,9 @@ public:
     static QString absolutePayloadFilePath(const QString &fileName);
 
     static bool streamPayloadToFile(const QByteArray &command, const QByteArray &data, QByteArray &error);
+
+    static QByteArray listPreference(Collection::ListPurpose purpose, Collection::ListPreference preference);
+    static QByteArray enabled(bool);
 };
 
 }
diff --git a/akonadi/resourcebase.cpp b/akonadi/resourcebase.cpp
index 50c9292..7a7b5f3 100644
--- a/akonadi/resourcebase.cpp
+++ b/akonadi/resourcebase.cpp
@@ -848,6 +848,7 @@ void ResourceBasePrivate::slotCollectionSyncDone(KJob *job)
             CollectionFetchJob *list = new CollectionFetchJob(Collection::root(), CollectionFetchJob::Recursive);
             list->setFetchScope(q->changeRecorder()->collectionFetchScope());
             list->fetchScope().setResource(mId);
+            list->fetchScope().setListFilter(CollectionFetchScope::Sync);
             q->connect(list, SIGNAL(result(KJob*)), q, SLOT(slotLocalListDone(KJob*)));
             return;
         } else if (scheduler->currentTask().type == ResourceScheduler::SyncCollectionTree) {
@@ -1077,25 +1078,23 @@ void ResourceBase::synchronizeCollection(qint64 collectionId, bool recursive)
     CollectionFetchJob *job = new CollectionFetchJob(Collection(collectionId), recursive ? CollectionFetchJob::Recursive : CollectionFetchJob::Base);
     job->setFetchScope(changeRecorder()->collectionFetchScope());
     job->fetchScope().setResource(identifier());
-    job->setProperty("recursive", recursive);
+    job->fetchScope().setListFilter(CollectionFetchScope::Sync);
     connect(job, SIGNAL(result(KJob*)), SLOT(slotCollectionListDone(KJob*)));
 }
 
 void ResourceBasePrivate::slotCollectionListDone(KJob *job)
 {
     if (!job->error()) {
-        Collection::List list = static_cast<CollectionFetchJob *>(job)->collections();
-        if (!list.isEmpty()) {
-            if (job->property("recursive").toBool()) {
-                Q_FOREACH (const Collection &collection, list) {
-                    scheduler->scheduleSync(collection);
-                }
-            } else {
-                scheduler->scheduleSync(list.first());
+        const Collection::List list = static_cast<CollectionFetchJob *>(job)->collections();
+        Q_FOREACH (const Collection &collection, list) {
+            //We also get collections that should not be synced but are part of the tree.
+            if (collection.shouldList(Collection::ListSync)) {
+                scheduler->scheduleSync(collection);
             }
         }
+    } else {
+        kWarning() << "Failed to fetch collection for collection sync: " << job->errorString();
     }
-    // TODO: error handling
 }
 
 void ResourceBase::synchronizeCollectionAttributes(qint64 collectionId)
diff --git a/akonadi/tests/collectionjobtest.cpp b/akonadi/tests/collectionjobtest.cpp
index fc8202e..566398d 100644
--- a/akonadi/tests/collectionjobtest.cpp
+++ b/akonadi/tests/collectionjobtest.cpp
@@ -766,4 +766,99 @@ void CollectionJobTest::testAncestorRetrieval()
   QCOMPARE( col, col2 );
 }
 
+void CollectionJobTest::testListPreference()
+{
+  Akonadi::Collection baseCol;
+  {
+    baseCol.setParentCollection(Akonadi::Collection(res1ColId));
+    baseCol.setName("base");
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(baseCol);
+    AKVERIFYEXEC(create);
+    baseCol = create->collection();
+  }
+  {
+    Akonadi::Collection col;
+    col.setParentCollection(baseCol);
+    col.setEnabled(true);
+    col.setName("enabled");
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(col);
+    AKVERIFYEXEC(create);
+
+    CollectionFetchJob *job = new CollectionFetchJob(create->collection(), CollectionFetchJob::Base);
+    AKVERIFYEXEC(job);
+    Akonadi::Collection result = job->collections().first();
+    QCOMPARE(result.enabled(), true);
+    QCOMPARE(result.localListPreference(Collection::ListDisplay), Collection::ListDefault);
+    QCOMPARE(result.localListPreference(Collection::ListSync), Collection::ListDefault);
+    QCOMPARE(result.localListPreference(Collection::ListIndex), Collection::ListDefault);
+  }
+  {
+    Akonadi::Collection col;
+    col.setParentCollection(baseCol);
+    col.setName("disabledPref");
+    col.setEnabled(true);
+    col.setLocalListPreference(Collection::ListDisplay, Collection::ListDisabled);
+    col.setLocalListPreference(Collection::ListSync, Collection::ListDisabled);
+    col.setLocalListPreference(Collection::ListIndex, Collection::ListDisabled);
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(col);
+    AKVERIFYEXEC(create);
+    CollectionFetchJob *job = new CollectionFetchJob(create->collection(), CollectionFetchJob::Base);
+    AKVERIFYEXEC(job);
+    Akonadi::Collection result = job->collections().first();
+    QCOMPARE(result.enabled(), true);
+    QCOMPARE(result.localListPreference(Collection::ListDisplay), Collection::ListDisabled);
+    QCOMPARE(result.localListPreference(Collection::ListSync), Collection::ListDisabled);
+    QCOMPARE(result.localListPreference(Collection::ListIndex), Collection::ListDisabled);
+  }
+  {
+    Akonadi::Collection col;
+    col.setParentCollection(baseCol);
+    col.setName("enabledPref");
+    col.setEnabled(false);
+    col.setLocalListPreference(Collection::ListDisplay, Collection::ListEnabled);
+    col.setLocalListPreference(Collection::ListSync, Collection::ListEnabled);
+    col.setLocalListPreference(Collection::ListIndex, Collection::ListEnabled);
+    Akonadi::CollectionCreateJob *create = new Akonadi::CollectionCreateJob(col);
+    AKVERIFYEXEC(create);
+    CollectionFetchJob *job = new CollectionFetchJob(create->collection(), CollectionFetchJob::Base);
+    AKVERIFYEXEC(job);
+    Akonadi::Collection result = job->collections().first();
+    QCOMPARE(result.enabled(), false);
+    QCOMPARE(result.localListPreference(Collection::ListDisplay), Collection::ListEnabled);
+    QCOMPARE(result.localListPreference(Collection::ListSync), Collection::ListEnabled);
+    QCOMPARE(result.localListPreference(Collection::ListIndex), Collection::ListEnabled);
+  }
+
+  //Check list filter
+  {
+    CollectionFetchJob *job = new CollectionFetchJob(baseCol, CollectionFetchJob::FirstLevel);
+    job->fetchScope().setListFilter(CollectionFetchScope::Display);
+    AKVERIFYEXEC(job);
+    QCOMPARE(job->collections().size(), 2);
+  }
+  {
+    CollectionFetchJob *job = new CollectionFetchJob(baseCol, CollectionFetchJob::FirstLevel);
+    job->fetchScope().setListFilter(CollectionFetchScope::Sync);
+    AKVERIFYEXEC(job);
+    QCOMPARE(job->collections().size(), 2);
+  }
+  {
+    CollectionFetchJob *job = new CollectionFetchJob(baseCol, CollectionFetchJob::FirstLevel);
+    job->fetchScope().setListFilter(CollectionFetchScope::Index);
+    AKVERIFYEXEC(job);
+    QCOMPARE(job->collections().size(), 2);
+  }
+  {
+    CollectionFetchJob *job = new CollectionFetchJob(baseCol, CollectionFetchJob::FirstLevel);
+    job->fetchScope().setListFilter(CollectionFetchScope::Enabled);
+    AKVERIFYEXEC(job);
+    QCOMPARE(job->collections().size(), 2);
+  }
+
+  //Cleanup
+  CollectionDeleteJob *deleteJob = new CollectionDeleteJob(baseCol);
+  AKVERIFYEXEC(deleteJob);
+}
+
+
 #include "collectionjobtest.moc"
\ No newline at end of file
diff --git a/akonadi/tests/collectionjobtest.h b/akonadi/tests/collectionjobtest.h
index 2d08cd0..233bf0d 100644
--- a/akonadi/tests/collectionjobtest.h
+++ b/akonadi/tests/collectionjobtest.h
@@ -52,6 +52,7 @@ class CollectionJobTest : public QObject
     void testRidCreateDelete_data();
     void testRidCreateDelete();
     void testAncestorRetrieval();
+    void testListPreference();
 };
 
 #endif


commit 552e1a9818022aab270b357f9c576ee9a1af0703
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Tue Jun 3 17:17:57 2014 +0200

    Fix 287242 - Empty error window when querying an ldap server
    
    Showing a standard error text, when no one is returned from job.
    
    BUG: 287242
    FIXED-IN: 4.14
    REVIEW: 118502

diff --git a/kldap/ldapconfigwidget.cpp b/kldap/ldapconfigwidget.cpp
index 5de51ad..e38f8f6 100644
--- a/kldap/ldapconfigwidget.cpp
+++ b/kldap/ldapconfigwidget.cpp
@@ -363,7 +363,11 @@ void LdapConfigWidget::Private::sendQuery()
     search.abandon();
   } else {
     if ( search.error() ) {
-      KMessageBox::error( mParent, search.errorString() );
+      if ( search.errorString().isEmpty() ) {
+        KMessageBox::error( mParent, i18nc( "%1 is a url to ldap server", "Unknown error connecting %1", _url.prettyUrl() ) );
+      } else {
+        KMessageBox::error( mParent, search.errorString() );
+      }
     }
   }
 }


commit 080ccc2c392fba0161e39cda11ed793083d38c08
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu May 29 20:31:53 2014 +0200

    Adding ability to subclass Fakeserver.
    
    For subclasses it is needed to have control over the received and
    expeced values of transmissions.
    
    REVIEW: 118408

diff --git a/kimap/tests/kimaptest/fakeserver.cpp b/kimap/tests/kimaptest/fakeserver.cpp
index 9bd6018..5b374ed 100644
--- a/kimap/tests/kimaptest/fakeserver.cpp
+++ b/kimap/tests/kimaptest/fakeserver.cpp
@@ -216,6 +216,12 @@ void FakeServer::writeServerPart( int scenarioNumber )
     m_scenarios[scenarioNumber] = scenario;
 }
 
+void FakeServer::compareReceived(const QByteArray& received, const QByteArray& expected) const
+{
+    QCOMPARE( QString::fromUtf8( received ), QString::fromUtf8( expected ) );
+    QCOMPARE( received, expected );
+}
+
 void FakeServer::readClientPart( int scenarioNumber )
 {
     QList<QByteArray> scenario = m_scenarios[scenarioNumber];
@@ -225,8 +231,7 @@ void FakeServer::readClientPart( int scenarioNumber )
             scenario.first().startsWith( "C: " ) ) {
       QByteArray received = "C: "+clientParser->readUntilCommandEnd().trimmed();
       QByteArray expected = scenario.takeFirst();
-      QCOMPARE( QString::fromUtf8( received ), QString::fromUtf8( expected ) );
-      QCOMPARE( received, expected );
+      compareReceived(received, expected);
       if (received.contains("STARTTLS")) {
         m_starttls = true;
       }
diff --git a/kimap/tests/kimaptest/fakeserver.h b/kimap/tests/kimaptest/fakeserver.h
index 009a2ad..add3626 100644
--- a/kimap/tests/kimaptest/fakeserver.h
+++ b/kimap/tests/kimaptest/fakeserver.h
@@ -207,6 +207,13 @@ public:
      */
     bool isAllScenarioDone() const;
 
+protected:
+    /**
+     * Whether the received content is the same as the expected.
+     * Use QCOMPARE, if creating subclasses.
+     */
+    virtual void compareReceived(const QByteArray& received, const QByteArray& expected) const;
+
 private Q_SLOTS:
     void newConnection();
     void dataAvailable();


commit 8e506506d7257c8c026487a04269f0b8c9f4ce82
Author: Maximiliano Curia <maxy at debian.org>
Date:   Wed May 28 12:24:08 2014 +0200

    Build and install akonaditest and Knut even when kdepimlibs are built without tests
    
    Makes it possible to still run tests of other components (runtime) that require
    akonaditest and Knut.
    
    BUG: 331529
    FIXED-IN: 4.14

diff --git a/akonadi/CMakeLists.txt b/akonadi/CMakeLists.txt
index 709e9b2..a6fc0aa 100644
--- a/akonadi/CMakeLists.txt
+++ b/akonadi/CMakeLists.txt
@@ -8,7 +8,10 @@ if(CMAKE_COMPILE_GCOV)
 endif()
 
 if (KDE4_BUILD_TESTS)
-add_subdirectory( tests )
+  add_subdirectory( tests )
+else()
+  add_subdirectory( tests/testrunner )
+  add_subdirectory( tests/testresource )
 endif()
 
 add_definitions( ${AKONADI_DEFINITIONS} )
diff --git a/akonadi/tests/testresource/CMakeLists.txt b/akonadi/tests/testresource/CMakeLists.txt
index 7099aac..1ae28b7 100644
--- a/akonadi/tests/testresource/CMakeLists.txt
+++ b/akonadi/tests/testresource/CMakeLists.txt
@@ -1,5 +1,32 @@
+include_directories(
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${AKONADI_INCLUDE_DIR}
+  ${AKONADI_INCLUDE_DIR}/akonadi/private
+  ${Boost_INCLUDE_DIR}
+  ${CMAKE_SOURCE_DIR}/akonadi
+  ${CMAKE_BINARY_DIR}/akonadi
+  ${CMAKE_BINARY_DIR}/akonadi/kmime
+  ${CMAKE_BINARY_DIR}/kmime
+)
+
 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}" )
 
+find_package(LibXslt)
+set_package_properties(LibXslt PROPERTIES DESCRIPTION "xsltproc" URL "http://xmlsoft.org/XSLT/" TYPE REQUIRED PURPOSE "Needed to generate D-Bus interface specifications")
+
+# generates a D-Bus interface description from a KConfigXT file
+macro(kcfg_generate_dbus_interface _kcfg _name)
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_name}.xml
+    COMMAND ${XSLTPROC_EXECUTABLE} --stringparam interfaceName ${_name}
+    ${CMAKE_SOURCE_DIR}/akonadi/kcfg2dbus.xsl
+    ${_kcfg}
+    > ${CMAKE_CURRENT_BINARY_DIR}/${_name}.xml
+    DEPENDS ${CMAKE_SOURCE_DIR}/akonadi/kcfg2dbus.xsl
+    ${_kcfg}
+    )
+endmacro()
+
 # Disabled for now, resourcetester remained in kdepim-runtime
 #add_subdirectory( tests )
 


commit 65fd2b2389a4847f8005e96a6d82e5f61df330ec
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue May 27 16:33:33 2014 +0200

    CollectionFetchJob: ensure result() is the last signal emitted.
    
    If we simply use delayedEmitResult() instead of emitResult() it is already
    ensured that all collections are emitted before result, the whole flushing
    not necessary. This also fixes the recursive fetch, where the collections
    were not emitted before result, which is IMO a bug.
    I added the required tests to ensure the job behaves like it should.
    
    REVIEW: 118329

diff --git a/akonadi/collectionfetchjob.cpp b/akonadi/collectionfetchjob.cpp
index ae24a35..5b17eb8 100644
--- a/akonadi/collectionfetchjob.cpp
+++ b/akonadi/collectionfetchjob.cpp
@@ -93,18 +93,6 @@ public:
         }
     }
 
-    void flushIterativeResult()
-    {
-        Q_Q(CollectionFetchJob);
-
-        if (mPendingCollections.isEmpty()) {
-            return;
-        }
-
-        emit q->collectionsReceived(mPendingCollections);
-        mPendingCollections.clear();
-    }
-
     QString jobDebuggingString() const
     {
         if (mBase.isValid()) {
@@ -402,20 +390,13 @@ void CollectionFetchJob::slotResult(KJob *job)
             const Collection::List result = filterDescendants(d->mPrefetchList);
             d->mPendingCollections += result;
             d->mCollections = result;
-            d->flushIterativeResult();
-            emitResult();
+            d->delayedEmitResult();
         }
     } else {
-        // We need to tell the subjob to emit its collectionsReceived signal before
-        // the result signal is emitted. That will populate my mPendingCollections
-        // which will be flushed by calling emitResult which will cause
-        // CollectionFetchJobPrivate::timeout to be called.
-        list->d_func()->flushIterativeResult();
         d->mCollections += list->collections();
-        // Pending collections should have already been emitted by listening to (and flushing) the job.
         Job::slotResult(job);
         if (!job->error() && !hasSubjobs()) {
-            emitResult();
+            d->delayedEmitResult();
         }
     }
 }
diff --git a/akonadi/tests/collectionjobtest.cpp b/akonadi/tests/collectionjobtest.cpp
index 298f489..fc8202e 100644
--- a/akonadi/tests/collectionjobtest.cpp
+++ b/akonadi/tests/collectionjobtest.cpp
@@ -160,6 +160,39 @@ void CollectionJobTest::testFolderList( )
   QVERIFY( findCol( list, "bla" ).isValid() );
 }
 
+class ResultSignalTester : public QObject
+{
+  Q_OBJECT
+public:
+  QStringList receivedSignals;
+public Q_SLOTS:
+  void onCollectionsReceived( const Akonadi::Collection::List & )
+  {
+    receivedSignals << QLatin1String( "collectionsReceived" );
+  }
+
+  void onCollectionRetrievalDone( KJob* )
+  {
+    receivedSignals << QLatin1String( "result" );
+  }
+};
+
+void CollectionJobTest::testSignalOrder()
+{
+  Akonadi::Collection::List toFetch;
+  toFetch << Collection( res1ColId );
+  toFetch << Collection( res2ColId );
+  CollectionFetchJob *job = new CollectionFetchJob( toFetch, CollectionFetchJob::Recursive );
+  ResultSignalTester spy;
+  connect( job, SIGNAL(collectionsReceived(Akonadi::Collection::List)), &spy, SLOT(onCollectionsReceived(Akonadi::Collection::List)) );
+  connect( job, SIGNAL(result(KJob*)), &spy, SLOT(onCollectionRetrievalDone(KJob*)) );
+  AKVERIFYEXEC( job );
+
+  QCOMPARE( spy.receivedSignals.size(), 2 );
+  QCOMPARE( spy.receivedSignals.at( 0 ), QLatin1String( "collectionsReceived" ) );
+  QCOMPARE( spy.receivedSignals.at( 1 ), QLatin1String( "result" ) );
+}
+
 void CollectionJobTest::testNonRecursiveFolderList( )
 {
   CollectionFetchJob *job = new CollectionFetchJob( Collection( res1ColId ), CollectionFetchJob::Base );
@@ -570,6 +603,67 @@ void CollectionJobTest::testMultiList()
   compareLists( res, req );
 }
 
+void CollectionJobTest::testRecursiveMultiList()
+{
+  Akonadi::Collection::List toFetch;
+  toFetch << Collection( res1ColId );
+  toFetch << Collection( res2ColId );
+  CollectionFetchJob *job = new CollectionFetchJob( toFetch, CollectionFetchJob::Recursive );
+  QSignalSpy spy( job, SIGNAL(collectionsReceived(Akonadi::Collection::List)) );
+  QVERIFY( spy.isValid() );
+  AKVERIFYEXEC( job );
+
+  Collection::List list = job->collections();
+
+  int count = 0;
+  for ( int i = 0; i < spy.count(); ++i ) {
+    Collection::List l = spy[i][0].value<Akonadi::Collection::List>();
+    for ( int j = 0; j < l.count(); ++j ) {
+      QVERIFY( list.count() > count + j );
+      QCOMPARE( list[count + j].id(), l[j].id() );
+    }
+    count += l.count();
+  }
+  QCOMPARE( count, list.count() );
+
+  // check if everything is there
+  QCOMPARE( list.count(), 4 + 2 );
+  QVERIFY( findCol( list, "foo" ).isValid() );
+  QVERIFY( findCol( list, "bar" ).isValid() );
+  QVERIFY( findCol( list, "bla" ).isValid() ); //There are two bla folders, but we only check for one.
+  QVERIFY( findCol( list, "foo2" ).isValid() );
+  QVERIFY( findCol( list, "space folder" ).isValid() );
+}
+
+void CollectionJobTest::testNonOverlappingRootList()
+{
+  Akonadi::Collection::List toFetch;
+  toFetch << Collection( res1ColId );
+  toFetch << Collection( res2ColId );
+  CollectionFetchJob *job = new CollectionFetchJob( toFetch, CollectionFetchJob::NonOverlappingRoots );
+  QSignalSpy spy( job, SIGNAL(collectionsReceived(Akonadi::Collection::List)) );
+  QVERIFY( spy.isValid() );
+  AKVERIFYEXEC( job );
+
+  Collection::List list = job->collections();
+
+  int count = 0;
+  for ( int i = 0; i < spy.count(); ++i ) {
+    Collection::List l = spy[i][0].value<Akonadi::Collection::List>();
+    for ( int j = 0; j < l.count(); ++j ) {
+      QVERIFY( list.count() > count + j );
+      QCOMPARE( list[count + j].id(), l[j].id() );
+    }
+    count += l.count();
+  }
+  QCOMPARE( count, list.count() );
+
+  // check if everything is there
+  QCOMPARE( list.count(), 2 );
+  QVERIFY( findCol( list, "res1" ).isValid() );
+  QVERIFY( findCol( list, "res2" ).isValid() );
+}
+
 void CollectionJobTest::testSelect()
 {
   CollectionPathResolver *resolver = new CollectionPathResolver( "res1/foo", this );;
@@ -672,3 +766,4 @@ void CollectionJobTest::testAncestorRetrieval()
   QCOMPARE( col, col2 );
 }
 
+#include "collectionjobtest.moc"
\ No newline at end of file
diff --git a/akonadi/tests/collectionjobtest.h b/akonadi/tests/collectionjobtest.h
index 63353c6..2d08cd0 100644
--- a/akonadi/tests/collectionjobtest.h
+++ b/akonadi/tests/collectionjobtest.h
@@ -29,6 +29,7 @@ class CollectionJobTest : public QObject
     void initTestCase();
     void testTopLevelList();
     void testFolderList();
+    void testSignalOrder();
     void testNonRecursiveFolderList();
     void testEmptyFolderList();
     void testSearchFolderList();
@@ -44,6 +45,8 @@ class CollectionJobTest : public QObject
     void testUtf8CollectionName_data();
     void testUtf8CollectionName();
     void testMultiList();
+    void testRecursiveMultiList();
+    void testNonOverlappingRootList();
     void testSelect();
     void testRidFetch();
     void testRidCreateDelete_data();


commit 53480388ee2d0970478661f853c7b52f7d04c691
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Mon May 26 18:05:57 2014 +0200

    Implement support for direct payload streaming to Create and Modify jobs
    
    ItemCreateJob and ItemModifyJob now handle STREAM continuation response and can
    write part payload data directly into the file received in the server response.
    
    Conflicts:
    	CMakeLists.txt

diff --git a/akonadi/itemcreatejob.cpp b/akonadi/itemcreatejob.cpp
index d4badd3..61d276a 100644
--- a/akonadi/itemcreatejob.cpp
+++ b/akonadi/itemcreatejob.cpp
@@ -1,6 +1,7 @@
 /*
     Copyright (c) 2006 - 2007 Volker Krause <vkrause at kde.org>
     Copyright (c) 2007        Robert Zwerus <arzie at dds.nl>
+    Copyright (c) 2014        Daniel Vrátil <dvratil at redhat.com>
 
     This library is free software; you can redistribute it and/or modify it
     under the terms of the GNU Library General Public License as published by
@@ -30,6 +31,7 @@
 #include "gid/gidextractor_p.h"
 
 #include <QtCore/QDateTime>
+#include <QtCore/QFile>
 
 #include <kdebug.h>
 
@@ -193,7 +195,15 @@ void ItemCreateJob::doHandleResponse(const QByteArray &tag, const QByteArray &da
     Q_D(ItemCreateJob);
 
     if (tag == "+") {   // ready for literal data
-        d->writeData(d->mPendingData);
+        if (data.startsWith("STREAM")) {
+            QByteArray error;
+            if (!ProtocolHelper::streamPayloadToFile(data, d->mPendingData, error)) {
+                d->writeData("* NO " + error);
+                return;
+            }
+        } else {
+            d->writeData(d->mPendingData);
+        }
         d->writeData(d->nextPartHeader());
         return;
     }
diff --git a/akonadi/itemmodifyjob.cpp b/akonadi/itemmodifyjob.cpp
index 81d5da2..994047f 100644
--- a/akonadi/itemmodifyjob.cpp
+++ b/akonadi/itemmodifyjob.cpp
@@ -285,7 +285,15 @@ void ItemModifyJob::doHandleResponse(const QByteArray &_tag, const QByteArray &d
     Q_D(ItemModifyJob);
 
     if (_tag == "+") {   // ready for literal data
-        d->writeData(d->mPendingData);
+        if (data.startsWith("STREAM")) {
+            QByteArray error;
+            if (!ProtocolHelper::streamPayloadToFile(data, d->mPendingData, error)) {
+                d->writeData("* NO " + error);
+                return;
+            }
+        } else {
+            d->writeData(d->mPendingData);
+        }
         d->writeData(d->nextPartHeader());
         return;
     }
diff --git a/akonadi/itemserializer.cpp b/akonadi/itemserializer.cpp
index d75de48..e78396a 100644
--- a/akonadi/itemserializer.cpp
+++ b/akonadi/itemserializer.cpp
@@ -22,15 +22,13 @@
 #include "item.h"
 #include "itemserializerplugin.h"
 #include "typepluginloader_p.h"
-#include "servermanager.h"
-#include <akonadi/private/xdgbasedirs_p.h>
+#include "protocolhelper_p.h"
 
 // Qt
 #include <QtCore/QBuffer>
 #include <QtCore/QFile>
 #include <QtCore/QIODevice>
 #include <QtCore/QString>
-#include <QtCore/QDir>
 
 #include <string>
 
@@ -86,18 +84,7 @@ void StdStringItemSerializerPlugin::serialize(const Item &item, const QByteArray
 void ItemSerializer::deserialize(Item &item, const QByteArray &label, const QByteArray &data, int version, bool external)
 {
     if (external) {
-        QString path;
-        QString fileName = QString::fromUtf8(data);
-        QFileInfo fi(fileName);
-        if (!fi.isAbsolute()) {
-            QString fullRelPath = QLatin1String("akonadi");
-            if (Akonadi::ServerManager::hasInstanceIdentifier()) {
-                fullRelPath += QDir::separator() + QLatin1String("instance") + QDir::separator() + Akonadi::ServerManager::instanceIdentifier();
-            }
-            fullRelPath += QDir::separator() + QLatin1String("file_db_data");
-            fileName = XdgBaseDirs::saveDir("data", fullRelPath) + QDir::separator() + fileName;
-        }
-
+        const QString fileName = ProtocolHelper::absolutePayloadFilePath(QString::fromUtf8(data));
         QFile file(fileName);
         if (file.open(QIODevice::ReadOnly)) {
             deserialize(item, label, file, version);
diff --git a/akonadi/protocolhelper.cpp b/akonadi/protocolhelper.cpp
index d9f30da..63d3f7f 100644
--- a/akonadi/protocolhelper.cpp
+++ b/akonadi/protocolhelper.cpp
@@ -25,10 +25,14 @@
 #include "exception.h"
 #include "itemserializer_p.h"
 #include "itemserializerplugin.h"
+#include "servermanager.h"
+#include <akonadi/private/xdgbasedirs_p.h>
 
 #include <QtCore/QDateTime>
 #include <QtCore/QFile>
 #include <QtCore/QVarLengthArray>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDir>
 
 #include <kdebug.h>
 #include <klocalizedstring.h>
@@ -617,3 +621,55 @@ void ProtocolHelper::parseTagFetchResult( const QList<QByteArray> &lineTokens, T
     }
   }
 }
+
+QString ProtocolHelper::akonadiStoragePath()
+{
+    QString fullRelPath = QLatin1String("akonadi");
+    if (Akonadi::ServerManager::hasInstanceIdentifier()) {
+        fullRelPath += QDir::separator() + QLatin1String("instance") + QDir::separator() + Akonadi::ServerManager::instanceIdentifier();
+    }
+    return XdgBaseDirs::saveDir("data", fullRelPath);
+}
+
+QString ProtocolHelper::absolutePayloadFilePath(const QString &fileName)
+{
+    QFileInfo fi(fileName);
+    if (!fi.isAbsolute()) {
+        return akonadiStoragePath() + QDir::separator() + QLatin1String("file_db_data") + QDir::separator() + fileName;
+    }
+
+    return fileName;
+}
+
+bool ProtocolHelper::streamPayloadToFile(const QByteArray &command, const QByteArray &data, QByteArray &error)
+{
+    const int fnStart = command.indexOf("[FILE ") + 6;
+    if (fnStart == -1) {
+        kDebug() << "Unexpected response";
+        return false;
+    }
+    const int fnEnd = command.indexOf("]", fnStart);
+    const QByteArray fn = command.mid(fnStart, fnEnd - fnStart);
+    const QString fileName = ProtocolHelper::absolutePayloadFilePath(QString::fromLatin1(fn));
+    if (!fileName.startsWith(akonadiStoragePath())) {
+        kWarning() << "Invalid file path" << fileName;
+        error = "Invalid file path";
+        return false;
+    }
+    QFile file(fileName);
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+        kWarning() << "Failed to open destination payload file" << file.errorString();
+        error = "Failed to store payload into file";
+        return false;
+    }
+    if (file.write(data) != data.size()) {
+        kWarning() << "Failed to write all payload data to file";
+        error = "Failed to store payload into file";
+        return false;
+    }
+    kDebug() << "Wrote" << data.size() << "bytes to " << file.fileName();
+
+    // Make sure stuff is written to disk
+    file.close();
+    return true;
+}
diff --git a/akonadi/protocolhelper_p.h b/akonadi/protocolhelper_p.h
index 24ba2d2..ddbb973 100644
--- a/akonadi/protocolhelper_p.h
+++ b/akonadi/protocolhelper_p.h
@@ -229,6 +229,10 @@ public:
     static void parseItemFetchResult(const QList<QByteArray> &lineTokens, Item &item, ProtocolHelperValuePool *valuePool = 0);
     static void parseTagFetchResult(const QList<QByteArray> &lineTokens, Tag &tag);
 
+    static QString akonadiStoragePath();
+    static QString absolutePayloadFilePath(const QString &fileName);
+
+    static bool streamPayloadToFile(const QByteArray &command, const QByteArray &data, QByteArray &error);
 };
 
 }
diff --git a/akonadi/session.cpp b/akonadi/session.cpp
index 8b9ac60..f91a880 100644
--- a/akonadi/session.cpp
+++ b/akonadi/session.cpp
@@ -58,7 +58,8 @@ static const QList<QByteArray> sCapabilities = QList<QByteArray>()
                                                << "NOTIFY 3"
                                                << "NOPAYLOADPATH"
                                                << "AKAPPENDSTREAMING"
-                                               << "SERVERSEARCH";
+                                               << "SERVERSEARCH"
+                                               << "DIRECTSTREAMING";
 
 void SessionPrivate::startNext()
 {


commit f3061f0ba5d0c96c3b772f3bc3c07cee5b7d6245
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Fri May 23 16:44:11 2014 +0200

    Fix handling of tags in ItemCreateJob
    
    Requires fixed server.
    
    Conflicts:
    	CMakeLists.txt

diff --git a/akonadi/itemcreatejob.cpp b/akonadi/itemcreatejob.cpp
index 621ad6a..d4badd3 100644
--- a/akonadi/itemcreatejob.cpp
+++ b/akonadi/itemcreatejob.cpp
@@ -134,14 +134,26 @@ void ItemCreateJob::doStart()
     }
     if (d->mItem.d_func()->mTagsOverwritten || !merge) {
         Q_FOREACH(const Akonadi::Tag &tag, d->mItem.d_func()->mAddedTags) {
-            flags += "TAG " + tag.remoteId();
+            if (tag.gid().isEmpty() && !tag.remoteId().isEmpty()) {
+                flags += "\\RTag[" + tag.remoteId() + ']';
+            } else if (!tag.gid().isEmpty()) {
+                flags += "\\Tag[" + tag.gid() + ']';
+            }
         }
     } else {
         Q_FOREACH(const Akonadi::Tag &tag, d->mItem.d_func()->mAddedTags) {
-            flags += "+TAG " + tag.remoteId();
+            if (tag.gid().isEmpty() && !tag.remoteId().isEmpty()) {
+                flags += "+\\RTag[" + tag.remoteId() + ']';
+            } else if (!tag.gid().isEmpty()) {
+                flags += "+\\Tag[" + tag.gid() + ']';
+            }
         }
         Q_FOREACH(const Akonadi::Tag &tag, d->mItem.d_func()->mDeletedTags) {
-            flags += "-TAG " + tag.remoteId();
+            if (tag.gid().isEmpty() && !tag.remoteId().isEmpty()) {
+                flags += "-\\RTag[" + tag.remoteId() + ']';
+            } else if (!tag.gid().isEmpty()) {
+                flags += "-\\Tag[" + tag.gid() + ']';
+            }
         }
     }
 


commit c68f38c4a1dcc4a5689a86e5b3e1fa2c3d306a7a
Author: Dan Vrátil <dvratil at redhat.com>
Date:   Mon May 19 10:08:27 2014 +0200

    Add explicit to Tag jobs ctors

diff --git a/akonadi/tagcreatejob.h b/akonadi/tagcreatejob.h
index 9a040d2..74e0c74 100644
--- a/akonadi/tagcreatejob.h
+++ b/akonadi/tagcreatejob.h
@@ -42,7 +42,7 @@ public:
      * @param tag The tag to create.
      * @param parent The parent object.
      */
-    TagCreateJob(const Tag &tag, QObject *parent = 0);
+    explicit TagCreateJob(const Tag &tag, QObject *parent = 0);
 
     /**
      * Returns the created tag with the new unique id, or an invalid tag if the job failed.
diff --git a/akonadi/tagdeletejob.h b/akonadi/tagdeletejob.h
index cce8797..9fa6fdb 100644
--- a/akonadi/tagdeletejob.h
+++ b/akonadi/tagdeletejob.h
@@ -37,8 +37,8 @@ class AKONADI_EXPORT TagDeleteJob : public Job
     Q_OBJECT
 
 public:
-    TagDeleteJob(const Tag &tag, QObject *parent = 0);
-    TagDeleteJob(const Tag::List &tag, QObject *parent = 0);
+    explicit TagDeleteJob(const Tag &tag, QObject *parent = 0);
+    explicit TagDeleteJob(const Tag::List &tag, QObject *parent = 0);
 
     /**
      * Returns the tags passed to the constructor.
diff --git a/akonadi/tagfetchjob.h b/akonadi/tagfetchjob.h
index 6fcc0cb..96e108d 100644
--- a/akonadi/tagfetchjob.h
+++ b/akonadi/tagfetchjob.h
@@ -48,7 +48,7 @@ public:
      *
      * @param parent The parent object.
      */
-    TagFetchJob(QObject *parent = 0);
+    explicit TagFetchJob(QObject *parent = 0);
 
     /**
      * Constructs a new tag fetch job that retrieves the specified tag.
@@ -60,7 +60,7 @@ public:
      * @param tag The tag to fetch.
      * @param parent The parent object.
      */
-    TagFetchJob(const Tag &tag, QObject *parent = 0);
+    explicit TagFetchJob(const Tag &tag, QObject *parent = 0);
 
     /**
      * Constructs a new tag fetch job that retrieves specified tags.
@@ -72,7 +72,7 @@ public:
      * @param tags Tags to fetch.
      * @param parent The parent object.
      */
-    TagFetchJob(const Tag::List &tags, QObject *parent = 0);
+    explicit TagFetchJob(const Tag::List &tags, QObject *parent = 0);
 
     /**
      * Convenience ctor equivalent to ItemFetchJob(const Item::List &items, QObject *parent = 0)
@@ -80,7 +80,7 @@ public:
      * @param ids UIDs of tags to fetch.
      * @param parent The parent object.
      */
-    TagFetchJob(const QList<Tag::Id> &ids, QObject *parent = 0);
+    explicit TagFetchJob(const QList<Tag::Id> &ids, QObject *parent = 0);
 
     /**
      * Sets the tag fetch scope.
diff --git a/akonadi/tagmodifyjob.h b/akonadi/tagmodifyjob.h
index 31edacf..5d9be1a 100644
--- a/akonadi/tagmodifyjob.h
+++ b/akonadi/tagmodifyjob.h
@@ -42,7 +42,7 @@ public:
      * @param tag The tag to modify.
      * @param parent The parent object.
      */
-    TagModifyJob(const Tag &tag, QObject *parent = 0);
+    explicit TagModifyJob(const Tag &tag, QObject *parent = 0);
 
     /**
      * Returns the modified tag.


commit fad78841c3bd81cfbe2937339500d17974905025
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Sun Aug 10 14:29:20 2014 +0200

    Add documentation to TagFetchJob
    
    Conflicts:
    	akonadi/tagfetchjob.h

diff --git a/akonadi/tagfetchjob.h b/akonadi/tagfetchjob.h
index f4dd905..6fcc0cb 100644
--- a/akonadi/tagfetchjob.h
+++ b/akonadi/tagfetchjob.h
@@ -29,7 +29,13 @@ class TagFetchScope;
 class TagFetchJobPrivate;
 
 /**
- * @short Job that fetches tags.
+ * @short Job that fetches tags from the Akonadi storage.
+ *
+ * This class is used to fetch tags from the Akonadi storage.
+ *
+ * If you want to fetch all items with given tag, use ItemFetchJob and the
+ * ItemFetchJob(const Tag &tag, QObject *parent = 0) constructor (since 4.14)
+ *
  * @since 4.13
  */
 class AKONADI_EXPORT TagFetchJob : public Job
@@ -37,14 +43,68 @@ class AKONADI_EXPORT TagFetchJob : public Job
     Q_OBJECT
 
 public:
-
+    /**
+     * Constructs a new tag fetch job that retrieves all tags stored in Akonadi.
+     *
+     * @param parent The parent object.
+     */
     TagFetchJob(QObject *parent = 0);
+
+    /**
+     * Constructs a new tag fetch job that retrieves the specified tag.
+     * If the tag has a uid set, this is used to identify the tag on the Akonadi
+     * server. If only a remote identifier is available, that is used. However
+     * as remote identifiers are internal to resources, it's necessary to set
+     * the resource context (see ResourceSelectJob).
+     *
+     * @param tag The tag to fetch.
+     * @param parent The parent object.
+     */
     TagFetchJob(const Tag &tag, QObject *parent = 0);
+
+    /**
+     * Constructs a new tag fetch job that retrieves specified tags.
+     * If the tags have a uid set, this is used to identify the tags on the Akonadi
+     * server. If only a remote identifier is available, that is used. However
+     * as remote identifiers are internal to resources, it's necessary to set
+     * the resource context (see ResourceSelectJob).
+     *
+     * @param tags Tags to fetch.
+     * @param parent The parent object.
+     */
     TagFetchJob(const Tag::List &tags, QObject *parent = 0);
+
+    /**
+     * Convenience ctor equivalent to ItemFetchJob(const Item::List &items, QObject *parent = 0)
+     *
+     * @param ids UIDs of tags to fetch.
+     * @param parent The parent object.
+     */
     TagFetchJob(const QList<Tag::Id> &ids, QObject *parent = 0);
 
+    /**
+     * Sets the tag fetch scope.
+     *
+     * The TagFetchScope controls how much of an tags's data is fetched
+     * from the server.
+     *
+     * @param fetchScope The new fetch scope for tag fetch operations.
+     * @see fetchScope()
+     */
     void setFetchScope(const TagFetchScope &);
 
+    /**
+     * Returns the tag fetch scope.
+     *
+     * Since this returns a reference it can be used to conveniently modify the
+     * current scope in-place, i.e. by calling a method on the returned reference
+     * without storing it in a local variable. See the TagFetchScope documentation
+     * for an example.
+     *
+     * @return a reference to the current tag fetch scope
+     *
+     * @see setFetchScope() for replacing the current tag fetch scope
+     */
     TagFetchScope &fetchScope();
 
     /**





More information about the commits mailing list