Branch 'c++/master' - 3 commits - c++/CMakeLists.txt c++/tests schemas/ical

Christian Mollekopf mollekopf at kolabsys.com
Mon Nov 14 20:25:37 CET 2011


 c++/CMakeLists.txt                                |   55 -
 c++/tests/CMakeLists.txt                          |   12 
 c++/tests/bindingstest.cpp                        |  293 +++++
 c++/tests/bindingstest.h                          |   23 
 c++/tests/kcalconversiontest.cpp                  |    2 
 c++/tests/testfiles/testevent.xml                 |   26 
 c++/tests/testfiles/testkolabevent.xml            |   29 
 schemas/ical/iCalendar-availability-extension.xsd |   85 +
 schemas/ical/iCalendar-bw-extensions.xsd          |   59 +
 schemas/ical/iCalendar-link-extension.xsd         |   50 
 schemas/ical/iCalendar-ms-extensions.xsd          |   48 
 schemas/ical/iCalendar-params.xsd                 |  376 ++++++
 schemas/ical/iCalendar-props.xsd                  |  773 ++++++++++++++
 schemas/ical/iCalendar-valtypes.xsd               |  234 ++++
 schemas/ical/iCalendar-wscal-extensions.xsd       |  161 ++
 schemas/ical/iCalendar.rng                        | 1184 ++++++++++++++++++++++
 schemas/ical/iCalendar.xsd                        |  206 +++
 schemas/ical/kolabformat.xsd                      |   39 
 18 files changed, 3636 insertions(+), 19 deletions(-)

New commits:
commit 35b3fbcb7383f432e01ee9e51f194b422018ed1a
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Mon Nov 14 20:22:33 2011 +0100

    first xCal based reading/writing test

diff --git a/c++/CMakeLists.txt b/c++/CMakeLists.txt
index 77458cf..dc1b2a3 100644
--- a/c++/CMakeLists.txt
+++ b/c++/CMakeLists.txt
@@ -1,30 +1,59 @@
 project(kolabxmlbindings)
 
-make_directory(bindings)
+cmake_minimum_required(VERSION 2.8)
+
+FIND_PACKAGE(Qt4 REQUIRED)
+include_directories(${QT_INCLUDES} ${QT_INCLUDE_DIR} QtCore)
+
+set(CMAKE_BUILD_TYPE Debug)
+
+file(MAKE_DIRECTORY bindings)
 
 set( SCHEMA_DIR ${CMAKE_SOURCE_DIR}/../schemas )
