diff -r 169e09206340 Core/DicomParsing/FromDcmtkBridge.cpp
--- a/Core/DicomParsing/FromDcmtkBridge.cpp	Fri Jan 18 17:10:24 2019 +0100
+++ b/Core/DicomParsing/FromDcmtkBridge.cpp	Tue Jan 22 13:59:03 2019 -0200
@@ -139,12 +139,8 @@
                              
 #else
   static void LoadExternalDictionary(DcmDataDictionary& dictionary,
-                                     const std::string& directory,
-                                     const std::string& filename)
+                                     const boost::filesystem::path p)
   {
-    boost::filesystem::path p = directory;
-    p = p / filename;
-
     LOG(WARNING) << "Loading the external DICOM dictionary " << p;
 
     if (!dictionary.loadDictionary(p.string().c_str()))
@@ -152,6 +148,43 @@
       throw OrthancException(ErrorCode_InternalError);
     }
   }
+
+  static void LoadExternalDictionaries(
+    DcmDataDictionary& dictionary,
+    std::list<boost::filesystem::path> dictionaries,
+    bool loadPrivateDictionary
+  ) {
+    for(
+      std::list<boost::filesystem::path>::iterator it = dictionaries.begin();
+      it != dictionaries.end();
+      it++
+    ) {
+      boost::filesystem::path file = *it;
+
+      if( boost::filesystem::is_regular_file( file ) && file.extension() == ".dic" )
+      {
+        std::string fileNameAsString( file.filename().string() );
+        if( fileNameAsString != "private.dic" || loadPrivateDictionary )
+        {
+          LoadExternalDictionary( dictionary, file );
+        }
+        else if( fileNameAsString == "private.dic" && !loadPrivateDictionary )
+        {
+          LOG(INFO) << "The dictionary of private tags has not been loaded";
+        }
+      }
+    }
+  }
+
+  static void SplitDcmDictPath( const std::string& dcmDictPath, std::list<boost::filesystem::path>& dictionaries )
+  {
+    std::string token;
+    std::istringstream tokenStream( dcmDictPath );
+    while( std::getline( tokenStream, token, ':' ) )
+    {
+      dictionaries.push_back( token );
+    }
+  }
 #endif
 
 
@@ -271,24 +304,35 @@
 
 #elif defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__) || defined(__OpenBSD__)
       std::string path = DCMTK_DICTIONARY_DIR;
+      std::list<boost::filesystem::path> dictionaries;
 
       const char* env = std::getenv(DCM_DICT_ENVIRONMENT_VARIABLE);
       if (env != NULL)
       {
         path = std::string(env);
-      }
-
-      LoadExternalDictionary(*locker, path, "dicom.dic");
-
-      if (loadPrivateDictionary)
-      {
-        LoadExternalDictionary(*locker, path, "private.dic");
+        SplitDcmDictPath( path, dictionaries );
       }
       else
       {
-        LOG(INFO) << "The dictionary of private tags has not been loaded";
+        boost::filesystem::path boostPath( path );
+
+        if( boost::filesystem::is_directory( boostPath ) )
+        {
+          for(
+            auto& dictionary
+              : boost::make_iterator_range( boost::filesystem::directory_iterator( boostPath ), boost::filesystem::directory_iterator() )
+          ) {
+            dictionaries.push_back( dictionary );
+          }
+         }
+        else
+        {
+          throw OrthancException( ErrorCode_InternalError, path + " (DCMTK_DICTIONARY_DIR) is not a directory" );
+        }
       }
 
+      LoadExternalDictionaries( *locker, dictionaries, loadPrivateDictionary );
+
 #else
 #error Support your platform here
 #endif
