diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index 5a628c2ccfe769d5c6144281a03966cd6adc8adc..938fc23f78527c74786c0b964583ff8db7775333 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -250,7 +250,8 @@ void PDBReader::AssignSecStructure(mol::EntityHandle ent)
     // two secondary structure segments to insert one residue of coil 
     // conformation.
     mol::ResNum start=i->start, end=i->end;
-    if (helix_list_.end()!=i+1 && (*(i+1)).start.GetNum()<=end.GetNum()+1) {
+    if (helix_list_.end()!=i+1 && (*(i+1)).start.GetNum()<=end.GetNum()+1 &&
+        (*(i+1)).end.GetNum()>end.GetNum()) {
       end=mol::ResNum((*(i+1)).start.GetNum()-2);
     }
     chain.AssignSecondaryStructure(alpha, start, end);
@@ -266,7 +267,8 @@ void PDBReader::AssignSecStructure(mol::EntityHandle ent)
     mol::SecStructure extended(mol::SecStructure::EXTENDED);
     mol::ResNum start=i->start, end=i->end;
     // see comment for helix assignment
-    if (strand_list_.end()!=i+1 && (*(i+1)).start.GetNum()<=end.GetNum()+1) {
+    if (strand_list_.end()!=i+1 && (*(i+1)).start.GetNum()<=end.GetNum()+1 &&
+        (*(i+1)).end.GetNum()>end.GetNum()) {
       end=mol::ResNum((*(i+1)).start.GetNum()-2);
     }    
     chain.AssignSecondaryStructure(extended, start, end);
@@ -612,7 +614,7 @@ void PDBReader::ParseStrandEntry(const StringRef& line)
     throw IOException(str(format("invalid strand entry on line %d")%line_num_));
   }
   LOG_DEBUG("making strand entry: " << start_num.second << ", " << line[26] 
-             << " " << end_num.second << " " << line[37]);
+            << " " << end_num.second << " " << line[37] << " chain=" << line[21]);
   HSEntry hse = {to_res_num(start_num.second, line[26]),
                  to_res_num(end_num.second, line[37]),
                  line.substr(21,1).str()};
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index 1a2e0e1378a52a4659b39ea53ee0db6e33f1d65f..c6b3192d3b5b3c55740e24a7d87ad0302cd6c9d4 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -341,11 +341,23 @@ void ChainImpl::AssignSecondaryStructure(SecStructure ss,
                                          const ResNum& start, 
                                          const ResNum& end)
 {
-  int i=this->GetIndex(start);
-  int j=this->GetIndex(end);
-  if (i>=0 && j>=0 && i<=j && j<static_cast<int>(residue_list_.size())) {
-    std::for_each(residue_list_.begin()+i, residue_list_.begin()+j+1,
-                  bind(&ResidueImpl::SetSecStructure, _1, ss));
+  int start_index=this->GetIndex(start);
+  int i=start_index;
+  bool found_end=false;
+  if (i>=0) {
+    while (i<static_cast<int>(residue_list_.size())) {
+      if (residue_list_[i]->GetNumber()==end) {
+        found_end=true;
+        break;
+      }
+      ++i;
+    }
+  }
+  if (!found_end) {
+    return;
+  }
+  for (int end=i, i=start_index; i<=end; ++i) {
+    residue_list_[i]->SetSecStructure(ss);
   }
 }