-set( SCHEMAS  
-    ${SCHEMA_DIR}/base.xsd 
-    ${SCHEMA_DIR}/incidence.xsd 
-    ${SCHEMA_DIR}/event.xsd 
-    ${SCHEMA_DIR}/note.xsd )
-set( SCHEMA_SOURCEFILES  
+set( XSDCXX  /usr/bin/xsdcxx)
+
+file(GLOB KOLAB_SCHEMAS ${SCHEMA_DIR}/*.xsd)
+set( KOLAB_SCHEMA_SOURCEFILES  
     bindings/base.cxx
     bindings/incidence.cxx
     bindings/event.cxx
     bindings/note.cxx )
-set( XSDCXX  /usr/bin/xsdcxx)
 
-add_custom_command(OUTPUT ${SCHEMA_SOURCEFILES}
-    COMMAND ${XSDCXX} cxx-tree --generate-serialization --namespace-map http://kolab.org=KolabXSD --output-dir bindings ${SCHEMAS}
-    COMMENT "Generating XSD bindings"
+add_custom_command(OUTPUT ${KOLAB_SCHEMA_SOURCEFILES}
+    COMMAND ${XSDCXX} cxx-tree --generate-serialization --namespace-map http://kolab.org=KolabXSD --output-dir bindings ${KOLAB_SCHEMAS}
+    COMMENT "Generating Kolab XSD bindings"
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
     VERBATIM
     )
 
+file(GLOB XCAL_SCHEMAS ${SCHEMA_DIR}/ical/*.xsd)
+set( XCAL_SCHEMA_SOURCEFILES  
+    bindings/kolabformat.cxx
+    bindings/iCalendar.cxx
+    bindings/iCalendar-params.cxx
+    bindings/iCalendar-props.cxx
+    bindings/iCalendar-valtypes.cxx
+    bindings/iCalendar-link-extension.cxx
+    bindings/iCalendar-bw-extensions.cxx
+    bindings/iCalendar-ms-extensions.cxx
+    bindings/iCalendar-availability-extension.cxx
+#     bindings/iCalendar-wscal-extensions.cxx
+)
+# --cxx-suffix .cpp --hxx-suffix .h  
+add_custom_command(OUTPUT ${XCAL_SCHEMA_SOURCEFILES}
+    COMMAND ${XSDCXX} cxx-tree --generate-polymorphic --generate-serialization --namespace-map http://icalnamespace.org=xcalns --namespace-map http://kolab.org=KolabXSD --root-element event --root-element todo --output-dir bindings ${XCAL_SCHEMAS}
+    COMMENT "Generating xCal XSD bindings"
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    VERBATIM
+    )
+
+set( SCHEMA_SOURCEFILES ${XCAL_SCHEMA_SOURCEFILES} ${KOLAB_SCHEMA_SOURCEFILES})
+
+SET_SOURCE_FILES_PROPERTIES(${SCHEMA_SOURCEFILES} PROPERTIES GENERATED 1)
+
 ADD_CUSTOM_TARGET(generate_bindings ALL DEPENDS ${SCHEMA_SOURCEFILES})
 
 include_directories( ./ )
 add_library(kolabxml lib/kolabkcalconversion.cpp ${SCHEMA_SOURCEFILES})
-
-add_subdirectory(tests)
\ No newline at end of file
+target_link_libraries(${kolabxml} xerces-c)
+add_subdirectory(tests)
diff --git a/c++/tests/bindingstest.cpp b/c++/tests/bindingstest.cpp
index f2536a7..1e741ea 100644
--- a/c++/tests/bindingstest.cpp
+++ b/c++/tests/bindingstest.cpp
@@ -1,4 +1,5 @@
 #include "bindingstest.h"
+
 #include <QObject>
 #include <QtTest/QtTest>
 
@@ -6,12 +7,13 @@
 #include "bindings/iCalendar.hxx"
 #include "bindings/iCalendar-props.hxx"
 #include "bindings/iCalendar-valtypes.hxx"
+#include "bindings/kolabformat.hxx"
 
-#include "iostream"
-#include <xercesc/dom/DOMException.hpp>
+#include <iostream>
 
+#include <xercesc/dom/DOMException.hpp>
 #include <xercesc/dom/DOMImplementation.hpp>
-#include </home/chrigi/work/kolab/xmlformat/cxxtest/xsdcxx/xsd/libxsd/xsd/cxx/xml/string.hxx>
+
 
 void BindingsTest::writeNoteTest()
 {
@@ -59,7 +61,7 @@ void BindingsTest::writeReadNoteTest()
 
 }
 
-void BindingsTest::writeXCalEvent()
+void BindingsTest::writeKolabXCalEvent()
 {
     try {
     //Components
@@ -67,10 +69,111 @@ void BindingsTest::writeXCalEvent()
 
     icalendar_2_0::ArrayOfEventTodoContainedComponents component;
     component.valarm().push_back(alarm);
+
+    //Properties
+
+    //Recurrence
+    icalendar_2_0::RecurType recur(icalendar_2_0::RecurType::freq_type::DAILY);
+    recur.count(2);
+    recur.byhour().push_back("3");
+    icalendar_2_0::RrulePropType rrule(recur);
+
+    //Startdate
+    xml_schema::date_time dt(2011,8,12,2,12,15);
+    icalendar_2_0::DtstartPropType::date_time_type datetime(dt);
+    icalendar_2_0::DtstartPropType startdate;
+    startdate.date_time(datetime);
+    //Startdate timezone
+    ::icalendar_2_0::ArrayOfParameters parameters;
+    ::icalendar_2_0::TzidParamType tzid("US/Eastern");
+    parameters.baseParameter().push_back(tzid);
+    startdate.parameters(parameters);
     
     
-    //Properties
+    //Custom value
+    KolabXSD::CustomType custom("cusotomtypeidentifier", "sldjfldfj");
+
+    //Assembling event properties
+    ::icalendar_2_0::ArrayOfProperties properties;
+    properties.baseProperty().push_back(startdate);
+    properties.baseProperty().push_back(rrule);
+    properties.baseProperty().push_back(custom);
+
+    //Assembling the complete event
+    icalendar_2_0::VeventType event(component);
+    event.properties(properties);
     
+    KolabXSD::Event kolabEvent(event);
+    xml_schema::namespace_infomap map;
+    map["kolab"].name = "http://kolab.org";
+    map[""].name = "urn:ietf:params:xml:ns:icalendar-2.0";
+    //map["xcal"].schema = "iCalendar.xsd";
+
+    KolabXSD::event (std::cout, kolabEvent, map);
+    
+    } catch  (const xml_schema::exception& e) {
+        std::cout << e << endl;
+        QVERIFY(false);
+    } 
+}
+
+
+void BindingsTest::readKolabXCalEvent()
+{
+    try {
+//         xml_schema::properties props;
+//         props.no_namespace_schema_location ("../../../schemas/ical/kolabevent.xsd");
+//         props.schema_location ("http://kolab.org", "../../../schemas/ical/kolabevent.xsd"); //Force schema
+//         std::auto_ptr<KolabXSD::Event> event(KolabXSD::kolabevent("testfiles/testkolabevent.xml", 0, props));
+
+        std::auto_ptr<KolabXSD::Event> event(KolabXSD::event("testfiles/testkolabevent.xml", xml_schema::flags::dont_validate));
+        
+        const icalendar_2_0::BaseComponentType::properties_type& properties = *event->vevent().properties();
+        const icalendar_2_0::ArrayOfProperties::baseProperty_sequence &propertyList = properties.baseProperty();
+        
+        /*for(int i = 0; i < propertyList.size(); i++) {
+            const icalendar_2_0::ArrayOfProperties::baseProperty_type prop = propertyList.at(i);
+            
+        }*/
+        std::cout << propertyList.size() << std::endl;
+        for (icalendar_2_0::ArrayOfProperties::baseProperty_sequence::const_iterator i (propertyList.begin ()); i != propertyList.end (); ++i) {
+            if (const icalendar_2_0::RrulePropType* d = dynamic_cast<const icalendar_2_0::RrulePropType*> (&(*i))) {
+                std::cout << "Rrule" << std::endl;
+                std::cout << d->recur().freq() << std::endl;
+                std::cout << d->recur().count() << std::endl;
+                //std::cout << d->recur().byhour() << std::endl;
+            } else {
+                std::cout << "other" << std::endl;
+                const icalendar_2_0::BasePropertyType &baseProperty = (*i);
+            }
+        }
+        
+        xml_schema::namespace_infomap map;
+        map[""].name = "http://kolab.org";
+//         map[""].schema = "kolabevent.xsd";
+        map["xcal"].name = "urn:ietf:params:xml:ns:icalendar-2.0";
+//         map["xcal"].schema = "iCalendar.xsd";
+
+        KolabXSD::event (std::cout, *event, map);
+
+    } catch  (const xml_schema::exception& e) {
+        std::cout << e << std::endl;
+        QVERIFY(false);
+    } 
+}
+
+#if 0
+void BindingsTest::writeXCalEvent()
+{
+    try {
+    //Components
+    icalendar_2_0::EventTodoComponentType::components_type::valarm_type alarm;
+
+    icalendar_2_0::ArrayOfEventTodoContainedComponents component;
+    component.valarm().push_back(alarm);
+
+    //Properties
+
     //Recurrence
     icalendar_2_0::RecurType recur(icalendar_2_0::RecurType::freq_type::DAILY);
     recur.count(2);
@@ -147,7 +250,7 @@ void BindingsTest::readXCalEvent()
 
 }
 
-
+#endif
 
 void BindingsTest::xercesException()
 {
diff --git a/c++/tests/bindingstest.h b/c++/tests/bindingstest.h
index 9eb4f7a..4122321 100644
--- a/c++/tests/bindingstest.h
+++ b/c++/tests/bindingstest.h
@@ -9,8 +9,10 @@ class BindingsTest : public QObject
   Q_OBJECT
   private slots:
       
-    void writeXCalEvent();
-    void readXCalEvent();
+     void writeKolabXCalEvent();
+     void readKolabXCalEvent();
+    //void writeXCalEvent();
+    //void readXCalEvent();
       
     void writeNoteTest();
     void readNoteTest();
diff --git a/c++/tests/kcalconversiontest.cpp b/c++/tests/kcalconversiontest.cpp
index b88d835..0599471 100644
--- a/c++/tests/kcalconversiontest.cpp
+++ b/c++/tests/kcalconversiontest.cpp
@@ -223,4 +223,4 @@ class KCalConversionTest : public QObject
 #endif
 QTEST_MAIN( KCalConversionTest )
 
-#include "moc_kcalconversiontest.cxx"
+//#include "moc_kcalconversiontest.cxx"
diff --git a/c++/tests/testfiles/testevent.xml b/c++/tests/testfiles/testevent.xml
new file mode 100644
index 0000000..dd59990
--- /dev/null
+++ b/c++/tests/testfiles/testevent.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<vevent xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+
+  <properties>
+    <dtstart>
+      <date>2011-11-10+10:10</date>
+    </dtstart>
+    <rrule>
+      <recur>
+        <freq>DAILY</freq>
+        <count>2</count>
+        <byhour>3</byhour>
+      </recur>
+    </rrule>
+    <x-prop>
+        <parameters>
+        <pref><integer>1</integer></pref>
+        </parameters>                 <!-- Core vCard elements  -->
+        <text>value goes here</text>  <!-- are still accessible -->
+    </x-prop>
+
+  </properties>
+
+  <components/>
+
+</vevent>
diff --git a/c++/tests/testfiles/testkolabevent.xml b/c++/tests/testfiles/testkolabevent.xml
new file mode 100644
index 0000000..021f289
--- /dev/null
+++ b/c++/tests/testfiles/testkolabevent.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<event xmlns="http://kolab.org" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0">
+
+  <xcal:vevent>
+    <xcal:properties>
+      <xcal:dtstart>
+        <xcal:date>2011-11-10+10:10</xcal:date>
+      </xcal:dtstart>
+      <xcal:rrule>
+        <xcal:recur>
+           <xcal:count>2</xcal:count>
+          <xcal:byhour>3</xcal:byhour>
+          <xcal:freq>DAILY</xcal:freq>
+          
+        </xcal:recur>
+      </xcal:rrule>
+      <x-custom-property>
+         <unknown>blabla</unknown>
+      </x-custom-property>       
+      <x-unknown-property>
+         <unknown>blibla</unknown>
+      </x-unknown-property>       
+    </xcal:properties>
+    <xcal:components>
+      <xcal:valarm/>
+    </xcal:components>
+  </xcal:vevent>
+
+</event>
diff --git a/schemas/ical/kolabformat.xsd b/schemas/ical/kolabformat.xsd
new file mode 100644
index 0000000..fff27e1
--- /dev/null
+++ b/schemas/ical/kolabformat.xsd
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0"
+    targetNamespace="http://kolab.org"
+    xmlns="http://kolab.org"
+    elementFormDefault="qualified">
+
+    <xs:import schemaLocation="iCalendar.xsd" namespace="urn:ietf:params:xml:ns:icalendar-2.0"/>
+
+    <xs:element name="event" type="Event"/>
+
+    <xs:complexType name="Event">
+        <xs:sequence>
+            <xs:element ref="xcal:vevent" minOccurs="1" maxOccurs="1"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="todo" type="Todo"/>
+
+    <xs:complexType name="Todo">
+        <xs:sequence>
+            <xs:element ref="xcal:vtodo" minOccurs="1" maxOccurs="1"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="CustomType" >
+        <xs:complexContent mixed="false">
+            <xs:extension base="xcal:BasePropertyType">
+                <xs:sequence>
+                    <xs:element name="identifier" type="xs:string"/>
+                    <xs:element name="value" type="xs:string"/>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:element name="x-kolab-customproperty" type="CustomType" substitutionGroup="xcal:baseProperty" /> 
+
+</xs:schema>
\ No newline at end of file


commit 2ce7b6accef55af731e1d99918e73ad4ce975697
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Thu Nov 10 15:54:33 2011 +0100

    bindingstest, basic serialization

diff --git a/c++/tests/CMakeLists.txt b/c++/tests/CMakeLists.txt
index b816f7a..d59dc7c 100644
--- a/c++/tests/CMakeLists.txt
+++ b/c++/tests/CMakeLists.txt
@@ -1,10 +1,12 @@
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/.. )
 
-FIND_PACKAGE(Qt4 REQUIRED)
-
-QT4_WRAP_CPP(HEADERS_MOC kcalconversiontest.h)
 
+QT4_WRAP_CPP(kcalconversiontest_MOC kcalconversiontest.h)
 #add_test("conversiontest" kcalconversiontest ${kolabproxy_shared_relative_SRCS} ${AKONADI_COLLECTIONATTRIBUTES_SHARED_SOURCES} kcalconversiontest.cpp)
-add_executable(kcalconversiontest kcalconversiontest.cpp )
-
+add_executable(kcalconversiontest kcalconversiontest.cpp ${kcalconversiontest_MOC})
 target_link_libraries(kcalconversiontest ${KDEPIMLIBS_AKONADI_LIBS} ${QT_QTTEST_LIBRARY} ${KDEPIMLIBS_KCALCORE_LIBS} kolabxml)
+
+#QT4_WRAP_CPP(BINDINGSTEST_MOC bindingstest.cpp)
+QT4_AUTOMOC(bindingstest.cpp)
+add_executable(bindingstest bindingstest.cpp ${BINDINGSTEST_MOC})
+target_link_libraries(bindingstest ${QT_QTTEST_LIBRARY} kolabxml xerces-c)
diff --git a/c++/tests/bindingstest.cpp b/c++/tests/bindingstest.cpp
new file mode 100644
index 0000000..f2536a7
--- /dev/null
+++ b/c++/tests/bindingstest.cpp
@@ -0,0 +1,190 @@
+#include "bindingstest.h"
+#include <QObject>
+#include <QtTest/QtTest>
+
+#include "bindings/note.hxx"
+#include "bindings/iCalendar.hxx"
+#include "bindings/iCalendar-props.hxx"
+#include "bindings/iCalendar-valtypes.hxx"
+
+#include "iostream"
+#include <xercesc/dom/DOMException.hpp>
+
+#include <xercesc/dom/DOMImplementation.hpp>
+#include </home/chrigi/work/kolab/xmlformat/cxxtest/xsdcxx/xsd/libxsd/xsd/cxx/xml/string.hxx>
+
+void BindingsTest::writeNoteTest()
+{
+    xml_schema::date_time datetime(2011, 11, 23, 12, 12, 12);
+    KolabXSD::XMLBase::sensitivity_type sensitivity = KolabXSD::Sensitivity::public_;
+    KolabXSD::Note::background_color_type bg = KolabXSD::Note::background_color_default_value();
+    KolabXSD::Note::foreground_color_type fg = KolabXSD::Note::foreground_color_default_value();
+    KolabXSD::Note note("test", "test", datetime, datetime, sensitivity, "", bg, fg);
+    
+    xml_schema::namespace_infomap map;
+    map[""].name = "http://kolab.org";
+    map[""].schema = "note.xsd";
+
+    KolabXSD::note (std::cout, note, map);
+    
+    
+  /*  QFETCH(KCalCore::Recurrence, kcalrecurrence);
+    
+    KolabXSD::Recurrence ret = Kolab::KCalConversion::fromKCal( &kcalrecurrence );
+    QCOMPARE(frequency(ret), kcalrecurrence.rRules().first()->frequency());
+    */
+}
+
+void BindingsTest::readNoteTest()
+{
+    try {
+        xml_schema::properties props;
+//         props.no_namespace_schema_location ("../../schemas/note.xsd");
+//         props.schema_location ("http://kolab.org", "../../schemas/note.xsd"); //Force schema
+        std::auto_ptr<KolabXSD::Note> note(KolabXSD::note("testfiles/testnote.xml", xml_schema::flags::keep_dom | xml_schema::flags::dont_validate, props));
+        
+        xml_schema::namespace_infomap map;
+        map[""].name = "http://kolab.org";
+        map[""].schema = "note.xsd";
+
+        KolabXSD::note (std::cout, *note, map);
+    } catch  (const xml_schema::exception& e) {
+        std::cout << e << endl;
+        QVERIFY(false);
+    } 
+}
+
+void BindingsTest::writeReadNoteTest()
+{
+
+}
+
+void BindingsTest::writeXCalEvent()
+{
+    try {
+    //Components
+    icalendar_2_0::EventTodoComponentType::components_type::valarm_type alarm;
+
+    icalendar_2_0::ArrayOfEventTodoContainedComponents component;
+    component.valarm().push_back(alarm);
+    
+    
+    //Properties
+    
+    //Recurrence
+    icalendar_2_0::RecurType recur(icalendar_2_0::RecurType::freq_type::DAILY);
+    recur.count(2);
+    recur.byhour().push_back("3");
+    icalendar_2_0::RrulePropType rrule(recur);
+    
+    //Startdate
+    icalendar_2_0::DtstartPropType::date_type date(2011, 11, 10, 10, 10);
+    icalendar_2_0::DtstartPropType startdate;
+    startdate.date(date);
+    
+    ::icalendar_2_0::ArrayOfProperties properties;
+    properties.baseProperty().push_back(startdate);
+    properties.baseProperty().push_back(rrule);
+    
+    
+    //Assembling the complete event
+    icalendar_2_0::VeventType event(component);
+    event.properties(properties);
+    
+    
+    icalendar_2_0::VcalendarType::components_type comp;
+    comp.vcalendarContainedComponent().push_back(event);
+    
+    icalendar_2_0::VcalendarType vcalendar(comp);
+    
+    icalendar_2_0::IcalendarType icalendar;
+    icalendar.vcalendar().push_back(vcalendar);
+    
+    /*
+     * We need the namespacemap, otherwise we get elements with a prefix ns1:vevent:components
+     * and at least xerces doesn't like prefixes with a ":" inside (only a single prefix is allowed).
+     * No idea why this happens though.
+     */
+    xml_schema::namespace_infomap map;
+    map[""].name = "urn:ietf:params:xml:ns:icalendar-2.0";
+    //map[""].schema = "iCalendar.xsd";
+    
+    icalendar_2_0::vevent (std::cout, event, map);
+    
+    } catch  (const xml_schema::exception& e) {
+        std::cout << e << endl;
+        QVERIFY(false);
+    } 
+    #if 0
+    catch (const xercesc_3_1::DOMException &e) {
+        std::cout << "Xerces dom exception: " /*<< std::basic_string<XMLCh>(e.getMessage())*/ << " Code: " << e.code << std::endl;
+        return;
+    }
+#endif
+}
+
+
+void BindingsTest::readXCalEvent()
+{
+
+    try {
+        xml_schema::properties props;
+//         props.no_namespace_schema_location ("../../schemas/ical/iCalendar.xsd");
+//         props.schema_location ("urn:ietf:params:xml:ns:icalendar-2.0", "../../schemas/ical/iCalendar.xsd"); //Force schema
+
+        std::auto_ptr<icalendar_2_0::VeventType > event(icalendar_2_0::vevent("testfiles/testevent.xml", xml_schema::flags::dont_validate, props));
+
+        xml_schema::namespace_infomap map;
+        map[""].name = "urn:ietf:params:xml:ns:icalendar-2.0";
+        map[""].schema = "iCalendar.xsd";
+
+        icalendar_2_0::vevent (std::cout, *event, map);
+
+    } catch  (const xml_schema::exception& e) {
+        std::cout << e << std::endl;
+        QVERIFY(false);
+    } 
+
+}
+
+
+
+void BindingsTest::xercesException()
+{
+    xercesc::XMLPlatformUtils::Initialize();
+    XMLCh tempStr[100];
+
+    xercesc::DOMImplementation* impl = xercesc::DOMImplementation::getImplementation();
+    
+    xercesc::XMLString::transcode("root", tempStr, 99);
+    xercesc::DOMDocument*   doc = impl->createDocument(0, tempStr, 0);
+    
+/*    XMLCh n[100];
+    XMLCh ns[100];
+    xercesc::XMLString::transcode("components", n, 99);
+    xercesc::XMLString::transcode("urn:ietf:params:xml:ns:icalendar-2.0", ns, 99);*/
+    try {
+        xercesc::DOMElement* e = doc->createElementNS (xsd::cxx::xml::string("urn:ietf:params:xml:ns:icalendar-2.0").c_str(), xsd::cxx::xml::string("components").c_str());
+        QVERIFY(e);
+        
+        /*
+        xercesc::DOMElement& s (    
+        ::xsd::cxx::xml::dom::create_element (
+          "components",
+          "http://icalnamespace.org",
+          e));
+        */
+
+    } catch (const xercesc_3_1::DOMException &e) {
+        std::cout << "Xerces dom exception: " /*<< std::basic_string<XMLCh>(e.getMessage())*/ << " Code: " << e.code << std::endl;
+        return;
+    }
+    
+    doc->release();
+}
+
+
+
+QTEST_MAIN( BindingsTest )
+
+#include "bindingstest.moc"
diff --git a/c++/tests/bindingstest.h b/c++/tests/bindingstest.h
new file mode 100644
index 0000000..9eb4f7a
--- /dev/null
+++ b/c++/tests/bindingstest.h
@@ -0,0 +1,21 @@
+#ifndef BINDINGSTEST_H
+#define BINDINGSTEST_H
+
+#include <QtCore/QObject>
+#include <QtTest/QtTest>
+
+class BindingsTest : public QObject
+{
+  Q_OBJECT
+  private slots:
+      
+    void writeXCalEvent();
+    void readXCalEvent();
+      
+    void writeNoteTest();
+    void readNoteTest();
+    void writeReadNoteTest();
+    void xercesException();
+};
+
+#endif
\ No newline at end of file


commit 04aba16b0dc2454163763d69e5860accf8e5fd9b
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Nov 2 19:59:17 2011 +0100

    xcal schemas

diff --git a/schemas/ical/iCalendar-availability-extension.xsd b/schemas/ical/iCalendar-availability-extension.xsd
new file mode 100644
index 0000000..f960a88
--- /dev/null
+++ b/schemas/ical/iCalendar-availability-extension.xsd
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar availability extension schema is
+     intended to work in conjunction with conformant
+     implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<!-- This schema extension defines properties and components for the availability
+     components defined in draft-daboo-calendar-availability -->
+	<!-- ===================== Value-types ================================  -->
+	<xs:include schemaLocation="iCalendar-valtypes.xsd"/>
+	<!-- ===================== Components =================================  -->
+	<xs:include schemaLocation="iCalendar.xsd"/>
+	<!-- ===================== Properties =================================  -->
+	<xs:include schemaLocation="iCalendar-props.xsd"/>
+	<!-- =====================================================================
+       Calendar Properties
+       ===================================================================== -->
+	<!-- The BUSYTYPE property is used to specify the default busy time
+      type.  The values correspond to those used by the "FBTYPE"
+      parameter used on a "FREEBUSY" property, with the exception that
+      the "FREE" value is not used.  If not specified on a component
+      that allows this property, the default is "BUSY-UNAVAILABLE".
+      
+      busytypevalue = "BUSY" / "BUSY-UNAVAILABLE" /
+                        "BUSY-TENTATIVE" / iana-token / x-name
+                        ; Default is "BUSY-UNAVAILABLE"
+      
+   -->
+	<xs:complexType name="BusytypePropType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       encodingparam      = "ENCODING" "="
+                          ( "8BIT"
+          ; "8bit" text encoding is defined in [RFC2045]
+                          / "BASE64"
+          ; "BASE64" binary encoding format is defined in [RFC4648]
+                          )
+      busytypevalue = "BUSY" 
+                    / "BUSY-UNAVAILABLE" 
+                    / "BUSY-TENTATIVE" 
+                    / iana-token 
+                    / x-name
+                    
+                    ; Default is "BUSY-UNAVAILABLE".
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =====================================================================
+       Calendar Components
+       ===================================================================== -->
+	<xs:complexType name="VavailabilityType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType">
+				<xs:sequence>
+					<xs:element name="components" type="xcal:ArrayOfVavailabilityContainedComponents"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="vavailability" type="xcal:VavailabilityType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:complexType name="ArrayOfVavailabilityContainedComponents">
+		<xs:sequence>
+			<xs:element ref="xcal:available" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="AvailableType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="available" type="xcal:AvailableType" substitutionGroup="xcal:baseComponent"/>
+</xs:schema>
diff --git a/schemas/ical/iCalendar-bw-extensions.xsd b/schemas/ical/iCalendar-bw-extensions.xsd
new file mode 100644
index 0000000..68b3b52
--- /dev/null
+++ b/schemas/ical/iCalendar-bw-extensions.xsd
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar Bedeworks server integration schema is
+     intended to work in conjunction with conformant
+     implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!--Bedework extensions to icalendar -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<xs:include schemaLocation="iCalendar-valtypes.xsd"/>
+	<!-- ===================== Properties =================================  -->
+	<xs:include schemaLocation="iCalendar-props.xsd"/>
+	<!-- =====================================================================
+       3.2 Property parameter definitions
+       ===================================================================== -->
+	<!-- Bedework x-parameters -->
+	<xs:element name="x-bedework-uid" type="xcal:XBedeworkUidParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:complexType name="XBedeworkUidParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =====================================================================
+       3.7 Calendar Properties
+       ===================================================================== -->
+	<xs:element name="x-bedework-cost" type="xcal:XBedeworkCostPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="x-bedework-exsynch-endtzid" type="xcal:XBedeworkExsynchEndtzidPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="x-bedework-exsynch-lastmod" type="xcal:XBedeworkExsynchLastmodPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="x-bedework-exsynch-organizer" type="xcal:OrganizerPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="x-bedework-exsynch-starttzid" type="xcal:XBedeworkExsynchStarttzidPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:complexType name="XBedeworkCostPropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="XBedeworkExsynchEndtzidPropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="XBedeworkExsynchLastmodPropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="XBedeworkExsynchStarttzidPropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+</xs:schema>
diff --git a/schemas/ical/iCalendar-link-extension.xsd b/schemas/ical/iCalendar-link-extension.xsd
new file mode 100644
index 0000000..a12cd53
--- /dev/null
+++ b/schemas/ical/iCalendar-link-extension.xsd
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar link extensions schema is intended to work
+     in conjunction with conformant implementations of
+     IETF RFC 5545 ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<!--Definition for the LINK extension property for icalendar -->
+	<xs:include schemaLocation="iCalendar-valtypes.xsd"/>
+	<!-- ===================== Properties =================================  -->
+	<xs:include schemaLocation="iCalendar-params.xsd"/>
+	<!-- ===================== Properties =================================  -->
+	<xs:include schemaLocation="iCalendar-props.xsd"/>
+	<!-- =====================================================================
+       3.2 Property parameter definitions
+       ===================================================================== -->
+	<!-- REL defines the type of relationship and may be a predefined value as
+       below or a URI which is globally unique and understood within the context
+       of its use.
+       
+       The standard relation types are:
+             "PARENT"    ; Parent relationship - Default
+             "CHILD"     ; Child relationship
+             "SIBLING"   ; Sibling relationship
+   -->
+	<xs:element name="rel" type="xcal:TextParameterType" substitutionGroup="xcal:baseParameter"/>
+	<!-- =====================================================================
+       3.7 Calendar Properties
+       ===================================================================== -->
+	<xs:complexType name="LinkPropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BasePropertyType">
+				<xs:choice>
+					<xs:element ref="xcal:uri"/>
+					<xs:element name="uid" type="xs:string"/>
+					<xs:element name="reference" type="xs:string"/>
+				</xs:choice>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="link" type="xcal:LinkPropType" substitutionGroup="xcal:baseProperty"/>
+</xs:schema>
diff --git a/schemas/ical/iCalendar-ms-extensions.xsd b/schemas/ical/iCalendar-ms-extensions.xsd
new file mode 100644
index 0000000..2539c99
--- /dev/null
+++ b/schemas/ical/iCalendar-ms-extensions.xsd
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar MS Exchange Server integration schema is
+     intended to work in conjunction with conformant
+     implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!--Bedework extensions to icalendar -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+           xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" 
+           targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" 
+           elementFormDefault="qualified">
+
+  <!-- =====================================================================
+       3.7 Calendar Properties
+       ===================================================================== -->  
+            
+  <!-- ===================== Properties =================================  -->
+  <xs:include schemaLocation="iCalendar-props.xsd" />
+
+  <xs:element name="x-microsoft-cdo-busystatus" 
+              type="xcal:XMicrosoftCdoBusystatusPropType"
+              substitutionGroup="xcal:baseProperty" />
+
+  <xs:element name="x-microsoft-cdo-intendedstatus" 
+              type="xcal:XMicrosoftCdoIntendedstatusPropType"
+              substitutionGroup="xcal:baseProperty" />
+  
+  <xs:complexType name="XMicrosoftCdoBusystatusPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <xs:complexType name="XMicrosoftCdoIntendedstatusPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+</xs:schema>
diff --git a/schemas/ical/iCalendar-params.xsd b/schemas/ical/iCalendar-params.xsd
new file mode 100644
index 0000000..1392daa
--- /dev/null
+++ b/schemas/ical/iCalendar-params.xsd
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar object parameters schema is intended to work in
+     conjunction with conformant implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!--non-normative, to support development of WS-Calendar - 2010/10/30. Refer to rfc5545 and xCal in the IETF for normative description-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<xs:include schemaLocation="iCalendar-valtypes.xsd"/>
+	<!-- =====================================================================
+       3.2 Property parameter definitions
+       ===================================================================== -->
+	<xs:complexType name="BaseParameterType" abstract="true"/>
+	<xs:element name="baseParameter" type="xcal:BaseParameterType"/>
+	<xs:complexType name="ArrayOfParameters">
+		<xs:sequence>
+			<xs:element ref="xcal:baseParameter" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- =====================================================================
+       Define all the standard properties. By using a substitutionGroup we
+       make it easy to extend the list of parameters. As an example see 
+       the parameters defined in iCalendar-caldavsched-extensions.xsd
+       ===================================================================== -->
+	<xs:element name="altrep" type="xcal:AltrepParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="cn" type="xcal:CnParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="cutype" type="xcal:CutypeParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="delegated-from" type="xcal:DelegatedFromParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="delegated-to" type="xcal:DelegatedToParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="dir" type="xcal:DirParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="encoding" type="xcal:EncodingParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="fmttype" type="xcal:FmttypeParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="fbtype" type="xcal:FbtypeParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="language" type="xcal:LanguageParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="member" type="xcal:MemberParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="partstat" type="xcal:PartstatParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="range" type="xcal:RangeParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="related" type="xcal:RelatedParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="reltype" type="xcal:ReltypeParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="role" type="xcal:RoleParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="rsvp" type="xcal:RsvpParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="sent-by" type="xcal:SentByParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="tzid" type="xcal:TzidParamType" substitutionGroup="xcal:baseParameter"/>
+	<!-- Scheduling parameters for attendee or organizer -->
+	<xs:element name="schedule-agent" type="xcal:ScheduleAgentParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="schedule-force-send" type="xcal:ScheduleForceSendParamType" substitutionGroup="xcal:baseParameter"/>
+	<xs:element name="schedule-status" type="xcal:ScheduleStatusParamType" substitutionGroup="xcal:baseParameter"/>
+	<!-- Parameters that take a simple boolean value -->
+	<xs:complexType name="BooleanParameterType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element ref="xcal:boolean"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- Parameters that take a simple text value -->
+	<xs:complexType name="TextParameterType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element ref="xcal:text"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- Parameters that take a uri value -->
+	<xs:complexType name="UriParameterType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element ref="xcal:uri"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="CalAddressListParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element ref="xcal:cal-address" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="CalAddressParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element ref="xcal:cal-address"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.1 Alternate Text Representation -->
+	<xs:complexType name="AltrepParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:UriParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.2 Common Name -->
+	<xs:complexType name="CnParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.3 Calendar User Type -->
+	<xs:complexType name="CutypeParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       cutypeparam        = "CUTYPE" "="
+                          ("INDIVIDUAL"   ; An individual
+                         / "GROUP"        ; A group of individuals
+                         / "RESOURCE"     ; A physical resource
+                         / "ROOM"         ; A room resource
+                         / "UNKNOWN"      ; Otherwise not known
+                         / x-name         ; Experimental type
+                         / iana-token)    ; Other IANA-registered
+                                          ; type
+       ; Default is INDIVIDUAL
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.4 Delegators -->
+	<xs:complexType name="DelegatedFromParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:CalAddressListParamType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.5 Delegatees -->
+	<xs:complexType name="DelegatedToParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:CalAddressListParamType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.6 Directory Entry Reference -->
+	<xs:complexType name="DirParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:UriParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.7 Inline Encoding -->
+	<xs:complexType name="EncodingParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       encodingparam      = "ENCODING" "="
+                          ( "8BIT"
+          ; "8bit" text encoding is defined in [RFC2045]
+                          / "BASE64"
+          ; "BASE64" binary encoding format is defined in [RFC4648]
+                          )
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.8 Format Type -->
+	<xs:complexType name="FmttypeParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.9 Free/Busy Time Type -->
+	<xs:complexType name="FbtypeParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       fbtypeparam        = "FBTYPE" "=" 
+                         ("FREE" 
+                          / "BUSY"
+                          / "BUSY-UNAVAILABLE" 
+                          / "BUSY-TENTATIVE"
+                          / x-name  ; Some experimental iCalendar free/busy type.
+                          / iana-token)
+                ; Some other IANA-registered iCalendar free/busy type.
+       ; Default is BUSY
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.10 Language -->
+	<xs:complexType name="LanguageParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.11 Group or List Membership -->
+	<xs:complexType name="MemberParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:CalAddressListParamType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.12 Participation Status -->
+	<xs:complexType name="PartstatParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       partstat-event   = ("NEEDS-ACTION"    ; Event needs action
+                        / "ACCEPTED"         ; Event accepted
+                        / "DECLINED"         ; Event declined
+                        / "TENTATIVE"        ; Event tentatively
+                                             ; accepted
+                        / "DELEGATED"        ; Event delegated
+                        / x-name             ; Experimental status
+                        / iana-token)        ; Other IANA-registered
+                                             ; status
+       ; These are the participation statuses for a "VEVENT".
+       ; Default is NEEDS-ACTION.
+
+       partstat-todo    = ("NEEDS-ACTION"    ; To-do needs action
+                        / "ACCEPTED"         ; To-do accepted
+                        / "DECLINED"         ; To-do declined
+                        / "TENTATIVE"        ; To-do tentatively
+                                             ; accepted
+                        / "DELEGATED"        ; To-do delegated
+                        / "COMPLETED"        ; To-do completed
+                                             ; COMPLETED property has
+                                             ; DATE-TIME completed
+                        / "IN-PROCESS"       ; To-do in process of
+                                             ; being completed
+                        / x-name             ; Experimental status
+                        / iana-token)        ; Other IANA-registered
+                                             ; status
+       ; These are the participation statuses for a "VTODO".
+       ; Default is NEEDS-ACTION.
+
+       partstat-jour    = ("NEEDS-ACTION"    ; Journal needs action
+                        / "ACCEPTED"         ; Journal accepted
+                        / "DECLINED"         ; Journal declined
+                        / x-name             ; Experimental status
+                        / iana-token)        ; Other IANA-registered
+                                             ; status
+       ; These are the participation statuses for a "VJOURNAL".
+       ; Default is NEEDS-ACTION.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.13 Recurrence Identifier Range -->
+	<xs:simpleType name="RangeValueType">
+		<xs:restriction base="xs:token">
+			<xs:enumeration value="THISANDFUTURE"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="RangeParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element name="text" type="xcal:RangeValueType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.14 Alarm Trigger Relationship -->
+	<xs:complexType name="RelatedParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       trigrelparam       = "RELATED" "="
+                           ("START"       ; Trigger off of start
+                          / "END")        ; Trigger off of end
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.15 Relationship Type -->
+	<xs:complexType name="ReltypeParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+       reltypeparam       = "RELTYPE" "="
+                           ("PARENT"    ; Parent relationship - Default
+                          / "CHILD"     ; Child relationship
+                          / "SIBLING"   ; Sibling relationship
+                          / iana-token  ; Some other IANA-registered
+                                        ; iCalendar relationship type
+                          / x-name)     ; A non-standard, experimental
+                                        ; relationship type
+        Ws-Calendar adds the values
+                           / "FINISHTOSTART"
+                           / "FINISHTOFINISH"
+                           / "STARTTOFINISH"
+                           / "STARTTOSTART"             
+                           
+       ; Default is PARENT
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.16 Participation Role -->
+	<xs:complexType name="RoleParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Standard values
+           "CHAIR" 
+           "REQ-PARTICIPANT" 
+           "OPT-PARTICIPANT" 
+           "NON-PARTICIPANT"
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.17 RSVP Expectation -->
+	<xs:complexType name="RsvpParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BooleanParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.18 Sent By -->
+	<xs:complexType name="SentByParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:CalAddressParamType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.2.19 Time Zone Identifier -->
+	<xs:complexType name="TzidParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- Scheduling parameters - Defined by CalDAV scheduling -->
+	<xs:complexType name="ScheduleAgentParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        scheduleagentparam = "SCHEDULE-AGENT" "="
+                        ("SERVER"      ; The server handles scheduling
+                       / "CLIENT"      ; The client handles scheduling
+                       / "NONE"        ; No automatic scheduling
+                       / x-name        ; Experimental type
+                       / iana-token)   ; Other IANA registered type
+                                       ;
+                                       ; Default is SERVER
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="ScheduleForceSendParamType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+      scheduleforcesendparam = "SCHEDULE-FORCE-SEND" "="
+                              ("REQUEST"    ; Force a "REQUEST"
+                             / "REPLY"      ; Force a "REPLY"
+                             / iana-token)  ; IANA registered method
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="ScheduleStatusParamType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextParameterType"/>
+		</xs:complexContent>
+	</xs:complexType>
+</xs:schema>
diff --git a/schemas/ical/iCalendar-props.xsd b/schemas/ical/iCalendar-props.xsd
new file mode 100644
index 0000000..c4dfc92
--- /dev/null
+++ b/schemas/ical/iCalendar-props.xsd
@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar object properties schema is intended to work in
+     conjunction with conformant implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!--non-normative, to support development of WS-Calendar - 2010/10/30. 
+    Refer to rfc5545 and xCal in the IETF for normative description -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+           xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" 
+           targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" 
+           elementFormDefault="qualified">
+
+  <!-- =====================================================================
+       3.7 Calendar Properties
+       ===================================================================== -->  
+            
+  <!-- ===================== Parameters =================================  -->
+  <xs:include schemaLocation="iCalendar-params.xsd" />
+
+  <!-- =====================================================================
+        BasePropertyType 
+        All properties are based off this type which defines a property as 
+        nothing more than a list of parameters. 
+        
+        We make no attempt to define valid parameters for each property as this
+        would complicate the schema significantly. Consumers can ignore 
+        property parameters they do not understand or expect. 
+       ===================================================================== -->  
+  <xs:complexType name="BasePropertyType" abstract="true" >
+    <xs:sequence>
+      <xs:element ref="xcal:parameters" 
+                  minOccurs="0" />
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:element name="parameters" type="xcal:ArrayOfParameters"/>
+
+  <xs:element name="baseProperty" type="xcal:BasePropertyType" />
+
+  <xs:complexType name="ArrayOfProperties">
+    <xs:sequence>
+      <xs:element ref="xcal:baseProperty" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <!-- =====================================================================
+       Define all the standard properties. By using a substitutionGroup we
+       make it easy to extend the list of properties. As an example see 
+       the properties defined in iCalendar-ms-extensions.xsd
+       ===================================================================== -->  
+  <xs:element name="calscale" type="xcal:CalscalePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="method" type="xcal:MethodPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="prodid" type="xcal:ProdidPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="version" type="xcal:VersionPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="attach" type="xcal:AttachPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="categories" type="xcal:CategoriesPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="class" type="xcal:ClassPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="comment" type="xcal:CommentPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="description" type="xcal:DescriptionPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="geo" type="xcal:GeoPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="location" type="xcal:LocationPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="percent-complete" type="xcal:PercentCompletePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="priority" type="xcal:PriorityPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="resources" type="xcal:ResourcesPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="status" type="xcal:StatusPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="summary" type="xcal:SummaryPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="completed" type="xcal:CompletedPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="dtend" type="xcal:DtendPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="dtstart" type="xcal:DtstartPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="due" type="xcal:DuePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="duration" type="xcal:DurationPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="freebusy" type="xcal:FreebusyPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="transp" type="xcal:TranspPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <!-- Comment out tzid for the moment. It has the same name as the parameter
+       and this is causing me some issues
+  <xs:element name="tzid" type="xcal:TzidPropType"
+              substitutionGroup="xcal:baseProperty" /> -->
+  <xs:element name="tzname" type="xcal:TznamePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="tzoffsetfrom" type="xcal:TzoffsetfromPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="tzoffsetto" type="xcal:TzoffsettoPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="tzurl" type="xcal:TzurlPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="attendee" type="xcal:AttendeePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="contact" type="xcal:ContactPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="organizer" type="xcal:OrganizerPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="recurrence-id" type="xcal:RecurrenceIdPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="url" type="xcal:UrlPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="uid" type="xcal:UidPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="exdate" type="xcal:ExdatePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="rdate" type="xcal:RdatePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="related-to" type="xcal:RelatedToPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="exrule" type="xcal:ExrulePropType"
+              substitutionGroup="xcal:baseProperty" /> 
+              
+  <xs:element name="rrule" type="xcal:RrulePropType"
+              substitutionGroup="xcal:baseProperty" /> 
+              
+  <xs:element name="action" type="xcal:ActionPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="repeat" type="xcal:RepeatPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="trigger" type="xcal:TriggerPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="created" type="xcal:CreatedPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="dtstamp" type="xcal:DtstampPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="last-modified" type="xcal:LastModifiedPropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="sequence" type="xcal:SequencePropType"
+              substitutionGroup="xcal:baseProperty" />
+              
+  <xs:element name="request-status" type="xcal:RequestStatusPropType"
+              substitutionGroup="xcal:baseProperty" />
+
+  <!-- Properties that take a simple text value -->
+  <xs:complexType name="TextPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence> 
+          <xs:element ref="xcal:text" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <xs:complexType name="TextListPropertyType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:text" maxOccurs="unbounded"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a calendar address value -->
+  <xs:complexType name="CalAddressPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:cal-address" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+ 
+  <!-- Properties that take a simple integer value -->
+  <xs:complexType name="IntegerPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:integer"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a uri value -->
+  <xs:complexType name="UriPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:uri"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a utc offset value -->
+  <xs:complexType name="UtcOffsetPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:utc-offset"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a date-time value -->
+  <xs:complexType name="DatetimePropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:date-time"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a utc-date-time value -->
+  <xs:complexType name="UtcDatetimePropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:utc-date-time"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a date or date-time value -->
+  <xs:complexType name="DateDatetimePropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:choice>
+            <xs:element ref="xcal:date-time"/>
+            <xs:element ref="xcal:date"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- Properties that take a recurrence value -->
+  <xs:complexType name="RecurPropertyType" >
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element name="recur" type="xcal:RecurType"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+     
+  <!-- 3.7.1 Calendar Scale -->
+  <xs:simpleType name="CalscaleValueType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="GREGORIAN"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:complexType name="CalscalePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element name="text" type="xcal:CalscaleValueType"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.7.2 Method -->
+  <xs:complexType name="MethodPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.7.3 Product Identifier -->
+  <xs:complexType name="ProdidPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.7.4 Version -->
+  <xs:complexType name="VersionPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8 Component Properties -->
+  <!-- 3.8.1 Descriptive Component Properties -->
+  <!-- 3.8.1.1 Attachment -->
+  <xs:complexType name="AttachPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:choice> 
+          <xs:element ref="xcal:uri"/>
+          <xs:element ref="xcal:binary"/>
+        </xs:choice>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.2 Categories -->
+  <xs:complexType name="CategoriesPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextListPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>  
+
+  <!-- 3.8.1.3 Classification -->
+  
+  <xs:complexType name="ClassPropType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+       classvalue = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token
+                  / x-name
+       ;Default is PUBLIC
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.4 Comment -->
+  <xs:complexType name="CommentPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.5 Description -->
+  <xs:complexType name="DescriptionPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.6 Geographic Position -->
+  <xs:complexType name="GeoPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:latitude"/>
+          <xs:element ref="xcal:longitude"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <xs:element name="latitude" type="xs:float"/>
+  <xs:element name="longitude" type="xs:float"/>
+  
+  <!-- 3.8.1.7 Location -->
+  <xs:complexType name="LocationPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.8 Percent Complete -->
+  <xs:complexType name="PercentCompletePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:IntegerPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.8.1.9 Priority -->
+  <xs:complexType name="PriorityPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:IntegerPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.1.10 Resources -->
+  <xs:complexType name="ResourcesPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextListPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.8.1.11 Status -->
+  <xs:complexType name="StatusPropType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+       status          = "STATUS" statparam ":" statvalue CRLF
+
+       statparam       = *(";" other-param)
+
+       statvalue       = (statvalue-event
+                       /  statvalue-todo
+                       /  statvalue-jour)
+
+       statvalue-event = "TENTATIVE"    ;Indicates event is tentative.
+                       / "CONFIRMED"    ;Indicates event is definite.
+                       / "CANCELLED"    ;Indicates event was cancelled.
+       ;Status values for a "VEVENT"
+
+       statvalue-todo  = "NEEDS-ACTION" ;Indicates to-do needs action.
+                       / "COMPLETED"    ;Indicates to-do completed.
+                       / "IN-PROCESS"   ;Indicates to-do in process of.
+                       / "CANCELLED"    ;Indicates to-do was cancelled.
+       ;Status values for "VTODO".
+
+       statvalue-jour  = "DRAFT"        ;Indicates journal is draft.
+                       / "FINAL"        ;Indicates journal is final.
+                       / "CANCELLED"    ;Indicates journal is removed.
+      ;Status values for "VJOURNAL".
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8.1.12 Summary -->
+  <xs:complexType name="SummaryPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2 Date and Time Component Properties -->
+  <!-- 3.8.2.1 Date/Time Completed -->
+  <xs:complexType name="CompletedPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.2 Date/Time End -->
+  <xs:complexType name="DtendPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.3 Date/Time Due -->
+  <xs:complexType name="DuePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.4 Date/Time Start -->
+  <xs:complexType name="DtstartPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.5 Duration -->
+  <xs:complexType name="DurationPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element  name="duration" type="xcal:DurationValueType"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.6 Free/Busy Time -->
+  <xs:complexType name="FreebusyPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element ref="xcal:period" maxOccurs="unbounded"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.2.7 Time Transparency -->
+  
+  <xs:complexType name="TranspPropType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+       transvalue = "OPAQUE"
+                   ;Blocks or opaque on busy time searches.
+                   / "TRANSPARENT"
+                   ;Transparent on busy time searches.
+       ;Default value is OPAQUE
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8.3 Time Zone Component Properties -->
+  <!-- 3.8.3.1 Time Zone Identifier -->
+  <xs:complexType name="TzidPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+        
+  <!-- 3.8.3.2 Time Zone Name -->
+  <xs:complexType name="TznamePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.3.3 Time Zone Offset From -->
+  <xs:complexType name="TzoffsetfromPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcOffsetPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.3.4 Time Zone Offset To -->
+  <xs:complexType name="TzoffsettoPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcOffsetPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.3.5 Time Zone URL -->
+  <xs:complexType name="TzurlPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UriPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4 Relationship Component Properties -->
+  <!-- 3.8.4.1 Attendee -->
+  <xs:complexType name="AttendeePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:CalAddressPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.2 Contact -->
+  <xs:complexType name="ContactPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.3 Organizer -->
+  <xs:complexType name="OrganizerPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:CalAddressPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.4 Recurrence ID -->
+  <xs:complexType name="RecurrenceIdPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.5 Related-To -->
+  <!-- Before extensions to allow different value types
+  <xs:complexType name="RelatedToPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+   -->
+   
+  <xs:complexType name="RelatedToPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:choice> 
+          <xs:element ref="xcal:uri"/>
+          <xs:element name="uid" type="xs:string"/>
+          <xs:element ref="xcal:text"/>
+        </xs:choice>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.6 Uniform Resource Locator -->
+  <xs:complexType name="UrlPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UriPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.4.7 Unique Identifier -->
+  <xs:complexType name="UidPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.5 Recurrence Component Properties -->
+  <!-- 3.8.5.1 Exception Date/Times -->
+  <xs:complexType name="ExdatePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.5.2 Recurrence Date/Times -->
+  <xs:complexType name="RdatePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:DateDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.5.3 Recurrence Rule -->
+  <xs:complexType name="RrulePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:RecurPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- x.x.x.x Deprecated ExRule -->
+  <xs:complexType name="ExrulePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:RecurPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.6 Alarm Component Properties -->
+  <!-- 3.8.6.1 Action -->
+  
+  <xs:complexType name="ActionPropType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+       actionvalue = "AUDIO" / "DISPLAY" / "EMAIL"
+                   / iana-token / x-name
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:TextPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8.6.2 Repeat Count -->
+  <xs:complexType name="RepeatPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:IntegerPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8.6.3 Trigger -->
+  <xs:complexType name="TriggerPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:choice>
+            <xs:element name="duration" type="xcal:DurationValueType"/>
+            <xs:element ref="xcal:date-time"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <!-- 3.8.7 Change Management Component Properties -->
+  <!-- 3.8.7.1 Date/Time Created -->
+  <xs:complexType name="CreatedPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+    
+  <!-- 3.8.7.2 Date/Time Stamp -->
+  <xs:complexType name="DtstampPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.8.7.3 Last Modified -->
+  <xs:complexType name="LastModifiedPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:UtcDatetimePropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.8.7.4 Sequence Number -->
+  <xs:complexType name="SequencePropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:IntegerPropertyType"/>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <!-- 3.8.8 Miscellaneous Component Properties -->
+  <!-- 3.8.8.3 Request Status -->
+  <xs:complexType name="RequestStatusPropType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="xcal:BasePropertyType">
+        <xs:sequence>
+          <xs:element name="code" type="xs:string" />
+          <xs:element name="description" type="xs:string"/>
+          <xs:element name="extdata" type="xs:string"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+    
+    <!-- 
+           statcode   = 1*DIGIT 1*2("." 1*DIGIT)
+       ;Hierarchical, numeric return status code
+
+       statdesc   = text
+       ;Textual status description
+
+       extdata    = text
+       ;Textual exception data.  For example, the offending property
+       ;name and value or complete property line.
+     -->
+</xs:schema>
diff --git a/schemas/ical/iCalendar-valtypes.xsd b/schemas/ical/iCalendar-valtypes.xsd
new file mode 100644
index 0000000..d194837
--- /dev/null
+++ b/schemas/ical/iCalendar-valtypes.xsd
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar values schema is intended to work in conjunction
+     with conformant implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!-- edited with XMLSpy v2010 rel. 3 sp1 (x64) (http://www.altova.com) by Toby Considine (TC9) -->
+<!--non-normative, to support development of WS-Calendar - 2010/10/30. Refer to rfc5545 and xCal in the IETF for normative description-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+           xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" 
+           targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" 
+           elementFormDefault="qualified">
+          
+  <!-- =====================================================================
+       3.3 Property Value Data Types 
+       ===================================================================== -->
+          
+	<!-- 3.3.1 BINARY -->
+	<xs:element name="binary" type="xs:string"/>
+  
+	<!-- 3.3.2 BOOLEAN -->
+	<xs:element name="boolean" type="xs:boolean" />
+  
+	<!-- 3.3.3 CAL-ADDRESS -->
+  <xs:simpleType name="CalAddressType">
+    <xs:restriction base="xs:string"/>
+  </xs:simpleType>
+  
+  <xs:element name="cal-address" type="xcal:CalAddressType" />  
+  
+	<!-- 3.3.4 DATE -->
+	<xs:element name="date" type="xs:date"/>
+  
+	<!-- 3.3.5 DATE-TIME -->
+  <!-- 
+  <xs:element name="date-time" type="xs:string"/>
+ -->  
+   <xs:simpleType name="DateTimeType">
+    <xs:restriction base="xs:dateTime">
+      <xs:pattern value="(\-|\+)?\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:\d{2}(\.\d*)?Z?"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:element name="date-time" type="xcal:DateTimeType"/>
+  
+  <xs:simpleType name="UTCDateTimeType">
+    <xs:restriction base="xs:dateTime">
+      <xs:pattern value="(\-|\+)?\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d*)Z"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:element name="utc-date-time" type="xcal:UTCDateTimeType"/>
+  
+	<!-- 3.3.6 DURATION 
+  We cannot have a duration value type here as the value-type element has the same 
+  name as the property.  
+	<xs:element name="duration" type="xs:duration"/>-->
+  
+  <xs:simpleType name="DurationValueType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+        Durations are a problem: 
+           XML schema types allow Years, Months, Days, Hours, Minutes, Seconds
+           Ical allows Weeks, Days, Hours, Minutes, Seconds
+           
+        These overlap and we really need a combination of both.
+        So the compromise is to have a pattern restricted String type and note
+        that if data is to be exported into the icalendar world it cannot have 
+        years or months.
+        
+        Ultimately it is to be hoped the two worlds can be aligned.
+        
+        RFC5545 (icalendar) specifies
+        dur-value  = (["+"] / "-") "P" (dur-date / dur-time / dur-week)
+
+        dur-date   = dur-day [dur-time]
+        dur-time   = "T" (dur-hour / dur-minute / dur-second)
+        dur-week   = 1*DIGIT "W"
+        dur-hour   = 1*DIGIT "H" [dur-minute]
+        dur-minute = 1*DIGIT "M" [dur-second]
+        dur-second = 1*DIGIT "S"
+        dur-day    = 1*DIGIT "D"
+        
+        So P5W is valid: P5WT10M is not. If weeks re specified nothing else can be
+        
+        XML specifies
+           PnYnMnDTnHnMnS
+        
+        The elements must appear in the order specified and the 'T' is omitted 
+        if hours minutes and seconds are absent.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:pattern value="(\+|\-)?P((\d+Y)?(\d+M)?(\d+D)?T?(\d+H)?(\d+M)?(\d+S)?)|(\d+W)"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+	<!-- 3.3.7 FLOAT -->
+	<xs:element name="float" type="xs:float"/>
+  
+	<!-- 3.3.8 INTEGER -->
+	<xs:element name="integer" type="xs:integer"/>
+  
+	<!-- 3.3.9 PERIOD -->
+
+  <xs:complexType name="PeriodType">
+    <xs:sequence>
+      <xs:element name="start" type="xcal:DateTimeType" />
+      <xs:sequence>
+        <xs:choice>
+          <xs:element name="end" type="xcal:DateTimeType" />
+          <xs:element name="duration" type="xcal:DurationValueType" />
+        </xs:choice>
+      </xs:sequence>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:element name="period" type="xcal:PeriodType" />
+     
+  <!-- 3.3.10 RECUR -->
+  <xs:complexType name="RecurType">
+    <xs:sequence>
+      <xs:element name="freq" type="xcal:FreqRecurType"/>
+      <xs:sequence>
+        <xs:choice minOccurs="0">
+          <xs:element ref="xcal:until" />
+          <xs:element ref="xcal:count" />
+        </xs:choice>
+      </xs:sequence>
+      <xs:element name="interval" type="xs:string" minOccurs="0"/>
+      <xs:element name="bysecond" type="xs:string" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="byminute" type="xs:string"  
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="byhour" type="xs:string" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="byday" type="xs:string" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="byyearday" type="xs:string" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="bymonthday" type="xcal:BymonthdayRecurType" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="byweekno" type="xs:string" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="bymonth" type="xcal:BymonthRecurType" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="bysetpos" type="xs:integer" 
+                  minOccurs="0" maxOccurs="unbounded" />
+      <xs:element name="wkst" type="xcal:WeekdayRecurType" minOccurs="0" />
+    </xs:sequence>
+  </xs:complexType>
+  
+	<xs:simpleType name="FreqRecurType">
+		<xs:restriction base="xs:token">
+			<xs:enumeration value="SECONDLY"/>
+			<xs:enumeration value="MINUTELY"/>
+			<xs:enumeration value="HOURLY"/>
+			<xs:enumeration value="DAILY"/>
+			<xs:enumeration value="WEEKLY"/>
+			<xs:enumeration value="MONTHLY"/>
+			<xs:enumeration value="YEARLY"/>
+		</xs:restriction>
+	</xs:simpleType>
+  
+  <xs:element name="until" type="xcal:UntilRecurType"/>
+  
+  <xs:complexType name="UntilRecurType" >
+    <xs:sequence>
+      <xs:choice>
+        <xs:element ref="xcal:date" />
+        <xs:element ref="xcal:date-time" />
+      </xs:choice>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:element name="count" type="xs:integer"/>
+  
+	<xs:simpleType name="WeekdayRecurType">
+		<xs:restriction base="xs:token">
+			<xs:enumeration value="SU"/>
+			<xs:enumeration value="MO"/>
+			<xs:enumeration value="TU"/>
+			<xs:enumeration value="WE"/>
+			<xs:enumeration value="TH"/>
+			<xs:enumeration value="FR"/>
+			<xs:enumeration value="SA"/>
+		</xs:restriction>
+	</xs:simpleType>
+  
+  <xs:simpleType name="BymonthdayRecurType">
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="-31"/>
+      <xs:maxInclusive value="31"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:simpleType name="BymonthRecurType">
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="1"/>
+      <xs:maxInclusive value="12"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+	<!-- 3.3.11 TEXT -->
+	<xs:element name="text" type="xs:string"/>
+  
+	<!-- 3.3.12 TIME -->
+	<xs:element name="time" type="xs:string"/>
+  
+	<!-- 3.3.13 URI -->
+	<xs:simpleType name="UriType">
+    <xs:restriction base="xs:string"/>
+  </xs:simpleType>
+  
+  <xs:element name="uri" type="xcal:UriType" />  
+  
+	<!-- 3.3.14 UTC-OFFSET -->
+  <xs:simpleType name="UtcOffsetType">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="(\-|\+)?\d{2}:\d{2}"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:element name="utc-offset" type="xcal:UtcOffsetType" />  
+  
+</xs:schema>
diff --git a/schemas/ical/iCalendar-wscal-extensions.xsd b/schemas/ical/iCalendar-wscal-extensions.xsd
new file mode 100644
index 0000000..4f3c7fe
--- /dev/null
+++ b/schemas/ical/iCalendar-wscal-extensions.xsd
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar service functionality extensions schema
+     is intended to work in conjunction with conformant
+     implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!--OASIS WS-Calendar extensions to icalendar -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<xs:include schemaLocation="iCalendar-valtypes.xsd"/>
+	<!-- ===================== Properties =================================  -->
+	<xs:include schemaLocation="iCalendar-props.xsd"/>
+	<!-- ===================== Components =================================  -->
+	<xs:include schemaLocation="iCalendar.xsd"/>
+	<!-- =====================================================================
+       3.2 Property parameter definitions
+       ===================================================================== -->
+	<!-- Parameters that take a duration value -->
+	<xs:complexType name="DurationParameterType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseParameterType">
+				<xs:sequence>
+					<xs:element name="duration" type="xs:duration"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- Gap is used in the RELATED-TO property -->
+	<xs:element name="gap" type="xcal:DurationParameterType" substitutionGroup="xcal:baseParameter"/>
+	<!-- Granularity is used in the VAVAILABILITY and AVAILABILITY components -->
+	<xs:element name="granularity" type="xcal:DurationPropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:complexType name="ToleranceValueType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+         A tolerance value is a set of durations which indicate the allowed
+         tolerance for the indicated value, e.g. startafter=PT5M indicates that
+         5 minutes late is acceptable. 
+      </xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element name="startbefore" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="startafter" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="endbefore" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="endafter" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="durationlong" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="durationshort" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+			<xs:element name="precision" type="xcal:DurationValueType" minOccurs="0" maxOccurs="1"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:element name="tolerance" type="xcal:TolerancePropType" substitutionGroup="xcal:baseProperty"/>
+	<xs:complexType name="TolerancePropType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:BasePropertyType">
+				<xs:sequence>
+					<xs:element name="tolerate" type="xcal:ToleranceValueType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =====================================================================
+       3.4 Calendar Components
+       ===================================================================== -->
+	<xs:complexType name="WsCalendarGluonType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+         A gluon takes vavailability.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType">
+				<xs:sequence>
+					<xs:element name="components" type="xcal:ArrayOfGluonContainedComponents"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfGluonContainedComponents" mixed="false">
+		<xs:sequence>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="xcal:vavailability"/>
+			</xs:choice>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:element name="gluon" type="xcal:WsCalendarGluonType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:complexType name="WsCalendarIntervalType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+         An interval takes no sub-components.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="interval" type="xcal:WsCalendarIntervalType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<!-- =====================================================================
+       3.7 Calendar Properties
+       ===================================================================== -->
+	<xs:complexType name="WsCalendarTypeType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:TextPropertyType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="WsCalendarAttachType" mixed="false">
+		<xs:annotation>
+			<xs:documentation>types the content of the xCal attach element</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BasePropertyType">
+				<xs:choice minOccurs="0" maxOccurs="unbounded">
+					<xs:element ref="xcal:artifact"/>
+					<xs:element ref="xcal:artifactBase"/>
+					<xs:element ref="xcal:uri"/>
+					<xs:element ref="xcal:text"/>
+				</xs:choice>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="x-wsCalendar-attach" type="xcal:WsCalendarAttachType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="x-wscalendar-type" type="xcal:WsCalendarTypeType" substitutionGroup="xcal:baseProperty"/>
+	<xs:element name="artifact" type="xcal:ArtifactType"/>
+	<xs:complexType name="ArtifactType">
+		<xs:annotation>
+			<xs:documentation>
+        The artifact is here to handle elements that are not proper extensions 
+        of wsCalendar.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:restriction base="xs:anyType">
+				<xs:anyAttribute namespace="##other" processContents="lax"/>
+			</xs:restriction>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="artifactBase" type="xcal:ArtifactBaseType" block="">
+		<xs:annotation>
+			<xs:documentation>
+        The artifact Base is here for use in extending by other specifications 
+        allowing attributes from other namespaces to be added to 
+        ws-calendar-based schemas.
+      </xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:complexType name="ArtifactBaseType" abstract="true" block="">
+		<xs:annotation>
+			<xs:documentation>
+        The artifact Base is here for use in extending by other specifications, 
+        to to allow attributes from other namespaces to be added to 
+        ws-calendar-based schemas.
+      </xs:documentation>
+		</xs:annotation>
+	</xs:complexType>
+</xs:schema>
diff --git a/schemas/ical/iCalendar.rng b/schemas/ical/iCalendar.rng
new file mode 100644
index 0000000..9bdafbd
--- /dev/null
+++ b/schemas/ical/iCalendar.rng
@@ -0,0 +1,1184 @@
+# Relax NG Schema for iCalendar in XML
+
+default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"
+
+# 3.2 Property Parameters
+
+# 3.2.1 Alternate Text Representation
+
+altrepparam = element altrep {
+    value-uri
+}
+
+# 3.2.2 Common Name
+
+cnparam = element cn {
+    value-text
+}
+
+# 3.2.3 Calendar User Type
+
+cutypeparam = element cutype {
+    element text {
+        "INDIVIDUAL" |
+        "GROUP" |
+        "RESOURCE" |
+        "ROOM" |
+        "UNKNOWN"
+    }
+}
+
+# 3.2.4 Delegators
+
+delfromparam = element delegated-from {
+    value-cal-address+
+}
+
+# 3.2.5 Delegatees
+
+deltoparam = element delegated-to {
+    value-cal-address+
+}
+
+# 3.2.6 Directory Entry Reference
+
+dirparam = element dir {
+    value-uri
+}
+
+# 3.2.7 Inline Encoding
+
+encodingparam = element encoding {
+    element text {
+        "8BIT" |
+        "BASE64"
+    }
+}
+
+
+# 3.2.8 Format Type
+
+fmttypeparam = element fmttype {
+    value-text
+}
+
+# 3.2.9 Free/Busy Time Type
+
+fbtypeparam = element fbtype {
+    element text {
+        "FREE" |
+        "BUSY" |
+        "BUSY-UNAVAILABLE" |
+        "BUSY-TENTATIVE"
+    }
+}
+
+# 3.2.10 Language
+
+languageparam = element language {
+    value-text
+}
+
+# 3.2.11 Group or List Membership
+
+memberparam = element member {
+    value-cal-address+
+}
+
+# 3.2.12 Participation Status
+
+partstatparam = element partstat {
+    type-partstat-event |
+    type-partstat-todo |
+    type-partstat-jour
+}
+
+type-partstat-event = (
+    element text {
+        "NEEDS-ACTION" |
+        "ACCEPTED" |
+        "DECLINED" |
+        "TENTATIVE" |
+        "DELEGATED"
+    }
+)
+
+type-partstat-todo = (
+    element text {
+        "NEEDS-ACTION" |
+        "ACCEPTED" |
+        "DECLINED" |
+        "TENTATIVE" |
+        "DELEGATED" |
+        "COMPLETED" |
+        "IN-PROCESS"
+    }
+)
+
+type-partstat-jour = (
+    element text {
+        "NEEDS-ACTION" |
+        "ACCEPTED" |
+        "DECLINED"
+    }
+)
+
+# 3.2.13 Recurrence Identifier Range
+
+rangeparam = element range {
+    element text {
+        "THISANDFUTURE"
+    }
+}
+
+# 3.2.14 Alarm Trigger Relationship
+
+trigrelparam = element related {
+    element text {
+        "START" |
+        "END"
+    }
+}
+
+# 3.2.15 Relationship Type
+
+reltypeparam = element reltype {
+    element text {
+        "PARENT" |
+        "CHILD" |
+        "SIBLING"
+    }
+}
+
+# 3.2.16 Participation Role
+
+roleparam = element role {
+    element text {
+        "CHAIR" |
+        "REQ-PARTICIPANT" |
+        "OPT-PARTICIPANT" |
+        "NON-PARTICIPANT"
+    }
+}
+
+# 3.2.17 RSVP Expectation
+
+rsvpparam = element rsvp {
+    value-boolean
+}
+
+# 3.2.18 Sent By
+
+sentbyparam = element sent-by {
+    value-cal-address
+}
+
+# 3.2.19 Time Zone Identifier
+
+tzidparam = element tzid {
+    value-text
+}
+
+# 3.3 Property Value Data Types
+
+# 3.3.1 BINARY
+
+value-binary =  element binary {
+    xsd:string
+}
+
+# 3.3.2 BOOLEAN
+
+value-boolean = element boolean {
+    xsd:boolean
+}
+
+# 3.3.3 CAL-ADDRESS
+
+value-cal-address = element cal-address {
+    xsd:anyURI
+}
+
+# 3.3.4 DATE
+
+pattern-date = xsd:string {
+    pattern = "\d\d\d\d-\d\d-\d\d"
+}
+
+value-date = element date {
+    pattern-date
+}
+
+# 3.3.5 DATE-TIME
+
+pattern-date-time = xsd:string {
+    pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
+}
+
+value-date-time = element date-time {
+    pattern-date-time
+}
+
+# 3.3.6 DURATION
+
+pattern-duration = xsd:string {
+    pattern = "[+\-]?P(\d+W)|(\d+D)?"
+            ~ "(T(\d+H(\d+M)?(\d+S)?)|"
+            ~   "(\d+M(\d+S)?)|"
+            ~   "(\d+S))?"
+}
+
+value-duration = element duration {
+    pattern-duration
+}
+
+# 3.3.7 FLOAT
+
+value-float = element float {
+    xsd:float
+}
+
+# 3.3.8 INTEGER
+
+value-integer = element integer {
+    xsd:integer
+}
+
+# 3.3.9 PERIOD
+
+value-period = element period {
+    element start {
+        pattern-date-time
+    },
+    (
+        element end {
+            pattern-date-time
+        } |
+        element duration {
+            pattern-duration
+        }
+    )
+}
+
+# 3.3.10 RECUR
+
+value-recur = element recur {
+    type-freq,
+    (type-until | type-count)?,
+    element interval {
+        xsd:positiveInteger
+    }?,
+    type-bysecond*,
+    type-byminute*,
+    type-byhour*,
+    type-byday*,
+    type-bymonthday*,
+    type-byyearday*,
+    type-byweekno*,
+    type-bymonth*,
+    type-bysetpos*,
+    element wkst { type-weekday }?
+}
+
+type-freq = element freq {
+    "SECONDLY" |
+    "MINUTELY" |
+    "HOURLY"   |
+    "DAILY"    |
+    "WEEKLY"   |
+    "MONTHLY"  |
+    "YEARLY"
+}
+
+type-until = element until {
+    type-date |
+    type-date-time
+}
+
+type-count = element count {
+    xsd:positiveInteger
+}
+
+type-bysecond = element bysecond {
+    xsd:positiveInteger
+}
+
+type-byminute = element byminute {
+    xsd:positiveInteger
+}
+
+type-byhour = element byhour {
+    xsd:positiveInteger
+}
+
+type-weekday = (
+    "SU" |
+    "MO" |
+    "TU" |
+    "WE" |
+    "TH" |
+    "FR" |
+    "SA"
+)
+
+type-byday = element byday {
+    xsd:integer?,
+    type-weekday
+}
+
+type-bymonthday = element bymonthday {
+    xsd:integer
+}
+
+type-byyearday = element byyearday {
+    xsd:integer
+}
+
+type-byweekno = element byweekno {
+    xsd:integer
+}
+
+type-bymonth = element bymonth {
+    xsd:positiveInteger
+}
+
+type-bysetpos = element bysetpos {
+    xsd:integer
+}
+
+# 3.3.11 TEXT
+
+value-text = element text {
+    xsd:string
+}
+
+# 3.3.12 TIME
+
+pattern-time = xsd:string {
+    pattern = "\d\d:\d\d:\d\dZ?"
+}
+
+value-time = element time {
+    pattern-time
+}
+
+# 3.3.13 URI
+
+value-uri = element uri {
+    xsd:anyURI
+}
+
+# 3.3.14 UTC-OFFSET
+
+value-utc-offset = element utc-offset {
+    xsd:string { pattern = "[+\-]\d\d:\d\d" }
+}
+
+# UNKNOWN
+
+value-unknown = element unknown {
+    xsd:string
+}
+
+# 3.4 iCalendar Stream
+
+start = element icalendar {
+    vcalendar+
+}
+
+# 3.6 Calendar Components
+
+vcalendar = element vcalendar {
+    type-calprops,
+    type-component
+}
+
+type-calprops = element properties {
+    property-prodid &
+    property-version &
+    property-calscale? &
+    property-method?
+}
+
+type-component = element components {
+    (
+        component-vevent |
+        component-vtodo |
+        component-vjournal |
+        component-vfreebusy |
+        component-vtimezone
+    )*
+}
+
+# 3.6.1 Event Component
+
+component-vevent = element vevent {
+    type-eventprop,
+    element components {
+        component-valarm+
+    }?
+}
+
+type-eventprop = element properties {
+    property-dtstamp &
+    property-dtstart &
+    property-uid &
+
+    property-class? &
+    property-created? &
+    property-description? &
+    property-geo? &
+    property-last-mod? &
+    property-location? &
+    property-organizer? &
+    property-priority? &
+    property-seq? &
+    property-status-event? &
+    property-summary? &
+    property-transp? &
+    property-url? &
+    property-recurid? &
+
+    property-rrule? &
+
+    (property-dtend | property-duration)? &
+
+    property-attach* &
+    property-attendee* &
+    property-categories* &
+    property-comment* &
+    property-contact* &
+    property-exdate* &
+    property-rstatus* &
+    property-related* &
+    property-resources* &
+    property-rdate*
+}
+
+# 3.6.2 To-do Component
+
+component-vtodo = element vtodo {
+    type-todoprop,
+    element components {
+        component-valarm+
+    }?
+}
+
+type-todoprop = element properties {
+    property-dtstamp &
+    property-uid &
+
+    property-class? &
+    property-completed? &
+    property-created? &
+    property-description? &
+    property-geo? &
+    property-last-mod? &
+    property-location? &
+    property-organizer? &
+    property-percent? &
+    property-priority? &
+    property-recurid? &
+    property-seq? &
+    property-status-todo? &
+    property-summary? &
+    property-url? &
+
+    property-rrule? &
+
+    (
+        (property-dtstart?, property-dtend? ) |
+        (property-dtstart, property-duration)?
+    ) &
+
+    property-attach* &
+    property-attendee* &
+    property-categories* &
+    property-comment* &
+    property-contact* &
+    property-exdate* &
+    property-rstatus* &
+    property-related* &
+    property-resources* &
+    property-rdate*
+}
+
+# 3.6.3 Journal Component
+
+component-vjournal = element vjournal {
+    type-jourprop
+}
+
+type-jourprop = element properties {
+    property-dtstamp &
+    property-uid &
+
+    property-class? &
+    property-created? &
+    property-dtstart? &
+    property-last-mod? &
+    property-organizer? &
+    property-recurid? &
+    property-seq? &
+    property-status-jour? &
+    property-summary? &
+    property-url? &
+
+    property-rrule? &
+
+    property-attach* &
+    property-attendee* &
+    property-categories* &
+    property-comment* &
+    property-contact* &
+    property-description? &
+    property-exdate* &
+    property-related* &
+    property-rdate* &
+    property-rstatus*
+}
+
+# 3.6.4 Free/Busy Component
+
+component-vfreebusy = element vfreebusy {
+    type-fbprop
+}
+
+type-fbprop = element properties {
+    property-dtstamp &
+    property-uid &
+    property-contact? &
+    property-dtstart? &
+    property-dtend? &
+    property-duration? &
+    property-organizer? &
+    property-url? &
+
+    property-attendee* &
+    property-comment* &
+    property-freebusy* &
+    property-rstatus*
+}
+
+# 3.6.5 Time Zone Component
+
+component-vtimezone = element vtimezone {
+    element properties {
+        property-tzid &
+
+        property-last-mod? &
+        property-tzuurl?
+    },
+    element components {
+        (component-standard | component-daylight) &
+        component-standard* &
+        component-daylight*
+    }
+}
+
+component-standard = element standard {
+    type-tzprop
+}
+
+component-daylight = element daylight {
+    type-tzprop
+}
+
+type-tzprop = element properties {
+    property-dtstart &
+    property-tzoffsetto &
+    property-tzoffsetfrom &
+
+    property-rrule? &
+
+    property-comment* &
+    property-rdate* &
+    property-tzname*
+}
+
+# 3.6.6 Alarm Component
+
+component-valarm = element valarm {
+    audioprop | dispprop | emailprop
+}
+
+type-audioprop = element properties {
+    property-action &
+    property-trigger &
+
+    (property-duration, property-repeat)? &
+
+    property-attach?
+}
+
+type-dispprop = element properties {
+    property-action &
+    property-description &
+    property-trigger &
+    property-summary &
+
+    property-attendee+ &
+
+    (property-duration, property-repeat)? &
+
+    property-attach*
+}
+
+type-emailprop = element properties {
+    property-action &
+    property-description &
+    property-trigger &
+
+    (property-duration, property-repeat)?
+}
+
+# 3.7 Calendar Properties
+
+# 3.7.1 Calendar Scale
+
+property-calscale = element calscale {
+
+    element parameters { empty }?,
+
+    element text { "GREGORIAN" }
+}
+
+# 3.7.2 Method
+
+property-method = element method {
+
+    element parameters { empty }?,
+
+    value-text
+}
+
+# 3.7.3 Product Identifier
+
+property-prodid = element prodid {
+
+    element parameters { empty }?,
+
+    value-text
+}
+
+# 3.7.4 Version
+
+property-version = element version {
+
+    element parameters { empty }?,
+
+    element text { "2.0" }
+}
+
+# 3.8 Component Properties
+
+# 3.8.1 Descriptive Component Properties
+
+# 3.8.1.1 Attachment
+
+property-attach = element attach {
+
+    element parameters {
+        fmttypeparam? &
+        encodingparam?
+    }?,
+
+    value-uri | value-binary
+}
+
+# 3.8.1.2 Categories
+
+property-categories = element categories {
+
+    element parameters {
+        languageparam? &
+    }?,
+    value-text+
+}
+
+# 3.8.1.3 Classification
+
+property-class = element class {
+
+    element parameters { empty }?,
+
+    element text {
+        "PUBLIC" |
+        "PRIVATE" |
+        "CONFIDENTIAL"
+    }
+}
+
+# 3.8.1.4 Comment
+
+property-comment = element comment {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.1.5 Description
+
+property-description = element description {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.1.6 Geographic Position
+
+property-geo = element geo {
+
+    element parameters { empty }?,
+
+    element latitude  { xsd:float },
+    element longitude { xsd:float }
+}
+
+# 3.8.1.7 Location
+
+property-location = element location {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.1.8 Percent Complete
+
+property-percent = element percent-complete {
+
+    element parameters { empty }?,
+
+    value-integer
+}
+
+# 3.8.1.9 Priority
+
+property-priority = element priority {
+
+    element parameters { empty }?,
+
+    value-integer
+}
+
+# 3.8.1.10 Resources
+
+property-resources = element resources {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text+
+}
+
+# 3.8.1.11 Status
+
+property-status-event = element status {
+
+    element parameters { empty }?,
+
+    element text {
+        "TENTATIVE" |
+        "CONFIRMED" |
+        "CANCELLED"
+    }
+}
+
+property-status-todo = element status {
+
+    element parameters { empty }?,
+
+    element text {
+        "NEEDS-ACTION" |
+        "COMPLETED" |
+        "IN-PROCESS" |
+        "CANCELLED"
+    }
+}
+
+property-status-jour = element status {
+
+    element parameters { empty }?,
+
+    element text {
+        "DRAFT" |
+        "FINAL" |
+        "CANCELLED"
+    }
+}
+
+# 3.8.1.12 Summary
+
+property-summary = element summary {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.2 Date and Time Component Properties
+
+# 3.8.2.1 Date/Time Completed
+
+property-completed = element completed {
+
+    element parameters { empty }?,
+
+    value-date-time
+}
+
+# 3.8.2.2 Date/Time End
+
+property-dtend = element dtend {
+
+    element parameters {
+        tzidparam?
+    }?,
+
+    value-date-time |
+    value-date
+}
+
+# 3.8.2.3 Date/Time Due
+
+property-due = element due {
+
+    element parameters {
+        tzidparam?
+    }?,
+
+    value-date-time |
+    value-date
+}
+
+# 3.8.2.4 Date/Time Start
+
+property-dtstart = element dtstart {
+
+    element parameters {
+        tzidparam?
+    }?,
+
+    value-date-time |
+    value-date
+}
+
+# 3.8.2.5 Duration
+
+property-duration = element duration {
+
+    element parameters { empty }?,
+    value-duration
+}
+
+# 3.8.2.6 Free/Busy Time
+
+property-freebusy = element freebusy {
+
+    element parameters {
+        fbtypeparam?
+    }?,
+
+
+    value-period+
+}
+
+# 3.8.2.7 Time Transparency
+
+property-transp = element transp {
+
+    element parameters { empty }?,
+
+    element text {
+        "OPAQUE" |
+        "TRANSPARENT"
+    }
+}
+
+# 3.8.3 Time Zone Component Properties
+
+# 3.8.3.1 Time Zone Identifier
+
+property-tzid = element tzid {
+
+    element parameters { empty }?,
+
+    value-text
+}
+
+# 3.8.3.2 Time Zone Name
+
+property-tzname = element tzname {
+
+    element parameters {
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.3.3 Time Zone Offset From
+
+property-tzoffsetfrom = element tzoffsetfrom {
+
+    element parameters { empty }?,
+
+    value-utc-offset
+}
+
+# 3.8.3.4 Time Zone Offset To
+
+property-tzoffsetto = element tzoffsetto {
+
+    element parameters { empty }?,
+
+    value-utc-offset
+}
+
+# 3.8.3.5 Time Zone URL
+
+property-tzurl = element tzurl {
+
+    element parameters { empty }?,
+
+    value-uri
+}
+
+# 3.8.4 Relationship Component Properties
+
+# 3.8.4.1 Attendee
+
+property-attendee = element attendee {
+
+    element parameters {
+        cutypeparam? &
+        memberparam? &
+        roleparam? &
+        partstatparam? &
+        rsvpparam? &
+        deltoparam? &
+        delfromparam? &
+        sentbyparam? &
+        cnparam? &
+        dirparam? &
+        languageparam?
+    }?,
+
+    value-cal-address
+}
+
+# 3.8.4.2 Contact
+
+property-contact = element contact {
+
+    element parameters {
+        altrepparam? &
+        languageparam?
+    }?,
+
+    value-text
+}
+
+# 3.8.4.3 Organizer
+
+property-organizer = element organizer {
+
+    element parameters {
+        cnparam? &
+        dirparam? &
+        sentbyparam? &
+        languageparam?
+    }?,
+
+    value-cal-address
+}
+
+# 3.8.4.4 Recurrence ID
+
+property-recurid = element recurrence-id {
+
+    element parameters {
+        tzidparam? &
+        rangeparam?
+    }?,
+
+    value-date-time |
+    value-date
+}
+
+# 3.8.4.5 Related-To
+
+property-related = element related-to {
+
+    element parameters {
+        reltypeparam?
+    }?,
+    value-text
+}
+
+# 3.8.4.6 Uniform Resource Locator
+
+property-url = element url {
+
+    element parameters { empty }?,
+
+    value-uri
+}
+
+# 3.8.4.7 Unique Identifier
+
+property-uid = element uid {
+
+    element parameters { empty }?,
+
+    value-text
+}
+
+# 3.8.5 Recurrence Component Properties
+
+# 3.8.5.1 Exception Date/Times
+
+property-exdate = element exdate {
+
+    element parameters {
+        tzidparam?
+    }?,
+
+    value-date-time+ |
+    value-date+
+}
+
+# 3.8.5.2 Recurrence Date/Times
+
+property-rdate = element rdate {
+
+    element parameters {
+        tzidparam?
+    }?,
+
+    value-date-time+ |
+    value-date+ |
+    value-period+
+}
+
+# 3.8.5.3 Recurrence Rule
+
+property-rrule = element rrule {
+
+    element parameters { empty }?,
+
+    value-recur
+}
+
+# 3.8.6 Alarm Component Properties
+
+# 3.8.6.1 Action
+
+property-action = element action {
+
+    element parameters { empty }?,
+
+    element text {
+        "AUDIO" |
+        "DISPLAY" |
+        "EMAIL"
+    }
+}
+
+# 3.8.6.2 Repeat Count
+
+property-repeat = element repeat {
+
+    element parameters { empty }?,
+
+    value-integer
+}
+
+# 3.8.6.3 Trigger
+
+property-trigger = element trigger {
+
+    (
+        element parameters {
+            trigrelparam?
+        }?,
+
+        value-duration
+    ) |
+    (
+        element parameters { empty }?,
+
+        value-date-time
+    )
+}
+
+# 3.8.7 Change Management Component Properties
+
+# 3.8.7.1 Date/Time Created
+
+property-created = element created {
+
+    element parameters { empty }?,
+
+    value-date-time
+}
+
+# 3.8.7.2 Date/Time Stamp
+
+property-dtstamp = element dtstamp {
+
+    element parameters { empty }?,
+
+    value-date-time
+}
+
+# 3.8.7.3 Last Modified
+
+property-last-mod = element last-modified {
+
+    element parameters { empty }?,
+
+    value-date-time
+}
+
+# 3.8.7.4 Sequence Number
+
+property-seq = element sequence {
+
+    element parameters { empty }?,
+
+    value-integer
+}
+
+# 3.8.8 Miscellaneous Component Properties
+
+# 3.8.8.3 Request Status
+
+property-rstatus = element request-status {
+
+    element parameters {
+        languageparam?
+    }?,
+
+    element code { xsd:string },
+    element description { xsd:string },
+    element data { xsd:string }?
+}
+
diff --git a/schemas/ical/iCalendar.xsd b/schemas/ical/iCalendar.xsd
new file mode 100644
index 0000000..def79cb
--- /dev/null
+++ b/schemas/ical/iCalendar.xsd
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     WS-Calendar Version 1.0
+     Committee Specification Draft 04 / Public Review Draft 03
+     17 June 2011
+     Source: http://docs.oasis-open.org/ws-calendar/ws-calendar-spec/v1.0/csprd03/xsd/
+     Copyright (c) The Calendaring and Scheduling Consortium 2010-2011. All Rights Reserved.
+     Copyright (c) OASIS Open 2010-2011. All Rights Reserved. -->
+
+<!-- iCalendar base schema is intended to work in conjunction
+     with conformant implementations of IETF RFC 5545
+     ( http://www.rfc-editor.org/rfc/rfc5545.txt ),
+     the normative specification of iCalendar. -->
+
+<!-- edited with XMLSpy v2010 rel. 3 sp1 (x64) (http://www.altova.com) by Toby Considine (TC9) -->
+<!--non-normative, to support development of WS-Calendar - 2010/10/30. Refer to rfc5545 and xCal in the IETF for normative description-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" elementFormDefault="qualified">
+	<!-- ===================== Standard Extensions =======================  -->
+	<xs:include schemaLocation="iCalendar-link-extension.xsd"/>
+	<!-- ===================== Proprietary Extensions =======================  -->
+	<xs:include schemaLocation="iCalendar-bw-extensions.xsd"/>
+	<xs:include schemaLocation="iCalendar-ms-extensions.xsd"/>
+	<xs:include schemaLocation="iCalendar-availability-extension.xsd"/>
+	<xs:include schemaLocation="iCalendar-wscal-extensions.xsd"/>
+	<!-- =====================================================================
+       3.4 Calendar Components
+       ===================================================================== -->
+	<xs:include schemaLocation="iCalendar-props.xsd"/>
+	<xs:complexType name="BaseComponentType" abstract="true">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        This type is the basis for all components and provides a base class for
+        applications.
+        
+        Essentially it states that a component is a set of properties.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:sequence>
+			<xs:element name="properties" type="xcal:ArrayOfProperties" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:element name="baseComponent" type="xcal:BaseComponentType" abstract="true"/>
+	<xs:element name="vevent" type="xcal:VeventType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:element name="vtodo" type="xcal:VtodoType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:element name="vjournal" type="xcal:VjournalType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:element name="vfreebusy" type="xcal:VfreebusyType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:element name="vtimezone" type="xcal:VtimezoneType" substitutionGroup="xcal:vcalendarContainedComponent"/>
+	<xs:element name="standard" type="xcal:StandardType" substitutionGroup="xcal:baseComponent"/>
+	<xs:element name="daylight" type="xcal:DaylightType" substitutionGroup="xcal:baseComponent"/>
+	<xs:element name="valarm" type="xcal:ValarmType"/>
+	<!-- 3.4 iCalendar Stream -->
+	<xs:complexType name="IcalendarType">
+		<xs:sequence>
+			<xs:element name="vcalendar" type="xcal:VcalendarType" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:element name="icalendar" type="xcal:IcalendarType"/>
+	<!-- 3.6 Calendar Components -->
+	<xs:complexType name="VcalendarType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        This type is the basis for all components and provides a base class for
+        applications.
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType">
+				<xs:sequence>
+					<xs:element name="components" type="xcal:ArrayOfVcalendarContainedComponents"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:element name="vcalendar" type="xcal:VcalendarType"/>
+	<xs:element name="vcalendarContainedComponent" type="xcal:VcalendarContainedComponentType" abstract="true"/>
+	<xs:complexType name="ArrayOfVcalendarContainedComponents">
+		<xs:sequence>
+			<xs:element ref="xcal:vcalendarContainedComponent" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="VcalendarContainedComponentType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        This type is the basis for all components that can be contained within
+        a vcalendar component
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.6.1 Event Component -->
+	<xs:complexType name="VeventType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:EventTodoComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="EventTodoComponentType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Events and todos only contain alarms
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType">
+				<xs:sequence>
+					<xs:element name="components" type="xcal:ArrayOfEventTodoContainedComponents"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfEventTodoContainedComponents">
+		<xs:sequence>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="xcal:valarm"/>
+			</xs:choice>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- 3.6.2 To-do Component -->
+	<xs:complexType name="VtodoType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:EventTodoComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.6.3 Journal Component -->
+	<xs:complexType name="VjournalType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Journal components contain no other components
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.6.4 Free/Busy Component -->
+	<xs:complexType name="VfreebusyType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Freebusy components contain no other components
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.6.5 timezone -->
+	<xs:complexType name="VtimezoneType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Timezones only contain daylight and standard
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:VcalendarContainedComponentType">
+				<xs:sequence>
+					<xs:element name="components" type="xcal:ArrayOfTimezoneContainedComponents"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="ArrayOfTimezoneContainedComponents">
+		<xs:sequence>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="xcal:standard"/>
+				<xs:element ref="xcal:daylight"/>
+			</xs:choice>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="StandardType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Standard components contain no other components
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="DaylightType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Daylight components contain no other components
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- 3.6.6 Alarm Component -->
+	<xs:complexType name="ValarmType" mixed="false">
+		<xs:complexContent>
+			<xs:extension base="xcal:AlarmComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="AlarmComponentType" mixed="false">
+		<xs:annotation>
+			<xs:documentation xml:lang="en">
+        Alarms contain no components
+      </xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="xcal:BaseComponentType"/>
+		</xs:complexContent>
+	</xs:complexType>
+</xs:schema>





More information about the commits mailing list