diff --git a/modules/io/src/mol/mmcif_info.cc b/modules/io/src/mol/mmcif_info.cc
index 709cb8686401bbd779c2b8f8cfa5be646bf9bf00..f2c0bf7545634744acde58f727d06b350e885335 100644
--- a/modules/io/src/mol/mmcif_info.cc
+++ b/modules/io/src/mol/mmcif_info.cc
@@ -23,14 +23,22 @@
 
 namespace ost { namespace io {
 
-void MMCifInfo::AddMMCifPDBChainTr(String cif, String pdb)
+void MMCifInfo::AddMMCifPDBChainTr(String cif, String pdb, bool fault_tolerant)
 {
   std::map<String, String>::iterator tr_it = cif_2_pdb_chain_id_.find(cif);
   if (tr_it != cif_2_pdb_chain_id_.end()) {
-    throw IOException("mmCIF chain id '"+ cif +"' is already mapped to '"+
-                      tr_it->second+"'.");
+    std::stringstream msg;
+    msg << "mmCIF chain id '" <<  cif << "' is already mapped to '" <<
+           tr_it->second << "'. Cannot map it to '" <<  pdb << "'." ;
+    if(fault_tolerant) {
+      LOG_WARNING(msg.str());
+      return;
+    } else {
+      throw IOException(msg.str());
+    }
+  } else {
+    cif_2_pdb_chain_id_.insert(std::pair<String, String>(cif, pdb));
   }
-  cif_2_pdb_chain_id_.insert(std::pair<String, String>(cif, pdb));
 }
 
 String MMCifInfo::GetMMCifPDBChainTr(String cif) const
@@ -41,14 +49,22 @@ String MMCifInfo::GetMMCifPDBChainTr(String cif) const
   return tr_it->second;
 }
 
-void MMCifInfo::AddPDBMMCifChainTr(String pdb, String cif)
+void MMCifInfo::AddPDBMMCifChainTr(String pdb, String cif, bool fault_tolerant)
 {
   std::map<String, String>::iterator tr_it = pdb_2_cif_chain_id_.find(pdb);
   if (tr_it != pdb_2_cif_chain_id_.end()) {
-    throw IOException("PDB chain id '"+ pdb +"' is already mapped to '"+
-                      tr_it->second+"'.");
+    std::stringstream msg;
+    msg << "PDB chain id '" <<  pdb << "' is already mapped to '" <<
+           tr_it->second << "'. Cannot map it to '" <<  cif << "'." ;
+    if(fault_tolerant) {
+      LOG_WARNING(msg.str());
+      return;
+    } else {
+      throw IOException(msg.str());
+    }
+  } else {
+    pdb_2_cif_chain_id_.insert(std::pair<String, String>(pdb, cif));
   }
-  pdb_2_cif_chain_id_.insert(std::pair<String, String>(pdb, cif));
 }
 
 String MMCifInfo::GetPDBMMCifChainTr(String pdb) const
@@ -59,14 +75,23 @@ String MMCifInfo::GetPDBMMCifChainTr(String pdb) const
   return tr_it->second;
 }
 
-void MMCifInfo::AddMMCifEntityIdTr(String cif, String ent_id)
+void MMCifInfo::AddMMCifEntityIdTr(String cif, String ent_id, bool fault_tolerant)
 {
   std::map<String, String>::iterator tr_it = cif_2_entity_id_.find(cif);
   if (tr_it != cif_2_entity_id_.end()) {
-    throw IOException("mmCIF chain id '" + cif + "' is already mapped to "
-                      "entity id '" + tr_it->second + "'.");
+    std::stringstream msg;
+    msg << "mmCIF chain id '" <<  cif << "' is already mapped to " <<
+           "entity id '" << tr_it->second << "'. Cannot map it to '" <<
+           ent_id << "'." ;
+    if(fault_tolerant) {
+      LOG_WARNING(msg.str());
+      return;
+    } else {
+      throw IOException(msg.str());
+    }
+  } else {
+    cif_2_entity_id_.insert(std::pair<String, String>(cif, ent_id));
   }
-  cif_2_entity_id_.insert(std::pair<String, String>(cif, ent_id));
 }
 
 String MMCifInfo::GetMMCifEntityIdTr(String cif) const
