diff --git a/VERSIONS b/VERSIONS
index 315d869f283a7015d0eb097898535cdc96bfc180..29a8edd73ffbdd5d7c55f1b1b69191b1b0fc4e66 100644
--- a/VERSIONS
+++ b/VERSIONS
@@ -1,3 +1,11 @@
+24/04/2018 - v7.12.13 v7.12.14 v7.12.15
+
+ - ticket #72285 : correction: si une zone de lien contient une URL relative, le lien reste relatif
+
+ - ticket #74605 : Administration : correction de l'ajout d'images dans les articles.
+ 
+
+
 23/04/2018 - v7.12.12
 
  - ticket #74541 : Administration : correction de l'affichage de la popup des listes de fonctionnalités
diff --git a/library/Class/FileManager.php b/library/Class/FileManager.php
index 0d8ee7b59f03e440754a5515879ed9b846d1ad64..02d8a735cd03a67f722d24c8ec308067eb775466 100644
--- a/library/Class/FileManager.php
+++ b/library/Class/FileManager.php
@@ -138,12 +138,21 @@ class Class_FileManager extends Class_Entity {
 
 
   public static function find($path) {
+    $path = static::_urlToPath($path);
     return ($item = static::directory($path))
       ? $item
       : static::file($path);
   }
 
 
+  protected static function _urlToPath($path) {
+    if(0 === strpos($path, BASE_URL))
+       $path = str_replace(BASE_URL . '/' , '', $path);
+
+    return $path;
+  }
+
+
   public static function delete($item) {
     if (!$item)
       return true;
diff --git a/library/Class/Notice/Urls.php b/library/Class/Notice/Urls.php
index 39f674959db1283f33e20d53804597823766021b..60e06cd2b24d82a75c446d9e7b99c9a4c38a87d5 100644
--- a/library/Class/Notice/Urls.php
+++ b/library/Class/Notice/Urls.php
@@ -146,6 +146,9 @@ class Class_Notice_Urls {
 
 
   protected function _ensureHttp($link) {
+    if (substr($link, 0, 1) === '/')
+      return $link;
+
     return (substr(strtoupper($link), 0, 4) != 'HTTP') ?
       'http://' . $link : $link;
   }
diff --git a/library/Class/Notice/Xsl.php b/library/Class/Notice/Xsl.php
index a4a23b3ed197cac37c9a3565942990ff448d6088..17831604ff1e14b8b24f38d3f227e90e8b044589 100644
--- a/library/Class/Notice/Xsl.php
+++ b/library/Class/Notice/Xsl.php
@@ -99,7 +99,8 @@ class Class_Notice_Xsl {
 
 
   public function getXslFileUrl() {
-     $settings = $this->_profile->getCfgModulesPreferences('recherche', 'viewnotice', $this->_record->getTypeDoc());
+    $settings = $this->_profile->getCfgModulesPreferences('recherche', 'viewnotice', $this->_record->getTypeDoc());
+
     if(!$settings)
       return;
 
diff --git a/library/ZendAfi/Controller/Plugin/Manager/FileManager.php b/library/ZendAfi/Controller/Plugin/Manager/FileManager.php
index 9479b013176bf39b6dc3b1230fbc6eec8b25fc8f..8230ae7d7cee9bc5339b1cdccc0f4fdc2091f28f 100644
--- a/library/ZendAfi/Controller/Plugin/Manager/FileManager.php
+++ b/library/ZendAfi/Controller/Plugin/Manager/FileManager.php
@@ -46,7 +46,7 @@ class ZendAfi_Controller_Plugin_Manager_FileManager extends ZendAfi_Controller_P
              },
              'label' => $this->_('Sélectionner "%s"', $model->getName()),
              'anchorOptions' => array_filter(['title' => $this->_('Sélectionner "%s"', $model->getName()),
-                                              'onclick' => "$(this).selectItemForCKEditor('" . str_replace(["'", '"'], ['%27', '%22'], $model->getId()) . "');"])],
+                                              'onclick' => "$(this).selectItemForCKEditor('" . str_replace(["'", '"'], ['%27', '%22'], Class_Url::relative($model->getPath())) . "');"])],
 
             ['url' => ['action' => 'create',
                        'into' => $model->getId()],
diff --git a/library/startup.php b/library/startup.php
index 26303c09498f80c6beffcd89c29df2ffb976583f..87c35db290933547a3c1bcd8325200984e676bf1 100644
--- a/library/startup.php
+++ b/library/startup.php
@@ -82,7 +82,7 @@ class Bokeh_Engine {
 
   function setupConstants() {
     defineConstant('BOKEH_MAJOR_VERSION','7.12');
-    defineConstant('BOKEH_RELEASE_NUMBER', BOKEH_MAJOR_VERSION . '.12');
+    defineConstant('BOKEH_RELEASE_NUMBER', BOKEH_MAJOR_VERSION . '.15');
 
     defineConstant('BOKEH_REMOTE_FILES', 'http://git.afi-sa.fr/afi/opacce/');
 
diff --git a/tests/application/modules/admin/controllers/FileManagerControllerTest.php b/tests/application/modules/admin/controllers/FileManagerControllerTest.php
index 3decc2196972fa800dd621524fc6d329e9c19747..2af63ced65cfeaaeffb3e69ca2602b240cba1478 100644
--- a/tests/application/modules/admin/controllers/FileManagerControllerTest.php
+++ b/tests/application/modules/admin/controllers/FileManagerControllerTest.php
@@ -1595,7 +1595,7 @@ class FileManagerControllerWithSpecialCharTest extends FileManagerControllerTest
 
   /** @test */
   public function selectButtonShouldBePresent() {
-    $this->assertXPathContentContains('//div//a[contains(@onclick, "$(this).selectItemForCKEditor(")][contains(@onclick, "selectItemForCKEditor(\'userfiles/my %27direct%22ory/new%27_ima%22ge.jpg")]', 'Sélectionner');
+    $this->assertXPathContentContains('//div//a[contains(@onclick, "$(this).selectItemForCKEditor(")][contains(@onclick, "/userfiles/my %27direct%22ory/new%27_ima%22ge.jpg")]', 'Sélectionner');
   }
 
 
diff --git a/tests/application/modules/opac/controllers/RecordCustomLinksTest.php b/tests/application/modules/opac/controllers/RecordCustomLinksTest.php
index 7ee1bc4cccf387f49011237e95d45b2285ca6105..616be8c87f693ad94238d2a96c1070e202c9b04c 100644
--- a/tests/application/modules/opac/controllers/RecordCustomLinksTest.php
+++ b/tests/application/modules/opac/controllers/RecordCustomLinksTest.php
@@ -29,7 +29,7 @@ abstract class RecordCustomLinksTestCase extends AbstractControllerTestCase {
     $this->fixture('Class_Notice',
                    ['id' => 999,
                     'type_doc' => 1,
-                    'unimarc' => '02096nam0 22002651  450 0010008000000100034000080730018000421000041000602000038001012100035001392150042001742250011002163301160002274100037013876070043014246760007014677000032014748010038015068010028015449020019015729020010015919030006016019330103016079330120017100662324  a978-2-7491-4106-0d18,80 Ð   |a2-7491-4106-0  a20140623d2014    u  u0frey50      ba1 aLa TerreurfPatrick Wald Lasowski  aPariscCherche midi (Le)d2014  a345 p.cjaquette ill. en coul.d21 cm| aStyles  aMars 1793. Un homme s\'interroge. Malade, rongé par le cancer qu\'il soigne en mêlant grains d\'opium et verres de ratafia, le commissaire Grand-Jacques découvre les effets de la Terreur mise à l\'ordre du jour. Que veulent-ils ? Qu\'est-ce qui les fait danser, les Enragés, les Indulgents, les missionnaires, les juges et les jurés du Tribunal révolutionnaire et la meute des lécheurs de guillotine qui attend le passage des condamnés ? Est-ce une puissance de mort ou de vie ? Est-ce un charnier ou un berceau ? Et lui-même, Grand-Jacques, qui poursuit ses enquêtes ordinaires, assisté de ses deux lieutenants, Chêneville et Cloüet, qu\'attend-il des mois qui lui restent à vivre ? Du moins y a-t-il les moments partagés avec son ami mélomane, Bruiant Fauve-Roussel, et les rêves que suscite Adeline, la fille galante de la maison voisine, aux yeux charbonnés et aux lèvres gourmandes. Voilà pourtant qu\'une série de crimes d\'une extrême violence relance son désir de justice, au-delà de la pitié. Le vieux limier se met en quête. Parmi les victimes quotidiennes de la Terreur, ces prostituées assassinées sont des mortes de trop. 030527714tStylescLe Cherche midi  aFrancez1789-1799 (Révolution)xRoman  aRP 1aWald LasowskibPatrick4070 3aFrbLibrairie Dialoguesc20140623 2aFRbBDP Yonnec20141017  aRoman policier  aRoman  am  3http://www.pagedeslibraires.fr/livre-6236/la-terreur.htmlaVoir la chronique de Page des libraires  3http://www.lepoint.fr/livres/la-terreur-cinq-meurtres-de-trop-14-09-2014-1863005_37.phpaVoir la chronique du Point']);
+                    'unimarc' => file_get_contents(ROOT_PATH.'/tests/fixtures/unimarc_laterreur.txt')]);
 
     Class_Profil::getCurrentProfil()
       ->setCfgModules(['recherche' => ['viewnotice1' => ['links_zones' => '933-3-a']]]);
@@ -97,7 +97,7 @@ class RecordCustomLinksRechercheControllerTest extends RecordCustomLinksTestCase
 
   /** @test */
   public function linkToPageDesLibrairesFrShouldBePresent() {
-    $this->assertXPathContentContains('//a[contains(@href, "www.pagedeslibraires.fr/livre-6236/la-terreur.html")]',
+    $this->assertXPathContentContains('//a[contains(@href, "http://www.pagedeslibraires.fr/livre-6236/la-terreur.html")]',
                                       'Voir la chronique de Page des libraires',
                                       $this->_response->getBody());
   }
@@ -105,7 +105,7 @@ class RecordCustomLinksRechercheControllerTest extends RecordCustomLinksTestCase
 
   /** @test */
   public function linkToLePointFrShouldBePresent() {
-    $this->assertXPathContentContains('//a[contains(@href, "www.lepoint.fr/livres/la-terreur-cinq-meurtres-de-trop")]',
+    $this->assertXPathContentContains('//a[contains(@href, "http://www.lepoint.fr/livres/la-terreur-cinq-meurtres-de-trop")]',
                                       'Voir la chronique du Point',
                                       $this->_response->getBody());
   }
@@ -140,5 +140,37 @@ class RecordCustomLinksRechercheControllerWithBrazilTest extends RecordCustomLin
   public function onlyOneLinkShouldContainsFragile() {
     $this->assertXPathCount('//dd//a[contains(text(), "Fragile")]', 1, $this->_response->getBody());
   }
+}
+
+
+
+
+class RecordCustomLinksRechercheControllerWithBackToFutureTest extends RecordCustomLinksTestCase {
+  public function setUp() {
+    parent::setUp();
+    $record = $this->fixture('Class_Album',
+                             ['id' => 1,
+                              'titre' => 'Back to future',
+                              'visible' => 1,
+                              'type_doc_id' => 100,
+                              'status' => Class_Album::STATUS_VALIDATED,
+                              'notes' => [['field' => '933',
+                                           'data' => ['a' => 'external pdf',
+                                                      '3' => '/userfiles/back.pdf']]]])
+                   ->index()
+                   ->getNotice();
 
+    Class_Profil::getCurrentProfil()
+      ->setCfgModules(['recherche' => ['viewnotice100' => ['links_zones' => '933-3-a']]]);
+
+    $this->dispatch('/opac/noticeajax/detail/id_notice/' . $record->getId(), true);
+  }
+
+
+  /** @test */
+  public function linkExternalPDFShouldBeRelative() {
+    $this->assertXPathContentContains('//a[@href="/userfiles/back.pdf"]',
+                                      'external pdf',
+                                      $this->_response->getBody());
+  }
 }
\ No newline at end of file
diff --git a/tests/fixtures/unimarc_laterreur.txt b/tests/fixtures/unimarc_laterreur.txt
new file mode 100644
index 0000000000000000000000000000000000000000..06bf11d89ce2d4c41a1edce9f02730451abc47b0
--- /dev/null
+++ b/tests/fixtures/unimarc_laterreur.txt
@@ -0,0 +1,2 @@
+02096nam0 22002651  450 0010008000000100034000080730018000421000041000602000038001012100035001392150042001742250011002163301160002274100037013876070043014246760007014677000032014748010038015068010028015449020019015729020010015919030006016019330103016079330120017100662324  a978-2-7491-4106-0d18,80 Ð   |a2-7491-4106-0  a20140623d2014    u  u0frey50      ba1 aLa TerreurfPatrick Wald Lasowski  aPariscCherche midi (Le)d2014  a345 p.cjaquette ill. en coul.d21 cm| aStyles  aMars 1793. Un homme s'interroge. Malade, rongé par le cancer qu'il soigne en mêlant grains d'opium et verres de ratafia, le commissaire Grand-Jacques découvre les effets de la Terreur mise à l'ordre du jour. Que veulent-ils ? Qu'est-ce qui les fait danser, les Enragés, les Indulgents, les missionnaires, les juges et les jurés du Tribunal révolutionnaire et la meute des lécheurs de guillotine qui attend le passage des condamnés ? Est-ce une puissance de mort ou de vie ? Est-ce un charnier ou un berceau ? Et lui-même, Grand-Jacques, qui poursuit ses enquêtes ordinaires, assisté de ses deux lieutenants, Chêneville et Cloüet, qu'attend-il des mois qui lui restent à vivre ? Du moins y a-t-il les moments partagés avec son ami mélomane, Bruiant Fauve-Roussel, et les rêves que suscite Adeline, la fille galante de la maison voisine, aux yeux charbonnés et aux lèvres gourmandes. Voilà pourtant qu'une série de crimes d'une extrême violence relance son désir de justice, au-delà de la pitié. Le vieux limier se met en quête. Parmi les victimes quotidiennes de la Terreur, ces prostituées assassinées sont des mortes de trop. 030527714tStylescLe Cherche midi  aFrancez1789-1799 (Révolution)xRoman  aRP 1aWald LasowskibPatrick4070 3aFrbLibrairie Dialoguesc20140623 2aFRbBDP Yonnec20141017  aRoman policier  aRoman  am  3http://www.pagedeslibraires.fr/livre-6236/la-terreur.htmlaVoir la chronique de Page des libraires  3http://www.lepoint.fr/livres/la-terreur-cinq-meurtres-de-trop-14-09-2014-18630
+05_37.phpaVoir la chronique du Point
\ No newline at end of file
diff --git a/tests/scenarios/Xsl/XslTest.php b/tests/scenarios/Xsl/XslTest.php
index fb6425121983d3188cbc60be5898f58b086bfd34..3357c6ccfb9d99adea4c1a2fba53d54197e2bcad 100644
--- a/tests/scenarios/Xsl/XslTest.php
+++ b/tests/scenarios/Xsl/XslTest.php
@@ -159,7 +159,7 @@ class XslNoticeajaxDetailDispatchTest extends AbstractControllerTestCase {
     Class_Notice_Xsl::setXSLTProcessor($xslt_processor);
 
     $profile = Class_Profil::getCurrentProfil();
-    $profile->setCfgModulesPreferences(['xslt' => 'tests/scenarios/Xsl/record_description.xsl'],
+    $profile->setCfgModulesPreferences(['xslt' => '/tests/scenarios/Xsl/record_description.xsl'],
                                        'recherche',
                                        'viewnotice',
                                        '1');
@@ -204,7 +204,7 @@ class XslNoticeajaxDetailDispatchWithoutXSLTest extends AbstractControllerTestCa
     Class_Notice_Xsl::setPhpCommand($php_command);
 
     $profile = Class_Profil::getCurrentProfil();
-    $profile->setCfgModulesPreferences(['xslt' => 'tests/scenarios/Xsl/record_description.xsl'],
+    $profile->setCfgModulesPreferences(['xslt' => '/tests/scenarios/Xsl/record_description.xsl'],
                                        'recherche',
                                        'viewnotice',
                                        '1');