[CalendarServer-changes] [13331] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 18 13:38:33 PDT 2014


Revision: 13331
          http://trac.calendarserver.org//changeset/13331
Author:   sagen at apple.com
Date:     2014-04-18 13:38:33 -0700 (Fri, 18 Apr 2014)
Log Message:
-----------
Landing the newcua branch on trunk: urn:x-uid: is the new canonical calendar user address.  /principals/... CUAs are recognized but not advertised.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tap/caldav.py
    CalendarServer/trunk/calendarserver/tools/calverify.py
    CalendarServer/trunk/calendarserver/tools/purge.py
    CalendarServer/trunk/calendarserver/tools/shell/cmd.py
    CalendarServer/trunk/calendarserver/tools/test/test_calverify.py
    CalendarServer/trunk/calendarserver/tools/test/test_purge.py
    CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py
    CalendarServer/trunk/contrib/performance/_event_create.py
    CalendarServer/trunk/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py
    CalendarServer/trunk/contrib/performance/benchmarks/event_autoaccept.py
    CalendarServer/trunk/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py
    CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py
    CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py
    CalendarServer/trunk/contrib/performance/loadtest/profiles.py
    CalendarServer/trunk/contrib/performance/sqlusage/sqlusage.py
    CalendarServer/trunk/contrib/performance/test_event_change_date.py
    CalendarServer/trunk/twistedcaldav/directory/principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/util.py
    CalendarServer/trunk/twistedcaldav/ical.py
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/twistedcaldav/storebridge.py
    CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
    CalendarServer/trunk/twistedcaldav/test/test_sharing.py
    CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
    CalendarServer/trunk/twistedcaldav/upgrade.py
    CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/inbound.py
    CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py
    CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py
    CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py
    CalendarServer/trunk/txdav/caldav/datastore/sql.py
    CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py
    CalendarServer/trunk/txdav/caldav/datastore/test/test_queue_scheduling.py
    CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py
    CalendarServer/trunk/txdav/caldav/datastore/test/util.py
    CalendarServer/trunk/txdav/caldav/datastore/util.py
    CalendarServer/trunk/txdav/common/datastore/sql_schema/current-oracle-dialect.sql
    CalendarServer/trunk/txdav/common/datastore/sql_schema/current.sql
    CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_37_to_38.sql
    CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_37_to_38.sql
    CalendarServer/trunk/txdav/who/directory.py
    CalendarServer/trunk/txdav/who/test/test_directory.py
    CalendarServer/trunk/txdav/who/test/test_group_attendees.py

Property Changed:
----------------
    CalendarServer/trunk/


