diff --git a/VERSIONS_HOTLINE/52287 b/VERSIONS_HOTLINE/52287
new file mode 100644
index 0000000000000000000000000000000000000000..320d90632b3f5d7d10fd23d588c49062fcc05bd0
--- /dev/null
+++ b/VERSIONS_HOTLINE/52287
@@ -0,0 +1 @@
+ - ticket #52287 : Agendas externes : adaptation du parser iCal aux flux Archimed Ermes.
\ No newline at end of file
diff --git a/library/Class/WebService/ICalendar.php b/library/Class/WebService/ICalendar.php
index f70b0e6417482ddfe6d08552f62e0b16a502561e..e9a3df47864653479b0513d4f37e88f5f7a4bbba 100644
--- a/library/Class/WebService/ICalendar.php
+++ b/library/Class/WebService/ICalendar.php
@@ -26,6 +26,7 @@ class Class_WebService_ICalendar extends Class_WebService_Abstract {
   protected
     $_events,
     $_current_event,
+    $_current_url,
     $_external_agenda;
 
   public function import($external_agenda) {
@@ -33,8 +34,12 @@ class Class_WebService_ICalendar extends Class_WebService_Abstract {
     $this->_events = new Storm_Model_Collection();
     $this->_current_event = null;
 
-    array_map([$this, '_importLine'],
-              explode("\r\n", $this->httpGet($external_agenda->getUrl())));
+
+    $ics_content = $this->httpGet($external_agenda->getUrl());
+    $ics_content = preg_replace('|\n\s|', '', $ics_content); //see RFC2445
+    $lines = preg_split('|\r?\n|', $ics_content);
+
+    array_map([$this, '_importLine'], $lines);
 
     return $this->_events;
   }
@@ -44,8 +49,13 @@ class Class_WebService_ICalendar extends Class_WebService_Abstract {
 
 
   protected function _importLine($line) {
+    if (!$line)
+      return $this;
+
     list($key, $value) = explode(':', $line, 2);
     $this->_importData($key, $value);
+
+    return $this;
   }
 
 
diff --git a/tests/scenarios/ExternalAgendas/ExternalAgendasTest.php b/tests/scenarios/ExternalAgendas/ExternalAgendasTest.php
index e6e271ed0e6945979c69c19ecfaa27492b52eff3..fc6a057b2b2eee8e212e8b69002b93598c6a24b2 100644
--- a/tests/scenarios/ExternalAgendas/ExternalAgendasTest.php
+++ b/tests/scenarios/ExternalAgendas/ExternalAgendasTest.php
@@ -58,6 +58,12 @@ abstract class ExternalAgendasAdminTestCase extends Admin_AbstractControllerTest
   }
 
   public function __call($method, $args) { /** in order to stub Class_ExternalAgenda::import($this) */}
+
+
+  public function tearDown() {
+    Class_WebService_ICalendar::setDefaultHttpClient(null);
+    parent::tearDown();
+  }
 }
 
 
@@ -475,12 +481,6 @@ class ExternalAgendasAdminImportTest extends ExternalAgendasAdminTestCase {
   }
 
 
-  public function tearDown() {
-    Class_WebService_ICalendar::setDefaultHttpClient(null);
-    parent::tearDown();
-  }
-
-
   /** @test */
   public function titleShouldBeMoissonageDesEvenements() {
     $this->assertXPathContentContains('//h1', 'Moissonnage des évènements de l\'agenda "Personal Agenda"');
@@ -490,8 +490,7 @@ class ExternalAgendasAdminImportTest extends ExternalAgendasAdminTestCase {
   /** @test */
   public function pageShouldContainsABackButton() {
     $this->assertXPathContentContains('//div[contains(@onclick, "replace(\'/admin/external-agendas\')")]//td',
-                                      'Retour à la liste des agendas',
-                                      $this->_response->getBody());
+                                      'Retour à la liste des agendas');
   }
 
 
@@ -660,3 +659,36 @@ class ExternalAgendasAdminSecondImportTest extends ExternalAgendasAdminTestCase
     $this->assertEquals(1, Class_ArticleCategorie::countBy(['libelle' => 'Atelier']));
   }
 }
