diff --git a/modules/conop/src/heuristic.cc b/modules/conop/src/heuristic.cc
index cecf6dcb2df8996a41b7685877e5c40518bac4b5..8c5277206ce487c7b9496b876f7422651db5c28c 100644
--- a/modules/conop/src/heuristic.cc
+++ b/modules/conop/src/heuristic.cc
@@ -32,14 +32,16 @@ namespace ost { namespace conop {
 
 void HeuristicProcessor::ProcessUnkResidue(DiagnosticsPtr diags, 
                                            mol::ResidueHandle res) const {
-  res.SetChemClass(GuessChemClass(res));
   mol::AtomHandleList atoms = res.GetAtomList(); 
   for (mol::AtomHandleList::iterator 
        i = atoms.begin(), e = atoms.end(); i != e; ++i) {
     mol::AtomHandle a = *i;
     if (!Conopology::Instance().IsValidElement(a.GetElement()))
-      a.SetElement(GuessAtomElement(a.GetName(), a.IsHetAtom()));
+      a.SetElement(GuessAtomElement(a.GetName(), atoms.size()));
   }
+
+  res.SetChemClass(GuessChemClass(res));
+
   if (!this->GetConnect()) { return; }
   for (mol::AtomHandleList::iterator 
        i = atoms.begin(), e = atoms.end(); i != e; ++i) {
@@ -64,6 +66,9 @@ void HeuristicProcessor::DoProcess(DiagnosticsPtr diags,
       if (!compound) {
         // process unknown residue...
         this->ProcessUnkResidue(diags, residue);
+        if (this->GetConnectAminoAcids()) 
+          this->ConnectResidues(prev, residue);
+        prev = residue;
         continue;
       }
       this->ReorderAtoms(residue, compound, true);  
diff --git a/modules/conop/src/processor.cc b/modules/conop/src/processor.cc
index d8f5c269837dd4f38a892b5fc8996ee4e9986656..4ce93eba6d6fcc2f1df40dc64d1ab92fc8f950df 100644
--- a/modules/conop/src/processor.cc
+++ b/modules/conop/src/processor.cc
@@ -115,6 +115,7 @@ void AssignBackboneTorsions(mol::ResidueHandle prev,
     }
   }
 } 
+
 mol::ChemClass GuessChemClass(mol::ResidueHandle res)
 {
   mol::AtomHandle ca=res.FindAtom("CA");
@@ -131,7 +132,8 @@ mol::ChemClass GuessChemClass(mol::ResidueHandle res)
   }
   return mol::ChemClass();
 }
-String GuessAtomElement(const String& aname, bool hetatm)
+
+String GuessAtomElement(const String& aname, int atom_count)
 {
   static String l1[] = {
     "H","C","N","O","P","S","K"
@@ -156,7 +158,7 @@ String GuessAtomElement(const String& aname, bool hetatm)
   if(ele[0]=='H') {
     return "H";
   }
-  if (hetatm==false) {
+  if (atom_count > 1) {
     if (ele=="CA" || ele=="CB") {
       return "C";
     }
diff --git a/modules/conop/src/processor.hh b/modules/conop/src/processor.hh
index 6001b5cbfa32b8610ef73753256515276f583f43..d66f6ccbc65459e16933bea7cc7053d5770d3b73 100644
--- a/modules/conop/src/processor.hh
+++ b/modules/conop/src/processor.hh
@@ -126,7 +126,7 @@ String DLLEXPORT_OST_CONOP StringFromConopAction(ConopAction action);
 
 
 /// \brief guess element of atom based on name and hetatm flag
-String DLLEXPORT_OST_CONOP GuessAtomElement(const String& atom_name, bool hetatm);
+String DLLEXPORT_OST_CONOP GuessAtomElement(const String& atom_name, int atom_count);
 
 /// \brief guess chemclass based on atoms of residue
 mol::ChemClass DLLEXPORT_OST_CONOP GuessChemClass(mol::ResidueHandle res);
diff --git a/modules/conop/src/rule_based.cc b/modules/conop/src/rule_based.cc
index 2a18ddb20360158baf6d1ac950568dfa05058ff5..c4c870005e5c3d33332c921a5c371b89cfdbe834 100644
--- a/modules/conop/src/rule_based.cc
+++ b/modules/conop/src/rule_based.cc
@@ -63,7 +63,7 @@ void RuleBasedProcessor::DoProcess(DiagnosticsPtr diags,
         mol::AtomHandleList unk_atoms;
         unk_atoms = GetUnknownAtomsOfResidue(residue, compound, 
                                              this->GetStrictHydrogens());
-        this->ProcessUnkAtoms(diags, unk_atoms, atoms_to_connect);
+        this->ProcessUnkAtoms(diags, residue, unk_atoms, atoms_to_connect);
         residue.SetChemClass(mol::ChemClass(mol::ChemClass::UNKNOWN));
         residue.SetChemType(mol::ChemType(mol::ChemType::UNKNOWN));
         residue.SetOneLetterCode('?');
@@ -102,7 +102,7 @@ void RuleBasedProcessor::ProcessUnkResidue(DiagnosticsPtr diags,
          e = atoms.end(); i !=e; ++i) {
       remaining_atoms.push_back(*i);
       if (!Conopology::Instance().IsValidElement(i->GetElement()))
-        i->SetElement(GuessAtomElement(i->GetName(), i->IsHetAtom()));
+        i->SetElement(GuessAtomElement(i->GetName(), atoms.size()));
     }
   }
   // Don't do anything if treatment is set to SILENT
@@ -129,6 +129,7 @@ void RuleBasedProcessor::ProcessUnkResidue(DiagnosticsPtr diags,
 }
 
 void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags,
+                                         mol::ResidueHandle res,
                                          mol::AtomHandleList unks,
                                          mol::AtomHandleList& remaining_atoms) const
 {
@@ -138,7 +139,7 @@ void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags,
          e = unks.end(); i !=e; ++i) {
       remaining_atoms.push_back(*i);
       if (!Conopology::Instance().IsValidElement(i->GetElement()))
-        i->SetElement(GuessAtomElement(i->GetName(), i->IsHetAtom()));
+        i->SetElement(GuessAtomElement(i->GetName(), res.GetAtomCount()));
     }
   }
 
diff --git a/modules/conop/src/rule_based.hh b/modules/conop/src/rule_based.hh
index 4275d7e40e15dfdd7b088fe5ceae437a32095aaa..3b91771a29c027f9cbd503c3927f3a13b58add34 100644
--- a/modules/conop/src/rule_based.hh
+++ b/modules/conop/src/rule_based.hh
@@ -85,6 +85,7 @@ protected:
                          mol::ResidueHandle res, 
                          mol::AtomHandleList& remaining) const;
   void ProcessUnkAtoms(DiagnosticsPtr diags,
+                       mol::ResidueHandle res,
                        mol::AtomHandleList unks,
                        mol::AtomHandleList& remaining) const;
   virtual void DoProcess(DiagnosticsPtr diags, 
diff --git a/modules/conop/tests/test_heuristic_conop.cc b/modules/conop/tests/test_heuristic_conop.cc
index 4943393161d1e3f8911073d67a6f261ccc091f2f..61155c644b20c11220218355153a8b334e4817bf 100644
--- a/modules/conop/tests/test_heuristic_conop.cc
+++ b/modules/conop/tests/test_heuristic_conop.cc
@@ -19,6 +19,7 @@
 
 #include <ost/log.hh>
 #include <ost/mol/mol.hh>
+#include <ost/mol/builder.hh>
 #include <ost/conop/heuristic.hh>
 
 #define BOOST_TEST_DYN_LINK
@@ -140,5 +141,44 @@ BOOST_AUTO_TEST_CASE(does_assign_torsions) {
   BOOST_CHECK(a2.GetPsiTorsion().IsValid());
 }
 
+
+BOOST_AUTO_TEST_CASE(quack_types_unknown_residues) {
+  
+  mol::EntityHandle e = Builder()
+    .Chain("A")
+      .Residue("GLY")
+        .Atom("N", geom::Vec3(-8.22, 35.20, 22.39))
+        .Atom("CA", geom::Vec3(-8.28, 36.36, 21.49))
+        .Atom("C", geom::Vec3(-8.59, 35.93, 20.06))
+        .Atom("O", geom::Vec3(-7.88, 36.30, 19.12))
+        .Atom("CB", geom::Vec3(-6.96, 37.11, 21.53))
+      .Residue("SEP")
+        .Atom("N", geom::Vec3(-9.66, 35.16, 19.91))
+        .Atom("CA", geom::Vec3(-10.08, 34.66, 18.61))
+        .Atom("CB", geom::Vec3(-10.90, 33.38, 18.79))
+        .Atom("OG", geom::Vec3(-12.22, 33.66, 19.22))
+        .Atom("C", geom::Vec3(-10.84, 35.69, 17.77))
+        .Atom("O", geom::Vec3(-10.99, 35.54, 16.56))
+        .Atom("P", geom::Vec3(-12.43, 33.20, 20.70))
+        .Atom("O1P", geom::Vec3(-11.55, 34.04, 21.65))
+        .Atom("O2P", geom::Vec3(-12.05, 31.71, 20.86))
+        .Atom("O3P", geom::Vec3(-13.92, 33.41, 21.07))
+      .Residue("GLY")
+        .Atom("N", geom::Vec3(-11.31, 36.75, 18.43))
+        .Atom("CA", geom::Vec3(-12.04, 37.81, 17.75))
+        .Atom("C", geom::Vec3(-12.34, 38.94, 18.73))
+        .Atom("O", geom::Vec3(-13.45, 39.03, 19.26))
+  ;
+  HeuristicProcessor proc;
+  proc.Process(e);
+  BOOST_CHECK(e.FindResidue("A", 1).IsPeptideLinking());
+  BOOST_CHECK(e.FindResidue("A", 2).IsPeptideLinking());
+  BOOST_CHECK(e.FindResidue("A", 3).IsPeptideLinking());
+
+  BOOST_CHECK(mol::BondExists(e.FindAtom("A", 1, "C"), e.FindAtom("A", 2, "N")));
+  BOOST_CHECK(mol::BondExists(e.FindAtom("A", 2, "C"), e.FindAtom("A", 3, "N")));
+
+}
+
 BOOST_AUTO_TEST_SUITE_END();