[CalendarServer-changes] [13309] CalendarServer/branches/users/sagen/newcua

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 17 11:25:57 PDT 2014


Revision: 13309
          http://trac.calendarserver.org//changeset/13309
Author:   sagen at apple.com
Date:     2014-04-17 11:25:57 -0700 (Thu, 17 Apr 2014)
Log Message:
-----------
New canonical CUA is urn:x-uid:<uid>; we can still look up by /principals/ CUAs, but we don't return them from record.calendarUserAddresses; we normalize CUAs within component( ) now

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py
    CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py
    CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py
    CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py
    CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py
    CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py
    CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py
    CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py
    CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql
    CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py
    CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py
    CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tap/caldav.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -603,6 +603,11 @@
             self.store,
             int(config.LogID) if config.LogID else 5
         )
+        from calendarserver.tools.purge import scheduleNextPrincipalPurgeUpdate
+        yield scheduleNextPrincipalPurgeUpdate(
+            self.store,
+            int(config.LogID) if config.LogID else 5
+        )
 
 
 

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/calverify.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -40,7 +40,6 @@
 
 """
 
-import base64
 import collections
 import sys
 import time
@@ -256,7 +255,6 @@
 Options for --ical:
 
 --badcua   : only look for bad calendar user addresses.
---nobase64 : do not apply base64 encoding to CALENDARSERVER-OLD-CUA.
 --uuid     : only scan specified calendar homes. Can be a partial GUID
              to scan all GUIDs with that as a prefix.
 --uid      : scan only calendar data with the specific iCalendar UID.
@@ -299,7 +297,7 @@
 CHANGES
 v8: Detects ORGANIZER or ATTENDEE properties with mailto: calendar user
     addresses for users that have valid directory records. Fix is to
-    replace the value with a urn:uuid: form.
+    replace the value with a urn:x-uid: form.
 
 v9: Detects double-bookings.
 
@@ -324,9 +322,7 @@
 
     optFlags = [
         ['ical', 'i', "Calendar data check."],
-        ['badcua', 'b', "Calendar data check for bad CALENDARSERVER-OLD-CUA only."],
         ['debug', 'D', "Debug logging."],
-        ['nobase64', 'n', "Do not apply CALENDARSERVER-OLD-CUA base64 transform when fixing."],
         ['mismatch', 's', "Detect organizer/attendee mismatches."],
         ['missing', 'm', "Show 'orphaned' homes."],
         ['double', 'd', "Detect double-bookings."],
@@ -696,21 +692,6 @@
         try:
             caldata = Calendar.parseText(rows[0][0]) if rows else None
         except ErrorBase:
-            caltxt = rows[0][0] if rows else None
-            if caltxt:
-                caltxt = caltxt.replace("\r\n ", "")
-                if caltxt.find("CALENDARSERVER-OLD-CUA=\"//") != -1:
-                    if doFix:
-                        caltxt = (yield self.fixBadOldCua(resid, caltxt))
-                        try:
-                            caldata = Calendar.parseText(caltxt) if rows else None
-                        except ErrorBase:
-                            self.parseError = "No fix bad CALENDARSERVER-OLD-CUA"
-                            returnValue(None)
-                    else:
-                        self.parseError = "Bad CALENDARSERVER-OLD-CUA"
-                        returnValue(None)
-
             self.parseError = "Failed to parse"
             returnValue(None)
 
@@ -743,68 +724,7 @@
         returnValue((caldata, rows[0][1], rows[0][2], rows[0][3],) if rows else (None, None, None, None,))
 
 
-    @inlineCallbacks
-    def fixBadOldCua(self, resid, caltxt):
-        """
-        Fix bad CALENDARSERVER-OLD-CUA lines and write fixed data to store. Assumes iCalendar data lines unfolded.
-        """
 
-        # Get store objects
-        homeID, calendarID = yield self.getAllResourceInfoForResourceID(resid)
-        home = yield self.txn.calendarHomeWithResourceID(homeID)
-        calendar = yield home.childWithID(calendarID)
-        calendarObj = yield calendar.objectResourceWithID(resid)
-
-        # Do raw data fix one line at a time
-        caltxt = self.fixBadOldCuaLines(caltxt)
-
-        # Re-parse
-        try:
-            component = Component.fromString(caltxt)
-        except InvalidICalendarDataError:
-            returnValue(None)
-
-        # Write out fix, commit and get a new transaction
-        # Use _migrating to ignore possible overridden instance errors - we are either correcting or ignoring those
-        self.txn._migrating = True
-        component = yield calendarObj._setComponentInternal(component, internal_state=ComponentUpdateState.RAW)
-        yield self.txn.commit()
-        self.txn = self.store.newTransaction()
-
-        returnValue(caltxt)
-
-
-    def fixBadOldCuaLines(self, caltxt):
-        """
-        Fix bad CALENDARSERVER-OLD-CUA lines. Assumes iCalendar data lines unfolded.
-        """
-
-        # Do raw data fix one line at a time
-        lines = caltxt.splitlines()
-        for ctr, line in enumerate(lines):
-            startpos = line.find(";CALENDARSERVER-OLD-CUA=\"//")
-            if startpos != -1:
-                endpos = line.find("urn:uuid:")
-                if endpos != -1:
-                    endpos += len("urn:uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"")
-                    badparam = line[startpos + len(";CALENDARSERVER-OLD-CUA=\""):endpos]
-                    endbadparam = badparam.find(";")
-                    if endbadparam != -1:
-                        badparam = badparam[:endbadparam].replace("\\", "")
-                        if badparam.find("8443") != -1:
-                            badparam = "https:" + badparam
-                        else:
-                            badparam = "http:" + badparam
-                        if self.options["nobase64"]:
-                            badparam = "\"" + badparam + "\""
-                        else:
-                            badparam = "base64-%s" % (base64.b64encode(badparam),)
-                        badparam = ";CALENDARSERVER-OLD-CUA=" + badparam
-                        lines[ctr] = line[:startpos] + badparam + line[endpos:]
-        caltxt = "\r\n".join(lines) + "\r\n"
-        return caltxt
-
-
     @inlineCallbacks
     def removeEvent(self, resid):
         """
@@ -1274,15 +1194,6 @@
                         else:
                             raise InvalidICalendarDataError("iCalendar ORGANIZER missing mailto:")
 
-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if organizer.hasParameter("CALENDARSERVER-OLD-CUA"):
-                    oldcua = organizer.parameterValue("CALENDARSERVER-OLD-CUA")
-                    if not oldcua.startswith("base64-") and not self.options["nobase64"]:
-                        if doFix:
-                            organizer.setParameter("CALENDARSERVER-OLD-CUA", "base64-%s" % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError("iCalendar ORGANIZER CALENDARSERVER-OLD-CUA not base64")
-
             for attendee in subcomponent.properties("ATTENDEE"):
                 cuaddr = attendee.value()
 
@@ -1307,16 +1218,7 @@
                         else:
                             raise InvalidICalendarDataError("iCalendar ATTENDEE missing mailto:")
 
-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if attendee.hasParameter("CALENDARSERVER-OLD-CUA"):
-                    oldcua = attendee.parameterValue("CALENDARSERVER-OLD-CUA")
-                    if not oldcua.startswith("base64-") and not self.options["nobase64"]:
-                        if doFix:
-                            attendee.setParameter("CALENDARSERVER-OLD-CUA", "base64-%s" % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError("iCalendar ATTENDEE CALENDARSERVER-OLD-CUA not base64")
 
-
     def attendeesWithoutOrganizer(self, component, doFix):
         """
         Look for events with ATTENDEE properties and no ORGANIZER property.
@@ -1521,11 +1423,11 @@
 
             # If targeting a specific organizer, skip events belonging to others
             if self.options["uuid"]:
-                if not organizer.startswith("urn:uuid:") or self.options["uuid"] != organizer[9:]:
+                if not organizer.startswith("urn:x-uid:") or self.options["uuid"] != organizer[10:]:
                     continue
 
             # Cache organizer/attendee states
-            if organizer.startswith("urn:uuid:") and owner == organizer[9:]:
+            if organizer.startswith("urn:x-uid:") and owner == organizer[10:]:
                 if not onlyAttendee:
                     self.organized.append((owner, resid, uid, md5, organizer, created, modified,))
                     self.organized_byuid[uid] = (owner, resid, uid, md5, organizer, created, modified,)
@@ -1789,9 +1691,9 @@
                 continue
 
             # Only care about data for hosted organizers
-            if not organizer.startswith("urn:uuid:"):
+            if not organizer.startswith("urn:x-uid:"):
                 continue
-            organizer = organizer[9:]
+            organizer = organizer[10:]
 
             # Skip organizers not enabled for calendaring
             if not (yield self.testForCalendaringUUID(organizer)):
@@ -1913,7 +1815,7 @@
         """
 
         try:
-            cuaddr = "urn:uuid:%s" % attendee
+            cuaddr = "urn:x-uid:%s" % attendee
 
             # Get the organizer's calendar data
             calendar = (yield self.getCalendar(orgresid))
@@ -2073,8 +1975,8 @@
             props = item.getOwner().getProperties().get(definitions.cICalProperty_ATTENDEE, [])
             for prop in props:
                 caladdr = prop.getCalAddressValue().getValue()
-                if caladdr.startswith("urn:uuid:"):
-                    caladdr = caladdr[9:]
+                if caladdr.startswith("urn:x-uid:"):
+                    caladdr = caladdr[10:]
                 else:
                     continue
                 if attendee_only is not None and attendee_only != caladdr:
@@ -2610,8 +2512,8 @@
             else:
                 principal = yield self.directoryService().recordWithCalendarUserAddress(organizer)
                 # FIXME: Why the mix of records and principals here?
-                if principal is None and organizer.startswith("urn:uuid:"):
-                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[9:])
+                if principal is None and organizer.startswith("urn:x-uid:"):
+                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[10:])
                 if principal is None:
                     if self.options["invalid-organizer"]:
                         fail = True

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/purge.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -17,33 +17,193 @@
 ##
 from __future__ import print_function
 
+import collections
+from getopt import getopt, GetoptError
+import os
+import sys
+
 from calendarserver.tools import tables
 from calendarserver.tools.cmdline import utilityMain, WorkerService
