diff --git a/VERSIONS_HOTLINE/50500 b/VERSIONS_HOTLINE/50500
new file mode 100644
index 0000000000000000000000000000000000000000..565cd501af81c844928b1ff8300d78ab0e30b13d
--- /dev/null
+++ b/VERSIONS_HOTLINE/50500
@@ -0,0 +1 @@
+ - ticket #50500 : Indexation : correction d'une erreur lorsqu'un niveau thesaurus dépassait 9999 éléments
\ No newline at end of file
diff --git a/cosmogramme/php/integration/domaines.php b/cosmogramme/php/integration/domaines.php
index 86d8f781dedd7a613826f8b228030621ad5cee6b..ec2cbd6179f52576816301656611f8713be17684 100644
--- a/cosmogramme/php/integration/domaines.php
+++ b/cosmogramme/php/integration/domaines.php
@@ -1,4 +1,4 @@
-<?PHP
+<?php
 /**
  * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
  *
@@ -18,55 +18,47 @@
  * along with BOKEH; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
-/////////////////////////////////////////////////////////////////////////
-// INTEGRATION DES RESERVATIONS
-/////////////////////////////////////////////////////////////////////////
-require_once("classe_transaction.php");
-setVariable("traitement_phase","Indexation des domaines");
+
+setVariable('traitement_phase', 'Indexation des domaines');
+
 if ($phase==16) {
-	$log->ecrire("<h4>Indexation des domaines</h4>");
-	unset($phase_data);
-	$reprise=false;
-	$phase_data["nombre"]=0;
-	$phase_data["nb_fic"]=0;
-	$phase_data["timeStart"]=time();
-	$phase_data["pointeur"]=0;
-	$phase_data["domaine"]=0;
+  $log->ecrire('<h4>Indexation des domaines</h4>');
+  unset($phase_data);
+  $reprise = false;
+  $phase_data['nombre'] = 0;
+  $phase_data['nb_fic'] = 0;
+  $phase_data['timeStart'] = time();
+  $phase_data['pointeur'] = 0;
+  $phase_data['domaine'] = 0;
 
-	$phase=17;
+  $phase=17;
 }
 
 if ($phase==17) {
-	$position_domaine=$phase_data["domaine"];
-// Indexation des catalogues dynamiques
-	$catalogues = array_slice(Class_Catalogue::findAllCataloguesAIndexer(),$position_domaine);
+  if ($mode_cron) {
+    $position_domaine = $phase_data['domaine'];
+    $catalogues = array_slice(Class_Catalogue::findAllCataloguesAIndexer(),
+                              $position_domaine);
 
-	foreach ($catalogues as $catalogue) {
-		$page=$phase_data["pointeur"];
-		$log->ecrire("Indexation du domaine : ".$catalogue->getLibelle()."<br/>");
-    $catalogue->index($page,
-                      function(&$phase_data) use ($page)
-                      {
-                        $phase_data['pointeur'] = $page;
-                      });
+    foreach ($catalogues as $catalogue) {
+      $page = $phase_data['pointeur'];
+      $log->ecrire('Indexation du domaine : '.$catalogue->getLibelle().'<br/>');
+      $catalogue->index($page);
 
-		$position_domaine++;
-		$phase_data["domaine"]=$position_domaine;
-		$phase_data["pointeur"]=0;
-	}
+      $position_domaine++;
+      $phase_data['domaine'] = $position_domaine;
+      $phase_data['pointeur'] = 0;
+    }
 
-	if ($mode_cron) {
-		$log->ecrire('<h4>Indexation des paniers dans les domaines</h4>');
-		Class_PanierNotice::indexAll();
+    $log->ecrire('<h4>Indexation des paniers dans les domaines</h4>');
+    Class_PanierNotice::indexAll();
 
-		$log->ecrire("<h4>Indexation des articles dans les domaines</h4>");
-		Class_Article::indexAll();
-
-		$log->ecrire("<h4>Indexation des sitothèques dans les domaines</h4>");
-		Class_Sitotheque::indexAll();
-	} else {
-		$log->ecrire("<h4>Les indexations des paniers, articles et sitothèques dans les domaines ne sont traitées qu'en mode cron</h4>");
-	}
-}
+    $log->ecrire('<h4>Indexation des articles dans les domaines</h4>');
+    Class_Article::indexAll();
 
-?>
\ No newline at end of file
+    $log->ecrire('<h4>Indexation des sitothèques dans les domaines</h4>');
+    Class_Sitotheque::indexAll();
+  } else {
+    $log->ecrire('<h4>Les indexations des domaines, des paniers, articles et sitothèques dans les domaines ne sont traitées qu\'en mode cron</h4>');
+  }
+}
\ No newline at end of file
diff --git a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php
index 70ceb22dd5deba2f3765e91b682891bfe1cc9ce4..7e48a68c4580289b5c14c0c3a1ac6cf3d1506152 100644
--- a/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php
+++ b/cosmogramme/tests/php/classes/KohaRecordIntegrationTest.php
@@ -217,8 +217,15 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec
                     'code' => 'summary'
                    ]);
 
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 6,
+                    'libelle' => 'Test',
+                    'id_thesaurus' => 'TEST',
+                    'id_origine' => null,
+                    'code' => 'TEST',
+                    'rules' => '{"label":"610$a"}']);
 
-		$loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifThesaurus');
+		$loader = $this->onLoaderOfModel('Class_CodifThesaurus');
 		$loader
 			->whenCalled('findFirstBy')
 			->with(['code' => 'authors',
@@ -243,12 +250,14 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec
 		$this->assertEquals('Vagabond n° 4', $this->_notice->getTitrePrincipal());
 	}
 
+
   /** @test */
   public function noSumm0002ShouldBeCreated() {
     $entry = Class_CodifThesaurus::findAllBy(['libelle' => 'd\'après l\'oeuvre d\'Eiji Yoshikawa, "Miyamoto Musashi"']);
 		$this->assertCount(1, $entry);
   }
 