diff --git a/modules/io/src/mol/mmcif_info.hh b/modules/io/src/mol/mmcif_info.hh
index 2892ae7c6ca18db874275884bf0f26b1fa22dd12..8cfb031cb9a7d3466cfd176ec66f576ad8c91b3f 100644
--- a/modules/io/src/mol/mmcif_info.hh
+++ b/modules/io/src/mol/mmcif_info.hh
@@ -1065,7 +1065,8 @@ public:
   ///
   /// \param cif chain name as used by the mmCIF file (label_asym_id)
   /// \param pdb chain name as used in the PDB file (auth_asym_id)
-  void AddMMCifPDBChainTr(String cif, String pdb);
+  void AddMMCifPDBChainTr(String cif, String pdb,
+                          bool fault_tolerant=false);
 
   /// \brief Get a PDB chain name for a CIF chain name
   ///
@@ -1077,7 +1078,8 @@ public:
   ///
   /// \param pdb chain name as used by the PDB file (auth_asym_id)
   /// \param cif chain name as used in the mmCIF file (label_asym_id)
-  void AddPDBMMCifChainTr(String pdb, String cif);
+  void AddPDBMMCifChainTr(String pdb, String cif,
+                          bool fault_tolerant=false);
 
   /// \brief Get a CIF chain name for a PDB chain name
   ///
@@ -1089,7 +1091,8 @@ public:
   ///
   /// \param cif chain name as used by the mmCIF file (label_asym_id)
   /// \param ent_id entity ID as used by the mmCIF file (label_entity_id)
-  void AddMMCifEntityIdTr(String cif, String ent_id);
+  void AddMMCifEntityIdTr(String cif, String ent_id,
+                          bool fault_tolerant=false);
 
   /// \brief Get the entity ID for a CIF chain name
   ///
diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc
index 2a3fed856f2fb29609c01a9ea329a4e31adcfb21..e95263b57e3f4bbb376bc5c61e46b5c135be49b7 100644
--- a/modules/io/src/mol/mmcif_reader.cc
+++ b/modules/io/src/mol/mmcif_reader.cc
@@ -608,7 +608,7 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns)
       curr_chain_.SetStringProp("entity_id", ent_id);
       chain_id_pairs_.push_back(std::pair<mol::ChainHandle,String>(curr_chain_,
                                                                    ent_id));
-      info_.AddMMCifEntityIdTr(cif_chain_name, ent_id);
+      info_.AddMMCifEntityIdTr(cif_chain_name, ent_id, profile_.fault_tolerant);
     }
     assert(curr_chain_.IsValid());
   } else if (chain_id_pairs_.back().second != // unit test
@@ -1865,12 +1865,14 @@ void MMCifReader::OnEndData()
       editor.SetChainDescription(css->first, edm_it->second.details);
       // Add chain mapping for all chains
       pdb_auth_chain_name = css->first.GetStringProp("pdb_auth_chain_name");
-      info_.AddMMCifPDBChainTr(css->first.GetName(), pdb_auth_chain_name);
+      info_.AddMMCifPDBChainTr(css->first.GetName(), pdb_auth_chain_name,
+                               profile_.fault_tolerant);
 
       if (edm_it->second.entity_type=="polymer") {
         // PDB -> mmCIF chain mapping only for polymers
         // This is not a 1:1 mapping because of ligands
-        info_.AddPDBMMCifChainTr(pdb_auth_chain_name, css->first.GetName());
+        info_.AddPDBMMCifChainTr(pdb_auth_chain_name, css->first.GetName(),
+                                 profile_.fault_tolerant);
       } else if (edm_it->second.entity_type=="non-polymer") {
         mol::ChainHandle chain=css->first;
         mol::ResidueHandleList residues=chain.GetResidueList();