+
+
+
+
+
+class ExternalAgendasAdminErmesImportTest extends ExternalAgendasAdminTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    Class_WebService_ICalendar::setDefaultHttpClient($this->mock()
+                                                     ->whenCalled('open_url')
+                                                     ->with('http://my.server.com/calendar.ics')
+                                                     ->answers(file_get_contents(__DIR__.'/ermes.ics'))
+                                                     ->beStrict());
+
+    $this->dispatch('/admin/external-agendas/import/id/124', true);
+    Class_Article::clearCache();
+  }
+
+
+
+  /** @test */
+  public function pageShouldContainsFiveEventsCreated() {
+    $this->assertXPathContentContains('//h2',
+                                      'Nombre d\'évènements créés : 5');
+  }
+
+
+  /** @test */
+  public function firstEventDescriptionShouldContainsEntreeLibre() {
+    $this->assertContains('entrée libre', Class_Article::find(1)->getContenu());
+  }
+}
diff --git a/tests/scenarios/ExternalAgendas/ermes.ics b/tests/scenarios/ExternalAgendas/ermes.ics
new file mode 100644
index 0000000000000000000000000000000000000000..a92980782c2d371ee99e16be4eff1b06224d9df0
--- /dev/null
+++ b/tests/scenarios/ExternalAgendas/ermes.ics
@@ -0,0 +1,128 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN
+X-ARCHIMED-IdAgenda:1
+X-ARCHIMED-Rights:
+X-WR-CALDESC:Ermes Calandar
+X-WR-CALNAME:Evenements des médiathèques de Lille
+BEGIN:VTIMEZONE
+TZID:Romance Standard Time
+BEGIN:STANDARD
+DTSTART:20161002T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYHOUR=3;BYMINUTE=0;BYMONTH=10
+TZNAME:Romance Standard Time
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20160301T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYHOUR=2;BYMINUTE=0;BYMONTH=3
+TZNAME:Romance Daylight Time
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+CATEGORIES:Heure du conte
+CREATED:20160827T113132
+DESCRIPTION:Heure du conte pour les 0-3 ans<br />Parents-Enfants<br />entré
+ e libre
+DTEND:20160921T110000
+DTSTAMP:20170118T135101Z
+DTSTART:20160921T103000
+LAST-MODIFIED:20160927T114437
+LOCATION:Médiathèque de Wazemmes
+ORGANIZER;CN=Alexis SETFAOUI (admin):
+SEQUENCE:0
+STATUS:Tentative
+SUMMARY:Kilikili minus
+UID:a1bc19ad-9371-4627-80e1-16ed6d303b89
+X-ALT-DESC;FMTTYPE=text/html:Heure du conte pour les 0-3 ans<br />Parents-E
+ nfants<br />entrée libre
+X-ARCHIMED-CATEGORIECOLOR:#92E1C0
+X-ARCHIMED-LASTMODIFIEDBY:Alexis SETFAOUI (admin)
+END:VEVENT
+BEGIN:VEVENT
+CATEGORIES:Heure du conte
+CREATED:20160827T113132
+DESCRIPTION:Heure du conte pour les 0-3 ans<br />Parents-Enfants<br />entré
+ e libre
+DTEND:20161015T110000
+DTSTAMP:20170118T135101Z
+DTSTART:20161015T103000
+LAST-MODIFIED:20160927T114437
+LOCATION:Médiathèque de Wazemmes
+ORGANIZER;CN=Alexis SETFAOUI (admin):
+SEQUENCE:0
+STATUS:Tentative
+SUMMARY:Kilikili minus
+UID:c0de757c-ff46-4dac-b648-05e972da2784
+X-ALT-DESC;FMTTYPE=text/html:Heure du conte pour les 0-3 ans<br />Parents-E
+ nfants<br />entrée libre
+X-ARCHIMED-CATEGORIECOLOR:#92E1C0
+X-ARCHIMED-LASTMODIFIEDBY:Alexis SETFAOUI (admin)
+END:VEVENT
+BEGIN:VEVENT
+CATEGORIES:Heure du conte
+CREATED:20160827T113132
+DESCRIPTION:<p>Heure du conte bilingue français-anglais par Rebecca Grossbe
+ rg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée libre.</p>
+DTEND;VALUE=DATE:20160921
+DTSTAMP:20170118T135101Z
+DTSTART:20160921T150000
+LAST-MODIFIED:20161224T104312
+LOCATION:Médiathèque de Wazemmes
+ORGANIZER;CN=Alexis SETFAOUI (admin):
+SEQUENCE:0
+STATUS:Confirmed
+SUMMARY:Storytime
+UID:3905e44d-9fa9-48f8-b1ad-6a7beda0ee76
+X-ALT-DESC;FMTTYPE=text/html:<p>Heure du conte bilingue français-anglais pa
+ r Rebecca Grossberg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée l
+ ibre.</p>
+X-ARCHIMED-CATEGORIECOLOR:#92E1C0
+X-ARCHIMED-LASTMODIFIEDBY:Céline Verwaerde
+END:VEVENT
+BEGIN:VEVENT
+CATEGORIES:Heure du conte
+CREATED:20160827T113132
+DESCRIPTION:<p>Heure du conte bilingue français-anglais par Rebecca Grossbe
+ rg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée libre.</p>
+DTEND:20161012T160000
+DTSTAMP:20170118T135101Z
+DTSTART:20161012T150000
+LAST-MODIFIED:20161224T104312
+LOCATION:Médiathèque de Wazemmes
+ORGANIZER;CN=Alexis SETFAOUI (admin):
+SEQUENCE:0
+STATUS:Confirmed
+SUMMARY:Storytime
+UID:35b302c6-e362-4f8a-9861-b7b9b91eb568
+X-ALT-DESC;FMTTYPE=text/html:<p>Heure du conte bilingue français-anglais pa
+ r Rebecca Grossberg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée l
+ ibre.</p>
+X-ARCHIMED-CATEGORIECOLOR:#92E1C0
+X-ARCHIMED-LASTMODIFIEDBY:Céline Verwaerde
+END:VEVENT
+BEGIN:VEVENT
+CATEGORIES:Heure du conte
+CREATED:20160827T113132
+DESCRIPTION:<p>Heure du conte bilingue français-anglais par Rebecca Grossbe
+ rg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée libre.</p>
+DTEND:20161116T160000
+DTSTAMP:20170118T135101Z
+DTSTART:20161116T150000
+LAST-MODIFIED:20161224T104312
+LOCATION:Médiathèque de Wazemmes
+ORGANIZER;CN=Alexis SETFAOUI (admin):
+SEQUENCE:0
+STATUS:Confirmed
+SUMMARY:Storytime
+UID:bb7f02cf-3515-4dbc-ae57-3bdd35a341ad
+X-ALT-DESC;FMTTYPE=text/html:<p>Heure du conte bilingue français-anglais pa
+ r Rebecca Grossberg.</p>\n<p><br />Parents-Enfants.</p>\n<p><br />Entrée l
+ ibre.</p>
+X-ARCHIMED-CATEGORIECOLOR:#92E1C0
+X-ARCHIMED-LASTMODIFIEDBY:Céline Verwaerde
+END:VEVENT
+END:VCALENDAR