-
-from getopt import getopt, GetoptError
-
 from pycalendar.datetime import DateTime
-
 from twext.python.log import Logger
-
 from twisted.internet.defer import inlineCallbacks, returnValue
-
 from twistedcaldav import caldavxml
-
 from txdav.caldav.datastore.query.filter import Filter
+from twext.enterprise.dal.record import fromTable
+from twext.enterprise.dal.syntax import Delete, Select
+from twext.enterprise.jobqueue import WorkItem
+from txdav.common.datastore.sql_tables import schema
+import datetime
 
+log = Logger()
 
-import collections
-import os
-import sys
 
-log = Logger()
-
 DEFAULT_BATCH_SIZE = 100
 DEFAULT_RETAIN_DAYS = 365
 
 
 
+class PrincipalPurgeScanPollingWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_SCAN_POLLING_WORK)
+):
+
+    group = "principal_purge_scan_polling"
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete all other work items
+        yield Delete(From=self.table, Where=None).on(self.transaction)
+
+        # Schedule next update, 7 days out
+        notBefore = (
+            datetime.datetime.utcnow() +
+            datetime.timedelta(days=7)
+        )
+        log.info(
+            "Scheduling next principal purge scan update: {when}", when=notBefore
+        )
+        yield self.transaction.enqueue(
+            PrincipalPurgeScanPollingWork,
+            notBefore=notBefore
+        )
+
+        # Do the scan
+        allUIDs = set()
+        for home in (schema.CALENDAR_HOME, schema.ADDRESSBOOK_HOME):
+            for [uid] in (
+                yield Select(
+                    [home.OWNER_UID],
+                    From=home
+                ).on(self.transaction)
+            ):
+                allUIDs.add(uid)
+
+        # Spread out the per-uid checks 1 second apart
+        seconds = 0
+        for uid in allUIDs:
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(seconds=seconds)
+            )
+            seconds += 1
+            yield self.transaction.enqueue(
+                PrincipalPurgeCheckWork,
+                uid=uid,
+                notBefore=notBefore
+            )
+
+
+
+
+class PrincipalPurgeCheckWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_CHECK_WORK)
+):
+    """
+    Work item for checking for the existence of a UID in the directory
+    """
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        log.debug("Checking for existence of {uid} in directory", uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Schedule purge of this UID a week from now
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(minutes=1)
+            )
+            log.warn(
+                "Principal {uid} is no longer in the directory; scheduling clean-up at {when}",
+                uid=self.uid, when=notBefore
+            )
+            yield self.transaction.enqueue(
+                PrincipalPurgeWork,
+                uid=self.uid,
+                notBefore=notBefore
+            )
+        else:
+            log.debug("{uid} is still in the directory", uid=self.uid)
+
+
+
+class PrincipalPurgeWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_WORK)
+):
+    """
+    Work item for purging a UID's data
+    """
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        # Check for UID in directory again
+        log.debug("One last existence check for {uid}", uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Time to go
+            service = PurgePrincipalService(self.transaction.store)
+            log.warn(
+                "Cleaning up future events for principal {uid} since they are no longer in directory",
+                uid=self.uid
+            )
+            yield service.purgeUIDs(
+                self.transaction.store,
+                directory,
+                [self.uid],
+                completely=False,
+                doimplicit=True,
+                proxies=True,
+                when=None
+            )
+        else:
+            log.debug("{uid} has re-appeared in the directory", uid=self.uid)
+
+
+ at inlineCallbacks
+def scheduleNextPrincipalPurgeUpdate(store, seconds):
+
+    notBefore = (
+        datetime.datetime.utcnow() + datetime.timedelta(seconds=seconds)
+    )
+
+    log.debug(
+        "Scheduling next principal purge update: {when}", when=notBefore
+    )
+
+    def _enqueue(txn):
+        return txn.enqueue(PrincipalPurgeScanPollingWork, notBefore=notBefore)
+
+    wp = yield store.inTransaction("scheduleNextPrincipalPurgeUpdate", _enqueue)
+
+    returnValue(wp)
+
+
+
 class PurgeOldEventsService(WorkerService):
 
     cutoff = None
@@ -681,11 +841,10 @@
 
     @classmethod
     @inlineCallbacks
-    def purgeUIDs(cls, store, directory, root, uids, verbose=False, dryrun=False,
+    def purgeUIDs(cls, store, directory, uids, verbose=False, dryrun=False,
                   completely=False, doimplicit=True, proxies=True, when=None):
 
         service = cls(store)
-        service.root = root
         service.directory = directory
         service.uids = uids
         service.verbose = verbose
@@ -701,10 +860,8 @@
     @inlineCallbacks
     def doWork(self):
 
-        if self.root is None:
-            self.root = self.rootResource()
         if self.directory is None:
-            self.directory = self.root.getDirectory()
+            self.directory = self.store.directoryService()
 
         total = 0
 

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/shell/cmd.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -36,7 +36,6 @@
 from txdav.common.icommondatastore import NotFoundError
 
 from calendarserver.version import version
-from calendarserver.tap.util import getRootResource
 from calendarserver.tools.tables import Table
 from calendarserver.tools.purge import PurgePrincipalService
 from calendarserver.tools.shell.vfs import Folder, RootFolder
@@ -668,11 +667,6 @@
             self.terminal.write("Aborting.\n")
             return
 
-        rootResource = getRootResource(
-            self.protocol.service.config,
-            self.protocol.service.store,
-        )
-
         if dryRun:
             toPurge = "to purge"
         else:
@@ -683,7 +677,6 @@
             count, _ignore_assignments = (yield PurgePrincipalService.purgeUIDs(
                 self.protocol.service.store,
                 directory,
-                rootResource,
                 (record.uid,),
                 verbose=False,
                 dryrun=dryRun,

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_calverify.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -157,9 +157,9 @@
 DTSTART:20100307T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n")
@@ -178,8 +178,8 @@
 DTSTART:20100307T111500Z
 DTSTAMP:20100303T181220Z
 ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 SEQUENCE:2
 END:VEVENT
 END:VCALENDAR
@@ -199,9 +199,9 @@
 SUMMARY:Ancient event
 DTSTART:20100307T111500Z
 DTSTAMP:20100303T181220Z
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
 ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 SEQUENCE:2
 END:VEVENT
 END:VCALENDAR
@@ -223,39 +223,13 @@
 DTSTAMP:20100303T181220Z
 ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
 ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 SEQUENCE:2
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n")
 
 
-# Non-base64 Organizer and Attendee parameter
-BAD7_ICS = """BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Apple Inc.//iCal 4.0.1//EN
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CREATED:20100303T181216Z
-UID:BAD7
-DTEND:20100307T151500Z
-TRANSP:OPAQUE
-SUMMARY:Ancient event
-DTSTART:20100307T111500Z
-DTSTAMP:20100303T181220Z
-ORGANIZER;CALENDARSERVER-OLD-CUA="http://demo.com:8008/principals/__uids__/
- D46F3D71-04B7-43C2-A7B6-6F92F92E61D0":urn:uuid:D46F3D71-04B7-43C2-A7B6-6F9
- 2F92E61D0
-ATTENDEE;CALENDARSERVER-OLD-CUA="http://demo.com:8008/principals/__uids__/D
- 46F3D71-04B7-43C2-A7B6-6F92F92E61D0":urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92
- F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-SEQUENCE:2
-END:VEVENT
-END:VCALENDAR
-""".replace("\n", "\r\n")
-
-
 # Base64 Organizer and Attendee parameter
 OK8_ICS = """BEGIN:VCALENDAR
 VERSION:2.0
@@ -271,73 +245,16 @@
 DTSTAMP:20100303T181220Z
 ORGANIZER;CALENDARSERVER-OLD-CUA="base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbm
  NpcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=":
- urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
 ATTENDEE;CALENDARSERVER-OLD-CUA="base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbmN
  pcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=":u
- rn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ rn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 SEQUENCE:2
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n")
 
-BAD9_ICS = """BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:BAD9
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA="//example.com\\:8443/principals/users/cyrus
- /;CN=\\"Cyrus Daboo\\";CUTYPE=INDIVIDUAL;EMAIL=\\"cyrus at example.com\\";PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22";CN=Cyrus Daboo;EMAIL=c
- yrus at example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith at example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA="//example.com\\:8443/principals/users/cyru
- s/;CN=\\"Cyrus Daboo\\";EMAIL=\\"cyrus at example.com\\":urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22";CN=Cyrus Daboo;EMAIL=cyrus at example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-""".replace("\n", "\r\n")
 
 # Non-mailto: Organizer
 BAD10_ICS = """BEGIN:VCALENDAR
@@ -425,8 +342,8 @@
 SUMMARY:Ancient event
 DTSTART:20100307T111500Z
 DTSTAMP:20100303T181220Z
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 SEQUENCE:2
 END:VEVENT
 END:VCALENDAR
@@ -457,9 +374,7 @@
                 "bad4.ics" : (BAD4_ICS, metadata,),
                 "bad5.ics" : (BAD5_ICS, metadata,),
                 "bad6.ics" : (BAD6_ICS, metadata,),
-                "bad7.ics" : (BAD7_ICS, metadata,),
                 "ok8.ics"  : (OK8_ICS, metadata,),
-                "bad9.ics" : (BAD9_ICS, metadata,),
                 "bad10.ics" : (BAD10_ICS, metadata,),
                 "bad11.ics" : (BAD11_ICS, metadata,),
                 "bad12.ics" : (BAD12_ICS, metadata,),
@@ -523,8 +438,6 @@
             ("home1", "BAD4",),
             ("home1", "BAD5",),
             ("home1", "BAD6",),
-            ("home1", "BAD7",),
-            ("home1", "BAD9",),
             ("home1", "BAD10",),
             ("home1", "BAD11",),
             ("home1", "BAD12",),
@@ -571,8 +484,6 @@
             ("home1", "BAD4",),
             ("home1", "BAD5",),
             ("home1", "BAD6",),
-            ("home1", "BAD7",),
-            ("home1", "BAD9",),
             ("home1", "BAD10",),
             ("home1", "BAD11",),
             ("home1", "BAD12",),
@@ -598,11 +509,11 @@
         obj = yield self.calendarObjectUnderTest(name="bad10.ics")
         ical = yield obj.component()
         org = ical.getOrganizerProperty()
-        self.assertEqual(org.value(), "urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0")
+        self.assertEqual(org.value(), "urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0")
         self.assertFalse(org.hasParameter("SCHEDULE-AGENT"))
         for attendee in ical.getAllAttendeeProperties():
             self.assertTrue(
-                attendee.value().startswith("urn:uuid:") or
+                attendee.value().startswith("urn:x-uid:") or
                 attendee.value().startswith("/principals")
             )
 
@@ -637,8 +548,6 @@
             ("home1", "BAD4",),
             ("home1", "BAD5",),
             ("home1", "BAD6",),
-            ("home1", "BAD7",),
-            ("home1", "BAD9",),
             ("home1", "BAD10",),
             ("home1", "BAD12",),
         )))
@@ -681,8 +590,6 @@
             ("home1", "BAD4",),
             ("home1", "BAD5",),
             ("home1", "BAD6",),
-            ("home1", "BAD7",),
-            ("home1", "BAD9",),
             ("home1", "BAD10",),
             ("home1", "BAD12",),
         )))
@@ -701,217 +608,8 @@
         self.assertNotEqual(sync_token_old, sync_token_new)
 
 
-    def test_fixBadCuaLines(self):
-        """
-        CalVerifyService.fixBadOldCuaLines. Make sure it applies correct fix.
-        """
 
-        data = (
-            (
-                """BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA="//example.com\\:8443/principals/users/cyrus
- /;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;EMAIL="cyrus at example.com";PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22";CN=Cyrus Daboo;EMAIL=c
- yrus at example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith at example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA="//example.com\\:8443/principals/users/cyru
- s/;CN="Cyrus Daboo";EMAIL="cyrus at example.com":urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22";CN=Cyrus Daboo;EMAIL=cyrus at example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-""".replace("\n", "\r\n"),
-                """BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA="https://example.com:8443/principals/users/c
- yrus/";CN=Cyrus Daboo;EMAIL=cyrus at example.com;RSVP=TRUE:urn:uuid:7B2636C7-0
- 7F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith at example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA="https://example.com:8443/principals/users/
- cyrus/";CN=Cyrus Daboo;EMAIL=cyrus at example.com:urn:uuid:7B2636C7-07F6-4475-
- 924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-""".replace("\n", "\r\n"),
-                """BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3Bya
- W5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus at example.com;RSVP=TRU
- E:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith at example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3By
- aW5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus at example.com:urn:uui
- d:7B2636C7-07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-""".replace("\n", "\r\n"),
-            ),
-        )
 
-        optionsNo64 = {
-            "ical": True,
-            "nobase64": True,
-            "verbose": False,
-            "uid": "",
-            "uuid": "",
-            "tzid": "",
-        }
-        calverifyNo64 = BadDataService(self._sqlCalendarStore, optionsNo64, StringIO(), reactor, config)
-        calverifyNo64.emailDomain = "example.com"
-
-        options64 = {
-            "ical": True,
-            "nobase64": False,
-            "verbose": False,
-            "uid": "",
-            "uuid": "",
-            "tzid": "",
-        }
-        calverify64 = BadDataService(self._sqlCalendarStore, options64, StringIO(), reactor, config)
-        calverify64.emailDomain = "example.com"
-
-        for bad, oknobase64, okbase64 in data:
-            bad = bad.replace("\r\n ", "")
-            oknobase64 = oknobase64.replace("\r\n ", "")
-            okbase64 = okbase64.replace("\r\n ", "")
-            self.assertEqual(calverifyNo64.fixBadOldCuaLines(bad), oknobase64)
-            self.assertEqual(calverify64.fixBadOldCuaLines(bad), okbase64)
-
-
-
 class CalVerifyMismatchTestsBase(StoreTestCase):
     """
     Tests calverify for iCalendar mismatch problems.
@@ -964,10 +662,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -986,10 +684,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1007,10 +705,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1029,10 +727,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1050,10 +748,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1071,10 +769,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1093,10 +791,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1114,10 +812,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1135,10 +833,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1157,10 +855,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear - 1, "month": nowMonth}
@@ -1178,10 +876,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1200,10 +898,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1221,9 +919,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1241,8 +939,8 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1260,10 +958,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1282,9 +980,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1302,9 +1000,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1322,10 +1020,10 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1583,9 +1281,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1604,9 +1302,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1624,9 +1322,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1810,9 +1508,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1831,9 +1529,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -1851,9 +1549,9 @@
 DTSTART:%(year)s%(month)02d07T111500Z
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2029,9 +1727,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2050,9 +1748,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2070,9 +1768,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2091,9 +1789,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2110,9 +1808,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 TRANSP:TRANSPARENT
 END:VEVENT
 END:VCALENDAR
@@ -2132,9 +1830,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2151,9 +1849,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 STATUS:CANCELLED
 END:VEVENT
 END:VCALENDAR
@@ -2173,9 +1871,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 RRULE:FREQ=DAILY;COUNT=3
 END:VEVENT
 END:VCALENDAR
@@ -2193,9 +1891,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
 END:VCALENDAR
@@ -2215,9 +1913,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 RRULE:FREQ=DAILY;COUNT=3
 END:VEVENT
 END:VCALENDAR
@@ -2235,9 +1933,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 RRULE:FREQ=DAILY;COUNT=2
 END:VEVENT
 BEGIN:VEVENT
@@ -2249,9 +1947,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2287,9 +1985,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2306,9 +2004,9 @@
 DTSTART;VALUE=DATE:%(year)s%(month)02d21
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2327,9 +2025,9 @@
 DURATION:PT2H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2347,9 +2045,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2479,9 +2177,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2500,9 +2198,9 @@
 DURATION:PT1H
 DTSTAMP:20100303T181220Z
 SEQUENCE:2
-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2523,7 +2221,7 @@
 SEQUENCE:2
 ORGANIZER:mailto:foobar at example.com
 ATTENDEE:mailto:foobar at example.com
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
 END:VEVENT
 END:VCALENDAR
 """.replace("\n", "\r\n") % {"year": nowYear, "month": nowMonth}
@@ -2810,9 +2508,9 @@
 UID:INVITE_VALID_ORGANIZER_ICS
 DTSTART:%(now)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
 RRULE:FREQ=DAILY
 SUMMARY:INVITE_VALID_ORGANIZER_ICS
 END:VEVENT
@@ -2827,9 +2525,9 @@
 UID:INVITE_VALID_ORGANIZER_ICS
 DTSTART:%(now)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
 RRULE:FREQ=DAILY
 SUMMARY:INVITE_VALID_ORGANIZER_ICS
 END:VEVENT
@@ -2844,9 +2542,9 @@
 UID:INVITE_VALID_ORGANIZER_ICS
 DTSTART:%(now_fwd11)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2 at example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2863,9 +2561,9 @@
 UID:INVITE_VALID_ORGANIZER_ICS
 DTSTART:%(now_fwd11)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2 at example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2882,9 +2580,9 @@
 UID:%(relID)s
 DTSTART:%(now)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2 at example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
 SEQUENCE:1
@@ -2901,9 +2599,9 @@
 UID:%(relID)s
 DTSTART:%(now)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2 at example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1 at example.com:urn:x-uid:%(uuid1)s
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
 SEQUENCE:1
@@ -2920,9 +2618,9 @@
 UID:VALID_ORGANIZER_OVERRIDE_ICS
 DTSTART:%(now)s
 DURATION:PT1H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
 RRULE:FREQ=DAILY
 SUMMARY:INVITE_VALID_ORGANIZER_ICS
 END:VEVENT
@@ -2931,9 +2629,9 @@
 RECURRENCE-ID:%(now_fwd11)s
 DTSTART:%(now_fwd11)s
 DURATION:PT2H
-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
 RRULE:FREQ=DAILY
 SUMMARY:INVITE_VALID_ORGANIZER_ICS
 END:VEVENT

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -877,7 +877,7 @@
         yield txn.commit()
 
         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=True))