Property changes on: CalendarServer/trunk
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalDAVTester/trunk:11193-11198
/CalendarServer/branches/config-separation:4379-4443
/CalendarServer/branches/egg-info-351:4589-4625
/CalendarServer/branches/generic-sqlstore:6167-6191
/CalendarServer/branches/new-store:5594-5934
/CalendarServer/branches/new-store-no-caldavfile:5911-5935
/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
/CalendarServer/branches/release/CalendarServer-5.2-dev:11972,12357-12358,12794,12814
/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
/CalendarServer/branches/users/cdaboo/cross-pod-sharing:12038-12191
/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
/CalendarServer/branches/users/cdaboo/json:11622-11912
/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
/CalendarServer/branches/users/cdaboo/pods:7297-7377
/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
/CalendarServer/branches/users/cdaboo/pycard:7227-7237
/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
/CalendarServer/branches/users/cdaboo/scheduling-queue-refresh:11783-12557
/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
/CalendarServer/branches/users/cdaboo/timezones:7443-7699
/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
/CalendarServer/branches/users/gaya/cleanrevisions:12152-12334
/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
/CalendarServer/branches/users/glyph/conn-limit:6574-6577
/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
/CalendarServer/branches/users/glyph/dalify:6932-7023
/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
/CalendarServer/branches/users/glyph/deploybuild:7563-7572
/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
/CalendarServer/branches/users/glyph/disable-quota:7718-7727
/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
/CalendarServer/branches/users/glyph/hang-fix:11465-11491
/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
/CalendarServer/branches/users/glyph/linux-tests:6893-6900
/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
/CalendarServer/branches/users/glyph/new-export:7444-7485
/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
/CalendarServer/branches/users/glyph/oracle:7106-7155
/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
/CalendarServer/branches/users/glyph/other-html:8062-8091
/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
/CalendarServer/branches/users/glyph/q:9560-9688
/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
/CalendarServer/branches/users/glyph/quota:7604-7637
/CalendarServer/branches/users/glyph/sendfdport:5388-5424
/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
/CalendarServer/branches/users/glyph/sharedpool:6490-6550
/CalendarServer/branches/users/glyph/sharing-api:9192-9205
/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
/CalendarServer/branches/users/glyph/sql-store:5929-6073
/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
/CalendarServer/branches/users/glyph/subtransactions:7248-7258
/CalendarServer/branches/users/glyph/table-alias:8651-8664
/CalendarServer/branches/users/glyph/uidexport:7673-7676
/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
/CalendarServer/branches/users/sagen/applepush:8126-8184
/CalendarServer/branches/users/sagen/inboxitems:7380-7381
/CalendarServer/branches/users/sagen/locations-resources:5032-5051
/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
/CalendarServer/branches/users/sagen/move2who:12819-12860
/CalendarServer/branches/users/sagen/move2who-2:12861-12898
/CalendarServer/branches/users/sagen/move2who-3:12899-12913
/CalendarServer/branches/users/sagen/move2who-4:12914-13157
/CalendarServer/branches/users/sagen/move2who-5:13158-13163
/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/branches/users/sagen/resources-2:5084-5093
/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
/CalendarServer/branches/users/wsanchez/transations:5515-5593
   + /CalDAVTester/trunk:11193-11198
/CalendarServer/branches/config-separation:4379-4443
/CalendarServer/branches/egg-info-351:4589-4625
/CalendarServer/branches/generic-sqlstore:6167-6191
/CalendarServer/branches/new-store:5594-5934
/CalendarServer/branches/new-store-no-caldavfile:5911-5935
/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
/CalendarServer/branches/release/CalendarServer-5.2-dev:11972,12357-12358,12794,12814
/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
/CalendarServer/branches/users/cdaboo/cross-pod-sharing:12038-12191
/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
/CalendarServer/branches/users/cdaboo/json:11622-11912
/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
/CalendarServer/branches/users/cdaboo/pods:7297-7377
/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
/CalendarServer/branches/users/cdaboo/pycard:7227-7237
/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
/CalendarServer/branches/users/cdaboo/scheduling-queue-refresh:11783-12557
/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
/CalendarServer/branches/users/cdaboo/timezones:7443-7699
/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
/CalendarServer/branches/users/gaya/cleanrevisions:12152-12334
/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
/CalendarServer/branches/users/glyph/conn-limit:6574-6577
/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
/CalendarServer/branches/users/glyph/dalify:6932-7023
/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
/CalendarServer/branches/users/glyph/deploybuild:7563-7572
/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
/CalendarServer/branches/users/glyph/disable-quota:7718-7727
/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
/CalendarServer/branches/users/glyph/hang-fix:11465-11491
/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
/CalendarServer/branches/users/glyph/linux-tests:6893-6900
/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
/CalendarServer/branches/users/glyph/new-export:7444-7485
/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
/CalendarServer/branches/users/glyph/oracle:7106-7155
/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
/CalendarServer/branches/users/glyph/other-html:8062-8091
/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
/CalendarServer/branches/users/glyph/q:9560-9688
/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
/CalendarServer/branches/users/glyph/quota:7604-7637
/CalendarServer/branches/users/glyph/sendfdport:5388-5424
/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
/CalendarServer/branches/users/glyph/sharedpool:6490-6550
/CalendarServer/branches/users/glyph/sharing-api:9192-9205
/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
/CalendarServer/branches/users/glyph/sql-store:5929-6073
/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
/CalendarServer/branches/users/glyph/subtransactions:7248-7258
/CalendarServer/branches/users/glyph/table-alias:8651-8664
/CalendarServer/branches/users/glyph/uidexport:7673-7676
/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
/CalendarServer/branches/users/sagen/applepush:8126-8184
/CalendarServer/branches/users/sagen/inboxitems:7380-7381
/CalendarServer/branches/users/sagen/locations-resources:5032-5051
/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
/CalendarServer/branches/users/sagen/move2who:12819-12860
/CalendarServer/branches/users/sagen/move2who-2:12861-12898
/CalendarServer/branches/users/sagen/move2who-3:12899-12913
/CalendarServer/branches/users/sagen/move2who-4:12914-13157
/CalendarServer/branches/users/sagen/move2who-5:13158-13163
/CalendarServer/branches/users/sagen/newcua:13309-13327
/CalendarServer/branches/users/sagen/newcua-1:13328-13330
/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
/CalendarServer/branches/users/sagen/resources-2:5084-5093
/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
/CalendarServer/branches/users/wsanchez/transations:5515-5593