+
   /** @test */
 	public function facetsShouldContainsHAUTH0001() {
 		$this->assertContains('HAUTH0001', $this->_notice->getFacetCodes());
@@ -268,6 +277,7 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec
 													$this->_notice->getFacettes());
 	}
 
+
   /** @test */
 	public function entryForYoshikawaShouldBeCreated() {
 		$entry = Class_CodifThesaurus::findFirstBy(['id_thesaurus' => 'AUTH0002']);
@@ -276,6 +286,101 @@ class KohaRecordIntegrationVagabondWithThesaurusOn702DollarATest extends KohaRec
 												$entry->getLibelle());
 	}
 
+
+  /** @test */
+  public function shouldCreateThesaurusFor610_a() {
+    $this->assertNotNull(Class_CodifThesaurus::findFirstBy(['id_thesaurus' => 'TEST0001',
+                                                            'libelle' => 'Manga']));
+  }
 }
 
-?>
\ No newline at end of file
+
+
+class KohaRecordIntegrationVagabondWithTooMany610aTest extends KohaRecordIntegrationTestCase {
+	public function setUp() {
+		parent::setUp();
+
+		$this->fixture('Class_CodifThesaurus',
+									 ['id' => 1,
+										'libelle' => 'Author',
+										'id_thesaurus' => 'AUTH',
+										'id_origine' => null,
+										'code' => 'authors',
+										'rules' => '{"label":"702$a"}']);
+
+
+		$marcel = $this->fixture('Class_CodifThesaurus',
+									 ['id' => 2,
+										'libelle' => 'Marcel',
+										'id_thesaurus' => 'AUTH0001',
+										'id_origine' => 'MARCEL',
+										'code' => 'authors',
+										'rules' => null]);
+
+
+		$docu = $this->fixture('Class_CodifThesaurus',
+													 ['id' => 3,
+														'libelle' => 'Document',
+														'id_thesaurus' => 'DOCU',
+														'id_origine' => null,
+														'code' => 'document',
+														'rules' => '{"label":" 99$t "}']);
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 4,
+                    'libelle' => 'Summary',
+                    'id_thesaurus' => 'SUMM',
+                    'id_origine' => null,
+                    'code' => 'summary',
+                    'rules' => '{"label":" 200$g "}']);
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 5,
+                    'libelle' => 'd\'après l\'oeuvre d\'Eiji Yoshikawa, "Miyamoto Musashi"',
+                    'id_thesaurus' => 'SUMM0001',
+                    'id_origine' => 'D\'APRèS L\'OEUVRE D\'E',
+                    'code' => 'summary'
+                   ]);
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id' => 6,
+                    'libelle' => 'Test',
+                    'id_thesaurus' => 'TEST',
+                    'id_origine' => null,
+                    'code' => 'TEST',
+                    'rules' => '{"label":"610$a"}']);
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id_thesaurus' => 'TEST9999',
+                    'id_origine' => 'RIME',
+                    'libelle' => 'rime',
+                    'code' => 'TEST',
+                    'id' => 10722,
+                    'libelle_facette' => 'rime',
+                    'rules' => null]);
+
+		$loader = $this->onLoaderOfModel('Class_CodifThesaurus');
+		$loader
+			->whenCalled('findFirstBy')
+			->with(['code' => 'authors',
+							'where' => 'id_thesaurus like "AUTH%"',
+							'order' => 'id_thesaurus desc'])
+			->answers($marcel)
+
+			->whenCalled('findFirstBy')
+			->with(['code' => 'document',
+							'where' => 'id_thesaurus like "DOCU%"',
+							'order' => 'id_thesaurus desc'])
+			->answers($docu);
+
+
+		$this->loadNotice('unimarc_vagabond');
+		$this->_notice = Class_Notice::find(1);
+	}
+
+
+  /** @test */
+  public function shouldNotCreateThesaurusFor610_a() {
+    $this->assertNull(Class_CodifThesaurus::findFirstBy(['libelle' => 'Manga']));
+  }
+}
\ No newline at end of file
diff --git a/library/Class/CodifThesaurus.php b/library/Class/CodifThesaurus.php
index 11188fedaf492ab40ea1a665a7856a19c89d96a9..7ce47599de34610a089b606d58f36dd0197e2a2a 100644
--- a/library/Class/CodifThesaurus.php
+++ b/library/Class/CodifThesaurus.php
@@ -256,6 +256,7 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
 
   const
     COLUMN_ORIGIN_SIZE = 20,