+            (self.uid,), verbose=False, proxies=False, completely=True))
         self.assertEquals(count, 2) # 2 events
 
         # Now you don't
@@ -892,7 +892,6 @@
         count = yield PurgePrincipalService.purgeUIDs(
             self.storeUnderTest(),
             self.directory,
-            self.rootResource,
             (self.uid,),
             verbose=False,
             proxies=False,
@@ -922,7 +921,7 @@
         yield txn.commit()
 
         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False))
+            (self.uid,), verbose=False, proxies=False, completely=False))
         self.assertEquals(count, 1) # 2 events
 
         # Now you still see it
@@ -935,7 +934,7 @@
         yield txn.commit()
 
         count = yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False)
+            (self.uid,), verbose=False, proxies=False, completely=False)
         self.assertEquals(count, 1)
 
         # And you still do

Modified: CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/calendarserver/tools/test/test_purge_old_events.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -677,7 +677,7 @@
 
         # Purge home1
         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
-            self.rootResource, ("home1",), verbose=False, proxies=False,
+            ("home1",), verbose=False, proxies=False,
             when=DateTime(now, 4, 1, 12, 0, 0, 0, Timezone(utc=True)))
 
         # 4 items deleted: 3 events and 1 vcard
@@ -714,7 +714,7 @@
 
         # Purge home1 completely
         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
-            self.rootResource, ("home1",), verbose=False, proxies=False, completely=True)
+            ("home1",), verbose=False, proxies=False, completely=True)
 
         # 9 items deleted: 8 events and 1 vcard
         self.assertEquals(total, 9)

Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/directory/test/test_principal.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -612,21 +612,10 @@
             provisioningResource, recordType, recordResource, record
         ) in (yield self._allRecords()):
             if record.hasCalendars:
-                if self.directory.fieldName.guid in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith("urn:uuid:")
-                    )
-                elif self.directory.fieldName.emailAddresses in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith("mailto:")
-                    )
-                else:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith("/principals/__uids__/")
-                    )
+                self.failUnless(
+                    recordResource.canonicalCalendarUserAddress()
+                    .startswith("urn:x-uid:")
+                )
 
 
     @inlineCallbacks

Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/ical.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -3267,13 +3267,21 @@
 
 
     @inlineCallbacks
