diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc
index bb6562c9cd5c248f9e239176cbfff617ac0a5d2d..fac143b8527ef1c880c615f9fc5ff47808516fb9 100644
--- a/modules/mol/base/src/chain_view.cc
+++ b/modules/mol/base/src/chain_view.cc
@@ -221,17 +221,21 @@ void ChainView::RemoveResidue(ResidueView view) {
   if (!view.IsValid())
     return;
   view.RemoveAtoms();
-  int index = view.GetIndex();
   ResidueViewList::iterator i=data_->residues.begin();
   for (; i!=data_->residues.end(); ++i) {
-    int res_index = (*i).GetIndex();
     if (*i==view) {
-      data_->residues.erase(i);
+      break;
     }
-    else if(index < res_index){
+  }
+  ResidueViewList::iterator to_del = i;
+  int index = view.GetIndex();
+  for(; i!=data_->residues.end(); ++i) {
+    int res_index = (*i).GetIndex();
+    if(index < res_index){
       (*i).SetIndex(res_index-1);
     }
   }
+  data_->residues.erase(to_del);
 }
 
 ResidueView ChainView::AddResidue(const ResidueView& residue_view, 
diff --git a/modules/mol/base/tests/test_residue.cc b/modules/mol/base/tests/test_residue.cc
index 5b5dea5ebb813f3d100bc6fccc67618bb868fe92..332d60edd6534837b9511314b4a3aecceadbffae 100644
--- a/modules/mol/base/tests/test_residue.cc
+++ b/modules/mol/base/tests/test_residue.cc
@@ -45,4 +45,30 @@ BOOST_AUTO_TEST_CASE(test_in_sequence)
   BOOST_CHECK(!InSequence(rA,rC));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_CASE(test_res_index)
+{
+  EntityHandle eh=CreateEntity();
+  XCSEditor e=eh.RequestXCSEditor();
+  ChainHandle ch1=e.InsertChain("A");
+  ResidueHandle rA = e.AppendResidue(ch1, "A");
+  ResidueHandle rB = e.AppendResidue(ch1, "B");
+  ResidueHandle rC = e.AppendResidue(ch1, "C");
+  EntityView v(eh);
+  ChainView cv1(v, ch1);
+  ResidueView rvA = cv1.AddResidue(rA);
+  ResidueView rvB = cv1.AddResidue(rB);
+  ResidueView rvC = cv1.AddResidue(rC);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),0);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber()));
+  BOOST_CHECK_EQUAL(rvB.GetIndex(),1);
+  BOOST_CHECK_EQUAL(rvB.GetIndex(),cv1.GetResidueIndex(rvB.GetNumber()));
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),2);
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber()));
+  cv1.RemoveResidue(rvB);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),0);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber()));
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),1);
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber()));
+}
+
+BOOST_AUTO_TEST_SUITE_END()