diff --git a/modules/io/src/mol/entity_io_mae_handler.cc b/modules/io/src/mol/entity_io_mae_handler.cc
index 6a5306b055c44f7d6c6ccc82f5defa8c1acd1d35..f52a9b6b8681fc395590bf7d5f1bbaef758a7615 100644
--- a/modules/io/src/mol/entity_io_mae_handler.cc
+++ b/modules/io/src/mol/entity_io_mae_handler.cc
@@ -297,7 +297,23 @@ void MAEReader::parse_and_add_atom(mol::EntityHandle ent,
 
   if(update_residue) {
     if (!(curr_residue_=curr_chain_.FindResidue(rnum))) {
-      curr_residue_=editor.AppendResidue(curr_chain_, rkey, rnum);
+      if(curr_chain_.GetResidueCount()>0) {
+        int loc=curr_chain_.GetResidueCount()-1;
+        for(;loc>=0;--loc) {
+          if(curr_chain_.GetResidueByIndex(loc).GetNumber()<rnum) break;
+        }
+        if(loc<0) {
+          curr_residue_=editor.InsertResidueBefore(curr_chain_,0,rnum,rkey);
+        } else {
+          curr_residue_=editor.InsertResidueAfter(curr_chain_,loc,rnum,rkey);
+        }
+        if(!curr_residue_) {
+          // this should not happen...
+          curr_residue_=editor.AppendResidue(curr_chain_, rkey, rnum);
+        }
+      } else {
+        curr_residue_=editor.AppendResidue(curr_chain_, rkey, rnum);
+      }
       assert(curr_residue_.IsValid());
       LOG_TRACE(" new residue " << curr_residue_);
       ++residue_count_;