-    def normalizeCalendarUserAddresses(self, lookupFunction, recordFunction,
-        toUUID=True):
+    def normalizeCalendarUserAddresses(
+        self, lookupFunction, recordFunction, toCanonical=True
+    ):
         """
         Do the ORGANIZER/ATTENDEE property normalization.
 
         @param lookupFunction: function returning full name, guid, CUAs for a given CUA
         @type lookupFunction: L{Function}
+
+        @param recordFunction: function taking a CUA and returning a record
+        @type recordFunction: L{Function}
+
+        @param toCanonical: whether to convert to the canonical CUA form (True)
+            or to the mailto: form (False)
+        @type toCanonical: L{bool}
         """
 
         for component in self.subcomponents():
@@ -3288,8 +3296,8 @@
                 # Check that we can lookup this calendar user address - if not
                 # we cannot do anything with it
                 cuaddr = normalizeCUAddr(prop.value())
-                name, guid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
-                if guid is None:
+                name, uid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
+                if uid is None:
                     continue
 
                 # Get any EMAIL parameter
@@ -3300,14 +3308,12 @@
                 # Get any CN parameter
                 oldCN = prop.parameterValue("CN")
 
-                if toUUID:
-                    # Always re-write value to urn:uuid
-                    if isinstance(guid, uuid.UUID):
-                        guid = unicode(guid).upper()
-                    prop.setValue("urn:uuid:{guid}".format(guid=guid))
+                if toCanonical:
+                    # Always re-write value to urn:x-uid
+                    prop.setValue("urn:x-uid:{uid}".format(uid=uid))
 
-                # If it is already a non-UUID address leave it be
-                elif cuaddr.startswith("urn:uuid:"):
+                # If it is already a non-x-uid address leave it be
+                elif (cuaddr.startswith("urn:x-uid:") or cuaddr.startswith("urn:uuid:")):
 
                     if oldemail:
                         # Use the EMAIL parameter if it exists
@@ -3364,7 +3370,7 @@
                     prop.removeParameter("CN")
 
                 # Re-write the EMAIL if its value no longer matches
-                if oldemail and oldemail not in cuaddrs or oldemail is None and toUUID:
+                if oldemail and oldemail not in cuaddrs or oldemail is None and toCanonical:
                     if cuaddr.startswith("mailto:") and cuaddr in cuaddrs:
                         email = cuaddr[7:]
                     else:
@@ -3388,7 +3394,7 @@
 
             # For VPOLL also do immediate children
             if component.name() == "VPOLL":
-                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toUUID)
+                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toCanonical)
 
 
     @inlineCallbacks
@@ -3638,21 +3644,21 @@
 
 # #
 # Utilities
-# #p
+# #
 
 @inlineCallbacks
-def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toUUID=True):
+def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toCanonical=True):
     # Check that we can lookup this calendar user address - if not
     # we cannot do anything with it
-    _ignore_name, guid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
+    _ignore_name, uid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
 
-    if toUUID:
-        # Always re-write value to urn:uuid
-        if guid:
-            returnValue("urn:uuid:{0}".format(guid,))
+    if toCanonical:
+        # Always re-write value to urn:x-uid
+        if uid:
+            returnValue("urn:x-uid:{0}".format(uid,))
 
-    # If it is already a non-UUID address leave it be
-    elif cuaddr.startswith("urn:uuid:"):
+    # If it is already a non-x-uid address leave it be
+    elif (cuaddr.startswith("urn:x-uid:") or cuaddr.startswith("urn:uuid:")):
 
         # Pick the first mailto,
         # or failing that the first path one,
@@ -3723,9 +3729,12 @@
 
 
 
-def normalize_iCalStr(icalstr):
+def normalize_iCalStr(icalstr, sort=False):
     """
     Normalize a string representation of ical data for easy test comparison.
+
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
     """
 
     icalstr = str(icalstr).replace("\r\n ", "")
@@ -3735,13 +3744,18 @@
         pos = line.find(";X-CALENDARSERVER-DTSTAMP=")
         if pos != -1:
             lines[ctr] = line[:pos] + line[pos + len(";X-CALENDARSERVER-DTSTAMP=") + 16:]
+    if sort:
+        lines.sort()
     icalstr = "\r\n".join(lines)
     return icalstr + "\r\n"
 
 
 
-def diff_iCalStrs(icalstr1, icalstr2):
-
-    icalstr1 = normalize_iCalStr(icalstr1).splitlines()
-    icalstr2 = normalize_iCalStr(icalstr2).splitlines()
+def diff_iCalStrs(icalstr1, icalstr2, sort=False):
+    """
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
+    """
+    icalstr1 = normalize_iCalStr(icalstr1, sort=sort).splitlines()
+    icalstr2 = normalize_iCalStr(icalstr2, sort=sort).splitlines()
     return "\n".join(unified_diff(icalstr1, icalstr2))

Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_icalendar.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -7598,7 +7598,7 @@
 
 
     @inlineCallbacks
-    def test_normalizeCalendarUserAddressesFromUUID(self):
+    def test_normalizeCalendarUserAddressesFromCanonical(self):
         """
         Ensure mailto is preferred, followed by path form, then http form.
         """
@@ -7612,6 +7612,7 @@
 ATTENDEE:urn:uuid:foo
 ATTENDEE:urn:uuid:bar
 ATTENDEE:urn:uuid:baz
+ATTENDEE:urn:x-uid:buz
 DTSTAMP:20071114T000000Z
 END:VEVENT
 END:VCALENDAR
@@ -7627,24 +7628,30 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo", "http://example.com/foo", "/foo")
+                        ("urn:x-uid:foo", "urn:uuid:foo", "http://example.com/foo", "/foo")
                     ),
                     "urn:uuid:bar" : (
                         "Bar",
                         "bar",
                         "INDIVIDUAL",
-                        ("urn:uuid:bar", "mailto:bar at example.com", "http://example.com/bar", "/bar")
+                        ("urn:x-uid:bar", "urn:uuid:bar", "mailto:bar at example.com", "http://example.com/bar", "/bar")
                     ),
                     "urn:uuid:baz" : (
                         "Baz",
                         "baz",
                         "INDIVIDUAL",
-                       ("urn:uuid:baz", "http://example.com/baz")
+                       ("urn:x-uid:baz", "urn:uuid:baz", "http://example.com/baz")
                     ),
+                    "urn:x-uid:buz" : (
+                        "Buz",
+                        "buz",
+                        "INDIVIDUAL",
+                       ("urn:x-uid:buz", "urn:uuid:buz", "http://example.com/buz")
+                    ),
                 }[cuaddr]
             )
 
-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=False)
+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=False)
 
         self.assertEquals("mailto:bar at example.com",
             component.getAttendeeProperty(("mailto:bar at example.com",)).value())
@@ -7652,6 +7659,8 @@
             component.getAttendeeProperty(("/foo",)).value())
         self.assertEquals("http://example.com/baz",
             component.getAttendeeProperty(("http://example.com/baz",)).value())
+        self.assertEquals("http://example.com/buz",
+            component.getAttendeeProperty(("http://example.com/buz",)).value())
 
 
     @inlineCallbacks
@@ -7686,30 +7695,30 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo",)
+                        ("urn:x-uid:foo", "urn:uuid:foo",)
                     ),
                     "http://example.com/principals/users/bar" : (
                         "Bar",
                         "bar",
                         "INDIVIDUAL",
-                        ("urn:uuid:bar",)
+                        ("urn:x-uid:bar", "urn:uuid:bar",)
                     ),
                     "http://example.com/principals/locations/buzz" : (
                         "{Restricted} Buzz",
                         "buzz",
                         "ROOM",
-                        ("urn:uuid:buzz",)
+                        ("urn:x-uid:buzz", "urn:uuid:buzz",)
                     ),
                 }[cuaddr]
             )
 
-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
 
         # Location value changed
         prop = component.mainComponent().getProperty("LOCATION")
         self.assertEquals(prop.value(), "{Restricted} Buzz")
-        prop = component.getAttendeeProperty(("urn:uuid:buzz",))
-        self.assertEquals("urn:uuid:buzz", prop.value())
+        prop = component.getAttendeeProperty(("urn:x-uid:buzz",))
+        self.assertEquals("urn:x-uid:buzz", prop.value())
         self.assertEquals(prop.parameterValue("CN"), "{Restricted} Buzz")
 
 
@@ -7745,30 +7754,30 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo",)
+                        ("urn:x-uid:foo", "urn:uuid:foo",)
                     ),
                     "http://example.com/principals/users/bar" : (
                         "Bar",
                         "bar",
                         "INDIVIDUAL",
-                        ("urn:uuid:bar",)
+                        ("urn:x-uid:bar", "urn:uuid:bar",)
                     ),
                     "http://example.com/principals/locations/buzz" : (
                         "{Restricted} Buzz",
                         "buzz",
                         "INDIVIDUAL",
-                        ("urn:uuid:buzz",)
+                        ("urn:x-uid:buzz", "urn:uuid:buzz",)
                     ),
                 }[cuaddr]
             )
 
-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
 
         # Location value changed
         prop = component.mainComponent().getProperty("LOCATION")
         self.assertEquals(prop.value(), "Fuzz")
-        prop = component.getAttendeeProperty(("urn:uuid:buzz",))
-        self.assertEquals("urn:uuid:buzz", prop.value())
+        prop = component.getAttendeeProperty(("urn:x-uid:buzz",))
+        self.assertEquals("urn:x-uid:buzz", prop.value())
         self.assertEquals(prop.parameterValue("CN"), "{Restricted} Buzz")
 
 
@@ -7804,30 +7813,30 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo",)
+                        ("urn:x-uid:foo", "urn:uuid:foo",)
                     ),
                     "http://example.com/principals/users/bar" : (
                         "Bar",
                         "bar",
                         "INDIVIDUAL",
-                        ("urn:uuid:bar",)
+                        ("urn:x-uid:bar", "urn:uuid:bar",)
                     ),
                     "http://example.com/principals/locations/buzz" : (
                         "{Restricted} Buzz",
                         "buzz",
                         "INDIVIDUAL",
-                        ("urn:uuid:buzz",)
+                        ("urn:x-uid:buzz", "urn:uuid:buzz",)
                     ),
                 }[cuaddr]
             )
 
