diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc
index 0fb3c18d540bc935797498799125095437b748ca..de1dbf8c6678263aecbb3a1a2ab4bb9671ac5f82 100644
--- a/modules/io/src/mol/mmcif_reader.cc
+++ b/modules/io/src/mol/mmcif_reader.cc
@@ -498,9 +498,11 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns)
   if (indices_[OCCUPANCY] != -1) { // unit test
     occ = this->TryGetReal(columns[indices_[OCCUPANCY]], "atom_site.occupancy");
   }
-  if (indices_[B_ISO_OR_EQUIV] != -1) { // unit test
-    temp = this->TryGetReal(columns[indices_[B_ISO_OR_EQUIV]],
-                            "atom_site.B_iso_or_equiv");
+  if (indices_[B_ISO_OR_EQUIV] != -1) {
+    if (!is_undef(columns[indices_[B_ISO_OR_EQUIV]])) {
+      temp = this->TryGetReal(columns[indices_[B_ISO_OR_EQUIV]],
+                              "atom_site.B_iso_or_equiv");
+    }
   }
 
   // determine element
@@ -521,7 +523,7 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns)
     update_residue=true;
   }
 
-  if(!curr_residue_) { // unit test
+  if(!curr_residue_) {
     update_residue=true;
     subst_res_id_ = cif_chain_name +
                     columns[indices_[AUTH_SEQ_ID]].str() +
diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc
index dd0f40fbb05d3dd2dcb1da55180d435111b0ff46..57fb3d3e0c629a0830f0450f3845b1702d7aef99 100644
--- a/modules/io/tests/test_mmcif_reader.cc
+++ b/modules/io/tests/test_mmcif_reader.cc
@@ -1521,4 +1521,88 @@ BOOST_AUTO_TEST_CASE(mmcif_pdbx_entity_branch_link_tests)
   BOOST_TEST_MESSAGE("  done.");
 }
 
+BOOST_AUTO_TEST_CASE(mmcif_atom_site_B_iso_or_equiv_tests)
+{
+  BOOST_TEST_MESSAGE("  Running mmcif_atom_site_B_iso_or_equiv_tests...");
+  mol::EntityHandle eh = mol::CreateEntity();
+  std::ifstream s("testfiles/mmcif/atom_site.mmcif");
+  IOProfile profile;
+  StarLoopDesc tmmcif_h;
+  TestMMCifReaderProtected tmmcif_p(s, eh, profile);
+  std::vector<StringRef> columns;
+
+  // set up dummy header to pre-set indices
+  SetAtomSiteHeader(&tmmcif_h);
+  // atom_site.auth_seq_id is not mandatory by standard but the reader,
+  // appears in 100% of PDB entries.
+  tmmcif_h.Add(StringRef("auth_seq_id", 11));
+  // atom_site.pdbx_PDB_ins_code is not mandatory by standard but the reader,
+  // but seems to be appear and set to '?' in PDB entries
+  tmmcif_h.Add(StringRef("pdbx_PDB_ins_code", 17));
+  tmmcif_h.Add(StringRef("B_iso_or_equiv", 14));
+  tmmcif_p.OnBeginLoop(tmmcif_h);
+
+  mol::AtomHandle a;
+
+  // check that the right values are read
+  BOOST_TEST_MESSAGE("          testing correct B-factors...");
+  {
+    // create dummy line to fetch B-factor
+    columns.push_back(StringRef("A", 1));
+    columns.push_back(StringRef("2", 1));
+    columns.push_back(StringRef(".", 1));
+    columns.push_back(StringRef("A", 1));
+    columns.push_back(StringRef("CA", 2));
+    columns.push_back(StringRef("VAL", 3));
+    columns.push_back(StringRef("1", 1));      // label_entity_id
+    columns.push_back(StringRef("1", 1));      // label_seq_id
+    columns.push_back(StringRef("C", 1));      // type_symbol
+    columns.push_back(StringRef("25.369", 6)); // Cartn_x
+    columns.push_back(StringRef("30.691", 6)); // Cartn_y
+    columns.push_back(StringRef("11.795", 6)); // Cartn_z
+    columns.push_back(StringRef("1", 1));      // auth_seq_id
+    columns.push_back(StringRef("?", 1));      // pdbx_PDB_ins_code
+    columns.push_back(StringRef("1.0", 3));    // B_iso_or_equiv
+
+    tmmcif_p.ParseAndAddAtom(columns);
+
+    a = eh.FindAtom("A", mol::ResNum(1), "CA");
+    BOOST_CHECK_EQUAL(a.GetBFactor(), 1.0);
+  }
+  BOOST_TEST_MESSAGE("          done.");
+  BOOST_TEST_MESSAGE("          testing blank B-factors...");
+  {
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.pop_back();
+    columns.push_back(StringRef("C", 1));
+    columns.push_back(StringRef("VAL", 3));
+    columns.push_back(StringRef("1", 1));      // label_entity_id
+    columns.push_back(StringRef("1", 1));      // label_seq_id
+    columns.push_back(StringRef("C", 1));      // type_symbol
+    columns.push_back(StringRef("25.369", 6)); // Cartn_x
+    columns.push_back(StringRef("30.691", 6)); // Cartn_y
+    columns.push_back(StringRef("11.795", 6)); // Cartn_z
+    columns.push_back(StringRef("1", 1));      // auth_seq_id
+    columns.push_back(StringRef("?", 1));      // pdbx_PDB_ins_code
+    columns.push_back(StringRef(".", 1)); // B_iso_or_equiv
+
+    tmmcif_p.ParseAndAddAtom(columns);
+
+    a = eh.FindAtom("A", mol::ResNum(1), "C");
+    BOOST_CHECK_EQUAL(a.GetBFactor(), 0.0);
+  }
+  BOOST_TEST_MESSAGE("          done.");
+  BOOST_TEST_MESSAGE("  done.");
+}
+
+
 BOOST_AUTO_TEST_SUITE_END();