diff --git a/modules/mol/alg/src/pdbize.cc b/modules/mol/alg/src/pdbize.cc
index 0eea5cb94b5eb05f39e0d3258a08a1994b5e4ab9..84853c6f0d20502c94d5bfb38f110ff3abf7b46d 100644
--- a/modules/mol/alg/src/pdbize.cc
+++ b/modules/mol/alg/src/pdbize.cc
@@ -134,9 +134,13 @@ void PDBize::Add(EntityView asu, const geom::Mat4List& transforms,
         last_rnum_ = 0;
       }
       char ins_code = chain.GetResidueCount()>1 ? 'A' : '\0';
-     
+
       for (ResidueViewList::const_iterator k = chain.GetResidueList().begin(),
            e3 = chain.GetResidueList().end(); k != e3; ++k) {
+        if (ins_code == 'Z'+1) {
+          ins_code = 'A';
+          last_rnum_+=1;
+        }
         ResidueHandle new_res = edi.AppendResidue(ligand_chain_, k->GetName(),
                                                   ResNum(last_rnum_+1, ins_code));
         transfer_residue_properties(*k, new_res);
diff --git a/modules/mol/alg/tests/test_pdbize.py b/modules/mol/alg/tests/test_pdbize.py
index 0048f9b3683c99be13f13380f1c94e4c04d7431a..5a180b95267938eab7b1b2240ef3a5848fb02fbe 100644
--- a/modules/mol/alg/tests/test_pdbize.py
+++ b/modules/mol/alg/tests/test_pdbize.py
@@ -25,6 +25,7 @@ class TestPDBize(unittest.TestCase):
       self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
     self.assertEqual(residues[26].number.num, 2)
     self.assertEqual(residues[26].number.ins_code, 'A')
+
   def test_starts_from_last_water_rnum(self):
     m = mol.CreateEntity()
     e = m.EditXCS(mol.BUFFERED_EDIT)
@@ -43,8 +44,55 @@ class TestPDBize(unittest.TestCase):
     self.assertEqual([r.number for r in residues],
                       [mol.ResNum(1, 'A'), mol.ResNum(1, 'B')])
 
+  def test_large_poly_ligand_inscode(self):
+    """Make sure polymeric ligands with 26+ residues get split up and do not
+    run into an overflow with the insertion codes.
+    """
+    m = mol.CreateEntity()
+    e = m.EditXCS(mol.BUFFERED_EDIT)
+    c = e.InsertChain("A");
+    e.SetChainType(c, mol.CHAINTYPE_OLIGOSACCHARIDE)
+    for i in range(27):
+      e.AppendResidue(c, "NAG")
+    pdbizer = mol.alg.PDBize(min_polymer_size=28)
+    transformations = geom.Mat4List()
+    transformations.append(geom.Mat4())
+    seqs = seq.CreateSequenceList()
+    pdbizer.Add(m.Select(''), transformations, seqs)
+    pdbized = pdbizer.Finish()
+    self.assertEqual([c.name for c in pdbized.chains], ["_"])
+    residues = pdbized.residues
+    for i in range(26):
+      self.assertEqual(residues[i].number.num, 1)
+      self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
+    self.assertEqual(residues[26].number.num, 2)
+    self.assertEqual(residues[26].number.ins_code, 'A')
 
-
+  def test_large_poly_ligand_resnum(self):
+    """Make sure polymeric ligands with 26 residues do not increase the residue
+    number by 2. Otherwise the next ligand is off by 1, like NAG26Z, ZN28.
+    """
+    m = mol.CreateEntity()
+    e = m.EditXCS(mol.BUFFERED_EDIT)
+    c = e.InsertChain("A");
+    e.SetChainType(c, mol.CHAINTYPE_OLIGOSACCHARIDE)
+    for i in range(26):
+      e.AppendResidue(c, "NAG")
+    c = e.InsertChain("B");
+    e.AppendResidue(c, "ZN")
+    pdbizer = mol.alg.PDBize(min_polymer_size=28)
+    transformations = geom.Mat4List()
+    transformations.append(geom.Mat4())
+    seqs = seq.CreateSequenceList()
+    pdbizer.Add(m.Select(''), transformations, seqs)
+    pdbized = pdbizer.Finish()
+    self.assertEqual([c.name for c in pdbized.chains], ["_"])
+    residues = pdbized.residues
+    for i in range(26):
+      self.assertEqual(residues[i].number.num, 1)
+      self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
+    self.assertEqual(residues[26].number.num, 2)
+    self.assertEqual(residues[26].number.ins_code, '\0')
 
 if __name__ == "__main__":
   from ost import testutils