diff --git a/CHANGES.rst b/CHANGES.rst
index 5fbf217..b323e83 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -7,10 +7,13 @@ Changelog
 New:
 
 - *add item here*
+- Updated components description to better comply with RFC 5545.
+  [stlaz]
 
 Fixes:
 
 - Fix testsuite for use with ``dateutil>=2.5``. Refs #195.
+- Reintroduce cal.Component.is_broken that was removed with 3.9.2 [geier]
 
 
 3.9.2 (2016-02-05)
diff --git a/src/icalendar/cal.py b/src/icalendar/cal.py
index 9828c54..9c854eb 100644
--- a/src/icalendar/cal.py
+++ b/src/icalendar/cal.py
@@ -106,6 +106,10 @@ class Component(CaselessDict):
         """
         return True if not (list(self.values()) + self.subcomponents) else False  # noqa
 
+    @property
+    def is_broken(self):
+        return bool(self.errors)
+
     #############################
     # handling of property values
 
@@ -432,7 +436,7 @@ class Component(CaselessDict):
 
 
 #######################################
-# components defined in RFC 2445
+# components defined in RFC 5545
 
 class Event(Component):
 
@@ -440,21 +444,21 @@ class Event(Component):
 
     canonical_order = (
         'SUMMARY', 'DTSTART', 'DTEND', 'DURATION', 'DTSTAMP',
-        'UID', 'RECURRENCE-ID', 'SEQUENCE',
-        'RRULE' 'EXRULE', 'RDATE', 'EXDATE',
+        'UID', 'RECURRENCE-ID', 'SEQUENCE', 'RRULE', 'RDATE',
+        'EXDATE',
     )
 
-    required = ('UID',)
+    required = ('UID', 'DTSTAMP',)
     singletons = (
         'CLASS', 'CREATED', 'DESCRIPTION', 'DTSTART', 'GEO', 'LAST-MODIFIED',
         'LOCATION', 'ORGANIZER', 'PRIORITY', 'DTSTAMP', 'SEQUENCE', 'STATUS',
         'SUMMARY', 'TRANSP', 'URL', 'RECURRENCE-ID', 'DTEND', 'DURATION',
-        'DTSTART',
+        'UID',
     )
-    exclusive = ('DTEND', 'DURATION', )
+    exclusive = ('DTEND', 'DURATION',)
     multiple = (
         'ATTACH', 'ATTENDEE', 'CATEGORIES', 'COMMENT', 'CONTACT', 'EXDATE',
-        'EXRULE', 'RSTATUS', 'RELATED', 'RESOURCES', 'RDATE', 'RRULE'
+        'RSTATUS', 'RELATED', 'RESOURCES', 'RDATE', 'RRULE'
     )
     ignore_exceptions = True
 
@@ -463,7 +467,7 @@ class Todo(Component):
 
     name = 'VTODO'
 
-    required = ('UID',)
+    required = ('UID', 'DTSTAMP',)
     singletons = (
         'CLASS', 'COMPLETED', 'CREATED', 'DESCRIPTION', 'DTSTAMP', 'DTSTART',
         'GEO', 'LAST-MODIFIED', 'LOCATION', 'ORGANIZER', 'PERCENT-COMPLETE',
@@ -473,7 +477,7 @@ class Todo(Component):
     exclusive = ('DUE', 'DURATION',)
     multiple = (
         'ATTACH', 'ATTENDEE', 'CATEGORIES', 'COMMENT', 'CONTACT', 'EXDATE',
-        'EXRULE', 'RSTATUS', 'RELATED', 'RESOURCES', 'RDATE', 'RRULE'
+        'RSTATUS', 'RELATED', 'RESOURCES', 'RDATE', 'RRULE'
     )
 
 
@@ -481,15 +485,14 @@ class Journal(Component):
 
     name = 'VJOURNAL'
 
-    required = ('UID',)
+    required = ('UID', 'DTSTAMP',)
     singletons = (
-        'CLASS', 'CREATED', 'DESCRIPTION', 'DTSTART', 'DTSTAMP',
-        'LAST-MODIFIED', 'ORGANIZER', 'RECURRENCE-ID', 'SEQUENCE', 'STATUS',
-        'SUMMARY', 'UID', 'URL',
+        'CLASS', 'CREATED', 'DTSTART', 'DTSTAMP', 'LAST-MODIFIED', 'ORGANIZER',
+        'RECURRENCE-ID', 'SEQUENCE', 'STATUS', 'SUMMARY', 'UID', 'URL',
     )
     multiple = (
         'ATTACH', 'ATTENDEE', 'CATEGORIES', 'COMMENT', 'CONTACT', 'EXDATE',
-        'EXRULE', 'RELATED', 'RDATE', 'RRULE', 'RSTATUS',
+        'RELATED', 'RDATE', 'RRULE', 'RSTATUS', 'DESCRIPTION',
     )
 
 
@@ -497,9 +500,9 @@ class FreeBusy(Component):
 
     name = 'VFREEBUSY'
 
-    required = ('UID',)
+    required = ('UID', 'DTSTAMP',)
     singletons = (
-        'CONTACT', 'DTSTART', 'DTEND', 'DURATION', 'DTSTAMP', 'ORGANIZER',
+        'CONTACT', 'DTSTART', 'DTEND', 'DTSTAMP', 'ORGANIZER',
         'UID', 'URL',
     )
     multiple = ('ATTENDEE', 'COMMENT', 'FREEBUSY', 'RSTATUS',)
@@ -507,8 +510,8 @@ class FreeBusy(Component):
 
 class Timezone(Component):
     name = 'VTIMEZONE'
-    canonical_order = ('TZID', 'STANDARD', 'DAYLIGHT',)
-    required = ('TZID', 'STANDARD', 'DAYLIGHT',)
+    canonical_order = ('TZID',)
+    required = ('TZID',) # it also requires one of components DAYLIGHT and STANDARD
     singletons = ('TZID', 'LAST-MODIFIED', 'TZURL',)
 
     @staticmethod
@@ -631,24 +634,28 @@ class Timezone(Component):
 class TimezoneStandard(Component):
     name = 'STANDARD'
     required = ('DTSTART', 'TZOFFSETTO', 'TZOFFSETFROM')
-    singletons = ('DTSTART', 'TZOFFSETTO', 'TZOFFSETFROM', 'RRULE')
-    multiple = ('COMMENT', 'RDATE', 'TZNAME')
+    singletons = ('DTSTART', 'TZOFFSETTO', 'TZOFFSETFROM',)
+    multiple = ('COMMENT', 'RDATE', 'TZNAME', 'RRULE', 'EXDATE')
 
 
 class TimezoneDaylight(Component):
     name = 'DAYLIGHT'
-    required = ('DTSTART', 'TZOFFSETTO', 'TZOFFSETFROM')
-    singletons = ('DTSTART', 'TZOFFSETTO', 'TZOFFSETFROM', 'RRULE')
-    multiple = ('COMMENT', 'RDATE', 'TZNAME')
+    required = TimezoneStandard.required
+    singletons = TimezoneStandard.singletons
+    multiple = TimezoneStandard.multiple
 
 
 class Alarm(Component):
 
     name = 'VALARM'
-    # not quite sure about these ...
+    # some properties MAY/MUST/MUST NOT appear depending on ACTION value
     required = ('ACTION', 'TRIGGER',)
-    singletons = ('ATTACH', 'ACTION', 'TRIGGER', 'DURATION', 'REPEAT',)
-    inclusive = (('DURATION', 'REPEAT',),)
+    singletons = (
+            'ATTACH', 'ACTION', 'DESCRIPTION', 'SUMMARY', 'TRIGGER',
+            'DURATION', 'REPEAT',
+            )
+    inclusive = (('DURATION', 'REPEAT',), ('SUMMARY', 'ATTENDEE',))
+    multiple = ('ATTENDEE', 'ATTACH')
 
 
 class Calendar(Component):
@@ -656,9 +663,8 @@ class Calendar(Component):
     """
     name = 'VCALENDAR'
     canonical_order = ('VERSION', 'PRODID', 'CALSCALE', 'METHOD',)