-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
 
         # Location value changed
         prop = component.mainComponent().getProperty("LOCATION")
         self.assertEquals(prop.value(), "Buzz")
-        prop = component.getAttendeeProperty(("urn:uuid:buzz",))
-        self.assertEquals("urn:uuid:buzz", prop.value())
+        prop = component.getAttendeeProperty(("urn:x-uid:buzz",))
+        self.assertEquals("urn:x-uid:buzz", prop.value())
         self.assertEquals(prop.parameterValue("CN"), "{Restricted} Buzz")
 
 
@@ -8529,7 +8538,7 @@
 
 
     @inlineCallbacks
-    def test_normalizeCUAddressFromUUID(self):
+    def test_normalizeCUAddressFromCanonical(self):
         """
         Ensure mailto is preferred, followed by path form, then http form.
         If CALENDARSERVER-OLD-CUA parameter is present, restore that value.
@@ -8539,7 +8548,11 @@
             ("urn:uuid:foo", "/foo"),
             ("urn:uuid:bar", "mailto:bar at example.com",),
             ("urn:uuid:baz", "http://example.com/baz",),
-            ("urn:uuid:buz", "urn:uuid:buz",),
+            ("urn:uuid:buz", "urn:x-uid:buz",),
+            ("urn:x-uid:foo", "/foo"),
+            ("urn:x-uid:bar", "mailto:bar at example.com",),
+            ("urn:x-uid:baz", "http://example.com/baz",),
+            ("urn:x-uid:buz", "urn:x-uid:buz",),
         )
 
         def lookupFunction(cuaddr, ignored1, ignored2):
@@ -8549,44 +8562,68 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo", "http://example.com/foo", "/foo")
+                        ("urn:x-uid:foo", "urn:uuid:foo", "http://example.com/foo", "/foo")
                     ),
                     "urn:uuid:bar" : (
                         "Bar",
                         "bar",
                         "INDIVIDUAL",
-                        ("urn:uuid:bar", "mailto:bar at example.com", "http://example.com/bar", "/bar")
+                        ("urn:x-uid:bar", "urn:uuid:bar", "mailto:bar at example.com", "http://example.com/bar", "/bar")
                     ),
                     "urn:uuid:baz" : (
                         "Baz",
                         "baz",
                         "INDIVIDUAL",
-                        ("urn:uuid:baz", "http://example.com/baz")
+                        ("urn:x-uid:baz", "urn:uuid:baz", "http://example.com/baz")
                     ),
                     "urn:uuid:buz" : (
                         "Buz",
                         "buz",
                         "INDIVIDUAL",
-                        ("urn:uuid:buz",)
+                        ("urn:x-uid:buz", "urn:uuid:buz",)
                     ),
+                    "urn:x-uid:foo" : (
+                        "Foo",
+                        "foo",
+                        "INDIVIDUAL",
+                        ("urn:x-uid:foo", "urn:uuid:foo", "http://example.com/foo", "/foo")
+                    ),
+                    "urn:x-uid:bar" : (
+                        "Bar",
+                        "bar",
+                        "INDIVIDUAL",
+                        ("urn:x-uid:bar", "urn:uuid:bar", "mailto:bar at example.com", "http://example.com/bar", "/bar")
+                    ),
+                    "urn:x-uid:baz" : (
+                        "Baz",
+                        "baz",
+                        "INDIVIDUAL",
+                        ("urn:x-uid:baz", "urn:uuid:baz", "http://example.com/baz")
+                    ),
+                    "urn:x-uid:buz" : (
+                        "Buz",
+                        "buz",
+                        "INDIVIDUAL",
+                        ("urn:x-uid:buz", "urn:uuid:buz",)
+                    ),
                 }[cuaddr]
             )
 
         for cuaddr, result in data:
-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=False)
+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=False)
             self.assertEquals(new_cuaddr, result)
 
 
     @inlineCallbacks
-    def test_normalizeCUAddressToUUID(self):
+    def test_normalizeCUAddressToCanonical(self):
         """
         Ensure http(s) and /path CUA values are tucked away into the property
         using CALENDARSERVER-OLD-CUA parameter.
         """
 
         data = (
-            ("/principals/users/foo", "urn:uuid:foo",),
-            ("http://example.com/principals/users/buz", "urn:uuid:buz",),
+            ("/principals/users/foo", "urn:x-uid:foo",),
+            ("http://example.com/principals/users/buz", "urn:x-uid:buz",),
         )
 
 
@@ -8597,19 +8634,19 @@
                         "Foo",
                         "foo",
                         "INDIVIDUAL",
-                        ("urn:uuid:foo",)
+                        ("urn:x-uid:foo", "urn:uuid:foo",)
                     ),
                     "http://example.com/principals/users/buz" : (
                         "Buz",
                         "buz",
                         "INDIVIDUAL",
-                        ("urn:uuid:buz",)
+                        ("urn:x-uid:buz", "urn:uuid:buz",)
                     ),
                 }[cuaddr]
             )
 
         for cuaddr, result in data:
-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=True)
+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=True)
             self.assertEquals(new_cuaddr, result)
 
 

Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/test/test_upgrade.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -1537,13 +1537,13 @@
 
         records = {
             "mailto:a at example.com":
-                StubRecord(("User A",), u"123", ("mailto:a at example.com", "urn:uuid:123")),
+                StubRecord(("User A",), u"123", ("mailto:a at example.com", "urn:x-uid:123")),
             "mailto:b at example.com":
-                StubRecord(("User B",), u"234", ("mailto:b at example.com", "urn:uuid:234")),
+                StubRecord(("User B",), u"234", ("mailto:b at example.com", "urn:x-uid:234")),
             "/principals/users/a":
-                StubRecord(("User A",), u"123", ("mailto:a at example.com", "urn:uuid:123")),
+                StubRecord(("User A",), u"123", ("mailto:a at example.com", "urn:x-uid:123")),
             "/principals/users/b":
-                StubRecord(("User B",), u"234", ("mailto:b at example.com", "urn:uuid:234")),
+                StubRecord(("User B",), u"234", ("mailto:b at example.com", "urn:x-uid:234")),
         }
 
         directory = StubDirectory()
@@ -1681,17 +1681,18 @@
 DTSTART;TZID=US/Pacific:20090203T120000
 DTEND;TZID=US/Pacific:20090203T130000
 ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez at example.com;
- PARTSTAT=ACCEPTED:urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D
+ PARTSTAT=ACCEPTED:urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D
 ATTENDEE;CN=Double 'quotey' Quotes;CUTYPE=INDIVIDUAL;EMAIL=doublequotes at ex
- ample.com;PARTSTAT=ACCEPTED:urn:uuid:8E04787E-336D-41ED-A70B-D233AD0DCE6F
+ ample.com;PARTSTAT=ACCEPTED:urn:x-uid:8E04787E-336D-41ED-A70B-D233AD0DCE6
+ F
 ATTENDEE;CN=Cyrus Daboo;CUTYPE=INDIVIDUAL;EMAIL=cdaboo at example.com;PARTSTA
- T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:5A985493-EE2C-4665-94CF-4DFEA3A8
- 9500
+ T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:x-uid:5A985493-EE2C-4665-94CF-4DFEA3A
+ 89500
 CREATED:20090203T181910Z
 DESCRIPTION:This has " Bad Quotes " in it
 DTSTAMP:20090203T181924Z
-ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo at example.com:urn:uuid:5A985493-EE2C-4
- 665-94CF-4DFEA3A89500
+ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo at example.com:urn:x-uid:5A985493-EE2C-
+ 4665-94CF-4DFEA3A89500
 SEQUENCE:2
 SUMMARY:New Event
 TRANSP:OPAQUE

Modified: CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/twistedcaldav/upgrade.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -587,7 +587,8 @@
 @inlineCallbacks
 def normalizeCUAddrs(data, directory, cuaCache):
     """
-    Normalize calendar user addresses to urn:uuid: form.
+    Normalize calendar user addresses in data.  Cache CUA lookup results for
+    great speed.
 
     @param data: the calendar data to convert
     @type data: C{str}

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/implicit.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -633,7 +633,7 @@
                 self.calendar.sequenceInSync(self.oldcalendar)
 
             # Significant change
-            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = yield self.isOrganizerChangeInsignificant()
+            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = self.isOrganizerChangeInsignificant()
             if no_change:
                 if reinvites:
                     log.debug("Implicit - organizer '{organizer}' is re-inviting UID: '{uid}', attendees: {attendees}", organizer=self.organizer, uid=self.uid, attendees=", ".join(reinvites))
@@ -721,7 +721,6 @@
                 pass
 
 
-    @inlineCallbacks
     def isOrganizerChangeInsignificant(self):
 
         rids = None
@@ -812,16 +811,8 @@
                     only_status = False
 
             if checkOrganizerValue:
-                @inlineCallbacks
-                def _normalizeCUAddress(addr):
-                    if not addr.startswith("urn:uuid"):
-                        principal = yield self.calendar_home.directoryService().recordWithCalendarUserAddress(addr)
-                        if principal is not None:
-                            addr = principal.canonicalCalendarUserAddress()
-                    returnValue(addr)
-
-                oldOrganizer = yield _normalizeCUAddress(self.oldcalendar.getOrganizer())
-                newOrganizer = yield _normalizeCUAddress(self.calendar.getOrganizer())
+                oldOrganizer = self.oldcalendar.getOrganizer()
+                newOrganizer = self.calendar.getOrganizer()
                 if oldOrganizer != newOrganizer:
                     log.error("Cannot change ORGANIZER: UID:{uid}", uid=self.uid)
                     raise HTTPError(ErrorResponse(
@@ -839,10 +830,10 @@
                 except KeyError:
                     pass
 
-        returnValue((
+        return (
             no_change, rids, date_changed_rids, reinvites,
             recurrence_reschedule, status_cancelled, only_status
-        ))
+        )
 
 
     def findRemovedAttendees(self):

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/ischedule/delivery.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -359,7 +359,7 @@
         # The Originator must be the ORGANIZER (for a request) or ATTENDEE (for a reply)
         originator = self.scheduler.organizer.cuaddr if self.scheduler.isiTIPRequest else self.scheduler.attendee
         if self.server.unNormalizeAddresses:
-            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toUUID=False)
+            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toCanonical=False)
         self.headers.addRawHeader("Originator", utf8String(originator))
         self.sign_headers.append("Originator")
 
