diff -Naur date.orig/date_api/date_api_ical.inc date/date_api/date_api_ical.inc
--- date.orig/date_api/date_api_ical.inc	2011-08-12 16:43:36.546904683 +0200
+++ date/date_api/date_api_ical.inc	2011-08-12 16:44:01.646941496 +0200
@@ -713,7 +713,7 @@
     $ex_dates = array();
     foreach ($form_values['EXDATE'] as $value) {
       if (!empty($value['datetime'])) {
-        $date = !is_object($value['datetime']) ? date_ical_date($value, 'UTC') : $value['datetime'];
+        $date = !is_object($value['datetime']) ? date_ical_date($value, $value['tz']) : $value['datetime'];
         $ex_date = !empty($date) ? $date->format(DATE_FORMAT_ICAL) : '';
         if (!empty($ex_date)) {
           $ex_dates[] = $ex_date;
@@ -733,7 +733,7 @@
   if (isset($form_values['RDATE']) && is_array($form_values['RDATE'])) {
     $ex_dates = array();
     foreach ($form_values['RDATE'] as $value) {
-      $date = !is_object($value['datetime']) ? date_ical_date($value, 'UTC') : $value['datetime'];
+      $date = !is_object($value['datetime']) ? date_ical_date($value, $value['tz']) : $value['datetime'];
       $ex_date = !empty($date) ? $date->format(DATE_FORMAT_ICAL) : '';
       if (!empty($ex_date)) {
         $ex_dates[] = $ex_date;
@@ -741,7 +741,7 @@
     }
     if (!empty($ex_dates)) {
       sort($ex_dates);
-      $RRULE .= chr(13) . chr(10) .'RDATE:'. implode(',', $ex_dates);
+      $RRULE .= chr(13) . chr(10) .'RDATE;'. implode(',', $ex_dates);
     }
   }
   elseif (!empty($form_values['RDATE'])) {
diff -Naur date.orig/date_repeat/date_repeat_calc.inc date/date_repeat/date_repeat_calc.inc
--- date.orig/date_repeat/date_repeat_calc.inc	2011-08-12 16:43:36.556904694 +0200
+++ date/date_repeat/date_repeat_calc.inc	2011-08-12 16:45:14.337048113 +0200
@@ -53,11 +53,21 @@
   // Create a date object for the start and end dates.
   $start_date = new DateObject($start, $timezone);
   $end_date = new DateObject($end, $timezone);
+
+  // we assume that everything ends ad midnight
+  // FIXME: should check if user specified end time and use it 
+  $end_date->setTime(23,59,59);
+
   $modify_time = ' ' . $start_date->format('g:ia');
 
   // If the rule has an UNTIL, see if that is earlier than the end date.
   if (!empty($rrule['UNTIL'])) {
     $until_date = date_ical_date($rrule['UNTIL'], $timezone);
+
+    // we assume that everything ends at midnight
+    // FIXME: should check if user specified end time and use it 
+    $until_date->setTime(23,59,59);
+
     if (date_format($until_date, 'U') < date_format($end_date, 'U')) {
       $end_date = $until_date;
     }
@@ -273,9 +283,14 @@
       // middle of the possible week days, needed so we don't prematurely
       // jump to the next week. The date_repeat_add_dates() function will
       // keep dates outside the range from getting added.
-      if (date_format($current_day, 'l') != $day_names[$day]) {  
-        date_modify($current_day, '-1 ' . $week_start_day . $modify_time);
-      }
+
+      // FIXME: commented out the if because it doesn't make sense and was
+      // producing holes. I.E: start 16/07/2011 every day except mondays
+      // cuts off first sunday. Needs review.
+      //if (date_format($current_day, 'l') != $day_names[$day]) {  
+      date_modify($current_day, '-1 ' . $week_start_day . $modify_time);
+      //}
+
       while (!$finished) {
         $period_finished = FALSE;
         while (!$period_finished) {
diff -Naur date.orig/date_repeat/date_repeat_form.inc date/date_repeat/date_repeat_form.inc
--- date.orig/date_repeat/date_repeat_form.inc	2011-08-12 16:43:36.556904694 +0200
+++ date/date_repeat/date_repeat_form.inc	2011-08-12 16:45:38.127083007 +0200
@@ -234,15 +234,15 @@
         '#name' => 'additions|' . $instance,
         '#default_value' => $RDATE,
         '#date_timezone' => !empty($element['#date_timezone']) ? $element['#date_timezone'] : date_default_timezone(),
-        '#date_format' => !empty($element['#date_format']) ? date_limit_format($element['#date_format'], array('year', 'month', 'day')) : 'Y-m-d',
+        '#date_format' => !empty($element['#date_format']) ? date_limit_format($element['#date_format'], array('year', 'month', 'day', 'hour', 'minute')) : 'Y-m-d H:i',
         '#date_text_parts'  => !empty($element['#date_text_parts']) ? $element['#date_text_parts'] : array(),
         '#date_year_range'  => !empty($element['#date_year_range']) ? $element['#date_year_range'] : '-3:+3',
         '#date_label_position' => !empty($element['#date_label_position']) ? $element['#date_label_position'] : 'within',
         '#date_flexible' => 0,
         ),
       'tz' => array('#type' => 'hidden', '#value' => $element['#date_timezone']),
-      'all_day' => array('#type' => 'hidden', '#value' => 1),
-      'granularity' => array('#type' => 'hidden', '#value' => serialize(array('year', 'month', 'day'))),
+      'all_day' => array('#type' => 'hidden', '#value' => 0),
+      'granularity' => array('#type' => 'hidden', '#value' => serialize(array('year', 'month', 'day', 'hour', 'minute'))),
       );
   }
 
@@ -344,7 +344,7 @@
     $rdate_element = $element;
     foreach ($form_values['RDATE'] as $delta => $value) {
       if (is_array($value['datetime'])) {
-        $rdate_element['#date_format'] = !empty($element['#date_format']) ? date_limit_format($element['#date_format'], array('year', 'month', 'day')) : 'Y-m-d';
+        $rdate_element['#date_format'] = !empty($element['#date_format']) ? date_limit_format($element['#date_format'], array('year', 'month', 'day', 'hour', 'minute')) : 'Y-m-d H:i';
         $form_values['RDATE'][$delta]['datetime'] = $function($rdate_element, $form_values['RDATE'][$delta]['datetime']);
       }
     }
diff -Naur date.orig/date_repeat/date_repeat.module date/date_repeat/date_repeat.module
--- date.orig/date_repeat/date_repeat.module	2011-08-12 16:43:36.556904694 +0200
+++ date/date_repeat/date_repeat.module	2011-08-12 16:44:27.576979516 +0200
@@ -278,7 +278,7 @@
       unset($exceptions['DATA']);
     }
     elseif (strstr($part, 'RDATE')) {
-      $RDATE = str_replace('RDATE:', '', $part);
+      $RDATE = str_replace(array('RDATE:', 'RDATE;'), '', $part);
       $additions = (array) date_ical_parse_exceptions('RDATE:', $RDATE);
       unset($additions['DATA']);
     }
