diff --git a/product/ERP5/tests/testCalendar.py b/product/ERP5/tests/testCalendar.py
index da424046167ad88839d38149ee3d12bcccca06a3..8934e71d4237f955f1ac1838805be0a9b98badd5 100644
--- a/product/ERP5/tests/testCalendar.py
+++ b/product/ERP5/tests/testCalendar.py
@@ -78,7 +78,7 @@ class TestCalendar(ERP5TypeTestCase):
   def stepTic(self,**kw):
     self.tic()
 
-  def afterSetUp(self, quiet=1, run=0):
+  def afterSetUp(self):
     """
     Fake after setup
     """
@@ -96,6 +96,14 @@ class TestCalendar(ERP5TypeTestCase):
     self._addPropertySheet('Presence Request Period', 'CalendarPeriodConstraint')
     self._addPropertySheet('Group Presence Period', 'CalendarPeriodConstraint')
 
+  def beforeTearDown(self):
+    get_transaction().abort()
+    for module in (self.portal.group_calendar_module,
+                   self.portal.leave_request_module,
+                   self.portal.presence_request_module,):
+      module.manage_delObjects(list(module.objectIds()))
+    get_transaction().commit()
+    self.tic()
 
   def _addPropertySheet(self, type_info_name, property_sheet_name):
     ti = self.portal.portal_types.getTypeInfo(type_info_name)
@@ -796,6 +804,217 @@ class TestCalendar(ERP5TypeTestCase):
     presence_request.setDestinationValue(person)
     self.assertEquals(0, len(presence_request.checkConsistency()))
 
