diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py
index 9b34f78e1..bcef50ab0 100644
--- a/ietf/meeting/tests_views.py
+++ b/ietf/meeting/tests_views.py
@@ -1469,6 +1469,40 @@ class InterimTests(TestCase):
         self.assertTrue('Action Required: Minutes' in outbox[-1]['Subject'])
 
 
+    def test_group_ical(self):
+        make_meeting_test_data()
+        meeting = Meeting.objects.filter(type='interim', session__group__acronym='mars').first()
+        s1 = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
+        a1 = s1.official_timeslotassignment()
+        t1 = a1.timeslot
+        # Create an extra session
+        t2 = TimeSlotFactory.create(meeting=meeting, time=datetime.datetime.combine(meeting.date, datetime.time(11, 30)))
+        s2 = SessionFactory.create(meeting=meeting, group=s1.group, add_to_schedule=False)
+        SchedTimeSessAssignment.objects.create(timeslot=t2, session=s2, schedule=meeting.agenda)
+        #
+        url = urlreverse('ietf.meeting.views.ical_agenda', kwargs={'num':meeting.number, 'acronym':s1.group.acronym, })
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, 200)
+        self.assertEqual(r.get('Content-Type'), "text/calendar")
+        self.assertContains(r, 'BEGIN:VEVENT')
+        self.assertEqual(r.content.count('UID'), 2)
+        self.assertContains(r, 'SUMMARY:mars - Martian Special Interest Group')
+        self.assertContains(r, t1.time.strftime('%Y%m%dT%H%M%S'))
+        self.assertContains(r, t2.time.strftime('%Y%m%dT%H%M%S'))
+        self.assertContains(r, 'END:VEVENT')
+        #
+        url = urlreverse('ietf.meeting.views.ical_agenda', kwargs={'num':meeting.number, 'session_id':s1.id, })
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, 200)
+        self.assertEqual(r.get('Content-Type'), "text/calendar")
+        self.assertContains(r, 'BEGIN:VEVENT')
+        self.assertEqual(r.content.count('UID'), 1)
+        self.assertContains(r, 'SUMMARY:mars - Martian Special Interest Group')
+        self.assertContains(r, t1.time.strftime('%Y%m%dT%H%M%S'))
+        self.assertNotContains(r, t2.time.strftime('%Y%m%dT%H%M%S'))
+        self.assertContains(r, 'END:VEVENT')
+
+
 class AjaxTests(TestCase):
     def test_ajax_get_utc(self):
         # test bad queries
diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py
index 5c6e698a7..10f49c462 100644
--- a/ietf/meeting/urls.py
+++ b/ietf/meeting/urls.py
@@ -9,6 +9,7 @@ from ietf.utils.urls import url
 
 safe_for_all_meeting_types = [
     url(r'^session/(?P<acronym>[-a-z0-9]+)/?$',  views.session_details),
+    url(r'^session/(?P<acronym>[-a-z0-9]+)\.ics$', views.ical_agenda),
     url(r'^session/(?P<session_id>\d+)/drafts$',  views.add_session_drafts),
     url(r'^session/(?P<session_id>\d+)/bluesheets$', views.upload_session_bluesheets),
     url(r'^session/(?P<session_id>\d+)/minutes$', views.upload_session_minutes),
@@ -17,7 +18,6 @@ safe_for_all_meeting_types = [
     url(r'^session/(?P<session_id>\d+)/slides/%(name)s/order$' % settings.URL_REGEXPS, views.set_slide_order),
     url(r'^session/(?P<session_id>\d+)/doc/%(name)s/remove$' % settings.URL_REGEXPS, views.remove_sessionpresentation),
     url(r'^session/(?P<session_id>\d+)\.ics$',    views.ical_agenda),
-    url(r'^session/(?P<acronym>[-a-z0-9]+).ics$', views.ical_agenda),
 ]
 
 
@@ -73,10 +73,8 @@ type_ietf_only_patterns_id_optional = [
     url(r'^agenda(?P<ext>.csv)$', views.agenda),
     url(r'^agenda/edit$', views.edit_agenda),
     url(r'^requests$', views.meeting_requests),
-    url(r'^agenda/agenda.ics$', views.ical_agenda),
-    url(r'^agenda.ics$', views.ical_agenda),
-    url(r'^session/(?P<session_id>\d+)\.ics$',    views.ical_agenda),
-    url(r'^session/(?P<acronym>[-a-z0-9]+).ics$', views.ical_agenda),
+    url(r'^agenda/agenda\.ics$', views.ical_agenda),
+    url(r'^agenda\.ics$', views.ical_agenda),
     url(r'^agenda.json$', views.json_agenda),
     url(r'^agenda/week-view(?:.html)?/?$', views.week_view),
     url(r'^agenda/room-view(?:.html)?/?$', views.room_view),
@@ -112,7 +110,7 @@ urlpatterns = [
     url(r'^requests.html$', RedirectView.as_view(url='/meeting/requests', permanent=True)),
     url(r'^past/?$', views.past),
     url(r'^upcoming/?$', views.upcoming),
-    url(r'^upcoming.ics/?$', views.upcoming_ical),
+    url(r'^upcoming\.ics/?$', views.upcoming_ical),
     # Then patterns from more specific to less
     url(r'^(?P<num>interim-[a-z0-9-]+)/', include(type_interim_patterns)),
     url(r'^(?P<num>\d+)/requests.html$', RedirectView.as_view(url='/meeting/%(num)s/requests', permanent=True)),