+    ID_KEY_LENGTH = 4,
 
     CODE_FACETTE = 'H',
     CODE_CATALOGUE = 'Catalogue',
@@ -329,8 +330,7 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
     $loader = $this->getLoader();
     $code = $this->getCode();
     return $loader->newInstance(['code' => $code,
-                                 'id_thesaurus' => $loader->findNextThesaurusChildId(
-                                                                                     $code,
+                                 'id_thesaurus' => $loader->findNextThesaurusChildId($code,
                                                                                      $this->getIdThesaurus())]);
   }
 
@@ -350,9 +350,8 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
       ->newChildEntry()
       ->updateAttributes(['id_origine' => $id_origine,
                           'libelle' => $label]);
-    $entry->assertSave();
 
-    return $entry;
+    return $entry->save() ? $entry : null;
   }
 
 
@@ -370,7 +369,9 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
 
 
   public function validate() {
-    $this->check('' != $this->getLibelle(), $this->_('Vous devez définir le libellé'));
+    $this->_validateIdThesaurus();
+
+    $this->checkAttribute('libelle', '' != $this->getLibelle(), $this->_('Vous devez définir le libellé'));
     if (!$this->getRules())
       return true;
 
@@ -381,6 +382,17 @@ class Class_CodifThesaurus extends Storm_Model_Abstract {
   }
 
 
+  protected function _validateIdThesaurus() {
+    $my_key = substr($this->getIdThesaurus(), -self::ID_KEY_LENGTH);
+    $empty_key = str_repeat('0', self::ID_KEY_LENGTH);
+
+    $this->checkAttribute('id_thesaurus',
+                          $my_key != $empty_key,
+                          $this->_('Nombre maximum d\'élément à ce niveau déjà atteint (%s)',
+                                   str_repeat('9', self::ID_KEY_LENGTH)));
+  }
+
+
   public function deleteMeAndMyChildren() {
     $this->cleanRecords();
     $this->getLoader()->deleteAllFrom($this);
diff --git a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
index 18ace745434a3f164185c3637408fb1c2af6b318..b4ebb7757f62ba609921ed04a71606fc9fdfb759 100644
--- a/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
+++ b/library/Class/Indexation/PseudoNotice/FacettesVisitor.php
@@ -154,9 +154,9 @@ class Class_Indexation_PseudoNotice_FacettesVisitor extends Class_Indexation_Pse
       return;
 
     foreach($value->getValueAsArray() as $one_value) {
-      $thesaurus = $this
-        ->_ensureThesaurusUnderWithValue($this->_ensureThesaurusFor($field),
-                                       $one_value);
+      if (!$thesaurus = $this->_ensureThesaurusUnderWithValue($this->_ensureThesaurusFor($field),
+                                                              $one_value))
+        continue;
       $this->_facettes[] = $thesaurus->getFacetteIndex();
     }
   }
diff --git a/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php b/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php
index e71267254c8bbce02ae02b66defc897d8ff6de5d..342504fba65f0d8301ba68aa6c88552b213896cb 100644
--- a/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php
+++ b/tests/application/modules/admin/controllers/CmsControllerCustomFieldsTest.php
@@ -173,6 +173,51 @@ class CmsControllerCustomFieldsAndIndexationPostEditActionTest
 
 
 
+
+class CmsControllerCustomFieldsAndIndexationPostEditWithTooManyValueActionTest
+  extends CmsControllerCustomFieldsTestCase {
+  protected
+    $_record,
+    $_field_thesaurus,
+    $_value_thesaurus;
+
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id_thesaurus' => 'CFCF00019999',
+                    'id_origine' => 'newbies',
+                    'libelle' => 'newbies',
+                    'code' => Class_CodifThesaurus::CODE_CUSTOMFIELDS,
+                    'id' => 10722,
+                    'libelle_facette' => 'newbies',
+                    'rules' => null]);
+
+    $this->postDispatch('admin/cms/edit/id/1',
+                        ['titre' => 'News Article',
+                         'contenu' => 'Welcome',
+                         'indexation' => 1,
+                         'status' => Class_Article::STATUS_VALIDATED,
+                         'field_5' => 'Hardcore gamers',
+                         'debut' => '',
+                         'fin' => '',
+                         'events_debut' => '',
+                         'events_fin' => '']);
+
+    $this->_value_thesaurus = Class_CodifThesaurus::findFirstBy(['libelle' => 'Hardcore gamers']);
+  }
+
+
+  /** @test */
+  public function shouldNotCreateNewThesaurus() {
+    $this->assertNull($this->_value_thesaurus);
+  }
+}
+
+
+
+
 class CmsControllerCustomFieldsNotIndexableMetaPostEditActionTest
   extends CmsControllerCustomFieldsTestCase {
 
diff --git a/tests/library/Class/CodifThesaurusTest.php b/tests/library/Class/CodifThesaurusTest.php
index f16b854ce2f069bedc5d02db2dd27e637a97c423..44f32e25bd1065c662ec9a35f11412dbd1e307e8 100644
--- a/tests/library/Class/CodifThesaurusTest.php
+++ b/tests/library/Class/CodifThesaurusTest.php
@@ -147,4 +147,45 @@ class CodifThesaurusDeleteTest extends ModelTestCase {
   public function recordShouldNotHaveFacetHCFCF() {
     $this->assertEquals('T8 A3452', $this->_record->getFacettes());
   }
+}
+
+
+
+/** @see http://forge.afi-sa.fr/issues/50500 */
+class CodifThesaurusTooManyValuesTest extends ModelTestCase {
+  protected $_storm_default_to_volatile = true;
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id_thesaurus' => 'TEST',
+                    'id_origine' => null,
+                    'libelle' => 'test',
+                    'code' => 'TEST',
+                    'id' => 723,
+                    'libelle_facette' => 'test',
+                    'rules' => '{"label":"610$a"}']);
+
+    $this->fixture('Class_CodifThesaurus',
+                   ['id_thesaurus' => 'TEST9999',
+                    'id_origine' => 'RIME',
+                    'libelle' => 'rime',
+                    'code' => 'TEST',
+                    'id' => 10722,
+                    'libelle_facette' => 'rime',
+                    'rules' => null]);
+  }
+
+
+  /** @test */
+  public function shouldNotInsertMoreThan9999Child() {
+    Class_CodifThesaurus::find(723)
+      ->getOrCreateChild(strtoupper('métiers de la recherche'),
+                         'métiers de la recherche');
+
+    $this->assertEquals(2, Class_CodifThesaurus::count(),
+                        Class_CodifThesaurus::findFirstBy(['order' => 'id desc'])
+                        ->getIdThesaurus());
+  }
 }
\ No newline at end of file