diff --git a/common/include/Dict.hpp b/common/include/Dict.hpp
index e88d07f6614d91bdd6cb252bc9a742701c5779a7..2aef8884592237a46dd8f745b69809de03eb6cc6 100644
--- a/common/include/Dict.hpp
+++ b/common/include/Dict.hpp
@@ -42,7 +42,7 @@ class Dict
   void setState(State state);
   State getState() const;
   void save(std::FILE * destination, Encoding encoding) const;
-  bool readEntry(std::FILE * file, int * index, char * entry, Encoding encoding);
+  bool readEntry(std::FILE * file, int * index, int * nbOccsEntry, char * entry, Encoding encoding);
   void printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const;
   std::size_t size() const;
   int getNbOccs(int index) const;
diff --git a/common/src/Dict.cpp b/common/src/Dict.cpp
index ffaca442c3279215e237c523f50c445385395378..8199f8383e27062d18f40af6e40eeff41ac2563e 100644
--- a/common/src/Dict.cpp
+++ b/common/src/Dict.cpp
@@ -41,13 +41,17 @@ void Dict::readFromFile(const char * filename)
   elementsToIndexes.reserve(nbEntries);
 
   int entryIndex;
+  int nbOccsEntry;
   char entryString[maxEntrySize+1];
   for (int i = 0; i < nbEntries; i++)
   {
-    if (!readEntry(file, &entryIndex, entryString, encoding))
+    if (!readEntry(file, &entryIndex, &nbOccsEntry, entryString, encoding))
       util::myThrow(fmt::format("file '{}' line {} bad format", filename, i));
 
     elementsToIndexes[entryString] = entryIndex;
+    while (nbOccs.size() <= entryIndex)
+      nbOccs.emplace_back(0);
+    nbOccs[entryIndex] = nbOccsEntry;
   }
 
   std::fclose(file);
@@ -107,17 +111,19 @@ void Dict::save(std::FILE * destination, Encoding encoding) const
     printEntry(destination, it.second, it.first, encoding);
 }
 
-bool Dict::readEntry(std::FILE * file, int * index, char * entry, Encoding encoding)
+bool Dict::readEntry(std::FILE * file, int * index, int * nbOccsEntry, char * entry, Encoding encoding)
 {
   if (encoding == Encoding::Ascii)
   {
-    static std::string readFormat = "%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n";
-    return fscanf(file, readFormat.c_str(), index, entry) == 2;
+    static std::string readFormat = "%d\t%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n";
+    return fscanf(file, readFormat.c_str(), index, nbOccsEntry, entry) == 3;
   }
   else
   {
     if (std::fread(index, sizeof *index, 1, file) != 1)
       return false;
+    if (std::fread(nbOccsEntry, sizeof *nbOccsEntry, 1, file) != 1)
+      return false;
     for (unsigned int i = 0; i < maxEntrySize; i++)
     {
       if (std::fread(entry+i, 1, 1, file) != 1)
@@ -131,14 +137,17 @@ bool Dict::readEntry(std::FILE * file, int * index, char * entry, Encoding encod
 
 void Dict::printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const
 {
+  auto entryNbOccs = getNbOccs(index);
+
   if (encoding == Encoding::Ascii)
   {
-    static std::string printFormat = "%d\t%s\n";
-    fprintf(file, printFormat.c_str(), index, entry.c_str());
+    static std::string printFormat = "%d\t%d\t%s\n";
+    fprintf(file, printFormat.c_str(), index, entryNbOccs, entry.c_str());
   }
   else
   {
     std::fwrite(&index, sizeof index, 1, file);
+    std::fwrite(&entryNbOccs, sizeof entryNbOccs, 1, file);
     std::fwrite(entry.c_str(), 1, entry.size()+1, file);
   }
 }