Modified: CalendarServer/trunk/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/caldav.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -604,8 +604,15 @@
             int(config.LogID) if config.LogID else 5
         )
 
+        # FIXME: uncomment this when purge is working
+        # from calendarserver.tools.purge import scheduleNextPrincipalPurgeUpdate
+        # yield scheduleNextPrincipalPurgeUpdate(
+        #     self.store,
+        #     int(config.LogID) if config.LogID else 5
+        # )
 
 
+
 class PreProcessingService(Service):
     """
     A Service responsible for running any work that needs to be finished prior

Modified: CalendarServer/trunk/calendarserver/tools/calverify.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/calverify.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/calverify.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/calendarserver/tools/purge.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/purge.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/purge.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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 PrincipalPurgePollingWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_POLLING_WORK)
+):
+
+    group = "principal_purge_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(
+            PrincipalPurgePollingWork,
+            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(PrincipalPurgePollingWork, 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/trunk/calendarserver/tools/shell/cmd.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/shell/cmd.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/shell/cmd.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/calendarserver/tools/test/test_calverify.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_calverify.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/test/test_calverify.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/calendarserver/tools/test/test_purge.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_purge.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/calendarserver/tools/test/test_purge_old_events.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/contrib/performance/_event_create.py
===================================================================
--- CalendarServer/trunk/contrib/performance/_event_create.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/_event_create.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -80,13 +80,13 @@
 
 attendee = """\
 ATTENDEE;CN=User %(SEQUENCE)02d;CUTYPE=INDIVIDUAL;EMAIL=user%(SEQUENCE)02d at example.com;PARTSTAT=NE
- EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:user%(SEQUENCE)02d
+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:x-uid:user%(SEQUENCE)02d
 """
 
 organizer = """\
-ORGANIZER;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d at example.com:urn:uuid:user%(SEQUENCE)02d
+ORGANIZER;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d at example.com:urn:x-uid:user%(SEQUENCE)02d
 ATTENDEE;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d at example.com;PARTSTAT=ACCEPTE
- D:urn:uuid:user%(SEQUENCE)02d
+ D:urn:x-uid:user%(SEQUENCE)02d
 """
 
 def formatDate(d):

Modified: CalendarServer/trunk/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py
===================================================================
--- CalendarServer/trunk/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -25,6 +25,7 @@
 from contrib.performance._event_create import (
     makeAttendees, makeVCalendar, formatDate, measure as _measure)
 
+
 def makeEvent(i, organizerSequence, attendeeCount):
     """
     Create a new half-hour long event that starts soon and recurs
@@ -38,7 +39,7 @@
     attendees = makeAttendees(attendeeCount)
     attendees.append(
         'ATTENDEE;CN="Resource 01";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
-        ' RUE;SCHEDULE-STATUS="1.2":urn:uuid:resource01\n')
+        ' RUE;SCHEDULE-STATUS="1.2":urn:x-uid:40000000-0000-0000-0000-000000000001\n')
     return makeVCalendar(
         uuid4(), start, end, rrule, organizerSequence, attendees)
 

