Here the MCT representations of the second case that Patrick proposed. Please note my comment in the end. CASE 2 1. Original of 1st author <text:p>This is the original paragraph, created with change tracking on so seen as an added paragraph.</text:p> 2. 1st author changes text: <text:p>This is the original paragraph, created with change tracking on so seen as an added paragraph, which is then modified.</text:p> 3. 1st author changes text again: <text:p>This is the modified paragraph, created with change tracking on so seen as an added paragraph, which is further modified.</text:p> The intermediate step #2 should not be recorded because its a single editing session, therefore the change tracking // FILEPATH ./content.xml // DESCRIPTION: The following is part of a content.xml file, similar abbreviated as in earlier examples <xmlns:text= urn:oasis:names:tc:opendocument:xmlns:text:1.0 xmlns:office= urn:oasis:names:tc:opendocument:xmlns:office:1.0 > <!-- ... --> <office:text > <text:p>This is the modified paragraph, created with change tracking on so seen as an added paragraph, which is further modified.</text:p> </office:text> <!-- ... --> // FILEPATH ./meta.xml // DESCRIPTION: Store all metadata of changes in the metadata file. <office:document-meta office:version= 1.3 xmlns:meta= urn:oasis:names:tc:opendocument:xmlns:meta:1.0 xmlns:office= urn:oasis:names:tc:opendocument:xmlns:office:1.0 xmlns:dc=
http://purl.org/dc/elements/1.1/ > <office:meta> <meta:generator>ODFApp/1.0$Win32/123m1$Build-007</meta:generator> <meta:creation-date> 20120618T145700+0100 </meta:creation-date> <meta:initial-creator xml:id= User1 > 1st author </ meta:initial-creator > <dc:creator xml:id= User1 >1st author </dc:creator> <dc:date> 20120618T150024+0100 </dc:date><!-- time of change the ODF XML is related to --> <dc:language>en-US</dc:language> <meta:editing-cycles>2</meta:editing-cycles> <office:meta> </office:document-meta> // FILEPATH ./changes/undo.xml // DESCRIPTION: Undo change operations are being stored in this file. The directory is useful for keeping changed binary data < undo xmlns=
http://docs.oasis-open.org/ns/office/1.3/merge/ct# > <del type= text time= 3m15s by= User1 s= /1/12 s= /1/21 /> <add type= text time= 3m24 by= User1 s= /1/12 >modified</add> <add type= text time= 1m44s by= User1 s= /1/93 >, which is then further modified</add> </ undo > COMMENT : The operation based system makes the sort of changes and compression easy. The ODF application does not have to read several ODF XML files to do a forensic-like analysis to map back the user change-operation from the content. Instead all changes are listed separated from the content (undo.xml file). If multiple users would like to merge their changes, like a student sending his paper to several reviewers and receiving back their comments, it is possible to integrate all reviewer changes into a single document. This can done by only adjusting the parameter of existing changes, every time an external change was made prior (or above) an existing one. Like incrementing a position parameter, when content was added prior. In addition only the new changes need to be sent and applied to the current content. Not the complete document have to be read by the application. Think of collaboration on our specification, where one editor only changes a word in the end, megabytes of XML have to be sent for GCT & ECT, while for MCT only require the single change-operation. In addition the adjustment of several changes is straight forward and not a problem like in GCT/ECT, which have to deal during the comparison with changes on XML level, like different XML prefixes, different placement of span or automatic style names. Two examples on sorting and compressing of operations. EXAMPLE 1: Sorting Sort is easy as only the position parameter have to be adjusted. < undo xmlns=
http://docs.oasis-open.org/ns/office/1.3/merge/ct# > <add type= text time= 3m24 by= User1 s= /1/12 >modified</add> <add type= text time= 1m44s by= User1 s= /1/93 >, which is then further modified</add> </ undo > is equal to < undo xmlns=
http://docs.oasis-open.org/ns/office/1.3/merge/ct# > <add type= text time= 1m44s by= User1 s= /1/85 >, which is then further modified</add> <add type= text time= 3m24 by= User1 s= /1/12 >modified</add> </ undo > because the modified text was not added prior the index is eight (the amount of characters of 'modified') less. Example 2: Compression Similar easy is the compression of operation. Multiple change operations as <add type= text time= 1m53s by= User1 s= /1/104 >f</add> <add type= text time= 1m53s by= User1 s= /1/105 >u</add> <add type= text time= 1m54s by= User1 s= /1/106 >r</add> <add type= text time= 1m54s by= User1 s= /1/107 >t</add> <add type= text time= 1m55s by= User1 s= /1/108 >h</add> <add type= text time= 1m56s by= User1 s= /1/109 >e</add> <add type= text time= 1m56s by= User1 s= /1/110 >r</add> <add type= text time= 1m57s by= User1 s= /1/111 > </add> are similar to the compressed operation <add type= text time= 1m57s by= User1 s= /1/104 >further </add> Similar the following 5 operations of the above none-saved user actions: < undo xmlns=
http://docs.oasis-open.org/ns/office/1.3/merge/ct# meta-file= ../meta.xml > <add type= text time= 1m44s by= User1 s= /1/93 >, which is then modified</add> <del type= text time= 1m47s by= User1 s= /1/104 s= /1/108 /> <add type= text time= 1m53s by= User1 s= /1/104 >further </add> <del type= text time= 3m15s by= User1 s= /1/12 s= /1/20 /> <add type= text time= 3m24 by= User1 s= /1/12 >modified</add> </ undo > where compressed to the final change-tracking of < undo xmlns=
http://docs.oasis-open.org/ns/office/1.3/merge/ct# > <del type= text time= 3m15s by= User1 s= /1/12 s= /1/20 /> <add type= text time= 3m24 by= User1 s= /1/12 >modified</add> <add type= text time= 1m44s by= User1 s= /1/93 >, which is then further modified</add> </ undo > Implementation Note: MCT can easily be added aside of the existing implementation. In the Apache (incubating) ODF Toolkit, I have added to the SAX handler the functionality to create components and operations from the loaded document aside the existing model (on a private branch). By doing so the operation can be easily extended incrementally, without any content get lost, because the components are accessed by component tree position (e.g. /1/1) and the reference to the existing model structure is returned. Best regards, Svante