KEP 3 (2010-11-18): Introduction of 'subevent' sub-tag for 'exclusion' from 'recurrence'

Georg C. F. Greve greve at
Thu Nov 18 10:29:11 CET 2010

Hi all,

Jeroen is already working on trying to put together some proposed tooling and 
process parameters for the KEP process. Until that is in place, I'll work with 
the date of the draft in the subject line to allow us to keep track of the 

This revision already includes the Recurrence ID brought up by Sergio to 
address the iTIP handling. It also includes lists of illegal and mandatory 
fields the subevent MUST or MUST NOT define, which Jeroen raised.

Sergio: Do you think this works?

Jeroen: Is this what you had in mind? 

ALL: Opinions about the changes, and the field lists?

Open question: This is still based on the deep nesting, which Bernhard pointed 
out some older clients might mangle despite what the format spec says.

There are fundamentally two options here:

 (a) IGNORE the problem: Newer clients will necessarily write recurrences in 
ways which older clients won't understand, so older clients won't ever be able 
to understand them, so only old or new clients should ever be used on any data 

 (b) UNNEST the structure: This will separate the exclusion date (a.k.a. 
Recurrence ID) from the subevent, which could then hold a mandatory Recurrence 
ID tag to allow finding it again. This is less elegant and puts a higher burden 
on the clients which for instance need to ensure to not leave around orphaned 
subevents and such.

Are there opinions on these choices?

Best regards,

Georg C. F. Greve
Chief Executive Officer

Kolab Systems AG
Zürich, Switzerland

e: greve at
t: +41 78 904 43 33

pgp: 86574ACA Georg C. F. Greve
-------------- next part --------------
KEP: 3
Title: Introduction of 'subevent' sub-tag for 'exclusion' from 'recurrence'
Version: $Revision$
Last-Modified: $Date$
Author: Georg Greve <greve at>
Status: Draft
Type: Design
Content-Type: text/x-rst
Created: 2010-11-17


The Kolab storage format models allows recurrence to have 'non-occurence' exceptions already, but it does not allow to have 'modification' exceptions, e.g. change of time or location. The way this has been handled is to create a 'non-occurence' exception, and then create a separate event for that day with the default values of the recurring event.

This has been understood as a suboptimal solution for a long time because the clients cannot easily connect that new event with the recurring event for future modifications, while the user logically sees them as connected.

The solution is to introduce a hierarchically nested 'subevent' sub-tag for an exception, which takes all default values from the recurring event itself, and only contains the differences to these default values. [1]

Update to the XML Format

The type for datetime storage in Kolab XML is modified as follows:

* Clients **MUST** treat the date of the 'exclusion' as the Recurrence ID [2] where applicable, in particular iTIP [3] handling.
* A 'subevent' XML tag **MAY** be added hierarchically nested within an 'exclusion' to a 'recurrence' of an 'event' object.
* There **MUST** be only one 'subevent' per 'exclusion.
* All event values of the 'subevent' default to the 'event' within which it is nested. Values within 'subevent' change these values for this 'exception' from the 'recurrence' only.
* Fields for 'event' that 'subevent' **MUST NOT** use/override are: *'uid'* and *'recurrence'*
* Fields that 'subevent' **MUST** define are: *'creation-date'* and *'last-modification-date'*


Moving one instance of a recurring event from date1, a normal date in the recurrence cycle, to new-date1 would express itself as follows










Upgrade Path

When this KEP becomes active, the version number of the Kolab Storage Format specification will be updated to 2.1.

New clients that correspond to 2.1 will be fully compatible with older data sets.

Older clients can continue to behave as before at their own choice, and will remain consistent with the 2.0 specification and no data will be lost or corrupted. So whilst this is important, it is not urgent. Older clients will however not be able to display recurrence exceptions of newer clients properly, so it is highly recommended to move to the newer 2.1 format when feasible.


.. [1] event XML 1.1 (fix recurrances), Konold

.. [2] RFC2445: Internet Calendaring and Scheduling Core Object Specification, Recurrence ID

.. [3] RFC2446: iCalendar Transport-Independent Interoperability Protocol (iTIP)


This document has been placed in the public domain.

   Local Variables:
   mode: indented-text
   indent-tabs-mode: nil
   sentence-end-double-space: t
   fill-column: 70
   coding: utf-8
-------------- next part --------------
A non-text attachment was scrubbed...
Name: KEP-3.pdf
Type: application/pdf
Size: 15100 bytes
Desc: not available
URL: <>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 308 bytes
Desc: This is a digitally signed message part.
URL: <>

More information about the format mailing list