diff --git a/FEATURES/52054 b/FEATURES/52054
new file mode 100644
index 0000000000000000000000000000000000000000..b3114ff8aeb76e289497280731ca3a70e3624096
--- /dev/null
+++ b/FEATURES/52054
@@ -0,0 +1,10 @@
+        '52054' =>
+            ['Label' => $this->_('Recherche fédérée pour MusicMe'),
+             'Desc' => $this->_('Moissonnage des notices de musicMe'),
+             'Image' => '',
+             'Video' => 'https://www.youtube.com/watch?v=xxMHIK31ZPc',
+             'Category' => 'Bibliothèque numérique',
+             'Right' => function($feature_description, $user) {return true;},
+             'Wiki' => 'http://wiki.bokeh-library-portal.org/index.php?title=MusicMe',
+             'Test' => '',
+             'Date' => '2017-11-14'],
\ No newline at end of file
diff --git a/VERSIONS_WIP/52054 b/VERSIONS_WIP/52054
new file mode 100644
index 0000000000000000000000000000000000000000..6a58a6f0707faff0e5048d965c5f297bf6df0ee7
--- /dev/null
+++ b/VERSIONS_WIP/52054
@@ -0,0 +1 @@
+ - ticket #52054 : Aspiration des notices de MusicMe
\ No newline at end of file
diff --git a/application/modules/opac/controllers/AuthController.php b/application/modules/opac/controllers/AuthController.php
index b3a171a11f486d4b119605eff23bde8932dd5a2f..0088ec3d381fd8826c5b79ce5e598426db41331e 100644
--- a/application/modules/opac/controllers/AuthController.php
+++ b/application/modules/opac/controllers/AuthController.php
@@ -738,7 +738,7 @@ class Auth_Strategy_Logged extends Auth_Strategy_Abstract{
 
 class Auth_Strategy_Cas_Abstract extends Auth_Strategy_Abstract{
   public function urlServiceCas() {
-    if ($url_musicme = $this->redirectMusicMe())
+    if ($url_musicme = $this->redirectMusicme())
       return $url_musicme;
 
     $ticket = (new Class_CasTicket())->getTicketForCurrentUser();
@@ -755,10 +755,10 @@ class Auth_Strategy_Cas_Abstract extends Auth_Strategy_Abstract{
   }
 
 
-  public function redirectMusicMe() {
+  public function redirectMusicme() {
     if (strpos($this->controller->getCasServerUrl(),'musicme') !== false) {
-      $musicme = new Class_Systeme_ModulesMenu_MusicMe();
-      return $musicme->getDynamiqueUrl();
+      $module_menu = Class_DigitalResource::getInstance()->getModuleMenuFor('Musicme');
+      return $module_menu->getDynamiqueUrl();
     }
 
     return false;
diff --git a/application/modules/opac/controllers/CasServerController.php b/application/modules/opac/controllers/CasServerController.php
index 2662ce7e0295760e195bf4cd8cba234b9bbc2fb3..54cb4e97d842b003ddf65aefad088d65f2bf5cbb 100644
--- a/application/modules/opac/controllers/CasServerController.php
+++ b/application/modules/opac/controllers/CasServerController.php
@@ -41,7 +41,7 @@ class CasServerController extends ZendAfi_Controller_Action {
   }
 
 
-  public function returnValidMusicMeResponse($user) {
+  public function returnValidMusicmeResponse($user) {
     $this->getResponse()->setHeader('Content-Type', 'application/xml;charset=utf-8');
     $this->getResponse()->setBody( '<User>
 <ID>'.$user->getId().'</ID>
@@ -54,7 +54,7 @@ class CasServerController extends ZendAfi_Controller_Action {
   }
 
 
-  public function returnMusicMeFailureTicketResponse($error,$ticket=null) {
+  public function returnMusicmeFailureTicketResponse($error,$ticket=null) {
     $this->getResponse()->setHeader('Content-Type', 'application/xml;charset=utf-8');
     $xml="<User />";
     $this->getResponse()->setBody($xml);
@@ -77,13 +77,13 @@ class CasServerController extends ZendAfi_Controller_Action {
     $ticket=$this->_request->getParam('ticket');
 
     if (strlen($ticket)<1 || strlen($bibid)<1) {
-      return $this->returnMusicMeFailureTicketResponse('INVALID_REQUEST');
+      return $this->returnMusicmeFailureTicketResponse('INVALID_REQUEST');
     }
 
     if ($user = (new Class_CasTicket())->userForTicket($ticket))
-      return $this->returnValidMusicMeResponse($user);
+      return $this->returnValidMusicmeResponse($user);
 
-    return $this->returnMusicMeFailureTicketResponse('INVALID_TICKET',$ticket);
+    return $this->returnMusicmeFailureTicketResponse('INVALID_TICKET',$ticket);
 
   }
 
diff --git a/application/modules/opac/controllers/ModulesController.php b/application/modules/opac/controllers/ModulesController.php
index 8fa1c122bfda586cda40af6a33d29f606f7862b1..3dfa1208fc7bcab52357ff10ed11e2678d19300a 100644
--- a/application/modules/opac/controllers/ModulesController.php
+++ b/application/modules/opac/controllers/ModulesController.php
@@ -31,7 +31,6 @@ class ModulesController extends ZendAfi_Controller_Action {
                 'orthodidacte' => 'Orthodidacte',
                 'cite-de-la-musique' => 'CiteDeLaMusique',
                 'artevod' => 'ArteVOD',
-                'musicme' => 'MusicMe',
                 'numilog' => 'Numilog'];
 
     $action = $this->_request->getActionName();
@@ -41,11 +40,12 @@ class ModulesController extends ZendAfi_Controller_Action {
 
     $digital_resource = Class_DigitalResource::getInstance();
 
-    if ($digital_resource->getPluginsSSOActions()->includes($action))
+    if ($digital_resource->getPluginsSSOActions()->includes($action)) {
       $this->_forward($action,
                       'index',
                       $digital_resource->getModuleNameForAction($action),
                       $this->_request->getParams());
+    }
   }
 
 
diff --git a/cosmogramme/sql/patch/patch_339.php b/cosmogramme/sql/patch/patch_339.php
new file mode 100644
index 0000000000000000000000000000000000000000..03c742c2340af352bc77e452f1b6b92f857e7a51
--- /dev/null
+++ b/cosmogramme/sql/patch/patch_339.php
@@ -0,0 +1,12 @@
+<?php
+(new Class_Migration_DigitalResource_Musicme())->run();
+$adapter = Zend_Db_Table_Abstract::getDefaultAdapter();
+
+try{
+  $adapter = Zend_Db_Table_Abstract::getDefaultAdapter();
+  $adapter->query('update album set url_origine = "http://www.lasourisquiraconte.com" where type_doc_id="LaSourisQuiRaconte" and url_origine is null');
+  $adapter->query('update album set url_origine = "http://skilleos.com/sigb/sso/" where type_doc_id="Skilleos" and url_origine is null');
+  $adapter->query('update album set url_origine = "http://www.lekiosk.com/" where type_doc_id="Lekiosk" and url_origine is null');
+} catch(Exception $e) {}
+
+?>
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 9eb73df0a9f2c6907dc4aa6416820b466e87fff0..54168b05adee764b982345b295c73c1a3fa648f8 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -158,9 +158,6 @@ class Class_AdminVarLoader extends Storm_Model_Loader {
 
             'NUMERIQUE_PREMIUM_URL' => Class_AdminVar_Meta::newDefault('')->bePrivate(),
 
-            'MUSICME_URL' => Class_AdminVar_Meta::newDefault('')->bePrivate(),
-            'MUSICME_BIB_ID' => Class_AdminVar_Meta::newDefault('')->bePrivate(),
-
             'JAMENDO_CLIENT_ID' => Class_AdminVar_Meta::newDefault($this->_('ID client Jamendo')),
             'SOUNDCLOUD_CLIENT_ID' => Class_AdminVar_Meta::newDefault($this->_('ID client SoundCloud')),
 
@@ -754,14 +751,6 @@ class Class_AdminVarLoader extends Storm_Model_Loader {
   }
 
 
-  /**
-   * @return bool
-   */
-  public function isMusicMeEnabled() {
-    return ('' != Class_AdminVar::get('MUSICME_URL'));
-  }
-
-
   /**
    * @return bool
    */
diff --git a/library/Class/Migration/DigitalResource/Abstract.php b/library/Class/Migration/DigitalResource/Abstract.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9a6dcf42a83aab18c3bdd47fab57c8918d8aece
--- /dev/null
+++ b/library/Class/Migration/DigitalResource/Abstract.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+abstract class Class_Migration_DigitalResource_Abstract {
+  use Trait_MemoryCleaner;
+
+  protected $_found_in_profil = false;
+
+
+  public function run() {
+    $this
+      ->renameAdminVars()
+      ->renameMenusKeys()
+      ->upgradePermissions()
+      ->renameBatches();
+  }
+
+
+  protected function renameAdminVars() {
+    foreach($this->_getAdminVarMapping() as $old => $new)
+      $this->_renameAdminVar($old, $new);
+
+    Class_AdminVar::clearCache();
+    return $this;
+  }
+
+
+  protected function _renameAdminVar($old, $new) {
+    if(!$old_var = Class_AdminVar::find($old))
+      return $this;
+
+    $old_var->delete();
+
+    Class_AdminVar::set($new, $old_var->getValeur());
+    Class_AdminVar::clearCache();
+    return $this;
+  }
+
+
+  protected function upgradePermissions() {
+    foreach(Class_UserGroup::findAll() as $group)
+      $this->replacePermission($group);
+    $this->_cleanMemory();
+    return $this;
+  }
+
+
+  protected function replacePermission($group) {
+    $old_rights = $group->getRightsToken();
+
+    if((pow(2, $this->_getOldRightToken()) & $old_rights) === pow(2, $this->_getOldRightToken())) {
+      $group
+        ->setRights($group->getRights())
+        ->save();
+      $permission = $this->_getConfig()
+        ->getPermission();
+      $permission->permitTo($group, new Class_Entity());
+    }
+
+    return $group;
+  }
+
+
+  protected function renameMenusKeys() {
+    foreach(Class_Profil::findTopProfils() as $profil)
+      $this->searchAndRename($profil);
+    $this->_cleanMemory();
+    return $this;
+  }
+
+
+  protected function searchAndRename($profil) {
+    $this->_found_in_profil = false;
+    $cfg_menu = $profil->getCfgMenusAsArray();
+    $cfg_menu = $this->recursiveSearchAndRename($this->_getOldMenuName(), $this->_getConfig()->getName(), $cfg_menu);
+
+    if($this->_found_in_profil)
+      $profil
+        ->setCfgMenus($cfg_menu)
+        ->save();
+
+    return $profil;
+  }
+
+
+  protected function recursiveSearchAndRename($search, $replace, $subject){
+    foreach($subject as $key => $value) {
+      if($search === $value){
+        $this->_found_in_profil = true;
+        $subject[$key] = $replace;
+        return $subject;
+      }
+      if(is_array($value))
+        $subject[$key] = $this->recursiveSearchAndRename($search, $replace, $value);
+    }
+    return $subject;
+  }
+
+
+
+  protected function renameBatches() {
+    if(!$batch = Class_Batch::findFirstBy(['type' => $this->_getOldBatchName()]))
+      return;
+
+    $batch->setType($this->_getConfig()->getName())->save();
+    return $this;
+  }
+
+
+  abstract protected function _getOldRightToken();
+  abstract protected function _getAdminVarMapping();
+  abstract protected function _getConfig();
+  abstract protected function _getOldMenuName();
+  abstract protected function _getOldBatchName();
+}
\ No newline at end of file
diff --git a/library/Class/Migration/DigitalResource/Assimil.php b/library/Class/Migration/DigitalResource/Assimil.php
index 60eff976f2f2889f1bf51f510e1fef816560d7f6..b5b584be2f818612fdd2aa6bfc7006c404fea886 100644
--- a/library/Class/Migration/DigitalResource/Assimil.php
+++ b/library/Class/Migration/DigitalResource/Assimil.php
@@ -20,108 +20,29 @@
  */
 
 
-class Class_Migration_DigitalResource_Assimil {
-  use Trait_MemoryCleaner;
+class Class_Migration_DigitalResource_Assimil extends Class_Migration_DigitalResource_Abstract {
 
-  const OLD_ASSIMIL_RIGHT_TOKEN = 30;
-
-  protected $_found_assimil_in_profil = false;
-
-
-  public function run() {
-    $this
-      ->renameAdminVar()
-      ->renameMenusKeys()
-      ->upgradePermissions()
-      ->renameBatches();
+  protected function _getOldRightToken() {
+    return 30;
   }
 
 
-  protected function renameAdminVar() {
-    if(!$old_var = Class_AdminVAr::find('ASSIMIL'))
-      return $this;
-
-    if(!Class_AdminVAr::set('Assimil_Assimil', $old_var->getValeur()))
-      return $this;
-
-    $old_var->delete();
-
-    Class_AdminVar::clearCache();
-    return $this;
+  protected function _getAdminVarMapping() {
+    return ['ASSIMIL' => 'Assimil_Assimil'];
   }
 
 
-  protected function renameBatches() {
-    if(!$batch = Class_Batch::findFirstBy(['type' => 'ASSIMIL']))
-      return;
-
-    $batch->setType(Assimil_Config::getName())->save();
-    return $this;
+  protected function _getConfig() {
+    return Assimil_Config::getInstance();
   }
 
 
-  protected function upgradePermissions() {
-    foreach(Class_UserGroup::findAll() as $group)
-      $this->replacePermission($group);
-    $this->_cleanMemory();
-    return $this;
+  protected function _getOldMenuName() {
+    return 'ASSIMIL';
   }
 
 
-  protected function replacePermission($group) {
-    $old_rights = $group->getRightsToken();
-    $permissions = [];
-
-    if((pow(2, static::OLD_ASSIMIL_RIGHT_TOKEN) & $old_rights) === pow(2, static::OLD_ASSIMIL_RIGHT_TOKEN))
-      $permissions[] = Assimil_Config::getInstance()->getPermission();
-
-    $group
-      ->setRights($group->getRights())
-      ->save();
-
-    (new Storm_Model_Collection($permissions))
-      ->eachDo(function($permission) use ($group)
-               {
-                 $permission->permitTo($group, new Class_Entity());
-               });
-
-    return $group;
+  protected function _getOldBatchName() {
+    return 'ASSIMIL';
   }
-
-
-  protected function renameMenusKeys() {
-    foreach(Class_Profil::findAll() as $profil)
-      $this->searchAndRename($profil);
-    $this->_cleanMemory();
-    return $this;
-  }
-
-
-  protected function searchAndRename($profil) {
-    $this->_found_assimil_in_profil = false;
-    $cfg_menu = $profil->getCfgMenusAsArray();
-    $cfg_menu = $this->recursiveSearchAndRename('ASSIMIL', Assimil_Config::getName(), $cfg_menu);
-
-    if($this->_found_assimil_in_profil)
-      $profil
-        ->setCfgMenus($cfg_menu)
-        ->save();
-
-    return $profil;
-  }
-
-
-  protected function recursiveSearchAndRename($search, $replace, $subject){
-    foreach($subject as $key => $value) {
-      if($search === $value){
-        $this->_found_assimil_in_profil = true;
-        $subject[$key] = $replace;
-        return $subject;
-      }
-      if(is_array($value))
-        $subject[$key] = $this->recursiveSearchAndRename($search, $replace, $value);
-    }
-    return $subject;
-  }
-
 }
\ No newline at end of file
diff --git a/library/Class/Migration/DigitalResource/LeKiosk.php b/library/Class/Migration/DigitalResource/LeKiosk.php
index 93f026a65f387805c5d167c7280ce3e8af58d754..5d3ec60c5b6f09d523e973ca6106b1589b58ad64 100644
--- a/library/Class/Migration/DigitalResource/LeKiosk.php
+++ b/library/Class/Migration/DigitalResource/LeKiosk.php
@@ -20,100 +20,30 @@
  */
 
 
-class Class_Migration_DigitalResource_LeKiosk {
-  use Trait_MemoryCleaner;
+class Class_Migration_DigitalResource_LeKiosk extends Class_Migration_DigitalResource_Abstract {
 
-  const OLD_LEKIOSK_RIGHT_TOKEN = 21;
-
-  protected $_found_lekiosk_in_profil = false;
-
-
-  public function run() {
-    $this
-      ->renameAdminVars()
-      ->renameMenusKeys()
-      ->upgradePermissions();
-  }
-
-
-  protected function renameAdminVars() {
-    foreach(['LEKIOSK_ID' => 'Lekiosk_ID',
-             'LEKIOSK_SSO_MODE' => 'Lekiosk_SSO_MODE'] as $old => $new)
-      $this->_renameAdminVar($old, $new);
-
-    Class_AdminVar::clearCache();
-    return $this;
-  }
-
-
-  protected function _renameAdminVar($old, $new) {
-    if(!$old_var = Class_AdminVAr::find($old))
-      return $this;
-
-    $old_var->delete();
-
-    Class_AdminVAr::set($new, $old_var->getValeur());
-    return $this;
-  }
-
-
-  protected function upgradePermissions() {
-    foreach(Class_UserGroup::findAll() as $group)
-      $this->replacePermission($group);
-    $this->_cleanMemory();
-    return $this;
+  protected function _getOldRightToken() {
+    return 21;
   }
 
 
-  protected function replacePermission($group) {
-    $old_rights = $group->getRightsToken();
-
-    if((pow(2, static::OLD_LEKIOSK_RIGHT_TOKEN) & $old_rights) === pow(2, static::OLD_LEKIOSK_RIGHT_TOKEN)) {
-      $group
-        ->setRights($group->getRights())
-        ->save();
-      $permission = Lekiosk_Config::getInstance()
-        ->getPermission();
-      $permission->permitTo($group, new Class_Entity());
-    }
-
-    return $group;
+  protected function _getAdminVarMapping() {
+    return ['LEKIOSK_ID' => 'Lekiosk_ID',
+            'LEKIOSK_SSO_MODE' => 'Lekiosk_SSO_MODE'];
   }
 
 
-  protected function renameMenusKeys() {
-    foreach(Class_Profil::findTopProfils() as $profil)
-      $this->searchAndRename($profil);
-    $this->_cleanMemory();
-    return $this;
+  protected function _getConfig() {
+    return Lekiosk_Config::getInstance();
   }
 
 
-  protected function searchAndRename($profil) {
-    $this->_found_lekiosk_in_profil = false;
-    $cfg_menu = $profil->getCfgMenusAsArray();
-    $cfg_menu = $this->recursiveSearchAndRename('LEKIOSK', Lekiosk_Config::getName(), $cfg_menu);
-
-    if($this->_found_lekiosk_in_profil)
-      $profil
-        ->setCfgMenus($cfg_menu)
-        ->save();
-
-    return $profil;
+  protected function _getOldMenuName() {
+    return 'LEKIOSK';
   }
 
 
-  protected function recursiveSearchAndRename($search, $replace, $subject){
-    foreach($subject as $key => $value) {
-      if($search === $value){
-        $this->_found_lekiosk_in_profil = true;
-        $subject[$key] = $replace;
-        return $subject;
-      }
-      if(is_array($value))
-        $subject[$key] = $this->recursiveSearchAndRename($search, $replace, $value);
-    }
-    return $subject;
+  protected function _getOldBatchName() {
+    return 'LEKIOSK';
   }
-
 }
\ No newline at end of file
diff --git a/library/Class/Migration/DigitalResource/Musicme.php b/library/Class/Migration/DigitalResource/Musicme.php
new file mode 100644
index 0000000000000000000000000000000000000000..c682eebc73c221e981ff2e26618527e2caa218b2
--- /dev/null
+++ b/library/Class/Migration/DigitalResource/Musicme.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Class_Migration_DigitalResource_Musicme extends Class_Migration_DigitalResource_Abstract {
+
+
+  protected function _getOldRightToken() {
+    return 7;
+  }
+
+
+  protected function _getAdminVarMapping() {
+    return ['MUSICME_URL' => 'Musicme_URL',
+            'MUSICME_BIB_ID' => 'Musicme_BIB_ID'];
+  }
+
+
+  protected function _getConfig() {
+    return Musicme_Config::getInstance();
+  }
+
+
+  protected function _getOldMenuName() {
+    return 'MUSICME';
+  }
+
+
+  protected function _getOldBatchName() {
+    return 'MUSICME';
+  }
+}
\ No newline at end of file
diff --git a/library/Class/MusicMeLink.php b/library/Class/MusicMeLink.php
deleted file mode 100644
index a24c51d27333131fc5646674d7a788548100ca23..0000000000000000000000000000000000000000
--- a/library/Class/MusicMeLink.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
- *
- * BOKEH is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * BOKEH is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
- */
-
-class Class_MusicMeLink {
-  use Trait_TimeSource;
-
-  const CVS_SOURCEXPIRATIONTIME = 30;
-
-  protected $_user;
-
-  public static function forUser($user) {
-    return new self($user);
-  }
-
-
-  public function __construct($user) {
-    $this->_user = $user;
-  }
-
-
-  public static function staticLink() {
-    return BASE_URL.'/modules/musicme';
-  }
-
-
-  public function baseUrl() {
-    $url = Class_AdminVar::get('MUSICME_URL');
-    return $url;
-  }
-
-
-  public function url() {
-    $bib_id = Class_AdminVar::get('MUSICME_BIB_ID');
-    $iduser = strtolower($this->_user->getLogin());
-    $formatted_date=date('YmdHi',$this->getCurrentTime());
-    $params = ['iduser' => $iduser,
-               'ticket' => (new Class_CasTicket())->getTicketForUser($this->_user),
-               'MediaLibraryID' => $bib_id
-      ];
-    $params['service'] = $this->baseUrl().'?'.http_build_query(array_filter($params));
-    return $this->baseUrl().'?'.http_build_query(array_filter($params));
-  }
-}
\ No newline at end of file
diff --git a/library/Class/Systeme/ModulesMenu.php b/library/Class/Systeme/ModulesMenu.php
index 7e35071bf35509845967ffa1c7d609773f339291..b529f71905adc8912fa2e115e2fbd470a05da030 100644
--- a/library/Class/Systeme/ModulesMenu.php
+++ b/library/Class/Systeme/ModulesMenu.php
@@ -119,7 +119,6 @@ class Class_Systeme_ModulesMenu extends Class_Systeme_ModulesAbstract {
                                      "NUMILOG" => new Class_Systeme_ModulesMenu_Numilog(),
                                      "ARTEVOD" => new Class_Systeme_ModulesMenu_ArteVOD(),
                                      "ORTHODIDACTE" => new Class_Systeme_ModulesMenu_Orthodidacte(),
-                                     "MUSICME" => new Class_Systeme_ModulesMenu_MusicMe(),
                                      "MYCOW" => new Class_Systeme_ModulesMenu_MyCow(),
                                      "PLANETNEMO" => new Class_Systeme_ModulesMenu_PlanetNemo(),
                                      "KIDLILANGUES" => new Class_Systeme_ModulesMenu_Kidilangues(),
diff --git a/library/Class/Systeme/ModulesMenu/MusicMe.php b/library/Class/Systeme/ModulesMenu/MusicMe.php
deleted file mode 100644
index 46d8df9159e93d0f047126d74b2d7b4fd6dd95ce..0000000000000000000000000000000000000000
--- a/library/Class/Systeme/ModulesMenu/MusicMe.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
- *
- * BOKEH is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * BOKEH is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
- */
-
-class Class_Systeme_ModulesMenu_MusicMe extends Class_Systeme_ModulesMenu_SSOAbstract {
-
-  protected
-    $_group = Class_Systeme_ModulesMenu::GROUP_MENU_ABONNES,
-    $_type_module = 'MusicMe',
-    $_url =  ['controller' => 'modules',
-              'action' => 'musicme'];
-
-
-  public function __construct() {
-    parent::__construct();
-    $this->_libelle = $this->_('Lien vers MusicMe');
-  }
-
-
-  public function urlForUser($user) {
-    if (!$user->hasRightAccesMusicMe())
-      return '';
-
-    $musicme_link=Class_MusicMeLink::forUser($user);
-    $url=$musicme_link->url();
-    if (!strlen($url)>0)
-      $this->setMessage($musicme_link->getMessage());
-
-    return $url;
-  }
-
-
-  public function isVisibleForProfil($profil) {
-    return Class_AdminVar::isMusicMeEnabled();
-  }
-}
\ No newline at end of file
diff --git a/library/Class/UserGroup.php b/library/Class/UserGroup.php
index a365adb0858822c312197883ae995da70468d66d..68f95e9daf63f9967ed166ff963caf77c69e2672 100644
--- a/library/Class/UserGroup.php
+++ b/library/Class/UserGroup.php
@@ -136,7 +136,6 @@ class Class_UserGroup extends Storm_Model_Abstract {
   const RIGHT_ACCES_CVS = 4;
   const RIGHT_ACCES_VODECLIC = 5;
   const RIGHT_ACCES_TOUTAPPRENDRE = 6;
-  const RIGHT_ACCES_MUSICME = 7;
   const RIGHT_ACCES_NUMERIQUEPREMIUM = 20;
   const RIGHT_ACCES_CYBERLIBRIS = 22;
   const RIGHT_ACCES_MYCOW = 24;
@@ -183,7 +182,6 @@ class Class_UserGroup extends Storm_Model_Abstract {
      self::RIGHT_ACCES_VODECLIC => 'Bibliothèque numérique: accéder à Vodéclic',
      self::RIGHT_ACCES_TOUTAPPRENDRE => 'Bibliothèque numérique: accéder à Tout Apprendre',
      self::RIGHT_ACCES_NUMERIQUEPREMIUM => 'Bibliothèque numérique: accéder à Numérique Premium',
-     self::RIGHT_ACCES_MUSICME => 'Bibliothèque numérique: accéder à Music Me',
      self::RIGHT_ACCES_MYCOW => 'Bibliothèque numérique: accéder à MyCOW.EU',
      self::RIGHT_ACCES_PLANETNEMO => 'Bibliothèque numérique: accéder à planetnemo.fr',
      self::RIGHT_ACCES_KIDILANGUES => 'Bibliothèque numérique: accéder à Kidilangues',
@@ -235,7 +233,6 @@ class Class_UserGroup extends Storm_Model_Abstract {
                 'Numilog' => [Class_UserGroup::RIGHT_ACCES_NUMILOG],
                 'Vodeclic' => [Class_UserGroup::RIGHT_ACCES_VODECLIC],
                 'ToutApprendre' => [Class_UserGroup::RIGHT_ACCES_TOUTAPPRENDRE],
-                'MusicMe' => [Class_UserGroup::RIGHT_ACCES_MUSICME],
                 'NumeriquePremium' => [Class_UserGroup::RIGHT_ACCES_NUMERIQUEPREMIUM],
                 'MyCow' => [Class_UserGroup::RIGHT_ACCES_MYCOW],
                 'Kidilangues' => [Class_UserGroup::RIGHT_ACCES_KIDILANGUES],
diff --git a/library/Class/Users.php b/library/Class/Users.php
index 70e0e32881c4b74d63031722387c83317e7d86c4..584228fbc516e7c4a070af823d588484fc211717 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -925,11 +925,6 @@ class Class_Users extends Storm_Model_Abstract {
   }
 
 
-  public function hasRightAccesMusicMe() {
-    return $this->isAbonneAndHasRightToAccess(Class_UserGroup::RIGHT_ACCES_MUSICME);
-  }
-
-
   public function hasRightAccessCyberlibris() {
     return $this->isAbonneAndHasRightToAccess(Class_UserGroup::RIGHT_ACCES_CYBERLIBRIS);
   }
diff --git a/library/digital_resources/LaSourisQuiRaconte/Service/Story.php b/library/digital_resources/LaSourisQuiRaconte/Service/Story.php
index 0b9c0ff1c04f9e948081a43148e693433cfbb540..0138148f6e9bc98b096217cc29157f1111e41836 100644
--- a/library/digital_resources/LaSourisQuiRaconte/Service/Story.php
+++ b/library/digital_resources/LaSourisQuiRaconte/Service/Story.php
@@ -45,6 +45,11 @@ class LaSourisQuiRaconte_Service_Story extends Class_WebService_BibNumerique_Res
   }
 
 
+  public function getBaseUrl() {
+    return LaSourisQuiRaconte_Config::LSQR_URL;
+  }
+
+
   protected function getTypeDoc() {
     return LaSourisQuiRaconte_Config::getInstance()->getDocType();
   }
diff --git a/library/digital_resources/LaSourisQuiRaconte/tests/LaSourisQuiRaconteTest.php b/library/digital_resources/LaSourisQuiRaconte/tests/LaSourisQuiRaconteTest.php
index b3b0eae6ee5c4f5d9c90851c5b0193513af3b59c..2aa00636121d8a9692fb84101d6e400476c3771d 100644
--- a/library/digital_resources/LaSourisQuiRaconte/tests/LaSourisQuiRaconteTest.php
+++ b/library/digital_resources/LaSourisQuiRaconte/tests/LaSourisQuiRaconteTest.php
@@ -271,6 +271,13 @@ class LaSourisQuiRaconteHarvestTest extends ModelTestCase {
                         $this->_leon_geant->getExternalUri());
   }
 
+  /** @test */
+  public function originUrlShouldbeLaSourisQuiRaconte() {
+    $this->assertEquals('http://www.lasourisquiraconte.com',
+                        $this->_leon_geant->getUrlOrigine());
+
+  }
+
 
   /** @test */
   public function droleDeChatSubjectsShouldBeAmourEnfantsDeuil() {
@@ -325,11 +332,13 @@ class LaSourisQuiRaconteHarvestTest extends ModelTestCase {
 
 
 class LaSourisQuiRaconteViewRecordTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
+  protected $_storm_default_to_volatile = true,
+    $service;
 
   public function setUp() {
     parent::setUp();
-    (new LaSourisQuiRaconteFixtures())->prepare()->harvest();
+    $this->service = (new LaSourisQuiRaconteFixtures())->prepare();
+    $this->service->harvest();
     Class_Album::find(1)->index();
   }
 
@@ -340,6 +349,25 @@ class LaSourisQuiRaconteViewRecordTest extends AbstractControllerTestCase {
   }
 
 
+  /** @test */
+  public function newHarvestShouldKeepNewTitle() {
+    Class_Album::find(1)->setTitre('My title modification')->save();
+    $this->service->harvest();
+    Class_Album::find(1)->index();
+    $this->assertEquals('My title modification', Class_Notice::find(1)->getTitrePrincipal());
+    $this->assertCount(1,Class_Album::findAllBy(['id_origine' => Class_Album::find(1)->getIdOrigine()]));
+  }
+
+    /** @test */
+  public function newHarvestWithDifferentOriginUrlShouldCreateNewAlbum() {
+    Class_Album::find(1)->setTitre('My title modification')->save();
+    Class_Album::find(1)->setUrlOrigine('Other url')->save();
+    $this->service->harvest();
+    Class_Album::find(1)->index();
+    $this->assertCount(2,Class_Album::findAllBy(['id_origine' => Class_Album::find(1)->getIdOrigine()]));
+  }
+
+
   /** @test */
   public function recordIsbnShouldBe978_2_36302_128_1() {
     $this->assertEquals('978-2-36302-128-1', Class_Notice::find(1)->getIsbn());
diff --git a/library/digital_resources/Lekiosk/Service/Album.php b/library/digital_resources/Lekiosk/Service/Album.php
index 4443a24a33c4f73f0b26e68a32ff294fe6e0af8c..77cc7d8fa63fb2391677be6307265b1f64406144 100644
--- a/library/digital_resources/Lekiosk/Service/Album.php
+++ b/library/digital_resources/Lekiosk/Service/Album.php
@@ -27,6 +27,10 @@ class Lekiosk_Service_Album extends Class_WebService_BibNumerique_RessourceNumer
       ->addEditor($this->getEditeur());
   }
 
+  public function getBaseUrl() {
+    return Lekiosk_Config::getInstance()->getUrl();
+  }
+
 
   public function getRessourceCategorieLibelle() {
     return Lekiosk_Config::getInstance()->getName();
diff --git a/library/digital_resources/Lekiosk/tests/LeKioskTest.php b/library/digital_resources/Lekiosk/tests/LeKioskTest.php
index 989189ca42c981be5f9f4c1a22fc3869d7e7b41c..34d1ac96d3f184fe5fc3c7d3f9cb4e6f5f169ac6 100644
--- a/library/digital_resources/Lekiosk/tests/LeKioskTest.php
+++ b/library/digital_resources/Lekiosk/tests/LeKioskTest.php
@@ -324,6 +324,11 @@ class LeKioskServiceHarvestTest extends LekioskServiceTestCase {
     $this->assertEquals(851749, $this->_10_national_sport->getIdOrigine());
   }
 
+    /** @test */
+  public function nationalSportIdShouldHaveUrlOrigine() {
+    $this->assertEquals('http://www.lekiosk.com/', $this->_10_national_sport->getUrlOrigine());
+  }
+
 
   /** @test */
   public function nationalSportTitleShouldBe10NationalSport() {
diff --git a/library/digital_resources/Musicme/Album.php b/library/digital_resources/Musicme/Album.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a5bafb5daff5a75fd899c8b17960cd92feacf31
--- /dev/null
+++ b/library/digital_resources/Musicme/Album.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_Service_Album extends Class_WebService_BibNumerique_RessourceNumerique {
+  protected
+    $_isbn,
+    $_genres = [];
+
+
+  public function addGenre($label) {
+    $this->_genres []= Class_CodifGenre::findOrCreateFromLabel($label)->getId();
+  }
+
+  public function setIsbn($isbn) {
+    $this->_isbn = $isbn;
+    return $this;
+  }
+
+
+  public function fillAlbum($album) {
+    $album->setIsbn($this->_isbn)
+          ->setTypeDocId($this->getTypeDoc())
+          ->addEditor($this->getEditeur())
+          ->setGenre(implode(';', $this->_genres));
+    return $this;
+  }
+
+
+  protected function getTypeDoc() {
+    return LaSourisQuiRaconte_Config::getInstance()->getDocType();
+  }
+
+
+  public function getRessourceCategorieLibelle() {
+    return LaSourisQuiRaconte_Config::getInstance()->getDocTypeLabel();
+  }
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/Batch.php b/library/digital_resources/Musicme/Batch.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5725fb5096d2c627543c04578a0af8cdb53ebfb
--- /dev/null
+++ b/library/digital_resources/Musicme/Batch.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_Batch extends Class_DigitalResource_Batch {}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/Config.php b/library/digital_resources/Musicme/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c4ca076c5b7fe04606afcf99870bb56d72d1bc7
--- /dev/null
+++ b/library/digital_resources/Musicme/Config.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright (c) 2012-2016, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class Musicme_Config extends Class_DigitalResource_Config {
+
+  public function getConfig() {
+    return [
+            'DocTypeLabel' => $this->_('musicMe'),
+            'PermissionLabel' => $this->_('Bibliothèque numérique: accéder à musicMe'),
+            'MenuLabel' => $this->_('Lien vers musicMe'),
+            'Introduction' => $this->_('Plateforme d\'écoute et de téléchargement de musique.'),
+            'NotAllowedMessage' => $this->_('Votre abonnement ne permet pas l\'accès à cette ressource.'),
+
+            'HelpLink' => 'http://wiki.bokeh-library-portal.org/index.php/MusicMe',
+            'Url' => 'http://www.musicme.com/',
+            'Icon' => 'https://static.wixstatic.com/media/679c8e_71d2ebe18f5141769ccb3d7cb6d66cf0.png',
+            'Mail' => 'support@musicme.com',
+            'MailUrl' => 'https://www.musicme.com/#/support.php?cat=2',
+
+            'AdminVars' => [
+                            'BIB_ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant fournit par musicMe'))->bePrivate(),
+                            'URL' => Class_AdminVar_Meta::newDefault($this->_('Url fournit par musicMe'))->bePrivate(),
+                            'EXPORT_URL' => Class_AdminVar_Meta::newDefault($this->_('Url du dépot de ressources founit par musicMe'))->bePrivate(),
+                            'COVER_IMG_URL' => Class_AdminVar_Meta::newDefault($this->_('Url du dépot des images de musicMe'), ['value' => 'https://covers.hosting-media.net/jpgr575'] )->bePrivate(),
+            ],
+
+            'SsoAction' => true,
+            'Batch' => 'Musicme_Batch',
+            'Service' => 'Musicme_Service',
+            'ModuleMenu' => 'Musicme_ModuleMenu',
+    ];
+  }
+
+
+  public function getSsoUrl($user) {
+    $iduser = strtolower($user->getLogin());
+
+    $formatted_date = date('YmdHi',$this->getCurrentTime());
+
+    $params = ['iduser' => $iduser,
+               'ticket' => (new Class_CasTicket())->getTicketForUser($user),
+               'MediaLibraryID' => $this->getAdminVar('BIB_ID')];
+
+    $params['service'] = $this->getAdminVar('URL') . '?' . http_build_query(array_filter($params));
+    return $this->getAdminVar('URL') . '?' . http_build_query(array_filter($params));
+  }
+
+
+  public function isEnabled() {
+    return  '' != $this->getAdminVar('BIB_ID');
+  }
+}
diff --git a/library/digital_resources/Musicme/ModuleMenu.php b/library/digital_resources/Musicme/ModuleMenu.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ba69433233315ef96de51b4f08bbd021f37c81b
--- /dev/null
+++ b/library/digital_resources/Musicme/ModuleMenu.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_ModuleMenu extends Class_DigitalResource_ModuleMenu {}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/Service.php b/library/digital_resources/Musicme/Service.php
new file mode 100644
index 0000000000000000000000000000000000000000..029b6c48970fd817852fe9c0bf06a21b91af602d
--- /dev/null
+++ b/library/digital_resources/Musicme/Service.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_Service extends Class_DigitalResource_Service {
+  protected $_parser,
+    $_albums = [];
+
+
+  /* Fonction appelée à la fin du moissonnage pour supprimer les albums obsolètes.
+     La méthode $this->_getHarvestedIds(); vous permet de récupérer les identifiants des albums moissonnés. */
+  protected function _deleteNonHarvested() {
+    return $this;
+  }
+
+
+
+  /* Fonction appelée par la mécanique de moissonnage.
+     C'est ici que le parser doit créer les albums  */
+  protected function loadPage($page_number = 1) {
+    $client = $this->getHttpClient();
+
+    $xml = gzdecode($client->open_url($this->_config->getAdminVar('EXPORT_URL')));
+
+    $this->_parser = new Musicme_Service_XMLParser();
+    $this->_parser->parseXML($xml);
+
+    $this->_albums =  $this->_parser->getAlbums();
+
+    return $this;
+  }
+
+  public function getPageCount() {
+    return 1;
+  }
+
+  public function getRessourcesNumeriques() {
+    return $this->_albums;
+  }
+}
+?>
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/Service/Album.php b/library/digital_resources/Musicme/Service/Album.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4ba314d42bdb1549f768f0f3fafdce826cfc1eb
--- /dev/null
+++ b/library/digital_resources/Musicme/Service/Album.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_Service_Album extends Class_WebService_BibNumerique_RessourceNumerique {
+  protected $_editors = [];
+
+
+  public function getBaseUrl() {
+    return Musicme_Config::getInstance()->getAdminVar('URL');
+  }
+
+
+  protected function getTypeDoc() {
+    return Musicme_Config::getInstance()->getDocType();
+  }
+
+  public function fillAlbum($album) {
+    $this->addPoster(Musicme_Config::getInstance()->getAdminVar('COVER_IMG_URL').'/'.$this->getId().'.jpg');
+    $album
+      ->setTypeDocId($this->getTypeDoc());
+
+    foreach ($this->_editors as $editor)
+      $album->addEditor(trim($editor));
+    return $this;
+  }
+
+
+  public function setEditors($editors) {
+    $this->_editors = explode('/',$editors);
+  }
+
+
+  public function getRessourceCategorieLibelle() {
+    return Musicme_Config::getInstance()->getDocTypeLabel();
+  }
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/Service/XMLParser.php b/library/digital_resources/Musicme/Service/XMLParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee058f67da8357c4219358974f71352249f1119d
--- /dev/null
+++ b/library/digital_resources/Musicme/Service/XMLParser.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+class Musicme_Service_XMLParser {
+  protected
+    $_albums = [],
+    $_artists = [],
+    $_current_album;
+
+  public function parseXML($xml) {
+    $this->_parser = new Class_WebService_FasterXMLParser();
+    $this->_parser->setElementHandler($this);
+    $this->_parser->parse($xml);
+    return $this;
+  }
+
+
+  public function startAlbum($attributes) {
+    $this->_current_album = new Musicme_Service_Album();
+    $this->_current_album->setId($attributes['BARCODE']);
+  }
+
+
+  public function endTitle($data) {
+    $this->_current_album->setTitle($data);
+  }
+
+
+  public function endArtist($data) {
+    $this->_current_album->addAuthor(new Class_Notice_Author($data));
+  }
+
+
+  public function endAlbum() {
+    $this->_albums[] = $this->_current_album;
+  }
+
+
+  public function endDateRelease($data) {
+    $this->_current_album->setYear($data);
+  }
+
+
+  public function endLabel($data){
+    $this->_current_album->setEditors($data);
+  }
+
+
+  public function endPrimaryDocUrl($data) {
+    $this->_current_album->setExternalUri($data);
+  }
+
+
+  public function endStyle($data) {
+    foreach (explode(',',$data) as $style)
+      $this->_current_album->addMatiere(trim($style));
+  }
+
+
+  public function endUrl($data) {
+    $this->_current_album->setExternalUri($data);
+  }
+
+
+  public function getAlbums() {
+    return $this->_albums;
+  }
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/View/Helper/Album.php b/library/digital_resources/Musicme/View/Helper/Album.php
new file mode 100644
index 0000000000000000000000000000000000000000..fbe6ccbdb94960bb25cbba56209e3a1705ffbf0e
--- /dev/null
+++ b/library/digital_resources/Musicme/View/Helper/Album.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class Musicme_View_Helper_Album extends ZendAfi_View_Helper_TagRessourceNumerique {
+
+  protected $_album;
+
+  public function album($album) {
+    $this->_album = $album;
+
+    $url = $this->view->url(['module' => 'opac',
+                             'controller' => 'modules',
+                             'action' => 'musicme',
+                             'album_id' => $album->getId()], null, true);
+
+    if (!Class_Users::getIdentity())
+      return $this->_tag('p',
+                         $this->view->tagAnchor($url,
+                                                $this->_('Vous devez être connecté sous un compte avec abonnement valide pour pouvoir accéder à l\'album')));
+
+    if (!$this->canAccessRessourceNumerique())
+            return $this->_tag('p',
+                               $this->_('Votre abonnement ne permet pas d\'accéder à la ressource. Merci de contacter la médiathèque.'));
+
+
+    return $this->view->tagAnchor($url,
+                                  $this->_('Accéder à "%s" dans un nouvel onglet', $album->getTitre()),
+                                  ['target' => '_blank']);
+  }
+
+
+  protected function hasRightAccesRessourcesNumeriques($user) {
+    return Musicme_Config::getInstance()->hasRightAccess($user);
+  }
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/controllers/IndexController.php b/library/digital_resources/Musicme/controllers/IndexController.php
new file mode 100644
index 0000000000000000000000000000000000000000..d97e079214695af9d7fe8091082a9a95246832ca
--- /dev/null
+++ b/library/digital_resources/Musicme/controllers/IndexController.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Musicme_Plugin_IndexController extends Class_DigitalResource_Controller {
+  public function getExternalUri($album, $module_menu) {
+    $sso_url = explode('?', $module_menu->getDynamiqueUrl());
+
+    return  str_replace('http://www.musicme.com',
+                        $sso_url[0],
+                        str_replace('"','%22',$album->getExternalUri()))
+      . '?' . (isset($sso_url[1]) ? $sso_url[1] : '');
+  }
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/images/icon.png b/library/digital_resources/Musicme/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..efa5478e33d3da99058b701c449c3c4e9443abf3
Binary files /dev/null and b/library/digital_resources/Musicme/images/icon.png differ
diff --git a/library/digital_resources/Musicme/tests/MusicmeTest.php b/library/digital_resources/Musicme/tests/MusicmeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d08407bf837973d9cd3ddd0ca8c7014b4595275
--- /dev/null
+++ b/library/digital_resources/Musicme/tests/MusicmeTest.php
@@ -0,0 +1,383 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class MusicmeFixtures {
+  use Storm_Test_THelpers;
+  public function activate() {
+    Class_AdminVar::newInstanceWithId('Musicme_BIB_ID', ['valeur' => 'QUEST']);
+    Class_AdminVar::newInstanceWithId('Musicme_URL', ['valeur' => 'http://linkmusicme.com']);
+    Class_AdminVar::newInstanceWithId('Musicme_EXPORT_URL', ['valeur' => 'http://easyaxe.musicme.com/partnerstop.xml.gz']);
+    Class_AdminVar::newInstanceWithId('Musicme_COVER_IMG_URL', ['valeur' => 'http://easyaxecover.com']);
+    return $this;
+  }
+
+
+  public  function deactivate() {
+    Class_AdminVar::newInstanceWithId('Musicme_BIB_ID', ['valeur' => '']);
+    Class_AdminVar::newInstanceWithId('Musicme_URL', ['valeur' => '']);
+    Class_AdminVar::newInstanceWithId('Musicme_EXPORT_URL', ['valeur' => '']);
+    Class_AdminVar::newInstanceWithId('Musicme_COVER_IMG_URL', ['valeur' => '']);
+    return $this;
+  }
+
+  public function prepare() {
+    $musicme_xml = file_get_contents(__DIR__ . '/musicme.xml.gz');
+    $http_client = $this->mock()
+                        ->whenCalled('open_url')
+                        ->with('http://easyaxe.musicme.com/partnerstop.xml.gz')
+                        ->answers($musicme_xml)
+                        ->whenCalled('open_url')
+                        ->with('http://easyaxecover.com/0000000063128.jpg')
+                        ->answers(true)
+                        ->whenCalled('open_url')
+                        ->with('http://easyaxecover.com/0190295740580.jpg')
+                        ->answers(true)
+                        ->whenCalled('open_url')
+                        ->with('http://easyaxecover.com/0008811031725.jpg')
+                        ->answers(true);
+
+
+
+    Musicme_Service::setDefaultHttpClient($http_client);
+    return new Musicme_Service(
+                    new Musicme_Config(
+                                       new Class_DigitalResource_Wrapper(Class_DigitalResource::getInstance(),
+                                                                  'Musicme')));
+
+  }
+
+  public function logValidUser() {
+    $group = $this->fixture('Class_UserGroup', ['id' => 1]);
+
+    $user = $this->fixture('Class_Users',
+                           ['id' => 1,
+                            'login' => 'Tom',
+                            'password' => 'pwd']);
+    $user
+      ->beAbonneSIGB()
+      ->setDateFin('9999-01-01')
+      ->setIdabon('2345')
+      ->setBib($this->fixture('Class_Bib',
+                              ['id' => 2,
+                               'libelle' => 'Annecy']))
+      ->setUserGroups([$group])
+      ->save();
+    ZendAfi_Auth::getInstance()->logUser($user);
+
+    $this->fixture('Class_Permission',
+                   ['id' => 1,
+                    'code' => 'Musicme'])
+         ->permitTo($group,  new Class_Entity());
+  }
+
+}
+
+
+class MusicmeSSOTest extends AbstractControllerTestCase {
+
+  protected
+    $_storm_default_to_volatile = true;
+
+  public function setUp() {
+    parent::setUp();
+    Storm_Cache::beVolatile();
+    (new MusicmeFixtures())->prepare();
+    $user= $this->fixture('Class_Users',
+                                 ['id' => 1,
+                                  'login' => 'Tom',
+                                  'password' => 'pwd']);
+    ZendAfi_Auth::getInstance()->logUser($user);
+  }
+
+
+    /** @test */
+  public function userWithRoleInviteShouldNotHaveAccessToModulesLSQR() {
+    $this->dispatch('/opac/modules/musicme', true);
+    $this->assertFlashMessengerContentContains('Votre abonnement ne permet pas l\'accès à cette ressource.');
+  }
+
+
+  /** @test */
+  public function musicMeUrlShouldExtractUrlFromResponse() {
+    (new MusicmeFixtures())->logValidUser();
+    $this->dispatch('/opac/modules/musicme', true);
+    $ticket='ST-'.md5( Zend_Session::getId() . '4');
+        $this->assertFlashMessengerContentContains('Votre abonnement ne permet pas l\'accès à cette ressource.');
+  }
+
+
+
+}
+
+class MusicmeHarvestTest extends ModelTestCase {
+  protected
+    $_storm_default_to_volatile = true,
+    $_destination;
+
+  public function setUp() {
+    parent::setUp();
+    (new MusicmeFixtures())->activate()->prepare()->harvest();
+
+    Class_Album::clearCache();
+    $this->_destination = Class_Album::find(1);
+  }
+
+
+  /** @test */
+  public function TitleShouldBeDestinationParadise() {
+    $this->assertEquals('Destination Paradise', $this->_destination->getTitre());
+  }
+
+
+  /** @test */
+  public function ArtistsShouldBeNilsVanZandsAndFatmanScoop() {
+    $this->assertEquals('Nils Van Zandt', $this->_destination->getAuthors()[0]->getName());
+    $this->assertEquals('Fatman Scoop', $this->_destination->getAuthors()[1]->getName());
+  }
+
+
+  /** @test */
+  public function publishersShouldIdolAndHappyMusic() {
+    $this->assertEquals('idol', $this->_destination->getEditors()[0]);
+    $this->assertEquals('happy music', $this->_destination->getEditors()[1]);
+
+  }
+
+
+  /** @test */
+  public function yearShouldBe1991ForSecondAlbum() {
+    $this->assertEquals('1991', Class_Album::find(2)->getAnnee());
+  }
+
+
+  /** @test */
+  public function styleShouldBeRap() {
+    $ids = explode(';', $this->_destination->getMatiere());
+    $this->assertEquals('Rap', Class_CodifMatiere::find($ids[0])->getLibelle());
+    $this->assertEquals('R&B', Class_CodifMatiere::find($ids[1])->getLibelle());
+    $this->assertEquals('Soul', Class_CodifMatiere::find($ids[2])->getLibelle());
+  }
+
+
+  /** @test */
+  public function urlShouldBeSet() {
+    $this->assertEquals('http://www.musicme.com/Nils-Van-Zandt/albums/Destination-Paradise-0000000063128.html', $this->_destination->getExternalUri());
+  }
+
+
+  /** @test */
+  public function imageShouldBeSet() {
+    $this->assertEquals('http://easyaxecover.com/0000000063128.jpg', $this->_destination->getPoster());
+  }
+}
+
+
+
+
+class ModulesControllerMusicmeTest extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true,
+    $fixtures ;
+
+  public function setUp() {
+    parent::setUp();
+    $this->fixtures = new MusicmeFixtures();
+    $this->fixtures->prepare();
+  }
+
+
+  /** @test */
+  public function responseShouldContainsRedirectToLogin() {
+    $this->fixtures->deactivate();
+    ZendAfi_Auth::getInstance()->clearIdentity();
+    $this->dispatch('/opac/modules/musicme', true);
+    $this->assertXpath('//script[contains(text(), "location.href=")][contains(text(), "auth/login?redirect=http")]');
+  }
+
+
+  /** @test */
+  public function shouldRedirectToMusicme() {
+    $this->fixtures->activate();
+    $this->fixtures->logValidUser();
+    $this->dispatch('/opac/modules/musicme', true);
+    $this->assertXpathContentContains('//script', 'document.location.href="http://linkmusicme.com?', $this->_response->getBody());
+  }
+
+}
+
+
+
+
+
+class CasServerControllerMusicmeValidateActionTest extends AbstractControllerTestCase {
+  protected $session_file_contents_logged;
+  protected $session_file_contents_nologin;
+
+  public function setUp() {
+    parent::setUp();
+    Storm_Cache::beVolatile();
+    $fixtures = new MusicmeFixtures();
+    $fixtures->prepare();
+    $fixtures->activate();
+    $fixtures->logValidUser();
+
+  }
+
+
+  /** @test */
+  public function requestMusicmeWithNoTicketShouldRespondAccountDisabledXML() {
+    $this->dispatch('/opac/cas-server/validate-musicme?MediaLibraryID=150&ticket=ST-0a1b2c3d');
+    $this->assertContains('<User />',$this->_response->getBody());
+  }
+
+
+  /** @test */
+  public function requestMusicmeWithValidTicketShouldRespondValidXML() {
+    $this->dispatch('/opac/cas-server/validate-musicme?ticket=ST-'.md5(Zend_Session::getId().'1').'&MediaLibraryID=http://test.com');
+    $this->assertContains('<ID>1</ID>',$this->_response->getBody());
+  }
+
+
+  /** @test */
+  public function musicmeUrlShouldContainsTicket0a1b2c3d() {
+    $expected_ticket = 'ST-'.md5(Zend_Session::getId().'1');
+    $musicme = Class_DigitalResource::getInstance()->getModuleMenuFor('Musicme');
+    $this->assertEquals('http://linkmusicme.com?iduser=tom&ticket='.$expected_ticket.'&MediaLibraryID=QUEST&service=http%3A%2F%2Flinkmusicme.com%3Fiduser%3Dtom%26ticket%3D'.$expected_ticket.'%26MediaLibraryID%3DQUEST', Class_DigitalResource::getInstance()->getModuleMenuFor('Musicme')->getDynamiqueUrl());
+  }
+
+
+  /** @test */
+  public function casLoginActioShouldRedirectToServiceWithTicket() {
+    $this->dispatch('/opac/cas-server/login?service=http://test.com', true);
+    $this->assertRedirectTo(
+      'http://test.com?ticket='.(new Class_CasTicket())->getTicketForCurrentUser(),
+      $this->getResponseLocation());
+  }
+
+
+  /** @test */
+  public function casIndexActionShouldForwardToLoginAction() {
+    $this->dispatch('/opac/cas-server/?service=http://test.com', true);
+    $this->assertRedirectTo(
+      'http://test.com?ticket='.(new Class_CasTicket())->getTicketForCurrentUser(),
+      $this->getResponseLocation());
+  }
+
+}
+
+
+
+
+
+class MusicmeViewRecordTest extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true,
+    $fixtures;
+
+  public function setUp() {
+    parent::setUp();
+    $this->service = (new MusicmeFixtures())->activate()->prepare();
+    $this->service->harvest();
+    Class_Album::find(1)->index();
+  }
+
+
+  /** @test */
+  public function recordTitleShouldBeDestinationParadise() {
+    $this->assertEquals('Destination Paradise', Class_Notice::find(1)->getTitrePrincipal());
+  }
+
+  /** @test */
+  public function urlOrigineShouldBeSetToUrl() {
+    $this->assertEquals('http://linkmusicme.com',Class_Album::find(1)->getUrlOrigine());
+  }
+
+  /** @test */
+  public function newHavestShouldKeepNewTitle() {
+    Class_Album::find(1)->setTitre('My title modification')->save();
+    $this->service->harvest();
+    Class_Album::find(1)->index();
+    $this->assertEquals('My title modification', Class_Notice::find(1)->getTitrePrincipal());
+  }
+
+
+  /** @test */
+  public function withoutUserConnectionLinkToModuleLSQRShouldIndicateToConnect() {
+    ZendAfi_Auth::getInstance()->clearIdentity();
+    $this->dispatch('/noticeajax/resnumeriques/id/1', true);
+    $this->assertXPathContentContains('//a[contains(@href, "modules/musicme")]', 'Vous devez ');
+  }
+
+
+  /** @test */
+  public function withUserConnectedLinkToModuleShouldIndicateAccessDigitalResource() {
+    (new MusicmeFixtures())->logValidUser();
+    $this->dispatch('/noticeajax/resnumeriques/id/1', true);
+    $this->assertXPathContentContains('//a[@href= "/modules/musicme/album_id/1"]', ' "Destination Paradise" dans un nouvel onglet');
+  }
+
+
+  /** @test */
+  public function modulesMusicMeWithAlbumidShouldRedirectToMusicMe() {
+    (new MusicmeFixtures())->logValidUser();
+    $this->dispatch('/modules/musicme/album_id/1', true);
+    $this->assertXPathContentContains('//script', 'http://linkmusicme.com/Nils-Van-Zandt/albums/Destination-Paradise-0000000063128.html?iduser=tom&ticket=ST-' . md5(Zend_Session::getId() . '1') . '&MediaLibraryID=QUEST&service=');
+
+  }
+
+
+
+  public function logValidUserNotAllowed() {
+    $user = $this->fixture('Class_Users',
+                           ['id' => 10,
+                            'login' => 'NotAllowed',
+                            'password' => 'pwd']);
+    $user
+      ->beAbonneSIGB()
+      ->setDateFin('9999-01-01')
+      ->setIdabon('2345')
+      ->setBib($this->fixture('Class_Bib',
+                              ['id' => 2,
+                               'libelle' => 'Annecy']))
+      ->setUserGroups([])
+      ->save();
+    ZendAfi_Auth::getInstance()->logUser($user);
+
+  }
+
+  /** @test */
+  public function viewNoticeMusicMeWithNotValidUserShouldDisplayCantAccess() {
+    $this->logValidUserNotAllowed();
+
+    $this->dispatch('/noticeajax/resnumeriques?id_notice=1', true);
+    $this->assertXPathContentContains('//p', utf8_encode('Votre abonnement ne permet pas d\'accéder à la ressource. Merci de contacter la médiathèque.'));
+
+
+  }
+
+
+  /** @test */
+  public function albumWithDoubleQuotesShouldReturnUrlWithoutDoubleQuotes() {
+    (new MusicmeFixtures())->logValidUser();
+    $this->dispatch('/modules/musicme/album_id/3', true);
+    $this->assertXPathContentContains('//script', 'http://linkmusicme.com/David-Bowie/albums/%22Heroes%22-0190295740580.html?iduser=tom&ticket=ST-' . md5(Zend_Session::getId() . '1') . '&MediaLibraryID=QUEST&service=', $this->_response->getBody());
+  }
+
+}
\ No newline at end of file
diff --git a/library/digital_resources/Musicme/tests/musicme.xml.gz b/library/digital_resources/Musicme/tests/musicme.xml.gz
new file mode 100644
index 0000000000000000000000000000000000000000..c513829de5eb4a61fc0d6788d69494e0c938b15a
Binary files /dev/null and b/library/digital_resources/Musicme/tests/musicme.xml.gz differ
diff --git a/library/digital_resources/Skilleos/Service/Parser.php b/library/digital_resources/Skilleos/Service/Parser.php
index 0a20bd917626c08aca71ec644f496509a299a533..d787b58dd13e557817b7491ebe2bc53c14caf970 100644
--- a/library/digital_resources/Skilleos/Service/Parser.php
+++ b/library/digital_resources/Skilleos/Service/Parser.php
@@ -50,5 +50,11 @@ class Skilleos_Service_Parser extends Class_WebService_BibNumerique_RessourceNum
     return Skilleos_Config::getInstance()->getDocTypeLabel();
   }
 
+
+  public function getBaseUrl() {
+    return Skilleos_Config::SKILLEOS_URL;
+  }
+
+
 }
 ?>
\ No newline at end of file
diff --git a/library/digital_resources/Skilleos/tests/SkilleosTest.php b/library/digital_resources/Skilleos/tests/SkilleosTest.php
index 544ddfea930066edbc7b8d5f39c4582f0aaf2b60..03f9e93ae65ff510521d5e214b3d4aa1c6c64f30 100644
--- a/library/digital_resources/Skilleos/tests/SkilleosTest.php
+++ b/library/digital_resources/Skilleos/tests/SkilleosTest.php
@@ -264,6 +264,12 @@ class SkilleosServiceHarvestTest extends SkilleosServiceTestCase {
   }
 
 
+  /** @test */
+  public function urlOriginShouldBeSet() {
+    $this->assertEquals('http://skilleos.com/sigb/sso/',Class_Album::find(1)->getUrlOrigine());
+  }
+
+
   /** @test */
   public function categoryShouldBeSkilleos() {
     $this->assertEquals('Cours en ligne Skilleos',Class_Album::find(1)->getCategoryLabel());
diff --git a/public/opac/js/digital_connectors.js b/public/opac/js/digital_connectors.js
index f9f924330f6e67a29266047614030fb5dff9f879..1082e08ffce508dbbc54a4e07f114fb590e47ec8 100644
--- a/public/opac/js/digital_connectors.js
+++ b/public/opac/js/digital_connectors.js
@@ -41,17 +41,6 @@
 		      "name" : "",
 		      "url" : "http://wiki.bokeh-library-portal.org/index.php/SoundCloud"}
   },
-  "MUSICME": {
-    "label" : "MusicMe", 
-    "enabled": "isMusicMeEnabled",
-    "url" : "http://www.musicme.com/", 
-    "image_url" : "http://bokeh-library-portal.org/userfiles/media/ressources_numeriques/musicMe.jpg", 
-    "desc": "musicMe est un site d'écoute et de téléchargement de musique.", 
-    "features": ["SSO"], 
-    "sales_contact": {"mail" : "",
-		      "name" : "",
-		      "url" : ""}
-  },
   "ARTEVOD": {
     "label" : "ArteVOD", 
     "enabled": "isArteVODEnabled",
diff --git a/tests/application/modules/admin/controllers/UserGroupControllerTest.php b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
index f58a398f5923cb6b6ff4f51f97677c8c572d2b87..4a79bed20cc44964ac72e0f9f414a1cacf8ece73 100644
--- a/tests/application/modules/admin/controllers/UserGroupControllerTest.php
+++ b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
@@ -1065,7 +1065,7 @@ class Admin_UserGroupControllerRessourcesNumeriquesTest extends Admin_UserGroupC
             ['Numilog', 'Numilog'],
             ['CVS', 'CVS'],
             ['ToutApprendre', 'Tout Apprendre'],
-            ['MusicMe', 'Music Me'],
+            ['Musicme', 'musicMe'],
             ['NumeriquePremium', 'Numérique Premium']];
   }
 
diff --git a/tests/application/modules/opac/controllers/AuthControllerTest.php b/tests/application/modules/opac/controllers/AuthControllerTest.php
index 76ed125f5e5a508bbb1e09eff05348e922076f0e..95234f89f68d935a144a63f1c553abc456265dfa 100644
--- a/tests/application/modules/opac/controllers/AuthControllerTest.php
+++ b/tests/application/modules/opac/controllers/AuthControllerTest.php
@@ -941,15 +941,26 @@ abstract class AuthControllerPostSimpleSuccessfulTestCase extends AuthController
 
   public function setUp() {
     parent::setUp();
-    $this->group_musicme = $this->fixture('Class_UserGroup',
-                                          ['id' => 20,
-                                           'libelle' => 'Multimedia'])
-                                ->addRight(Class_UserGroup::RIGHT_ACCES_MUSICME);
+    $group = $this->fixture('Class_UserGroup',
+                            ['id' => 20,
+                             'libelle' => 'Multimedia']);
+
+    Musicme_Config::getInstance()->getPermissions();
+    $permission_id = Class_Permission::findFirstBy(['code' => 'Musicme'])->getId();
+
+    $this->fixture('Class_UserGroup_Permission',
+                   ['id' => 1,
+                    'id_group' => 20,
+                    'id_permission' => $permission_id,
+                    'id_model' => null,
+                    'model_class' => null
+                   ]);
+
 
     $this->_marcel = Storm_Test_ObjectWrapper::on(
                                                   Class_Users::newInstanceWithId(2, ['nom' => 'Marcel','login' =>'foo'])
                                                   ->beAbonneSIGB()
-                                                  ->setUserGroups([$this->group_musicme]));
+                                                  ->setUserGroups([$group]));
 
     Class_Users::cacheInstance($this->_marcel);
 
@@ -1191,10 +1202,10 @@ class AuthControllerPostSuccessfulFromLecturaClientTest extends AuthControllerLe
 
 
 
-class AuthControllerPostSuccessfulFromMusicMeCASClientTest extends AuthControllerPostSimpleSuccessfulTestCase {
+class AuthControllerPostSuccessfulFromMusicmeCASClientTest extends AuthControllerPostSimpleSuccessfulTestCase {
   public function setUp() {
     parent::setUp();
-    RessourcesNumeriquesFixtures::activateMusicMe();
+    RessourcesNumeriquesFixtures::activateMusicme();
     $this->postDispatch('/opac/auth/login',
                         ['username' => 'foo',
                          'password' => 'bar',
@@ -1203,18 +1214,22 @@ class AuthControllerPostSuccessfulFromMusicMeCASClientTest extends AuthControlle
 
 
   /** @test */
-  public function responseShouldRedirectToMusicMeCasClientWithTicketAndBibId() {
+  public function responseShouldRedirectToMusicmeCasClientWithTicketAndBibId() {
     $ticket='ST-'.md5(Zend_Session::getId(). '2');
     $this->assertRedirectTo('http://musicmeurl/?iduser=foo&ticket='.$ticket.'&MediaLibraryID=888&service=http%3A%2F%2Fmusicmeurl%2F%3Fiduser%3Dfoo%26ticket%3D'.$ticket.'%26MediaLibraryID%3D888');
   }
 
+
   /** @test */
-  public function userFooMusicMeShouldBeLogged() {
+  public function userFooMusicmeShouldBeLogged() {
     $this->assertEquals('foo', Class_Users::getIdentity()->getLogin());
   }
 }
 
 
+
+
+
 class AuthControllerFromCASClientUserConnectedTest extends AuthControllerNobodyLoggedTestCase {
   public function setUp() {
     parent::setUp();
diff --git a/tests/application/modules/opac/controllers/CasServerControllerTest.php b/tests/application/modules/opac/controllers/CasServerControllerTest.php
index 135f1da0ffa4f91cf7bbec9e306e60955d9846e3..d4bbaec55b82b5b38cff48d2054a7c830214a0dd 100644
--- a/tests/application/modules/opac/controllers/CasServerControllerTest.php
+++ b/tests/application/modules/opac/controllers/CasServerControllerTest.php
@@ -148,59 +148,3 @@ class CasServerControllerValidateActionTest extends AbstractControllerTestCase {
     $this->assertRedirectTo('http://go-out.com');
   }
 }
-
-
-
-
-class CasServerControllerMusicMeValidateActionTest extends AbstractControllerTestCase {
-  protected $session_file_contents_logged;
-  protected $session_file_contents_nologin;
-
-  public function setUp() {
-    parent::setUp();
-    Storm_Cache::beVolatile();
-    $tom = Class_Users::newInstanceWithId(300,
-                                          ['nom' => 'Ate',
-                                           'prenom' => 'Tom']);
-    ZendAfi_Auth::getInstance()->logUser($tom);
-  }
-
-
-  /** @test */
-  public function requestMusicMeWithNoTicketShouldRespondAccountDisabledXML() {
-    $this->dispatch('/opac/cas-server/validate-musicme?MediaLibraryID=150&ticket=ST-0a1b2c3d');
-    $this->assertContains('<User />',$this->_response->getBody());
-  }
-
-
-  /** @test */
-  public function requestMusicMeWithValidTicketShouldRespondValidXML() {
-    $this->dispatch('/opac/cas-server/validate-musicme?ticket=ST-'.md5(Zend_Session::getId().'300').'&MediaLibraryID=http://test.com');
-    $this->assertContains('<ID>300</ID>',$this->_response->getBody());
-  }
-
-
-  /** @test */
-  public function musicmeUrlShouldContainsTicket0a1b2c3d() {
-    $expected_ticket = 'ST-'.md5(Zend_Session::getId().'300');
-    $this->assertContains('ticket='.$expected_ticket.'&', Class_MusicMeLink::forUser(Class_Users::find(300))->url());
-  }
-
-
-  /** @test */
-  public function casLoginActioShouldRedirectToServiceWithTicket() {
-    $this->dispatch('/opac/cas-server/login?service=http://test.com', true);
-    $this->assertRedirectTo(
-      'http://test.com?ticket='.(new Class_CasTicket())->getTicketForCurrentUser(),
-      $this->getResponseLocation());
-  }
-
-
-  /** @test */
-  public function casIndexActionShouldForwardToLoginAction() {
-    $this->dispatch('/opac/cas-server/?service=http://test.com', true);
-    $this->assertRedirectTo(
-      'http://test.com?ticket='.(new Class_CasTicket())->getTicketForCurrentUser(),
-      $this->getResponseLocation());
-  }
-}
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/ModulesControllerTest.php b/tests/application/modules/opac/controllers/ModulesControllerTest.php
index 61e5b59eab7c73748bf9805585edd06b4d4ebe06..0da2a6cd870383ac16fb131cf5417981a89dd736 100644
--- a/tests/application/modules/opac/controllers/ModulesControllerTest.php
+++ b/tests/application/modules/opac/controllers/ModulesControllerTest.php
@@ -350,37 +350,4 @@ class ModulesControllerBibliondemandSsoTest extends AbstractControllerTestCase {
     $this->dispatch('/modules/sso/id/21', true);
     $this->assertXPathContentContains('//script', 'document.location.href="http://numerique-pasdecalais.bibliondemand.com/logon.aspx?provider=SsoCas&sso-id=cg62-saintomer&returnUrl='. urlencode('http://music.1dtouch.com/users/auth/assa?dest=albums/137962&bibid=CG62').'"', $this->_response->getBody());
   }
-}
-
-
-
-
-
-class ModulesControllerMusicMeTest extends AbstractControllerTestCase {
-  protected $_storm_default_to_volatile = true;
-
-  public function setUp() {
-    parent::setUp();
-    Class_AdminVar::newInstanceWithId('MUSICME_URL',['valeur' => 'http://music_me.com/ecoute']);
-  }
-
-
-  /** @test */
-  public function responseShouldContainsRedirectToLogin() {
-    ZendAfi_Auth::getInstance()->clearIdentity();
-    $this->dispatch('/opac/modules/musicme');
-    $this->assertXpath('//script[contains(text(), "location.href=")][contains(text(), "auth/login?redirect=http")]');
-  }
-
-
-  /** @test */
-  public function shouldRedirectToNumilog() {
-    $group = $this->fixture('Class_UserGroup', ['id' => 1])
-                  ->addRight(Class_UserGroup::RIGHT_ACCES_MUSICME);
-
-    Class_Users::getIdentity()->setUserGroups([$group]);
-
-    $this->dispatch('/opac/modules/musicme');
-    $this->assertXpathContentContains('//script', 'document.location.href="http://music_me.com/ecoute');
-  }
-}
+}
\ No newline at end of file
diff --git a/tests/db/UpgradeDBTest.php b/tests/db/UpgradeDBTest.php
index 167ae3369a8328ef4247046988928016b01558b5..e559607d3b9b6049e0c58a5e0a72e49c02f9af24 100644
--- a/tests/db/UpgradeDBTest.php
+++ b/tests/db/UpgradeDBTest.php
@@ -1867,6 +1867,7 @@ class UpgradeDB_337_Test extends UpgradeDBTestCase {
 
 
 class UpgradeDB_338_Test extends UpgradeDBTestCase {
+  static $skilleos;
   public function prepare() {
     try {
       $this->query('ALTER TABLE multimedia_device DROP column note');
@@ -1878,3 +1879,41 @@ class UpgradeDB_338_Test extends UpgradeDBTestCase {
     $this->assertColumn('multimedia_device', 'note');
   }
 }
+
+
+
+class UpgradeDB_339_Test extends UpgradeDBTestCase {
+  static $skilleos, $lasouris, $lekiosk;
+  public function prepare() {
+    try {
+      $this->query('insert into album(titre, type_doc_id) values("bibifoc", "Skilleos")');
+      $this->query('insert into album(titre, type_doc_id) values("bibifoc", "LaSourisQuiRaconte ")');
+      $this->query('insert into album(titre, type_doc_id) values("bibifoc", "Lekiosk ")');
+
+      static::$skilleos = $this->query('select id from album where titre like "bibifoc" and type_doc_id = "Skilleos" limit 1')->fetch()['id'];
+      static::$lasouris = $this->query('select id from album where titre like "bibifoc" and type_doc_id = "LaSourisQuiRaconte" limit 1')->fetch()['id'];
+      static::$lekiosk = $this->query('select id from album where titre like "bibifoc" and type_doc_id = "Lekiosk" limit 1')->fetch()['id'];
+
+    } catch(Exception $e) {}
+  }
+
+  /** @test */
+  public function placeholderForMusicmeMigrationPatch() {}
+
+  /** @test */
+  public function skilleosShouldHaveUrlOrine() {
+    $this->assertEquals('http://skilleos.com/sigb/sso/',Class_Album::find(static::$skilleos)->getUrlOrigine());
+  }
+
+
+  /** @test */
+  public function laSourisQuiRaconteShouldHaveUrlOrine() {
+    $this->assertEquals('http://www.lasourisquiraconte.com',Class_Album::find(static::$lasouris)->getUrlOrigine());
+  }
+
+
+  /** @test */
+  public function leKioskShouldHaveUrlOrine() {
+    $this->assertEquals('http://www.lekiosk.com/',Class_Album::find(static::$lekiosk)->getUrlOrigine());
+  }
+}
diff --git a/tests/fixtures/RessourcesNumeriquesFixtures.php b/tests/fixtures/RessourcesNumeriquesFixtures.php
index a7ba10e1b5497b3652dc716ceecff7f28b182b19..3f0c9482648de85112a48fdcb4e89c6074aec41c 100644
--- a/tests/fixtures/RessourcesNumeriquesFixtures.php
+++ b/tests/fixtures/RessourcesNumeriquesFixtures.php
@@ -29,7 +29,7 @@ class RessourcesNumeriquesFixtures {
     self::deactivateNumeriquePremium();
     self::deactivateTypo3();
     self::disableCVS();
-    self::deactivateMusicMe();
+    self::deactivateMusicme();
     self::deactivate1Dtouch();
     self::deactivateMyCow();
     self::deactivatePlanetNemo();
@@ -51,7 +51,7 @@ class RessourcesNumeriquesFixtures {
     self::activateNumeriquePremium();
     self::activateTypo3();
     self::activateCVS();
-    self::activateMusicMe();
+    self::activateMusicme();
     self::activate1Dtouch();
     self::activateOrphea();
     self::activateMyCow();
@@ -163,15 +163,15 @@ class RessourcesNumeriquesFixtures {
   }
 
 
-  public static function activateMusicMe() {
-    Class_AdminVar::newInstanceWithId('MUSICME_URL',['valeur' => 'http://musicmeurl/']);
-    Class_AdminVar::newInstanceWithId('MUSICME_BIB_ID',['valeur' => '888']);
+  public static function activateMusicme() {
+    Class_AdminVar::newInstanceWithId('Musicme_URL',['valeur' => 'http://musicmeurl/']);
+    Class_AdminVar::newInstanceWithId('Musicme_BIB_ID',['valeur' => '888']);
   }
 
 
-  public static function deactivateMusicMe() {
-    Class_AdminVar::newInstanceWithId('MUSICME_URL',['valeur' => '']);
-    Class_AdminVar::newInstanceWithId('MUSICME_BIB_ID',['valeur' => '']);
+  public static function deactivateMusicme() {
+    Class_AdminVar::newInstanceWithId('Musicme_URL',['valeur' => '']);
+    Class_AdminVar::newInstanceWithId('Musicme_BIB_ID',['valeur' => '']);
   }
 
 
diff --git a/tests/library/Class/Migration/DigitalResource/AssimilTest.php b/tests/library/Class/Migration/DigitalResource/AssimilTest.php
index d1d36889922cfb3d110fab578e89b8d5da838168..d09e90e87495ab7f309801e33f0b74fed23e0a0b 100644
--- a/tests/library/Class/Migration/DigitalResource/AssimilTest.php
+++ b/tests/library/Class/Migration/DigitalResource/AssimilTest.php
@@ -65,13 +65,14 @@ class Class_Migration_DigitialResource_AssimilTest extends ModelTestCase {
 
     $profil_adulte = $this->fixture('Class_Profil',
                                     ['id' => 22,
-                                     'rewrite_url' => 'adulte'])
+                                     'parent_id' => null])
                           ->setBrowser('opac')
                           ->setLibelle('Profil Adulte')
                           ->setCfgMenus($cfg_menus);
 
     $profil_without_assimil = $this->fixture('Class_Profil',
                                              ['id' => 23,
+                                              'parent_id' => null,
                                               'rewrite_url' => 'adulte'])
                                    ->setBrowser('opac')
                                    ->setLibelle('Profil Adulte')
diff --git a/tests/library/Class/Migration/DigitalResource/MusicMeTest.php b/tests/library/Class/Migration/DigitalResource/MusicMeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..143d2900055f41fd544043a870a41c1e1b3b8882
--- /dev/null
+++ b/tests/library/Class/Migration/DigitalResource/MusicMeTest.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class Class_Migration_DigitialResource_MusicmeTest extends ModelTestCase {
+  protected
+    $_storm_default_to_volatile = true,
+    $_migration;
+
+  public function setUp() {
+    parent::setUp();
+    Class_DigitalResource::resetInstance();
+
+    $cfg_menus = ['H' => ['libelle' => 'Menu horizontal',
+                          'picto' => 'vide.gif',
+                          'menus' => [
+                                      ['type_menu' => 'MENU',
+                                       'libelle' => 'Pratique',
+                                       'picto' => 'bookmark.png',
+                                       'preferences' => [],
+                                       'sous_menus' => [
+                                                        ['type_menu' => 'ACCUEIL',
+                                                         'libelle' => 'Accueil',
+                                                         'picto' => 'vide.gif',
+                                                         'preferences' => [],
+                                                         'sous_menus' => ''],
+
+                                                        ['type_menu' => 'MUSICME',
+                                                         'libelle' => 'Lien vers Musicme',
+                                                         'preferences' => [],
+                                                         'picto' => 'vide.gif'] ]]]]];
+
+    $cfg_menus_without_lekiosk = ['H' => ['libelle' => 'Menu horizontal',
+                                          'picto' => 'vide.gif',
+                                          'menus' => [
+                                                      ['type_menu' => 'MENU',
+                                                       'libelle' => 'Pratique',
+                                                       'picto' => 'bookmark.png',
+                                                       'preferences' => [],
+                                                       'sous_menus' => [
+                                                                        ['type_menu' => 'ACCUEIL',
+                                                                         'libelle' => 'Accueil',
+                                                                         'picto' => 'vide.gif',
+                                                                         'preferences' => [],
+                                                                         'sous_menus' => ''] ]]]]];
+
+
+    $profil_adulte = $this->fixture('Class_Profil',
+                                    ['id' => 22,
+                                     'parent_id' => null])
+                          ->setBrowser('opac')
+                          ->setLibelle('Profil Adulte')
+                          ->setCfgMenus($cfg_menus);
+
+    $profil_without_lekiosk = $this->fixture('Class_Profil',
+                                             ['id' => 23,
+                                              'rewrite_url' => 'adulte'])
+                                   ->setBrowser('opac')
+                                   ->setLibelle('Profil Adulte')
+                                   ->setCfgMenus($cfg_menus_without_lekiosk);
+
+
+    Class_Profil::setCurrentProfil($profil_adulte);
+
+    $this->fixture('Class_UserGroup',
+                   ['id' => 2,
+                    'libelle' => 'team ONE',
+                    'rights_token' => pow(2, 7)]);
+
+    $this->fixture('Class_AdminVar',
+                   ['id' => 'MUSICME_URL',
+                    'valeur' => 'http://mediathequefr.musicme.com/']);
+
+    $this->fixture('Class_AdminVar',
+                   ['id' => 'MUSICME_BIB_ID',
+                    'valeur' => '123']);
+
+    $this->_migration = (new Class_Migration_DigitalResource_Musicme())
+      ->setMemoryCleaner(function(){})
+      ->run();
+  }
+
+
+  public function tearDown() {
+    Class_DigitalResource::resetInstance();
+    parent::tearDown();
+  }
+
+
+  /** @test */
+  public function adminVarMusicmeUrlShoudBeUpdated() {
+    $this->assertEquals(2, Class_AdminVar::count());
+    $this->assertNotNull(Class_AdminVar::findFirstBy(['clef' => 'Musicme_URL',
+                                                      'valeur' => 'http://mediathequefr.musicme.com/']));
+  }
+
+
+  /** @test */
+  public function adminVarMusicmeBibIdShoudBeUpdated() {
+    $this->assertEquals(2, Class_AdminVar::count());
+    $this->assertNotNull(Class_AdminVar::findFirstBy(['clef' => 'Musicme_BIB_ID',
+                                                      'valeur' => '123']));
+  }
+
+
+  /** @test */
+  public function profilMenuWithAssimilShouldContainsMusicme() {
+    $this->assertEquals('Musicme', Class_Profil::find(22)->getCfgMenusAsArray()['H']['menus'][0]['sous_menus'][1]['type_menu']);
+  }
+
+
+  /** @test */
+  public function teamOneShouldHavePermissionOnMusicme() {
+    if (!$permissions = Class_UserGroup::find(2)->getPermissions())
+      return $this->fail();
+    $this->assertEquals('Musicme', array_shift($permissions)->getCode());
+  }
+
+
+  /** @test */
+  public function teamOneRightsShouldBeCleaned() {
+    $this->assertEmpty(Class_UserGroup::find(2)->getRightsToken());
+  }
+}
diff --git a/tests/library/Class/MoteurRechercheTest.php b/tests/library/Class/MoteurRechercheTest.php
index 1b9102d782ac34a06c910f8d402835e544ad93dd..e5f2aafbb8ca7aa4e2e17a84a96b1d816dae99e4 100644
--- a/tests/library/Class/MoteurRechercheTest.php
+++ b/tests/library/Class/MoteurRechercheTest.php
@@ -309,13 +309,13 @@ class MoteurRechercheSimpleTest extends MoteurRechercheTestCase {
             [['expressionRecherche' => '',
               'digital_lib' => '1'],
              'nb_mots'=> 0,
-             'req_liste' => 'select id_notice, facettes from notices Where (type_doc in (\'100\',\'101\',\'102\',\'103\',\'104\',\'105\',\'106\',\'107\',\'108\',\'109\',\'110\',\'111\',\'112\',\'114\',\'113\',\'115\',\'116\',\'117\',\'119\',\'Assimil\',\'LaSourisQuiRaconte\',\'Lekiosk\',\'Omeka\',\'Skilleos\'))'],
+             'req_liste' => 'select id_notice, facettes from notices Where (type_doc in (\'100\',\'101\',\'102\',\'103\',\'104\',\'105\',\'106\',\'107\',\'108\',\'109\',\'110\',\'111\',\'112\',\'114\',\'113\',\'115\',\'116\',\'117\',\'119\',\'Assimil\',\'LaSourisQuiRaconte\',\'Lekiosk\',\'Musicme\',\'Omeka\',\'Skilleos\'))'],
 
 
             [['expressionRecherche' => 'logo',
               'digital_lib' => '1'],
              'nb_mots'=> 1,
-             'req_liste' => "select id_notice, facettes from notices Where " . $match_axes . " AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and (type_doc in ('100','101','102','103','104','105','106','107','108','109','110','111','112','114','113','115','116','117','119','Assimil','LaSourisQuiRaconte','Lekiosk','Omeka','Skilleos')) order by (MATCH(alpha_titre) AGAINST(' LOGO') * 1.5) + (MATCH(alpha_auteur) AGAINST(' LOGO')) desc"],
+             'req_liste' => "select id_notice, facettes from notices Where " . $match_axes . " AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and (type_doc in ('100','101','102','103','104','105','106','107','108','109','110','111','112','114','113','115','116','117','119','Assimil','LaSourisQuiRaconte','Lekiosk','Musicme','Omeka','Skilleos')) order by (MATCH(alpha_titre) AGAINST(' LOGO') * 1.5) + (MATCH(alpha_auteur) AGAINST(' LOGO')) desc"],
 
             [['expressionRecherche' => '',
               'id_panier' => 4],
diff --git a/tests/library/Class/MusicMeLinkTest.php b/tests/library/Class/MusicMeLinkTest.php
deleted file mode 100644
index ff7bd2c03948908e6b1fe691ae13f0b5a6eaa31d..0000000000000000000000000000000000000000
--- a/tests/library/Class/MusicMeLinkTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
- *
- * BOKEH is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * BOKEH is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
- */
-
-abstract class MusicMeLinkTestCase extends Storm_Test_ModelTestCase {
-  protected   $_http_client;
-  protected $_jerry;
-  public function setUp() {
-    parent::setUp();
-    $this->_http_client = Storm_Test_ObjectWrapper::mock();
-
-    Class_WebService_Abstract::setDefaultHttpClient($this->_http_client);
-    RessourcesNumeriquesFixtures::activateMusicMe();
-    $this->_jerry = Class_Users::getLoader()
-      ->newInstanceWithId(4)
-      ->setIdabon(34)
-      ->setLogin(34)
-      ->setPseudo('JKhan')
-      ->setPrenom('Jerry')
-      ->setNom('Khan')
-      ->setMail('feu@essence.fr')
-      ->setPassword('secret')
-      ->setDateFin('2023-09-02')
-      ->setNaissance('1977-06-27')
-      ->setBib(Class_Bib::newInstanceWithId(34, ['libelle' => 'Annecy']));
-
-    $this->_musicme = Class_MusicMeLink::forUser($this->_jerry);
-
-  }
-}
-
-
-
-class MusicMeLinkWithAbonTest extends MusicMeLinkTestCase {
-  /** @test */
-  public function urlWithLogginShouldBeMusicmeSSO() {
-    $this->assertEquals('http://musicmeurl/',
-                        $this->_musicme->baseUrl());
-  }
-
-/** @test */
-  public function musicMeUrlShouldExtractUrlFromResponse() {
-    $ticket='ST-'.md5( Zend_Session::getId() . '4');
-    $this->assertEquals('http://musicmeurl/?iduser=34&ticket='.$ticket.
-                        '&MediaLibraryID=888&service=http%3A%2F%2Fmusicmeurl%2F%3Fiduser%3D34%26ticket%3D'.$ticket.'%26MediaLibraryID%3D888',
-                        $this->_musicme->url());
-  }
-}
diff --git a/tests/library/Class/Systeme/ModulesMenu/MusicMeTest.php b/tests/library/Class/Systeme/ModulesMenu/MusicMeTest.php
deleted file mode 100644
index 2b5b54ba249e2531a19b9828b2d25b0d010b7548..0000000000000000000000000000000000000000
--- a/tests/library/Class/Systeme/ModulesMenu/MusicMeTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
- *
- * BOKEH is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * BOKEH is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
- */
-
-
-class Class_Systeme_ModulesMenu_MusicMeTest extends Storm_Test_ModelTestCase {
-  public function setUp() {
-    parent::setUp();
-    RessourcesNumeriquesFixtures::activate();
-    $this->menu = new Class_Systeme_ModulesMenu_MusicMe();
-    $this->user = $this->fixture('Class_Users', [
-      'id'=> 34 ,
-      'password' => 'toto' ,
-      'login' => '34',
-      'idabon' => 34,
-      'date_debut' => '1999-02-10',
-      'date_fin' => '2025-09-12',
-      'user_groups' => [$this->fixture('Class_UserGroup', [
-        'id' => 20, 
-        'libelle' => 'MusicMe'
-      ])->addRight(Class_UserGroup::RIGHT_ACCES_MUSICME)]
-    ])->beAbonneSIGB();
-    ZendAfi_Auth::getInstance()->logUser($this->user);
-    Zend_Registry::get('translate')->setLocale('fr');
-  }
-
-
-  /** @test */
-  public function urlWithUserLoggedShouldBeLink() {
-    $this->assertContains('musicme', $this->menu->getDynamiqueUrl());
-  }
-
-
-  /** @test */
-  public function urlWithAbonnementInvalidShouldBeJSAlertAbonnementInvalid() {
-    $this->user->setDateFin('2000-03-01');
-    $url = $this->menu->getDynamiqueUrl();    
-    $this->assertContains('Votre abonnement ne permet pas', $this->menu->getMessage());
-  }
-}
-?>
\ No newline at end of file
diff --git a/tests/library/Class/Systeme/ModulesMenuTest.php b/tests/library/Class/Systeme/ModulesMenuTest.php
index a410fe1a13277c9e8df46c9ddeeda23f6bf90261..e096899645344efa9ad0161025a3d87207a32f84 100644
--- a/tests/library/Class/Systeme/ModulesMenuTest.php
+++ b/tests/library/Class/Systeme/ModulesMenuTest.php
@@ -25,7 +25,7 @@ abstract class ModulesMenuBibNumeriqueTestCase extends Storm_Test_ModelTestCase
   public function availableServices() {
     return [
             ['VODECLIC', 'Vodeclic'],
-            ['MUSICME', 'MusicMe'],
+            ['MUSICME', 'Musicme'],
             ['LEKIOSK', 'LeKiosk'],
             ['TOUTAPPRENDRE', 'Tout Apprendre'],
             ['NUMILOG', 'Numilog'],
diff --git a/tests/library/ZendAfi/View/Helper/Status/JsonTest.php b/tests/library/ZendAfi/View/Helper/Status/JsonTest.php
index 05a316a898c77fa5ce24ad5bea76405cf017c1cc..31b40663fa242d4725d2ab4df66be98e371d832d 100644
--- a/tests/library/ZendAfi/View/Helper/Status/JsonTest.php
+++ b/tests/library/ZendAfi/View/Helper/Status/JsonTest.php
@@ -180,17 +180,6 @@ class ZendAfi_View_Helper_Status_JsonTest extends ZendAfi_View_Helper_Status_Tes
 
 
 
-  /** @test */
-  public function MusicMeShouldEnabled() {
-    $this->assertContains(["code" => "MUSICME",
-                           "label"  =>  "MusicMe",
-                           "enabled" => true,
-                           "features" => ["SSO"]
-                           ],
-                          $this->_report['digital_connectors']);
-  }
-
-
   /** @test */
   public function ToutApprendreShouldEnabled() {
     $this->assertContains(["code" => "TOUTAPPRENDRE",