Modified: CalendarServer/trunk/contrib/performance/benchmarks/event_autoaccept.py
===================================================================
--- CalendarServer/trunk/contrib/performance/benchmarks/event_autoaccept.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/benchmarks/event_autoaccept.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -34,7 +34,7 @@
     attendees = makeAttendees(attendeeCount)
     attendees.append(
         'ATTENDEE;CN="Resource 01";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
-        ' RUE;SCHEDULE-STATUS="1.2":urn:uuid:resource01\n')
+        ' RUE;SCHEDULE-STATUS="1.2":urn:x-uid:40000000-0000-0000-0000-000000000001\n')
     return makeVCalendar(
         uuid4(),
         base + i * interval,

Modified: CalendarServer/trunk/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py
===================================================================
--- CalendarServer/trunk/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -36,7 +36,7 @@
     attendees = makeAttendees(attendeeCount)
     attendees.append(
         'ATTENDEE;CN="Resource 01";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
-        ' RUE;SCHEDULE-STATUS="1.2":urn:uuid:resource01\n')
+        ' RUE;SCHEDULE-STATUS="1.2":urn:x-uid:40000000-0000-0000-0000-000000000001\n')
     return makeVCalendar(
         uuid4(), start, end, "RRULE:FREQ=WEEKLY", organizerSequence, attendees)
 

Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py
===================================================================
--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -73,7 +73,7 @@
 X-CALENDARSERVER-MASK-UID:EC75A61B-08A3-44FD-BFBB-2457BBD0D490
 DTSTAMP:20100729T174751Z
 ORGANIZER:mailto:user01 at example.com