-    required = ('prodid', 'version', )
-    singletons = ('prodid', 'version', )
-    multiple = ('calscale', 'method', )
+    required = ('PRODID', 'VERSION', )
+    singletons = ('PRODID', 'VERSION', 'CALSCALE', 'METHOD')
 
 # These are read only singleton, so one instance is enough for the module
 types_factory = TypesFactory()

diff --git a/src/icalendar/tests/test_fixed_issues.py b/src/icalendar/tests/test_fixed_issues.py
index ae29535..6b375d3 100644
--- a/src/icalendar/tests/test_fixed_issues.py
+++ b/src/icalendar/tests/test_fixed_issues.py
@@ -200,6 +200,7 @@ X
 END:VEVENT"""
         event = icalendar.Calendar.from_ical(ical_str)
         self.assertTrue(isinstance(event, icalendar.Event))
+        self.assertTrue(event.is_broken)  # REMOVE FOR NEXT MAJOR RELEASE
         self.assertEqual(
             event.errors,
             [(None, "Content line could not be parsed into parts: 'X': Invalid content line")]  # noqa

incompatible changes in 3.9.2
With 70a7b5a16748afbf0d48ca180c2b7613fdd7e7d0 we introduced some  backwards incompatible changes:

 * `Component.is_broken` got replaced with `Component.errors`
 * events with a `RDATE;VALUE=PERIOD:19970101T180000Z/19970102T070000Z,19970109T180000Z/PT5H30M` component still had an `RDATE` with `VALUE=PERIOD` param before, now they are `RDATE:None`

While I do agree with both changes, I think they should have been deferred to the 4.0.0 release. Because we don't have `VALUE=PERIOD` anyway I think we can leave this one as it is, but I believe we should bring back `Component.is_broken` for the 3.9.3 release.

src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_104__ignore_exceptions
src/icalendar/tests/test_fixed_issues.py::TestIssues::test_index_error_issue src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_100 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_101 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_104__no_ignore_exceptions src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_112 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_116 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_142 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_143 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_157 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_168 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_178 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_53 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_55 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_58 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_64 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_70 src/icalendar/tests/test_fixed_issues.py::TestIssues::test_issue_82