diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index b4b097c1b8c8bdffcf29a3ccfac8ee9173a4abf0..e706d960d290df2905c51622e7b0c1c4edaef604 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -42,23 +42,23 @@ using boost::format;
 
 namespace {
 
-bool IEquals(const StringRef& a, const StringRef& b)
-{
-  if (a.size()!=b.size()) {
-    return false;
-  }
-  for (size_t i=0; i<a.size(); ++i) {
-    if (toupper(a[i])!=b[i]) {
+  bool IEquals(const StringRef& a, const StringRef& b)
+  {
+    if (a.size()!=b.size()) {
       return false;
     }
+    for (size_t i=0; i<a.size(); ++i) {
+      if (toupper(a[i])!=b[i]) {
+        return false;
+      }
+    }
+    return true;
   }
-  return true;
-}
 
-mol::ResNum to_res_num(int num, char ins_code)
-{
-  return mol::ResNum(num, ins_code==' ' ? '\0' : ins_code);
-}
+  mol::ResNum to_res_num(int num, char ins_code)
+  {
+    return mol::ResNum(num, ins_code==' ' ? '\0' : ins_code);
+  }
 
 }
 
@@ -776,8 +776,25 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
       curr_residue_=curr_chain_.FindResidue(res_num);
     }
     if (!curr_residue_.IsValid()) {
-      LOG_DEBUG("new residue " << res_name << " " << res_num);
-      curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num);
+      if(curr_chain_.GetResidueCount()>0 && profile_.join_spread_atom_records) {
+        int loc=curr_chain_.GetResidueCount()-1;
+        for(;loc>=0;--loc) {
+          if(curr_chain_.GetResidueByIndex(loc).GetNumber()<res_num) break;
+        }
+        if(loc<0) {
+          curr_residue_=editor.InsertResidueBefore(curr_chain_,0,res_num,res_name.str());
+        } else {
+          curr_residue_=editor.InsertResidueAfter(curr_chain_,loc,res_num,res_name.str());
+        }
+        if(!curr_residue_) {
+          // this should not happen...
+          curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num);
+        }
+        LOG_DEBUG("inserted new residue " << res_name << " " << res_num << " after " << loc);
+      } else {
+        curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num);
+        LOG_DEBUG("appended new residue " << res_name << " " << res_num);
+      }
       warned_name_mismatch_=false;
       ++residue_count_; 
     }