-SUMMARY:Availability for urn:uuid:user02
+SUMMARY:Availability for urn:x-uid:user02
 END:VFREEBUSY
 END:VCALENDAR
 """
@@ -124,6 +124,7 @@
 @inlineCallbacks
 def measure(host, port, dtrace, events, samples):
     user = password = "user01"
+    uid = "10000000-0000-0000-0000-000000000001"
     root = "/"
     principal = "/"
     calendar = "vfreebusy-benchmark"
@@ -150,12 +151,12 @@
     headers = Headers({
             "content-type": ["text/calendar"],
             "originator": ["mailto:%s at example.com" % (user,)],
-            "recipient": ["urn:uuid:%s, urn:uuid:user02" % (user,)]})
+            "recipient": ["urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002" % (uid,)]})
 
     vfb = VFREEBUSY % {
             "attendees": "".join([
-                    "ATTENDEE:urn:uuid:%s\n" % (user,),
-                    "ATTENDEE:urn:uuid:user02\n"]),
+                    "ATTENDEE:urn:x-uid:%s\n" % (uid,),
+                    "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n"]),
             "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
             "end": formatDate(
                 baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}

Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py
===================================================================
--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -34,6 +34,7 @@
 
 from contrib.performance.benchmarks.vfreebusy import VFREEBUSY, formatDate, makeEventNear
 
+
 @inlineCallbacks
 def measure(host, port, dtrace, attendees, samples):
     userNumber = 1
@@ -51,7 +52,7 @@
     for i in [userNumber] + targets:
         targetUser = "user%02d" % (i,)
         for path in ["calendars/users/%s/" % (targetUser,),
-                     "calendars/__uids__/%s/" % (targetUser,)]:
+                     "calendars/__uids__/10000000-0000-0000-0000-000000000%03d/" % (i,)]:
             authinfo.add_password(
                 realm="Test Realm",
                 uri="http://%s:%d/%s" % (host, port, path),
@@ -75,14 +76,14 @@
 
     # And now issue the actual VFREEBUSY request
     method = 'POST'
-    uri = 'http://%s:%d/calendars/__uids__/%s/outbox/' % (host, port, user)
+    uri = 'http://%s:%d/calendars/__uids__/10000000-0000-0000-0000-000000000001/outbox/' % (host, port)
     headers = Headers({
             "content-type": ["text/calendar"],
             "originator": ["mailto:%s at example.com" % (user,)],
-            "recipient": [", ".join(["urn:uuid:user%02d" % (i,) for i in [userNumber] + targets])]})
+            "recipient": [", ".join(["urn:x-uid:10000000-0000-0000-0000-000000000%03d" % (i,) for i in [userNumber] + targets])]})
     body = StringProducer(VFREEBUSY % {
             "attendees": "".join([
-                    "ATTENDEE:urn:uuid:user%02d\n" % (i,)
+                    "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n" % (i,)
                     for i in [userNumber] + targets]),
             "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
             "end": formatDate(

Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -205,7 +205,7 @@
             except IndexError:
                 continue
             cuaddr = u'mailto:%s' % (record.email,)
-            uuid = u'urn:uuid:%s' % (record.uid,)
+            uuid = u'urn:x-uid:%s' % (record.uid,)
             if cuaddr not in invitees and uuid not in invitees:
                 break
         else:
@@ -592,21 +592,21 @@
     A Calendar user who creates new events.
     """
     _eventTemplate = Component.fromString("""\
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Apple Inc.//iCal 4.0.3//EN
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CREATED:20101018T155431Z
-UID:C98AD237-55AD-4F7D-9009-0D355D835822
-DTEND;TZID=America/New_York:20101021T130000
-TRANSP:OPAQUE
-SUMMARY:Simple event
-DTSTART;TZID=America/New_York:20101021T120000
-DTSTAMP:20101018T155438Z
-SEQUENCE:2
-END:VEVENT
-END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.3//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20101018T155431Z
+UID:C98AD237-55AD-4F7D-9009-0D355D835822
+DTEND;TZID=America/New_York:20101021T130000
+TRANSP:OPAQUE
+SUMMARY:Simple event
+DTSTART;TZID=America/New_York:20101021T120000
+DTSTAMP:20101018T155438Z
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR
 """.replace("\n", "\r\n"))
 
     def setParameters(

Modified: CalendarServer/trunk/contrib/performance/sqlusage/sqlusage.py
===================================================================
--- CalendarServer/trunk/contrib/performance/sqlusage/sqlusage.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/sqlusage/sqlusage.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -286,7 +286,7 @@
         for i in range(n - self.currentCount):
             index = self.currentCount + i + 2
             users.append("user%02d" % (index,))
-            uids.append("urn:uuid:user%02d" % (index,))
+            uids.append("urn:x-uid:user%02d" % (index,))
         session.addInvitees(URL(path=calendarhref), uids, True)
 
         # Now accept each one

Modified: CalendarServer/trunk/contrib/performance/test_event_change_date.py
===================================================================
--- CalendarServer/trunk/contrib/performance/test_event_change_date.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/contrib/performance/test_event_change_date.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -51,11 +51,11 @@
 
 calendarTail = """\
 ATTENDEE;CN=User 02;CUTYPE=INDIVIDUAL;EMAIL=user02 at example.com;PARTSTAT=NE
- EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:use
+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:use
  r02
 CREATED:20100729T193912Z
 DTSTAMP:20100729T195557Z
-ORGANIZER;CN=User 03;EMAIL=user03 at example.com:urn:uuid:user03
+ORGANIZER;CN=User 03;EMAIL=user03 at example.com:urn:x-uid:user03
 SEQUENCE:1
 SUMMARY:STUFF IS THINGS
 TRANSP:OPAQUE

Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/principal.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/directory/principal.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -117,7 +117,10 @@
 
     cua = normalizeCUAddr(origCUAddr)
 
-    if cua.startswith("urn:uuid:"):
+    if cua.startswith("urn:x-uid:"):
+        return "uid", cua[10:]
+
+    elif cua.startswith("urn:uuid:"):
         return "guid", uuid.UUID(cua[9:])
 
     elif cua.startswith("mailto:"):
@@ -849,9 +852,7 @@
         namespace, name = qname
 
         if qname == davxml.ResourceID.qname():
-            # FIXME: should this return a different CUA flavor if guid is not set on this record?
-            if hasattr(self.record, "guid"):
-                returnValue(davxml.ResourceID(davxml.HRef.fromString("urn:uuid:%s" % (self.record.guid,))))
+            returnValue(davxml.ResourceID(davxml.HRef.fromString("urn:x-uid:%s" % (self.record.uid,))))
 
         elif namespace == calendarserver_namespace:
 
@@ -1268,11 +1269,7 @@
 
     def canonicalCalendarUserAddress(self):
         """
-        Return a CUA for this principal, preferring in this order:
-            urn:uuid: form
-            mailto: form
-            /principal/__uids__/ form
-            first in calendarUserAddresses( ) list
+        Return a CUA for this principal
         """
         return self.record.canonicalCalendarUserAddress()
 

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/twistedcaldav/directory/test/util.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/util.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/directory/test/util.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -213,6 +213,7 @@
 
         addresses = set(value("addresses"))
         if record.hasCalendars:
+            addresses.add("urn:x-uid:%s" % (record.uid,))
             addresses.add("urn:uuid:%s" % (record.guid,))
             addresses.add("/principals/__uids__/%s/" % (record.uid,))
             addresses.add("/principals/%s/%s/" % (record.recordType, record.shortNames[0],))

Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/ical.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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)
 
 
     def _reconcileGroupAttendee(self, groupCUA, memberAtttendeeProps):
@@ -3652,21 +3658,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,
@@ -3740,6 +3746,9 @@
 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 ", "")
@@ -3756,8 +3765,11 @@
 
 
 
-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/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -65,7 +65,7 @@
             @inlineCallbacks
             def invitePropertyElement(invitation, includeUID=True):
 
-                userid = "urn:uuid:" + invitation.shareeUID
+                userid = "urn:x-uid:" + invitation.shareeUID
                 principal = yield self.principalForUID(invitation.shareeUID)
                 cn = principal.displayName() if principal else invitation.shareeUID
                 returnValue(customxml.InviteUser(
@@ -91,11 +91,11 @@
                     invitations = yield self.validateInvites(request, invitations)
 
                     ownerPrincipal = yield self.principalForUID(self._newStoreObject.ownerHome().uid())
-                    # FIXME:  use urn:uuid in all cases
+                    # FIXME:  use urn:x-uid in all cases
                     if self.isCalendarCollection():
                         owner = ownerPrincipal.principalURL()
                     else:
-                        owner = "urn:uuid:" + ownerPrincipal.principalUID()
+                        owner = "urn:x-uid:" + ownerPrincipal.principalUID()
                     ownerCN = ownerPrincipal.displayName()
 
                     returnValue(customxml.Invite(
@@ -437,7 +437,7 @@
             invitations = yield self._newStoreObject.allInvitations()
         for invitation in invitations:
             if invitation.status != _BIND_STATUS_INVALID:
-                if not (yield self.validUserIDForShare("urn:uuid:" + invitation.shareeUID, request)):
+                if not (yield self.validUserIDForShare("urn:x-uid:" + invitation.shareeUID, request)):
                     self.log.error("Invalid sharee detected: {uid}", uid=invitation.shareeUID)
 
         returnValue(invitations)

Modified: CalendarServer/trunk/twistedcaldav/storebridge.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/storebridge.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/storebridge.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -1539,7 +1539,7 @@
         """
 
         attendees = (yield self._newStoreCalendarObject.component()).getAttendees()
-        attendees = [attendee.split("urn:uuid:")[-1] for attendee in attendees]
+        attendees = [attendee.split("urn:x-uid:")[-1] for attendee in attendees]
         document = yield davXMLFromStream(request.stream)
         for ace in document.root_element.children:
             for child in ace.children:
@@ -3928,7 +3928,7 @@
             if jsondata["shared-type"] == "calendar":
                 owner = ownerPrincipal.principalURL()
             else:
-                owner = "urn:uuid:" + ownerPrincipal.principalUID()
+                owner = "urn:x-uid:" + ownerPrincipal.principalUID()
 
             shareePrincipal = yield self.principalForUID(jsondata["sharee"])
 
@@ -3949,7 +3949,7 @@
                 customxml.DTStamp.fromString(jsondata["dtstamp"]),
                 customxml.InviteNotification(
                     customxml.UID.fromString(jsondata["uid"]),
-                    element.HRef.fromString("urn:uuid:" + jsondata["sharee"]),
+                    element.HRef.fromString("urn:x-uid:" + jsondata["sharee"]),
                     invitationBindStatusToXMLMap[jsondata["status"]](),
                     customxml.InviteAccess(invitationBindModeToXMLMap[jsondata["access"]]()),
                     customxml.HostURL(
@@ -3970,7 +3970,7 @@
 
             shareePrincipal = yield self.principalForUID(jsondata["sharee"])
 
-            # FIXME:  use urn:uuid always?
+            # FIXME:  use urn:x-uid always?
             if jsondata["shared-type"] == "calendar":
                 # Prefer mailto:, otherwise use principal URL
                 for cua in shareePrincipal.calendarUserAddresses():
@@ -3979,7 +3979,7 @@
                 else:
                     cua = shareePrincipal.principalURL()
             else:
-                cua = "urn:uuid:" + shareePrincipal.principalUID()
+                cua = "urn:x-uid:" + shareePrincipal.principalUID()
 
             commonName = shareePrincipal.displayName()
             # record = shareePrincipal.record

Modified: CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/test/test_icalendar.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/twistedcaldav/test/test_sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -80,6 +80,8 @@
     def __init__(self, cuaddr, test):
         if cuaddr.startswith("mailto:"):
             name = cuaddr[7:].split('@')[0]
+        elif cuaddr.startswith("urn:x-uid:"):
+            name = cuaddr[10:]
         elif cuaddr.startswith("urn:uuid:"):
             name = cuaddr[9:]
         else:
@@ -324,7 +326,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -354,7 +356,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -403,7 +405,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -478,21 +480,21 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user03"),
+                davxml.HRef.fromString("urn:x-uid:user03"),
                 customxml.CommonName.fromString("User 03"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user04"),
+                davxml.HRef.fromString("urn:x-uid:user04"),
                 customxml.CommonName.fromString("User 04"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -536,14 +538,14 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user04"),
+                davxml.HRef.fromString("urn:x-uid:user04"),
                 customxml.CommonName.fromString("User 04"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -587,14 +589,14 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user03"),
+                davxml.HRef.fromString("urn:x-uid:user03"),
                 customxml.CommonName.fromString("User 03"),
                 customxml.InviteAccess(customxml.ReadAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -704,7 +706,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -719,7 +721,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("user02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -848,7 +850,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -878,7 +880,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -922,7 +924,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("urn:uuid:user02"),
+                davxml.HRef.fromString("urn:x-uid:user02"),
                 customxml.CommonName.fromString("User 02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),

Modified: CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_upgrade.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/test/test_upgrade.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/upgrade.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/twistedcaldav/upgrade.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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}
@@ -1310,7 +1311,7 @@
         txn = request._newStoreTransaction
 
         ownerPrincipal = principal
-        cua = "urn:uuid:%s" % (uuid,)
+        cua = "urn:x-uid:%s" % (uuid,)
         owner = LocalCalendarUser(
             cua, ownerPrincipal,
             inbox, ownerPrincipal.scheduleInboxURL()

Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/inbound.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/inbound.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/inbound.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -327,9 +327,9 @@
             fromAddr = attendee[7:]
             if organizer.startswith("mailto:"):
                 toAddr = organizer[7:]
-            elif organizer.startswith("urn:uuid:"):
-                guid = organizer[9:]
-                record = yield self.directory.recordWithGUID(guid)
+            elif organizer.startswith("urn:x-uid:"):
+                uid = organizer[10:]
+                record = yield self.directory.recordWithUID(uid)
                 try:
                     if record and record.emailAddresses:
                         toAddr = list(record.emailAddresses)[0]

Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -3047,6 +3047,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/trunk/txdav/caldav/datastore/test/test_implicit.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/test/test_queue_scheduling.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_queue_scheduling.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_queue_scheduling.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/test/test_sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/test/util.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/util.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/util.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/caldav/datastore/util.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/util.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/caldav/datastore/util.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/common/datastore/sql_schema/current-oracle-dialect.sql
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_schema/current-oracle-dialect.sql	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/common/datastore/sql_schema/current-oracle-dialect.sql	2014-04-18 20:38:33 UTC (rev 13331)
@@ -535,6 +535,23 @@
     "ICALENDAR_TEXT" nclob
 );
 
+create table PRINCIPAL_PURGE_POLLING_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB
+);
+
+create table PRINCIPAL_PURGE_CHECK_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB,
+    "UID" nvarchar2(255)
+);
+
+create table PRINCIPAL_PURGE_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB,
+    "UID" nvarchar2(255)
+);
+
 create table CALENDARSERVER (
     "NAME" nvarchar2(255) primary key,
     "VALUE" nvarchar2(255)
@@ -805,6 +822,18 @@
     JOB_ID
 );
 
+create index PRINCIPAL_PURGE_POLLI_6383e68a on PRINCIPAL_PURGE_POLLING_WORK (
+    JOB_ID
+);
+
+create index PRINCIPAL_PURGE_CHECK_b0c024c1 on PRINCIPAL_PURGE_CHECK_WORK (
+    JOB_ID
+);
+
+create index PRINCIPAL_PURGE_WORK__7a8141a3 on PRINCIPAL_PURGE_WORK (
+    JOB_ID
+);
+
 -- Skipped Function next_job
 
 -- Extras

Modified: CalendarServer/trunk/txdav/common/datastore/sql_schema/current.sql
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_schema/current.sql	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/common/datastore/sql_schema/current.sql	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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_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_POLLING_WORK_JOB_ID on
+  PRINCIPAL_PURGE_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/trunk/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_37_to_38.sql
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_37_to_38.sql	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/oracle-dialect/upgrade_from_37_to_38.sql	2014-04-18 20:38:33 UTC (rev 13331)
@@ -32,6 +32,46 @@
 alter index TRANSPARENCY_TIME_RAN_5f34467f
   rename to PERUSER_TIME_RANGE_IN_5468a226;
 
+----------------------------------
+-- Principal Purge Polling Work --
+----------------------------------
 
+create table PRINCIPAL_PURGE_POLLING_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB
+);
+
+--------------------------------
+-- Principal Purge Check Work --
+--------------------------------
+
+create table PRINCIPAL_PURGE_CHECK_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB,
+    "UID" nvarchar2(255)
+);
+
+--------------------------
+-- Principal Purge Work --
+--------------------------
+
+create table PRINCIPAL_PURGE_WORK (
+    "WORK_ID" integer primary key not null,
+    "JOB_ID" integer not null references JOB,
+    "UID" nvarchar2(255)
+);
+
+create index PRINCIPAL_PURGE_POLLI_6383e68a on PRINCIPAL_PURGE_POLLING_WORK (
+    JOB_ID
+);
+
+create index PRINCIPAL_PURGE_CHECK_b0c024c1 on PRINCIPAL_PURGE_CHECK_WORK (
+    JOB_ID
+);
+
+create index PRINCIPAL_PURGE_WORK__7a8141a3 on PRINCIPAL_PURGE_WORK (
+    JOB_ID
+);
+
 -- update the version
 update CALENDARSERVER set VALUE = '38' where NAME = 'VERSION';

Modified: CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_37_to_38.sql
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_37_to_38.sql	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/common/datastore/sql_schema/upgrades/postgres-dialect/upgrade_from_37_to_38.sql	2014-04-18 20:38:33 UTC (rev 13331)
@@ -32,5 +32,44 @@
 alter index TRANSPARENCY_TIME_RANGE_INSTANCE_ID
   rename to PERUSER_TIME_RANGE_INSTANCE_ID;
 
+----------------------------------
+-- Principal Purge Polling Work --
+----------------------------------
+
+create table PRINCIPAL_PURGE_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_POLLING_WORK_JOB_ID on
+  PRINCIPAL_PURGE_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);
+
+
 -- update the version
 update CALENDARSERVER set VALUE = '38' where NAME = 'VERSION';

Modified: CalendarServer/trunk/txdav/who/directory.py
===================================================================
--- CalendarServer/trunk/txdav/who/directory.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/who/directory.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/who/test/test_directory.py
===================================================================
--- CalendarServer/trunk/txdav/who/test/test_directory.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/who/test/test_directory.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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/trunk/txdav/who/test/test_group_attendees.py
===================================================================
--- CalendarServer/trunk/txdav/who/test/test_group_attendees.py	2014-04-18 19:32:26 UTC (rev 13330)
+++ CalendarServer/trunk/txdav/who/test/test_group_attendees.py	2014-04-18 20:38:33 UTC (rev 13331)
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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/20140418/88a552ff/attachment-0001.html>


More information about the calendarserver-changes mailing list