+  def test_SimpleLeaveRequestWithSameDateAsGroupCalendar(self):
+    group_calendar = self.portal.group_calendar_module.newContent(
+                                  portal_type='Group Calendar')
+    group_calendar_period = group_calendar.newContent(
+                                  portal_type='Group Presence Period')
+    group_calendar_period.setStartDate(self.start_date)
+    group_calendar_period.setStopDate(self.stop_date)
+    group_calendar_period.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    group_calendar.confirm()
+
+    person = self.portal.person_module.newContent(portal_type='Person')
+    assignment = person.newContent(portal_type='Assignment',
+                                   calendar_value=group_calendar)
+    get_transaction().commit()
+    self.tic()
+
+    # there is 43200 seconds between self.start_date and self.stop_date
+    total_time = 43200
+
+    self.assertEquals(total_time, person.getAvailableTime(
+                                from_date=self.start_date-1,
+                                to_date=self.stop_date+1))
+    self.assertEquals([total_time], [x.total_quantity for x in 
+                              person.getAvailableTimeSequence(
+                                year=1,
+                                from_date=self.start_date-1,
+                                to_date=self.stop_date+1)])
+
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                                            from_date=self.start_date-1,
+                                            to_date=self.stop_date+1)
+    self.assertEquals(1, len(available_time_movement_list))
+    self.assertEquals([(self.start_date.ISO(), self.stop_date.ISO())],
+                      [(x.getStartDate().ISO(), x.getStopDate().ISO()) for x in
+                          available_time_movement_list])
+
+
+    leave_request = self.portal.leave_request_module.newContent(
+                                  portal_type='Leave Request')
+    leave_request_period = leave_request.newContent(
+                                  portal_type='Leave Request Period')
+    leave_request_period.setStartDate(self.start_date)
+    leave_request_period.setStopDate(self.stop_date)
+    leave_request_period.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    leave_request.setDestinationValue(person)
+    leave_request.confirm()
+    
+    get_transaction().commit()
+    self.tic()
+    
+    self.assertEquals(0, person.getAvailableTime(
+                                from_date=self.start_date-1,
+                                to_date=self.stop_date+1))
+    self.assertEquals([0], [x.total_quantity for x in 
+                              person.getAvailableTimeSequence(
+                                year=1,
+                                from_date=self.start_date-1,
+                                to_date=self.stop_date+1)])
+                              
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                                            from_date=self.start_date-1,
+                                            to_date=self.stop_date+1)
+    self.assertEquals(0, len(available_time_movement_list))
+
+
+  def test_LeaveRequestWithSameDateAsGroupCalendar(self):
+    group_calendar = self.portal.group_calendar_module.newContent(
+                                  portal_type='Group Calendar')
+    group_calendar_period_am = group_calendar.newContent(
+                                  portal_type='Group Presence Period')
+    group_calendar_period_am.setStartDate('2008/01/01 08:00')
+    group_calendar_period_am.setStopDate('2008/01/01 12:00')
+    group_calendar_period_am.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    group_calendar_period_pm = group_calendar.newContent(
+                                  portal_type='Group Presence Period')
+    group_calendar_period_pm.setStartDate('2008/01/01 14:00')
+    group_calendar_period_pm.setStopDate('2008/01/01 18:00')
+    group_calendar_period_pm.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+
+    group_calendar.confirm()
+
+    person = self.portal.person_module.newContent(portal_type='Person')
+    assignment = person.newContent(portal_type='Assignment',
+                                   calendar_value=group_calendar)
+    get_transaction().commit()
+    self.tic()
+    
+    self.assertEquals((18 - 14 + 12 - 8) * 60 * 60, person.getAvailableTime(
+                            from_date=DateTime(2008, 1, 1).earliestTime(),
+                            to_date=DateTime(2008, 1, 1).latestTime()))
+                            
+    self.assertEquals([(18 - 14 + 12 - 8) * 60 * 60],
+      [x.total_quantity for x in person.getAvailableTimeSequence(
+                  day=1,
+                  from_date=DateTime(2008, 1, 1).earliestTime(),
+                  to_date=DateTime(2008, 1, 1).latestTime())])
+
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                  from_date=DateTime(2008, 1, 1).earliestTime(),
+                  to_date=DateTime(2008, 1, 1).latestTime())
+    self.assertEquals(2, len(available_time_movement_list))
+    self.assertEquals(
+        [(DateTime('2008/01/01 08:00'), DateTime('2008/01/01 12:00')),
+         (DateTime('2008/01/01 14:00'), DateTime('2008/01/01 18:00'))],
+        [(m.getStartDate(), m.getStopDate()) for m in
+          available_time_movement_list])
+
+    leave_request = self.portal.leave_request_module.newContent(
+                                  portal_type='Leave Request')
+    leave_request_period = leave_request.newContent(
+                                  portal_type='Leave Request Period')
+    leave_request_period.setStartDate('2008/01/01 08:00')
+    leave_request_period.setStopDate('2008/01/01 18:00')
+    leave_request_period.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    leave_request.setDestinationValue(person)
+    leave_request.confirm()
+    
+    get_transaction().commit()
+    self.tic()
+    
+    self.assertEquals(0, person.getAvailableTime(
+                            from_date=DateTime(2008, 1, 1).earliestTime(),
+                            to_date=DateTime(2008, 1, 1).latestTime()))
+                            
+    self.assertEquals([0],
+      [x.total_quantity for x in person.getAvailableTimeSequence(
+                  day=1,
+                  from_date=DateTime(2008, 1, 1).earliestTime(),
+                  to_date=DateTime(2008, 1, 1).latestTime())])
+
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                  from_date=DateTime(2008, 1, 1).earliestTime(),
+                  to_date=DateTime(2008, 1, 1).latestTime())
+    self.assertEquals(0, len(available_time_movement_list))
+
+
+  def test_LeaveRequestWithSameDateAsRepeatedGroupCalendar(self):
+    group_calendar = self.portal.group_calendar_module.newContent(
+                                  portal_type='Group Calendar')
+    group_calendar_period = group_calendar.newContent(
+                                  portal_type='Group Presence Period')
+    # note that 2008/01/01 was a Tuesday
+    group_calendar_period.setStartDate('2008/01/01 08:00')
+    group_calendar_period.setStopDate('2008/01/01 18:00')
+    group_calendar_period.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    group_calendar_period.setPeriodicityStopDate('2008/01/30')
+    group_calendar_period.setPeriodicityWeekDayList(['Monday'])
+
+    group_calendar.confirm()
+
+    person = self.portal.person_module.newContent(portal_type='Person')
+    assignment = person.newContent(portal_type='Assignment',
+                                   calendar_value=group_calendar)
+    get_transaction().commit()
+    self.tic()
+    
+    # 2008/01/07 was a Monday
+    self.assertEquals((18 - 8) * 60 * 60, person.getAvailableTime(
+                            from_date=DateTime(2008, 1, 6).earliestTime(),
+                            to_date=DateTime(2008, 1, 7).latestTime()))
+
+    self.assertEquals([(18 - 8) * 60 * 60],
+      [x.total_quantity for x in person.getAvailableTimeSequence(
+                  day=2,
+                  from_date=DateTime(2008, 1, 6).earliestTime(),
+                  to_date=DateTime(2008, 1, 7).latestTime())])
+
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                  from_date=DateTime(2008, 1, 6).earliestTime(),
+                  to_date=DateTime(2008, 1, 7).latestTime())
+    self.assertEquals(1, len(available_time_movement_list))
+    self.assertEquals(
+        [(DateTime('2008/01/07 08:00'), DateTime('2008/01/07 18:00'))],
+        [(m.getStartDate(), m.getStopDate()) for m in
+          available_time_movement_list])
+
+    leave_request = self.portal.leave_request_module.newContent(
+                                  portal_type='Leave Request')
+    leave_request_period = leave_request.newContent(
+                                  portal_type='Leave Request Period')
+
+    leave_request_period.setStartDate('2008/01/06 08:00')
+    leave_request_period.setStopDate('2008/01/07 18:00')
+    leave_request_period.setResourceValue(
+          self.portal.portal_categories.calendar_period_type.type1)
+    leave_request.setDestinationValue(person)
+    leave_request.confirm()
+    
+    get_transaction().commit()
+    self.tic()
+    
+    self.assertEquals(0, person.getAvailableTime(
+                            from_date=DateTime(2008, 1, 6).earliestTime(),
+                            to_date=DateTime(2008, 1, 7).latestTime()))
+                            
+    self.assertEquals([0],
+      [x.total_quantity for x in person.getAvailableTimeSequence(
+                  day=2,
+                  from_date=DateTime(2008, 1, 6).earliestTime(),
+                  to_date=DateTime(2008, 1, 7).latestTime())])
+    available_time_movement_list = person.Person_getAvailableTimeMovementList(
+                  from_date=DateTime(2008, 1, 6).earliestTime(),
+                  to_date=DateTime(2008, 1, 7).latestTime())
+    self.assertEquals(0, len(available_time_movement_list))
+
 
 import unittest
 def test_suite():