@@ -417,7 +417,7 @@
                 yield normalizedCalendar.normalizeCalendarUserAddresses(
                     normalizationLookup,
                     self.scheduler.txn.directoryService().recordWithCalendarUserAddress,
-                    toUUID=False)
+                    toCanonical=False)
 
             # For VFREEBUSY we need to strip out ATTENDEEs that do not match the recipient list
             if self.scheduler.isfreebusy:

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/scheduling/test/test_implicit.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -1295,7 +1295,8 @@
 
         cobj = yield self.calendarObjectUnderTest(home="user01", name="test.ics")
         comp = yield cobj.component()
-        self.assertTrue(comp.getOrganizer().startswith("mailto:"))
+        # Because CUA normalization happens in component() now too...
+        self.assertTrue(comp.getOrganizer().startswith("urn:x-uid:"))
         self.assertFalse(comp.getOrganizerScheduleAgent())
 
         cobj = yield self.calendarObjectUnderTest(home="user01", name="test.ics")
@@ -1304,7 +1305,7 @@
 
         cobj = yield self.calendarObjectUnderTest(home="user01", name="test.ics")
         comp = yield cobj.component()
-        self.assertTrue(comp.getOrganizer().startswith("urn:uuid:"))
+        self.assertTrue(comp.getOrganizer().startswith("urn:x-uid:"))
         self.assertTrue(comp.getOrganizerScheduleAgent())
 
 

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/sql.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -3003,6 +3003,14 @@
             # Fix any bogus data we can
             fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
 
+            # Normalize CUAs:
+            # FIXME: update the DB copy as well so we don't keep going through
+            # this normalization?
+            yield component.normalizeCalendarUserAddresses(
+                normalizationLookup,
+                self.directoryService().recordWithCalendarUserAddress
+            )
+
             if unfixed:
                 self.log.error(
                     "Calendar data id={0} had unfixable problems:\n  {1}".format(

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_implicit.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -103,8 +103,8 @@
         calendar_resource1 = (yield self.calendarObjectUnderTest(name="test.ics", home="user01",))
         calendar1 = (yield calendar_resource1.component())
         calendar1 = str(calendar1).replace("\r\n ", "")
-        self.assertTrue("urn:uuid:user01" in calendar1)
-        self.assertTrue("urn:uuid:user02" in calendar1)
+        self.assertTrue("urn:x-uid:user01" in calendar1)
+        self.assertTrue("urn:x-uid:user02" in calendar1)
         self.assertTrue("CN=" in calendar1)
         yield self.commit()
 
@@ -543,7 +543,7 @@
 DTSTAMP:20080601T120000Z
 DTSTART:20080601T120000Z
 DTEND:20080601T130000Z
-X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:x-uid:user01";
  X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment
 END:VEVENT
 END:VCALENDAR
@@ -577,7 +577,7 @@
         calendar_resource = (yield self.calendarObjectUnderTest(name="test.ics", home="user01",))
         calendar1 = (yield calendar_resource.component())
         calendar1 = str(calendar1).replace("\r\n ", "")
-        self.assertTrue("X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\"urn:uuid:user01\";X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment" in calendar1)
+        self.assertTrue("X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\"urn:x-uid:user01\";X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment" in calendar1)
         self.assertTrue("SUMMARY:Changed" in calendar1)
         yield self.commit()
 

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_queue_scheduling.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -122,10 +122,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR
@@ -139,10 +139,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR
@@ -155,10 +155,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 TRANSP:TRANSPARENT
 END:VEVENT
@@ -172,10 +172,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR
@@ -188,10 +188,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR
@@ -205,9 +205,9 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 REQUEST-STATUS:2.0;Success
 END:VEVENT
@@ -221,10 +221,10 @@
 UID:12345-67890
 DTSTART:{now}T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com;SCHEDULE-STATUS=1.2:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com;SCHEDULE-STATUS=1.2:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/test_sql.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -2022,10 +2022,10 @@
 UID:12345-67890
 DTSTART:20130806T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SUMMARY:1
 END:VEVENT
@@ -2034,10 +2034,10 @@
 RECURRENCE-ID:20130807T120000Z
 DTSTART:20130807T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1
 END:VEVENT
 END:VCALENDAR
@@ -2050,10 +2050,10 @@
 UID:12345-67890
 DTSTART:20130806T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SEQUENCE:1
 SUMMARY:1-2
@@ -2063,10 +2063,10 @@
 RECURRENCE-ID:20130807T000000Z
 DTSTART:20130807T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:1
 SUMMARY:1-3
 END:VEVENT
@@ -2080,10 +2080,10 @@
 UID:12345-67890
 DTSTART:20130806T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SEQUENCE:1
 SUMMARY:1-2
@@ -2093,10 +2093,10 @@
 RECURRENCE-ID:20130807T000000Z
 DTSTART:20130807T000000Z
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:1
 SUMMARY:1-3
 END:VEVENT
@@ -2160,12 +2160,12 @@
 DTSTART;TZID=America/Los_Angeles:20131211T164500
 DTEND;TZID=America/Los_Angeles:20131211T174500
 ATTENDEE;CN=Conference Room One;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
- T;SCHEDULE-STATUS=2.0:urn:uuid:room1
+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room1
 ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01 at example.com;PARTSTAT=AC
- CEPTED:urn:uuid:user01
+ CEPTED:urn:x-uid:user01
 CREATED:20131211T221854Z
 DTSTAMP:20131211T230632Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY;COUNT=5
 SEQUENCE:8
 SUMMARY:locations
@@ -2177,12 +2177,12 @@
 DTSTART;TZID=America/Los_Angeles:20131214T160000
 DTEND;TZID=America/Los_Angeles:20131214T170000
 ATTENDEE;CN=Conference Room Two;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
- T;SCHEDULE-STATUS=2.0:urn:uuid:room2
+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room2
 ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01 at example.com;PARTSTAT=AC
- CEPTED:urn:uuid:user01
+ CEPTED:urn:x-uid:user01
 CREATED:20131211T221854Z
 DTSTAMP:20131211T230632Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:8
 SUMMARY:locations
 TRANSP:OPAQUE
@@ -2571,11 +2571,11 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2589,10 +2589,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user05
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user05
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2606,11 +2606,11 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -2624,11 +2624,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user04
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user04
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2637,10 +2637,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2654,12 +2654,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2685,11 +2685,11 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -2703,11 +2703,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE:urn:uuid:user04
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE:urn:x-uid:user04
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2716,10 +2716,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2741,12 +2741,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2765,12 +2765,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2796,13 +2796,13 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_back25)s
 EXDATE:%(now_back24)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -2829,12 +2829,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:uuid:user03
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03 at example.com;RSVP=TRUE:urn:x-uid:user03
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -2854,11 +2854,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE:urn:uuid:user04
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04 at example.com;RSVP=TRUE:urn:x-uid:user04
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2881,10 +2881,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE:urn:uuid:user05
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE:urn:x-uid:user05
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -2908,10 +2908,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE:urn:uuid:user05
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05 at example.com;RSVP=TRUE:urn:x-uid:user05
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -3188,10 +3188,10 @@
 UID:12345-67890
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3208,10 +3208,10 @@
 UID:12345-67890
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3235,10 +3235,10 @@
 UID:12345-67890
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3251,10 +3251,10 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3270,10 +3270,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3294,10 +3294,10 @@
 UID:12345-67890
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SUMMARY:1234567890123456789012345678901234567890
  1234567890123456789012345678901234567890
@@ -3459,10 +3459,10 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SEQUENCE:1
 END:VEVENT
@@ -3477,10 +3477,10 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RRULE:FREQ=DAILY
 SEQUENCE:1
 SUMMARY:1234567890123456789012345678901234567890
@@ -3494,10 +3494,10 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:1
 END:VEVENT
 BEGIN:VEVENT
@@ -3506,10 +3506,10 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:1
 END:VEVENT
 BEGIN:VEVENT
@@ -3518,10 +3518,10 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 SEQUENCE:1
 END:VEVENT
 END:VCALENDAR
@@ -3535,10 +3535,10 @@
 DTSTART:%(now_back14)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:3
@@ -3553,10 +3553,10 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3571,10 +3571,10 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:3
@@ -3589,10 +3589,10 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3602,10 +3602,10 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3620,10 +3620,10 @@
 DTSTART:%(now_back14)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:3
@@ -3638,10 +3638,10 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3663,10 +3663,10 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:3
@@ -3681,10 +3681,10 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3694,10 +3694,10 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:%(dtstamp)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:3
 END:VEVENT
@@ -3913,7 +3913,7 @@
 DTSTART:%(now_back14)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -3930,7 +3930,7 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -3966,7 +3966,7 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -3983,7 +3983,7 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -3995,7 +3995,7 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4044,7 +4044,7 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4061,7 +4061,7 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4073,7 +4073,7 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4096,7 +4096,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip1 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "12345-67890"
 
@@ -4143,7 +4143,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip2 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "C4526F4C-4324-4893-B769-BD766E4A4E7C"
 
@@ -4217,7 +4217,7 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4253,7 +4253,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip1 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "CANCEL"
         processor.uid = "12345-67890"
 
@@ -4336,7 +4336,7 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4371,7 +4371,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip1 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "12345-67890"
 
@@ -4475,7 +4475,7 @@
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4505,7 +4505,7 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4541,7 +4541,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip1 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "12345-67890"
 
@@ -4697,7 +4697,7 @@
 DTSTART:%(now_back30)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4714,7 +4714,7 @@
 DTSTART:%(now_back25)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4726,7 +4726,7 @@
 DTSTART:%(now_back24)s
 DURATION:PT1H
 ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01 at example.org
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=DECLINED:urn:x-uid:user01
 DTSTAMP:20051222T210507Z
 ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01 at example.org
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
@@ -4758,7 +4758,7 @@
         processor.recipient_calendar = (yield cobj.componentForUser("user01"))
         processor.message = Component.fromString(itip1 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "12345-67890"
 
@@ -4777,7 +4777,7 @@
         processor.recipient_calendar = None
         processor.message = Component.fromString(itip2 % self.subs)
         processor.originator = RemoteCalendarUser("mailto:cuser01 at example.org")
-        processor.recipient = LocalCalendarUser("urn:uuid:user01", None)
+        processor.recipient = LocalCalendarUser("urn:x-uid:user01", None)
         processor.method = "REQUEST"
         processor.uid = "C4526F4C-4324-4893-B769-BD766E4A4E7C"
 
@@ -4858,11 +4858,11 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -4876,10 +4876,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -4893,11 +4893,11 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -4911,11 +4911,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -4924,10 +4924,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -4941,12 +4941,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -4972,11 +4972,11 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -4990,11 +4990,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5003,10 +5003,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5028,12 +5028,12 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_fwd10)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -5055,11 +5055,11 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -5073,10 +5073,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5093,12 +5093,12 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
 EXDATE:%(now_back24)s
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -5112,11 +5112,11 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 ATTENDEE;RSVP=TRUE:mailto:cuser01 at example.org
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5204,11 +5204,11 @@
 
         # Verify cuser02 data
         self.assertEqual(len(details), 2)
-        self.assertEqual(details[0][0], "urn:uuid:user01")
+        self.assertEqual(details[0][0], "urn:x-uid:user01")
         self.assertEqual(details[0][1], ("mailto:cuser01 at example.org",))
         self.assertEqual(normalize_iCalStr(details[0][2]), normalize_iCalStr(data_future_external) % relsubs, "Failed future: %s\n%s" % (title, diff_iCalStrs(details[0][2], data_future_external % relsubs),))
 
-        self.assertEqual(details[1][0], "urn:uuid:user01")
+        self.assertEqual(details[1][0], "urn:x-uid:user01")
         self.assertEqual(details[1][1], ("mailto:cuser01 at example.org",))
         self.assertEqual(normalize_iCalStr(details[1][2]), normalize_iCalStr(data_past_external) % relsubs, "Failed past: %s\n%s" % (title, diff_iCalStrs(details[1][2], data_past_external % relsubs),))
 
@@ -5325,10 +5325,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT2H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -5342,10 +5342,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5359,10 +5359,10 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT2H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -5376,10 +5376,10 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5388,10 +5388,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5405,10 +5405,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT2H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -5422,10 +5422,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5446,10 +5446,10 @@
 UID:%(relID)s
 DTSTART:%(now_back30)s
 DURATION:PT2H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -5463,10 +5463,10 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5475,10 +5475,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5500,10 +5500,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT2H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY
 SEQUENCE:1
@@ -5517,10 +5517,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5706,10 +5706,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;COUNT=36
 SEQUENCE:1
@@ -5723,10 +5723,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5740,10 +5740,10 @@
 UID:%(relID)s
 DTSTART:%(now_back28)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -5757,10 +5757,10 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5769,10 +5769,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5786,10 +5786,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;COUNT=36
 SEQUENCE:1
@@ -5803,10 +5803,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5827,10 +5827,10 @@
 UID:%(relID)s
 DTSTART:%(now_back28)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
 SEQUENCE:1
@@ -5844,10 +5844,10 @@
 RECURRENCE-ID:%(now_back25)s
 DTSTART:%(now_back25)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5856,10 +5856,10 @@
 RECURRENCE-ID:%(now_back24)s
 DTSTART:%(now_back24)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT
@@ -5881,10 +5881,10 @@
 UID:12345-67890
 DTSTART:%(now_back14)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 RRULE:FREQ=DAILY;COUNT=36
 SEQUENCE:1
@@ -5898,10 +5898,10 @@
 RECURRENCE-ID:%(now_fwd10)s
 DTSTART:%(now_fwd10)s
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:user02
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:user02
 DTSTAMP:20051222T210507Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:user01
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:user01
 RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
 SEQUENCE:1
 END:VEVENT

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/test/util.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -81,6 +81,7 @@
     def canonicalCalendarUserAddress(self):
         """
             Return a CUA for this record, preferring in this order:
+            urn:x-uid: form
             urn:uuid: form
             mailto: form
             /principals/__uids__/ form
@@ -90,6 +91,7 @@
         sortedCuas = sorted(self.calendarUserAddresses)
 
         for prefix in (
+            "urn:x-uid:",
             "urn:uuid:",
             "mailto:",
             "/principals/__uids__/"
@@ -147,6 +149,7 @@
             ("user%02d" % (ctr,),),
             "User %02d" % (ctr,),
             frozenset((
+                "urn:x-uid:user%02d" % (ctr,),
                 "urn:uuid:user%02d" % (ctr,),
                 "mailto:user%02d at example.com" % (ctr,),
             )),
@@ -188,13 +191,13 @@
     ))
     directory.addRecord(TestCalendarStoreDirectoryRecord(
         "room1", ("room1",), "Conference Room One",
-        frozenset(("urn:uuid:room1",)),
+        frozenset(("urn:x-uid:room1",)),
         cutype="ROOM",
         associatedAddress="il1",
     ))
     directory.addRecord(TestCalendarStoreDirectoryRecord(
         "room2", ("room2",), "Conference Room Two",
-        frozenset(("urn:uuid:room2",)),
+        frozenset(("urn:x-uid:room2",)),
         cutype="ROOM",
         associatedAddress="il2",
     ))
@@ -209,6 +212,7 @@
         (uid,),
         uid.capitalize(),
         frozenset((
+            "urn:x-uid:{0}".format(uid,),
             "urn:uuid:{0}".format(uid,),
             "mailto:{0}@example.com".format(uid,),
         )),

Modified: CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/caldav/datastore/util.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -104,8 +104,8 @@
 def normalizationLookup(cuaddr, recordFunction, config):
     """
     Lookup function to be passed to ical.normalizeCalendarUserAddresses.
-    Returns a tuple of (Full name C{str}, guid C{UUID}, cudtype C{str}, and
-    calendar user address list C{str}) for the given cuaddr.
+    Returns a tuple of (Full name C{unicode}, uid C{unicode}, cudtype C{str}, and
+    calendar user address list C{unicode}) for the given cuaddr.
     recordFunction is called to retrieve the record for the cuaddr.
     """
     try:
@@ -127,15 +127,10 @@
         cuas = set(
             [cua.encode("utf-8") for cua in record.calendarUserAddresses]
         )
-        try:
-            guid = record.guid
-        except AttributeError:
-            guid = None
+        returnValue((fullName, record.uid, record.getCUType(), cuas))
 
-        returnValue((fullName, guid, record.getCUType(), cuas))
 
 
-
 @inlineCallbacks
 def dropboxIDFromCalendarObject(calendarObject):
     """

Modified: CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/common/datastore/sql_schema/current.sql	2014-04-17 18:25:57 UTC (rev 13309)
@@ -1007,6 +1007,45 @@
 create index SCHEDULE_REPLY_CANCEL_WORK_JOB_ID on
   SCHEDULE_REPLY_CANCEL_WORK(JOB_ID);
 
+----------------------------------
+-- Principal Purge Polling Work --
+----------------------------------
+
+create table PRINCIPAL_PURGE_SCAN_POLLING_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null
+);
+
+create index PRINCIPAL_PURGE_SCAN_POLLING_WORK_JOB_ID on
+  PRINCIPAL_PURGE_SCAN_POLLING_WORK(JOB_ID);
+
+--------------------------------
+-- Principal Purge Check Work --
+--------------------------------
+
+create table PRINCIPAL_PURGE_CHECK_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_CHECK_WORK_JOB_ID on
+  PRINCIPAL_PURGE_CHECK_WORK(JOB_ID);
+
+--------------------------
+-- Principal Purge Work --
+--------------------------
+
+create table PRINCIPAL_PURGE_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_WORK_JOB_ID on
+  PRINCIPAL_PURGE_WORK(JOB_ID);
+
+
 --------------------
 -- Schema Version --
 --------------------

Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/directory.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -68,16 +68,23 @@
         from txdav.caldav.datastore.scheduling.cuaddress import normalizeCUAddr
         address = normalizeCUAddr(address)
         record = None
-        if address.startswith("urn:uuid:"):
+
+        if address.startswith("urn:x-uid:"):
+            uid = address[10:]
+            record = yield self.recordWithUID(uid)
+
+        elif address.startswith("urn:uuid:"):
             try:
                 guid = uuid.UUID(address[9:])
             except ValueError:
                 log.info("Invalid GUID: {guid}", guid=address[9:])
                 returnValue(None)
             record = yield self.recordWithGUID(guid)
+
         elif address.startswith("mailto:"):
             records = yield self.recordsWithEmailAddress(address[7:])
             record = records[0] if records else None
+
         elif address.startswith("/principals/"):
             parts = address.split("/")
             if len(parts) == 4:
@@ -85,7 +92,6 @@
                     uid = parts[3]
                     record = yield self.recordWithUID(uid)
                 else:
-                    # recordType = self.fieldName.lookupByName(parts[2])
                     recordType = self.oldNameToRecordType(parts[2])
                     record = yield self.recordWithShortName(recordType, parts[3])
 
@@ -259,30 +265,31 @@
         except AttributeError:
             pass
 
-        try:
-            cuas = set(
-                ["mailto:{0}".format(emailAddress,)
-                 for emailAddress in self.emailAddresses]
-            )
-        except AttributeError:
-            cuas = set()
+        cuas = set()
 
+        # urn:x-uid:
+        cuas.add("urn:x-uid:{}".format(self.uid))
+
+        # urn:uuid:
         try:
             if self.guid:
                 if isinstance(self.guid, uuid.UUID):
                     guid = unicode(self.guid).upper()
                 else:
                     guid = self.guid
-                cuas.add("urn:uuid:{guid}".format(guid=guid))
+                cuas.add("urn:uuid:{}".format(guid))
         except AttributeError:
             # No guid
             pass
-        cuas.add(u"/principals/__uids__/{uid}/".format(uid=self.uid))
-        for shortName in self.shortNames:
-            cuas.add(u"/principals/{rt}/{sn}/".format(
-                rt=self.service.recordTypeToOldName(self.recordType),
-                sn=shortName)
-            )
+
+        # mailto:
+        try:
+            for emailAddress in self.emailAddresses:
+                cuas.add(u"mailto:{}".format(emailAddress))
+        except AttributeError:
+            # No emailAddresses
+            pass
+
         return frozenset(cuas)
 
     # Mapping from directory record.recordType to RFC2445 CUTYPE values
@@ -346,6 +353,7 @@
     def canonicalCalendarUserAddress(self):
         """
             Return a CUA for this record, preferring in this order:
+            urn:x-uid: form
             urn:uuid: form
             mailto: form
             /principals/__uids__/ form
@@ -355,6 +363,7 @@
         sortedCuas = sorted(self.calendarUserAddresses)
 
         for prefix in (
+            "urn:x-uid:",
             "urn:uuid:",
             "mailto:",
             "/principals/__uids__/"

Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_directory.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -60,20 +60,22 @@
         record = TestDirectoryRecord(
             self.directory,
             {
-                FieldName.uid: u"uid",
+                FieldName.uid: u"test",
                 FieldName.shortNames: [u"name"],
                 FieldName.recordType: RecordType.user,
             }
         )
         self.assertEquals(
             record.canonicalCalendarUserAddress(),
-            u"/principals/__uids__/uid/"
+            u"urn:x-uid:test"
         )
 
+        # Even with email address, canonical still remains urn:x-uid:
+
         record = TestDirectoryRecord(
             self.directory,
             {
-                FieldName.uid: u"uid",
+                FieldName.uid: u"test",
                 FieldName.shortNames: [u"name"],
                 FieldName.emailAddresses: [u"test at example.com"],
                 FieldName.recordType: RecordType.user,
@@ -81,25 +83,57 @@
         )
         self.assertEquals(
             record.canonicalCalendarUserAddress(),
-            u"mailto:test at example.com"
+            u"urn:x-uid:test"
         )
 
+
+    def test_calendarUserAddresses(self):
+        """
+        Verify the right CUAs are advertised, which no longer includes the
+        /principals/ flavors (although those are still recognized by
+        recordWithCalendarUserAddress( ) for backwards compatibility).
+        """
+
         record = TestDirectoryRecord(
             self.directory,
             {
-                FieldName.uid: u"uid",
+                FieldName.uid: u"test",
                 FieldName.guid: UUID("E2F6C57F-BB15-4EF9-B0AC-47A7578386F1"),
-                FieldName.shortNames: [u"name"],
-                FieldName.emailAddresses: [u"test at example.com"],
+                FieldName.shortNames: [u"name1", u"name2"],
+                FieldName.emailAddresses: [u"test at example.com", u"another at example.com"],
                 FieldName.recordType: RecordType.user,
             }
         )
         self.assertEquals(
-            record.canonicalCalendarUserAddress(),
-            u"urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1"
+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u"urn:x-uid:test",
+                    u"urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1",
+                    u"mailto:test at example.com",
+                    u"mailto:another at example.com",
+                ]
+            )
         )
 
+        record = TestDirectoryRecord(
+            self.directory,
+            {
+                FieldName.uid: u"test",
+                FieldName.shortNames: [u"name1", u"name2"],
+                FieldName.recordType: RecordType.user,
+            }
+        )
+        self.assertEquals(
+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u"urn:x-uid:test",
+                ]
+            )
+        )
 
+
     @inlineCallbacks
     def test_recordsFromMatchExpression(self):
         expression = MatchExpression(
@@ -127,7 +161,9 @@
     @inlineCallbacks
     def test_recordWithCalendarUserAddress(self):
         """
-        Make sure hasCalendars is honored
+        Make sure various CUA forms are recognized and hasCalendars is honored.
+        Note: /principals/ CUAs are recognized but not advertised anymore; see
+        record.calendarUserAddresses.
         """
 
         # hasCalendars
@@ -135,7 +171,32 @@
             u"mailto:wsanchez at example.com"
         )
         self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u"6423F94A-6B76-4A3A-815B-D52CFD77935D")
 
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u"urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D"
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u"6423F94A-6B76-4A3A-815B-D52CFD77935D")
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u"urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D"
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u"6423F94A-6B76-4A3A-815B-D52CFD77935D")
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u"/principals/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D"
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u"6423F94A-6B76-4A3A-815B-D52CFD77935D")
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u"/principals/users/wsanchez"
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u"6423F94A-6B76-4A3A-815B-D52CFD77935D")
+
         # no hasCalendars
         record = yield self.directory.recordWithCalendarUserAddress(
             u"mailto:nocalendar at example.com"

Modified: CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py
===================================================================
--- CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py	2014-04-17 18:18:04 UTC (rev 13308)
+++ CalendarServer/branches/users/sagen/newcua/txdav/who/test/test_group_attendees.py	2014-04-17 18:25:57 UTC (rev 13309)
@@ -29,6 +29,7 @@
 from txdav.who.util import directoryFromConfig
 import os
 
+
 class GroupAttendeeReconciliation(CommonCommonTests, unittest.TestCase):
     """
     GroupAttendeeReconciliation tests
@@ -41,12 +42,16 @@
         yield super(GroupAttendeeReconciliation, self).setUp()
         self.xmlService = xmlService(self.mktemp(), xmlData=None)
 
-        self.patch(config.DirectoryService.params, "xmlFile",
+        self.patch(
+            config.DirectoryService.params,
+            "xmlFile",
             os.path.join(
                 os.path.dirname(__file__), "accounts", "groupAttendeeAccounts.xml"
             )
         )
-        self.patch(config.ResourceService.params, "xmlFile",
+        self.patch(
+            config.ResourceService.params,
+            "xmlFile",
             os.path.join(
                 os.path.dirname(__file__), "accounts", "resources.xml"
             )
@@ -77,6 +82,7 @@
         "10000000-0000-0000-0000-000000000008" : None,
         "10000000-0000-0000-0000-000000000009" : None,
         "10000000-0000-0000-0000-000000000010" : None,
+
     }
 
     @inlineCallbacks
@@ -118,12 +124,12 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:10000000-0000-0000-0000-000000000001
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -138,7 +144,7 @@
 
         cobj1 = yield self.calendarObjectUnderTest(name="data1.ics", calendar_name="calendar", home="10000000-0000-0000-0000-000000000001")
         vcalendar2 = yield cobj1.component()
-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
 
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000006", 1)
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000007", 1)
@@ -176,10 +182,10 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
 ATTENDEE;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:FFFFFFFF-EEEE-DDDD-CCCC-BBBBBBBBBBBB
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:10000000-0000-0000-0000-000000000001
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -191,7 +197,7 @@
 
         cobj1 = yield self.calendarObjectUnderTest(name="data1.ics", calendar_name="calendar", home="10000000-0000-0000-0000-000000000001")
         vcalendar2 = yield cobj1.component()
-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
 
 
     @inlineCallbacks
@@ -227,11 +233,11 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:10000000-0000-0000-0000-000000000001
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -242,7 +248,7 @@
 
         cobj1 = yield self.calendarObjectUnderTest(name="data1.ics", calendar_name="calendar", home="10000000-0000-0000-0000-000000000001")
         vcalendar1 = yield cobj1.component()
-        self.assertEqual(normalize_iCalStr(vcalendar1), normalize_iCalStr(data_get_1))
+        self.assertEqual(normalize_iCalStr(vcalendar1), normalize_iCalStr(Component.fromString(data_get_1)))
 
 
     @inlineCallbacks
@@ -271,7 +277,7 @@
 UID:event1 at ninevah.local
 ORGANIZER:MAILTO:user01 at example.com
 ATTENDEE:mailto:user01 at example.com
-ATTENDEE:urn:uuid:20000000-0000-0000-0000-000000000004
+ATTENDEE:urn:x-uid:20000000-0000-0000-0000-000000000004
 END:VEVENT
 END:VCALENDAR"""
 
@@ -283,15 +289,15 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004
-ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
-ATTENDEE;CN=User 08;EMAIL=user08 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 10;EMAIL=user10 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000004
+ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 08;EMAIL=user08 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 10;EMAIL=user10 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000010
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:10000000-0000-0000-0000-000000000001
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -303,7 +309,7 @@
 
         cobj1 = yield self.calendarObjectUnderTest(name="data1.ics", calendar_name="calendar", home="10000000-0000-0000-0000-000000000001")
         vcalendar2 = yield cobj1.component()
-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
+        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(Component.fromString(data_get_1)))
 
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000006", 1)
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000007", 1)
@@ -351,16 +357,16 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000003
-ATTENDEE;CN=User 08;EMAIL=user08 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000003";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000003";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000003
+ATTENDEE;CN=User 08;EMAIL=user08 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000003";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000003";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 06;EMAIL=user06 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:uuid:10000000-0000-0000-0000-000000000001
+ORGANIZER;CN=User 01;EMAIL=user01 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -372,7 +378,7 @@
 
         cobj1 = yield self.calendarObjectUnderTest(name="data1.ics", calendar_name="calendar", home="10000000-0000-0000-0000-000000000001")
         vcalendar2 = yield cobj1.component()
-        self.assertEqual(normalize_iCalStr(vcalendar2), normalize_iCalStr(data_get_1))
+        self.assertEqual(normalize_iCalStr(vcalendar2, sort=True), normalize_iCalStr(Component.fromString(data_get_1), sort=True))
 
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000006", 1)
         yield self._verifyObjectResourceCount("10000000-0000-0000-0000-000000000007", 1)
@@ -410,10 +416,10 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:uuid:10000000-0000-0000-0000-000000000002
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
 SUMMARY:event 1
 END:VEVENT
 END:VCALENDAR
@@ -427,11 +433,11 @@
 UID:event1 at ninevah.local
 DTSTART;TZID=US/Eastern:20140101T100000
 DURATION:PT1H
-ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000001";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 02;EMAIL=user02 at example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01 at example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 01;EMAIL=user01 at example.com;MEMBER="urn:x-uid:20000000-0000-0000-0000-000000000001";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000001
 CREATED:20060101T150000Z
-ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:uuid:10000000-0000-0000-0000-000000000002
+ORGANIZER;CN=User 02;EMAIL=user02 at example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
 SEQUENCE:1
 SUMMARY:event 1
 END:VEVENT
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140417/8304adb1/attachment-0001.html>


More information about the calendarserver-changes mailing list