diff --git a/modules/conop/pymod/export_compound.cc b/modules/conop/pymod/export_compound.cc
index 6b8196e6768a608745c9c83608a7ddffc6ef50d3..33cbe0536ae7490f14edc9116ef2ea25adf4d430 100644
--- a/modules/conop/pymod/export_compound.cc
+++ b/modules/conop/pymod/export_compound.cc
@@ -127,7 +127,7 @@ void export_Compound() {
   class_<BondSpec>("BondSpec", no_init)
     .def_readonly("atom_one", &BondSpec::atom_one)
     .def_readonly("atom_two", &BondSpec::atom_two)    
-    .def_readonly("border", &BondSpec::order)
+    .def_readonly("order", &BondSpec::order)
 
   ;  
 
diff --git a/modules/conop/src/CMakeLists.txt b/modules/conop/src/CMakeLists.txt
index 28cf8368ef52c223b4827046e03bf0635ce4b44f..d5649f4008b5df9bd7241ce8553e474ca803f78b 100644
--- a/modules/conop/src/CMakeLists.txt
+++ b/modules/conop/src/CMakeLists.txt
@@ -1,9 +1,6 @@
 set(OST_CONOP_HEADERS
-#builder.hh
-#builder_fw.hh
 conop.hh
 processor.hh
-#heuristic_builder.hh
 amino_acids.hh
 diag.hh
 model_check.hh
@@ -13,24 +10,24 @@ compound_lib.hh
 module_config.hh
 rule_based.hh
 nonstandard.hh
-#rule_based_builder.hh
+minimal_compound_lib.hh
+compound_lib_base.hh
 ring_finder.hh
 )
 
 set(OST_CONOP_SOURCES
-# builder.cc
 processor.cc
 amino_acids.cc
 conop.cc
+minimal_compound_lib.cc
+compound_lib_base.cc
 heuristic.cc
 diag.cc
 rule_based.cc
 model_check.cc
-#heuristic_builder.cc
 compound.cc
 compound_lib.cc
 nonstandard.cc
-#rule_based_builder.cc
 ring_finder.cc
 )
 
diff --git a/modules/conop/src/compound.hh b/modules/conop/src/compound.hh
index 7e8c424571967ea5a7b0e339323561488b598d1e..c62c1aa801323cd669eca94e4f6ee0a8c3974135 100644
--- a/modules/conop/src/compound.hh
+++ b/modules/conop/src/compound.hh
@@ -20,6 +20,7 @@
 #define OST_CONOP_COMPOUND_HH
 
 #include <vector>
+#include <map>
 #include <boost/shared_ptr.hpp>
 #include <ost/string_ref.hh>
 #include <ost/conop/module_config.hh>
@@ -72,6 +73,9 @@ struct DLLEXPORT_OST_CONOP AtomSpec {
   AtomSpec()
     : ordinal(0), is_leaving(false) {
   }
+  AtomSpec(int o, const String& n, const String& a, const String& e,
+           bool l, bool r): ordinal(o), name(n), alt_name(a), element(e),
+    is_leaving(l), is_aromatic(r) {}
   int    ordinal;
   String name;
   String alt_name;
@@ -93,7 +97,7 @@ struct DLLEXPORT_OST_CONOP BondSpec {
     : atom_one(0), atom_two(0), order(1) {
 
   }
-
+  BondSpec(int a, int b, int o): atom_one(a), atom_two(b), order(o) {}
   bool operator==(const BondSpec& rhs) const {
     return atom_one==rhs.atom_one && atom_two==rhs.atom_two;
   }
@@ -247,6 +251,8 @@ private:
   Date                         mod_date_;
 };
 
+typedef std::map<String, CompoundPtr> CompoundMap;
+
 }}
 
 #endif
diff --git a/modules/conop/src/compound_lib.cc b/modules/conop/src/compound_lib.cc
index 63fd58bcf5094df4a908ff5c7ff14f63d15d875a..db00bcc771502cd99b8c58c9d72e58d3723545e3 100644
--- a/modules/conop/src/compound_lib.cc
+++ b/modules/conop/src/compound_lib.cc
@@ -363,7 +363,7 @@ CompoundLibPtr CompoundLib::Load(const String& database, bool readonly)
   return lib;
 }
 
-void CompoundLib::LoadAtomsFromDB(CompoundPtr comp, int pk) {
+void CompoundLib::LoadAtomsFromDB(CompoundPtr comp, int pk) const {
   String aq=str(format("SELECT name, alt_name, element, ordinal, is_leaving "
                        "FROM atoms WHERE compound_id=%d "
                        "ORDER BY ordinal ASC") % pk);  
@@ -392,7 +392,7 @@ void CompoundLib::ClearCache()
   compound_cache_.clear();
 }
 
-void CompoundLib::LoadBondsFromDB(CompoundPtr comp, int pk) {
+void CompoundLib::LoadBondsFromDB(CompoundPtr comp, int pk) const {
   sqlite3_stmt* stmt;
   String aq=str(format("SELECT a1.ordinal, a2.ordinal, b.bond_order FROM bonds AS b "
                        "LEFT JOIN atoms AS a1 ON b.atom_one=a1.id "
@@ -417,8 +417,8 @@ void CompoundLib::LoadBondsFromDB(CompoundPtr comp, int pk) {
 }
 
 CompoundPtr CompoundLib::FindCompound(const String& id, 
-                                      Compound::Dialect dialect) {
-  CompoundMap::iterator i=compound_cache_.find(id);
+                                      Compound::Dialect dialect) const {
+  CompoundMap::const_iterator i=compound_cache_.find(id);
   if (i!=compound_cache_.end()) {
     return i->second;
   }
diff --git a/modules/conop/src/compound_lib.hh b/modules/conop/src/compound_lib.hh
index c79463a6f28857e813c7c0e57050d4459a7714f9..fef48b1a766899cff3e4097fe68e70a0031291b8 100644
--- a/modules/conop/src/compound_lib.hh
+++ b/modules/conop/src/compound_lib.hh
@@ -25,41 +25,42 @@
 // our own local copy of sqlite3
 #include <ost/db/sqlite3.h>
 
-#include <ost/conop/module_config.hh>
-#include <ost/conop/compound.hh>
+#include "module_config.hh"
+#include "compound.hh"
+#include "compound_lib_base.hh"
 
 namespace ost { namespace conop {
 
 class CompoundLib;
 
 typedef boost::shared_ptr<CompoundLib> CompoundLibPtr;
-typedef std::map<String, CompoundPtr> CompoundMap;
 
-class DLLEXPORT_OST_CONOP CompoundLib {
+class DLLEXPORT_OST_CONOP CompoundLib : public CompoundLibBase {
 public:
   static CompoundLibPtr Load(const String& database, bool readonly=true);
   static CompoundLibPtr Create(const String& database);
   ~CompoundLib();
   
-  CompoundPtr FindCompound(const String& id, Compound::Dialect dialect);
-  Date GetCreationDate(void);
-  String GetOSTVersionUsed(void);
+  virtual CompoundPtr FindCompound(const String& id, 
+                                   Compound::Dialect dialect) const;
   void AddCompound(const CompoundPtr& compound);
   CompoundLibPtr Copy(const String& filename) const;
   void ClearCache();
+  Date GetCreationDate(void);
+  String GetOSTVersionUsed(void);
   void SetChemLibInfo(void);
 private:
     CompoundLib();
 
-    void LoadAtomsFromDB(CompoundPtr comp, int pk);
-    void LoadBondsFromDB(CompoundPtr comp, int pk);    
+    void LoadAtomsFromDB(CompoundPtr comp, int pk) const;
+    void LoadBondsFromDB(CompoundPtr comp, int pk) const;    
 private:
-  CompoundMap       compound_cache_;
-  sqlite3*          conn_;
-  bool              chem_type_available_; // weather pdbx_type is available in db
-  bool              name_available_; // weather name is available in db
-  Date              creation_date_;
-  String            ost_version_used_;
+  mutable CompoundMap       compound_cache_;
+  sqlite3*                  conn_;
+  bool                      chem_type_available_; // weather pdbx_type is available in db
+  bool                      name_available_; // weather name is available in db
+  Date                      creation_date_;
+  String                    ost_version_used_;
 };
 
 }}
diff --git a/modules/conop/src/compound_lib_base.cc b/modules/conop/src/compound_lib_base.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/modules/conop/src/compound_lib_base.hh b/modules/conop/src/compound_lib_base.hh
new file mode 100644
index 0000000000000000000000000000000000000000..fdcee50203bbbdb99162a5be57fbfe65964f2473
--- /dev/null
+++ b/modules/conop/src/compound_lib_base.hh
@@ -0,0 +1,18 @@
+#ifndef OST_CONOP_COMPOUND_LIB_BASE_HH
+#define OST_CONOP_COMPOUND_LIB_BASE_HH
+
+#include "compound.hh"
+
+namespace ost { namespace conop {
+
+class CompoundLibBase;
+typedef boost::shared_ptr<CompoundLibBase> CompoundLibBasePtr;
+
+class DLLEXPORT_OST_CONOP CompoundLibBase {
+  virtual CompoundPtr FindCompound(const String& id, 
+                                   Compound::Dialect dialect) const = 0;
+};
+
+}}
+#endif
+
diff --git a/modules/conop/src/heuristic.cc b/modules/conop/src/heuristic.cc
index 11070fd7d71402ec78644cf0b2b9510ceecc5260..12942520823772bb88c723cf3fb15314c474e678 100644
--- a/modules/conop/src/heuristic.cc
+++ b/modules/conop/src/heuristic.cc
@@ -16,6 +16,7 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+
 #include <ost/log.hh>
 #include <ost/profile.hh>
 #include <ost/mol/xcs_editor.hh>
@@ -28,7 +29,6 @@
 
 namespace ost { namespace conop {
 
-
 void HeuristicProcessor::DoProcess(DiagnosticsPtr diags, 
                                    mol::EntityHandle ent) const {
 }
diff --git a/modules/conop/src/heuristic.hh b/modules/conop/src/heuristic.hh
index 2e5250d26f4c8fd0f3ea515a1b902ebbd437d734..07f2d6e96a8cad443576cf697e2e7a9e8e9d78e5 100644
--- a/modules/conop/src/heuristic.hh
+++ b/modules/conop/src/heuristic.hh
@@ -46,5 +46,6 @@ private:
 
 
 }}
+
 #endif
 
diff --git a/modules/conop/src/minimal_compound_lib.cc b/modules/conop/src/minimal_compound_lib.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9eeb107539e70a34bcdfe9f66ec4917d8b2bcc56
--- /dev/null
+++ b/modules/conop/src/minimal_compound_lib.cc
@@ -0,0 +1,54 @@
+#include "minimal_compound_lib.hh"
+namespace ost { namespace conop {
+
+#include "standard_compounds.cc"
+
+CompoundMap MinimalCompoundLib::compounds_ = MinimalCompoundLib::InitCompounds();
+
+CompoundMap MinimalCompoundLib::InitCompounds() {
+  CompoundMap c;
+  c["ALA"] = MakeALACompound();
+  c["CYS"] = MakeCYSCompound();
+  c["ASP"] = MakeASPCompound();
+  c["GLU"] = MakeGLUCompound();
+  c["PHE"] = MakePHECompound();
+  c["GLY"] = MakeGLYCompound();
+  c["HIS"] = MakeHISCompound();
+  c["ILE"] = MakeILECompound();
+  c["LYS"] = MakeLYSCompound();
+  c["LEU"] = MakeLEUCompound();
+  c["MET"] = MakeMETCompound();
+  c["ASN"] = MakeASNCompound();
+  c["PRO"] = MakePROCompound();
+  c["GLN"] = MakeGLNCompound();
+  c["ARG"] = MakeARGCompound();
+  c["SER"] = MakeSERCompound();
+  c["THR"] = MakeTHRCompound();
+  c["VAL"] = MakeVALCompound();
+  c["TRP"] = MakeTRPCompound();
+  c["TYR"] = MakeTYRCompound();
+  c["G"] = MakeGCompound();
+  c["T"] = MakeTCompound();
+  c["A"] = MakeACompound();
+  c["C"] = MakeCCompound();
+  c["U"] = MakeUCompound();
+  c["DG"] = MakeDGCompound();
+  c["DT"] = MakeDTCompound();
+  c["DU"] = MakeDUCompound();
+  c["DC"] = MakeDCCompound();
+  c["DA"] = MakeDACompound();
+  return c;
+}
+
+
+CompoundPtr MinimalCompoundLib::FindCompound(const String& id, 
+                                             Compound::Dialect dialect) const
+{
+   CompoundMap::const_iterator i = MinimalCompoundLib::compounds_.find(id); 
+   if (i != MinimalCompoundLib::compounds_.end()) {
+     return i->second;
+   }
+   return CompoundPtr();
+}
+
+}}
diff --git a/modules/conop/src/minimal_compound_lib.hh b/modules/conop/src/minimal_compound_lib.hh
new file mode 100644
index 0000000000000000000000000000000000000000..e1c035a51d74ca72057ce71e684506b20ab90342
--- /dev/null
+++ b/modules/conop/src/minimal_compound_lib.hh
@@ -0,0 +1,28 @@
+
+#ifndef OST_CONOP_MINIMAL_COMPOUND_LIB_HH
+#define OST_CONOP_MINIMAL_COMPOUND_LIB_HH
+
+#include "compound_lib_base.hh"
+
+namespace ost { namespace conop {
+
+class MinimalCompoundLib;
+typedef boost::shared_ptr<MinimalCompoundLib> MinimalCompoundLibPtr;
+
+// a minimal compound lib containing the definitions of the 20 standard 
+// amino acids and standard nucleotides
+class MinimalCompoundLib : public CompoundLibBase {
+public:
+  MinimalCompoundLib() {}
+  virtual CompoundPtr FindCompound(const String& id, 
+                                   Compound::Dialect dialect) const;
+private:
+  static CompoundMap InitCompounds();
+  // since this information is never going to change, it is shared 
+  // between instances of minimal compound lib.
+  static CompoundMap compounds_;
+};
+
+
+}}
+#endif
diff --git a/modules/conop/src/standard_compounds.cc b/modules/conop/src/standard_compounds.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7ce7302ffcc4f90e37a1f59e80595e54efbb4f24
--- /dev/null
+++ b/modules/conop/src/standard_compounds.cc
@@ -0,0 +1,1906 @@
+CompoundPtr MakeALACompound() {
+  CompoundPtr c( new Compound("ALA"));
+  c->SetOneLetterCode('A');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C3 H7 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "OXT", "OXT", "O", true, true),
+    AtomSpec(6, "H", "H", "H", false, true),
+    AtomSpec(7, "H2", "HN2", "H", true, true),
+    AtomSpec(8, "HA", "HA", "H", false, true),
+    AtomSpec(9, "HB1", "1HB", "H", false, true),
+    AtomSpec(10, "HB2", "2HB", "H", false, true),
+    AtomSpec(11, "HB3", "3HB", "H", false, true),
+    AtomSpec(12, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<13; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 6, 1),
+    BondSpec(0, 7, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 8, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 5, 1),
+    BondSpec(4, 9, 1),
+    BondSpec(4, 10, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 12, 1)
+  };
+  for (int i=0; i<12; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeCYSCompound() {
+  CompoundPtr c( new Compound("CYS"));
+  c->SetOneLetterCode('C');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C3 H7 N O2 S");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "SG", "SG", "S", false, true),
+    AtomSpec(6, "OXT", "OXT", "O", true, true),
+    AtomSpec(7, "H", "H", "H", false, true),
+    AtomSpec(8, "H2", "HN2", "H", true, true),
+    AtomSpec(9, "HA", "HA", "H", false, true),
+    AtomSpec(10, "HB2", "1HB", "H", false, true),
+    AtomSpec(11, "HB3", "2HB", "H", false, true),
+    AtomSpec(12, "HG", "HG", "H", false, true),
+    AtomSpec(13, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<14; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 7, 1),
+    BondSpec(0, 8, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 9, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 6, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 10, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 12, 1),
+    BondSpec(6, 13, 1)
+  };
+  for (int i=0; i<13; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeASPCompound() {
+  CompoundPtr c( new Compound("ASP"));
+  c->SetOneLetterCode('D');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C4 H7 N O4");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "OD1", "OD1", "O", false, true),
+    AtomSpec(7, "OD2", "OD2", "O", false, true),
+    AtomSpec(8, "OXT", "OXT", "O", true, true),
+    AtomSpec(9, "H", "H", "H", false, true),
+    AtomSpec(10, "H2", "HN2", "H", true, true),
+    AtomSpec(11, "HA", "HA", "H", false, true),
+    AtomSpec(12, "HB2", "HB1", "H", false, true),
+    AtomSpec(13, "HB3", "HB2", "H", false, true),
+    AtomSpec(14, "HD2", "HD2", "H", false, true),
+    AtomSpec(15, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<16; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 11, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 8, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 12, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(5, 6, 2),
+    BondSpec(5, 7, 1),
+    BondSpec(7, 14, 1),
+    BondSpec(8, 15, 1)
+  };
+  for (int i=0; i<15; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeGLUCompound() {
+  CompoundPtr c( new Compound("GLU"));
+  c->SetOneLetterCode('E');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C5 H9 N O4");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD", "CD", "C", false, true),
+    AtomSpec(7, "OE1", "OE1", "O", false, true),
+    AtomSpec(8, "OE2", "OE2", "O", false, true),
+    AtomSpec(9, "OXT", "OXT", "O", true, true),
+    AtomSpec(10, "H", "H", "H", false, true),
+    AtomSpec(11, "H2", "HN2", "H", true, true),
+    AtomSpec(12, "HA", "HA", "H", false, true),
+    AtomSpec(13, "HB2", "HB1", "H", false, true),
+    AtomSpec(14, "HB3", "HB2", "H", false, true),
+    AtomSpec(15, "HG2", "HG1", "H", false, true),
+    AtomSpec(16, "HG3", "HG2", "H", false, true),
+    AtomSpec(17, "HE2", "HE2", "H", false, true),
+    AtomSpec(18, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<19; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(0, 11, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 12, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 9, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(4, 14, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 15, 1),
+    BondSpec(5, 16, 1),
+    BondSpec(6, 7, 2),
+    BondSpec(6, 8, 1),
+    BondSpec(8, 17, 1),
+    BondSpec(9, 18, 1)
+  };
+  for (int i=0; i<18; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakePHECompound() {
+  CompoundPtr c( new Compound("PHE"));
+  c->SetOneLetterCode('F');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H11 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD1", "CD1", "C", false, true),
+    AtomSpec(7, "CD2", "CD2", "C", false, true),
+    AtomSpec(8, "CE1", "CE1", "C", false, true),
+    AtomSpec(9, "CE2", "CE2", "C", false, true),
+    AtomSpec(10, "CZ", "CZ", "C", false, true),
+    AtomSpec(11, "OXT", "OXT", "O", true, true),
+    AtomSpec(12, "H", "H", "H", false, true),
+    AtomSpec(13, "H2", "HN2", "H", true, true),
+    AtomSpec(14, "HA", "HA", "H", false, true),
+    AtomSpec(15, "HB2", "1HB", "H", false, true),
+    AtomSpec(16, "HB3", "2HB", "H", false, true),
+    AtomSpec(17, "HD1", "HD1", "H", false, true),
+    AtomSpec(18, "HD2", "HD2", "H", false, true),
+    AtomSpec(19, "HE1", "HE1", "H", false, true),
+    AtomSpec(20, "HE2", "HE2", "H", false, true),
+    AtomSpec(21, "HZ", "HZ", "H", false, true),
+    AtomSpec(22, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<23; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 12, 1),
+    BondSpec(0, 13, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 14, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 11, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 15, 1),
+    BondSpec(4, 16, 1),
+    BondSpec(5, 6, 2),
+    BondSpec(5, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 17, 1),
+    BondSpec(7, 9, 2),
+    BondSpec(7, 18, 1),
+    BondSpec(8, 10, 2),
+    BondSpec(8, 19, 1),
+    BondSpec(9, 10, 1),
+    BondSpec(9, 20, 1),
+    BondSpec(10, 21, 1),
+    BondSpec(11, 22, 1)
+  };
+  for (int i=0; i<23; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeGLYCompound() {
+  CompoundPtr c( new Compound("GLY"));
+  c->SetOneLetterCode('G');
+  c->SetChemClass(mol::ChemClass('P'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C2 H5 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "OXT", "OXT", "O", true, true),
+    AtomSpec(5, "H", "H", "H", false, true),
+    AtomSpec(6, "H2", "HN2", "H", true, true),
+    AtomSpec(7, "HA2", "HA1", "H", false, true),
+    AtomSpec(8, "HA3", "HA2", "H", false, true),
+    AtomSpec(9, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<10; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 5, 1),
+    BondSpec(0, 6, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 7, 1),
+    BondSpec(1, 8, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 4, 1),
+    BondSpec(4, 9, 1)
+  };
+  for (int i=0; i<9; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeHISCompound() {
+  CompoundPtr c( new Compound("HIS"));
+  c->SetOneLetterCode('H');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C6 H10 N3 O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "ND1", "ND1", "N", false, true),
+    AtomSpec(7, "CD2", "CD2", "C", false, true),
+    AtomSpec(8, "CE1", "CE1", "C", false, true),
+    AtomSpec(9, "NE2", "NE2", "N", false, true),
+    AtomSpec(10, "OXT", "OXT", "O", true, true),
+    AtomSpec(11, "H", "H", "H", false, true),
+    AtomSpec(12, "H2", "HN2", "H", true, true),
+    AtomSpec(13, "HA", "HA", "H", false, true),
+    AtomSpec(14, "HB2", "1HB", "H", false, true),
+    AtomSpec(15, "HB3", "2HB", "H", false, true),
+    AtomSpec(16, "HD1", "HD1", "H", false, true),
+    AtomSpec(17, "HD2", "HD2", "H", false, true),
+    AtomSpec(18, "HE1", "HE1", "H", false, true),
+    AtomSpec(19, "HE2", "HE2", "H", false, true),
+    AtomSpec(20, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<21; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 11, 1),
+    BondSpec(0, 12, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 13, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 10, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 14, 1),
+    BondSpec(4, 15, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 7, 2),
+    BondSpec(6, 8, 2),
+    BondSpec(6, 16, 1),
+    BondSpec(7, 9, 1),
+    BondSpec(7, 17, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 18, 1),
+    BondSpec(9, 19, 1),
+    BondSpec(10, 20, 1)
+  };
+  for (int i=0; i<21; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeILECompound() {
+  CompoundPtr c( new Compound("ILE"));
+  c->SetOneLetterCode('I');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C6 H13 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG1", "CG1", "C", false, true),
+    AtomSpec(6, "CG2", "CG2", "C", false, true),
+    AtomSpec(7, "CD1", "CD1", "C", false, true),
+    AtomSpec(8, "OXT", "OXT", "O", true, true),
+    AtomSpec(9, "H", "H", "H", false, true),
+    AtomSpec(10, "H2", "HN2", "H", true, true),
+    AtomSpec(11, "HA", "HA", "H", false, true),
+    AtomSpec(12, "HB", "HB", "H", false, true),
+    AtomSpec(13, "HG12", "1HG1", "H", false, true),
+    AtomSpec(14, "HG13", "2HG1", "H", false, true),
+    AtomSpec(15, "HG21", "1HG2", "H", false, true),
+    AtomSpec(16, "HG22", "2HG2", "H", false, true),
+    AtomSpec(17, "HG23", "3HG2", "H", false, true),
+    AtomSpec(18, "HD11", "1HD1", "H", false, true),
+    AtomSpec(19, "HD12", "2HD1", "H", false, true),
+    AtomSpec(20, "HD13", "3HD1", "H", false, true),
+    AtomSpec(21, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<22; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 11, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 8, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 6, 1),
+    BondSpec(4, 12, 1),
+    BondSpec(5, 7, 1),
+    BondSpec(5, 13, 1),
+    BondSpec(5, 14, 1),
+    BondSpec(6, 15, 1),
+    BondSpec(6, 16, 1),
+    BondSpec(6, 17, 1),
+    BondSpec(7, 18, 1),
+    BondSpec(7, 19, 1),
+    BondSpec(7, 20, 1),
+    BondSpec(8, 21, 1)
+  };
+  for (int i=0; i<21; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeLYSCompound() {
+  CompoundPtr c( new Compound("LYS"));
+  c->SetOneLetterCode('K');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C6 H15 N2 O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD", "CD", "C", false, true),
+    AtomSpec(7, "CE", "CE", "C", false, true),
+    AtomSpec(8, "NZ", "NZ", "N", false, true),
+    AtomSpec(9, "OXT", "OXT", "O", true, true),
+    AtomSpec(10, "H", "H", "H", false, true),
+    AtomSpec(11, "H2", "HN2", "H", true, true),
+    AtomSpec(12, "HA", "HA", "H", false, true),
+    AtomSpec(13, "HB2", "1HB", "H", false, true),
+    AtomSpec(14, "HB3", "2HB", "H", false, true),
+    AtomSpec(15, "HG2", "1HG", "H", false, true),
+    AtomSpec(16, "HG3", "2HG", "H", false, true),
+    AtomSpec(17, "HD2", "1HD", "H", false, true),
+    AtomSpec(18, "HD3", "2HD", "H", false, true),
+    AtomSpec(19, "HE2", "1HE", "H", false, true),
+    AtomSpec(20, "HE3", "2HE", "H", false, true),
+    AtomSpec(21, "HZ1", "1HZ", "H", false, true),
+    AtomSpec(22, "HZ2", "2HZ", "H", false, true),
+    AtomSpec(23, "HZ3", "3HZ", "H", false, true),
+    AtomSpec(24, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<25; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(0, 11, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 12, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 9, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(4, 14, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 15, 1),
+    BondSpec(5, 16, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 17, 1),
+    BondSpec(6, 18, 1),
+    BondSpec(7, 8, 1),
+    BondSpec(7, 19, 1),
+    BondSpec(7, 20, 1),
+    BondSpec(8, 21, 1),
+    BondSpec(8, 22, 1),
+    BondSpec(8, 23, 1),
+    BondSpec(9, 24, 1)
+  };
+  for (int i=0; i<24; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeLEUCompound() {
+  CompoundPtr c( new Compound("LEU"));
+  c->SetOneLetterCode('L');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C6 H13 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD1", "CD1", "C", false, true),
+    AtomSpec(7, "CD2", "CD2", "C", false, true),
+    AtomSpec(8, "OXT", "OXT", "O", true, true),
+    AtomSpec(9, "H", "H", "H", false, true),
+    AtomSpec(10, "H2", "HN2", "H", true, true),
+    AtomSpec(11, "HA", "HA", "H", false, true),
+    AtomSpec(12, "HB2", "1HB", "H", false, true),
+    AtomSpec(13, "HB3", "2HB", "H", false, true),
+    AtomSpec(14, "HG", "HG", "H", false, true),
+    AtomSpec(15, "HD11", "1HD1", "H", false, true),
+    AtomSpec(16, "HD12", "2HD1", "H", false, true),
+    AtomSpec(17, "HD13", "3HD1", "H", false, true),
+    AtomSpec(18, "HD21", "1HD2", "H", false, true),
+    AtomSpec(19, "HD22", "2HD2", "H", false, true),
+    AtomSpec(20, "HD23", "3HD2", "H", false, true),
+    AtomSpec(21, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<22; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 11, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 8, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 12, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 7, 1),
+    BondSpec(5, 14, 1),
+    BondSpec(6, 15, 1),
+    BondSpec(6, 16, 1),
+    BondSpec(6, 17, 1),
+    BondSpec(7, 18, 1),
+    BondSpec(7, 19, 1),
+    BondSpec(7, 20, 1),
+    BondSpec(8, 21, 1)
+  };
+  for (int i=0; i<21; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeMETCompound() {
+  CompoundPtr c( new Compound("MET"));
+  c->SetOneLetterCode('M');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C5 H11 N O2 S");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "SD", "SD", "S", false, true),
+    AtomSpec(7, "CE", "CE", "C", false, true),
+    AtomSpec(8, "OXT", "OXT", "O", true, true),
+    AtomSpec(9, "H", "H", "H", false, true),
+    AtomSpec(10, "H2", "HN2", "H", true, true),
+    AtomSpec(11, "HA", "HA", "H", false, true),
+    AtomSpec(12, "HB2", "1HB", "H", false, true),
+    AtomSpec(13, "HB3", "2HB", "H", false, true),
+    AtomSpec(14, "HG2", "1HG", "H", false, true),
+    AtomSpec(15, "HG3", "2HG", "H", false, true),
+    AtomSpec(16, "HE1", "1HE", "H", false, true),
+    AtomSpec(17, "HE2", "2HE", "H", false, true),
+    AtomSpec(18, "HE3", "3HE", "H", false, true),
+    AtomSpec(19, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<20; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 11, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 8, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 12, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 14, 1),
+    BondSpec(5, 15, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(7, 16, 1),
+    BondSpec(7, 17, 1),
+    BondSpec(7, 18, 1),
+    BondSpec(8, 19, 1)
+  };
+  for (int i=0; i<19; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeASNCompound() {
+  CompoundPtr c( new Compound("ASN"));
+  c->SetOneLetterCode('N');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C4 H8 N2 O3");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "OD1", "OD1", "O", false, true),
+    AtomSpec(7, "ND2", "ND2", "N", true, true),
+    AtomSpec(8, "OXT", "OXT", "O", true, true),
+    AtomSpec(9, "H", "H", "H", false, true),
+    AtomSpec(10, "H2", "HN2", "H", true, true),
+    AtomSpec(11, "HA", "HA", "H", false, true),
+    AtomSpec(12, "HB2", "HB1", "H", false, true),
+    AtomSpec(13, "HB3", "HB2", "H", false, true),
+    AtomSpec(14, "HD21", "HD21", "H", true, true),
+    AtomSpec(15, "HD22", "HD22", "H", true, true),
+    AtomSpec(16, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<17; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 11, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 8, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 12, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(5, 6, 2),
+    BondSpec(5, 7, 1),
+    BondSpec(7, 14, 1),
+    BondSpec(7, 15, 1),
+    BondSpec(8, 16, 1)
+  };
+  for (int i=0; i<16; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakePROCompound() {
+  CompoundPtr c( new Compound("PRO"));
+  c->SetOneLetterCode('P');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C5 H9 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD", "CD", "C", false, true),
+    AtomSpec(7, "OXT", "OXT", "O", true, true),
+    AtomSpec(8, "H", "HT1", "H", true, true),
+    AtomSpec(9, "HA", "HA", "H", false, true),
+    AtomSpec(10, "HB2", "1HB", "H", false, true),
+    AtomSpec(11, "HB3", "2HB", "H", false, true),
+    AtomSpec(12, "HG2", "1HG", "H", false, true),
+    AtomSpec(13, "HG3", "2HG", "H", false, true),
+    AtomSpec(14, "HD2", "1HD", "H", false, true),
+    AtomSpec(15, "HD3", "2HD", "H", false, true),
+    AtomSpec(16, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<17; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 6, 1),
+    BondSpec(0, 8, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 9, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 7, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 10, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 12, 1),
+    BondSpec(5, 13, 1),
+    BondSpec(6, 14, 1),
+    BondSpec(6, 15, 1),
+    BondSpec(7, 16, 1)
+  };
+  for (int i=0; i<17; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeGLNCompound() {
+  CompoundPtr c( new Compound("GLN"));
+  c->SetOneLetterCode('Q');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C5 H10 N2 O3");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD", "CD", "C", false, true),
+    AtomSpec(7, "OE1", "OE1", "O", false, true),
+    AtomSpec(8, "NE2", "NE2", "N", false, true),
+    AtomSpec(9, "OXT", "OXT", "O", true, true),
+    AtomSpec(10, "H", "H", "H", false, true),
+    AtomSpec(11, "H2", "HN2", "H", true, true),
+    AtomSpec(12, "HA", "HA", "H", false, true),
+    AtomSpec(13, "HB2", "1HB", "H", false, true),
+    AtomSpec(14, "HB3", "2HB", "H", false, true),
+    AtomSpec(15, "HG2", "1HG", "H", false, true),
+    AtomSpec(16, "HG3", "2HG", "H", false, true),
+    AtomSpec(17, "HE21", "1HE2", "H", false, true),
+    AtomSpec(18, "HE22", "2HE2", "H", false, true),
+    AtomSpec(19, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<20; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 10, 1),
+    BondSpec(0, 11, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 12, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 9, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 13, 1),
+    BondSpec(4, 14, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 15, 1),
+    BondSpec(5, 16, 1),
+    BondSpec(6, 7, 2),
+    BondSpec(6, 8, 1),
+    BondSpec(8, 17, 1),
+    BondSpec(8, 18, 1),
+    BondSpec(9, 19, 1)
+  };
+  for (int i=0; i<19; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeARGCompound() {
+  CompoundPtr c( new Compound("ARG"));
+  c->SetOneLetterCode('R');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C6 H15 N4 O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD", "CD", "C", false, true),
+    AtomSpec(7, "NE", "NE", "N", false, true),
+    AtomSpec(8, "CZ", "CZ", "C", false, true),
+    AtomSpec(9, "NH1", "NH1", "N", false, true),
+    AtomSpec(10, "NH2", "NH2", "N", false, true),
+    AtomSpec(11, "OXT", "OXT", "O", true, true),
+    AtomSpec(12, "H", "H", "H", false, true),
+    AtomSpec(13, "H2", "HN2", "H", true, true),
+    AtomSpec(14, "HA", "HA", "H", false, true),
+    AtomSpec(15, "HB2", "1HB", "H", false, true),
+    AtomSpec(16, "HB3", "2HB", "H", false, true),
+    AtomSpec(17, "HG2", "1HG", "H", false, true),
+    AtomSpec(18, "HG3", "2HG", "H", false, true),
+    AtomSpec(19, "HD2", "1HD", "H", false, true),
+    AtomSpec(20, "HD3", "2HD", "H", false, true),
+    AtomSpec(21, "HE", "HE", "H", false, true),
+    AtomSpec(22, "HH11", "1HH1", "H", false, true),
+    AtomSpec(23, "HH12", "2HH1", "H", false, true),
+    AtomSpec(24, "HH21", "1HH2", "H", false, true),
+    AtomSpec(25, "HH22", "2HH2", "H", false, true),
+    AtomSpec(26, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<27; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 12, 1),
+    BondSpec(0, 13, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 14, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 11, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 15, 1),
+    BondSpec(4, 16, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 17, 1),
+    BondSpec(5, 18, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 19, 1),
+    BondSpec(6, 20, 1),
+    BondSpec(7, 8, 1),
+    BondSpec(7, 21, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 2),
+    BondSpec(9, 22, 1),
+    BondSpec(9, 23, 1),
+    BondSpec(10, 24, 1),
+    BondSpec(10, 25, 1),
+    BondSpec(11, 26, 1)
+  };
+  for (int i=0; i<26; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeSERCompound() {
+  CompoundPtr c( new Compound("SER"));
+  c->SetOneLetterCode('S');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C3 H7 N O3");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "OG", "OG", "O", false, true),
+    AtomSpec(6, "OXT", "OXT", "O", true, true),
+    AtomSpec(7, "H", "H", "H", false, true),
+    AtomSpec(8, "H2", "HN2", "H", true, true),
+    AtomSpec(9, "HA", "HA", "H", false, true),
+    AtomSpec(10, "HB2", "1HB", "H", false, true),
+    AtomSpec(11, "HB3", "2HB", "H", false, true),
+    AtomSpec(12, "HG", "HG", "H", false, true),
+    AtomSpec(13, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<14; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 7, 1),
+    BondSpec(0, 8, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 9, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 6, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 10, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 12, 1),
+    BondSpec(6, 13, 1)
+  };
+  for (int i=0; i<13; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeTHRCompound() {
+  CompoundPtr c( new Compound("THR"));
+  c->SetOneLetterCode('T');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C4 H9 N O3");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "OG1", "OG1", "O", false, true),
+    AtomSpec(6, "CG2", "CG2", "C", false, true),
+    AtomSpec(7, "OXT", "OXT", "O", true, true),
+    AtomSpec(8, "H", "H", "H", false, true),
+    AtomSpec(9, "H2", "HN2", "H", true, true),
+    AtomSpec(10, "HA", "HA", "H", false, true),
+    AtomSpec(11, "HB", "HB", "H", false, true),
+    AtomSpec(12, "HG1", "HG1", "H", false, true),
+    AtomSpec(13, "HG21", "1HG2", "H", false, true),
+    AtomSpec(14, "HG22", "2HG2", "H", false, true),
+    AtomSpec(15, "HG23", "3HG2", "H", false, true),
+    AtomSpec(16, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<17; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 8, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 10, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 7, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 6, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 12, 1),
+    BondSpec(6, 13, 1),
+    BondSpec(6, 14, 1),
+    BondSpec(6, 15, 1),
+    BondSpec(7, 16, 1)
+  };
+  for (int i=0; i<16; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeVALCompound() {
+  CompoundPtr c( new Compound("VAL"));
+  c->SetOneLetterCode('V');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C5 H11 N O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG1", "CG1", "C", false, true),
+    AtomSpec(6, "CG2", "CG2", "C", false, true),
+    AtomSpec(7, "OXT", "OXT", "O", true, true),
+    AtomSpec(8, "H", "H", "H", false, true),
+    AtomSpec(9, "H2", "HN2", "H", true, true),
+    AtomSpec(10, "HA", "HA", "H", false, true),
+    AtomSpec(11, "HB", "HB", "H", false, true),
+    AtomSpec(12, "HG11", "1HG1", "H", false, true),
+    AtomSpec(13, "HG12", "2HG1", "H", false, true),
+    AtomSpec(14, "HG13", "3HG1", "H", false, true),
+    AtomSpec(15, "HG21", "1HG2", "H", false, true),
+    AtomSpec(16, "HG22", "2HG2", "H", false, true),
+    AtomSpec(17, "HG23", "3HG2", "H", false, true),
+    AtomSpec(18, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<19; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 8, 1),
+    BondSpec(0, 9, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 10, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 7, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 6, 1),
+    BondSpec(4, 11, 1),
+    BondSpec(5, 12, 1),
+    BondSpec(5, 13, 1),
+    BondSpec(5, 14, 1),
+    BondSpec(6, 15, 1),
+    BondSpec(6, 16, 1),
+    BondSpec(6, 17, 1),
+    BondSpec(7, 18, 1)
+  };
+  for (int i=0; i<18; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeTRPCompound() {
+  CompoundPtr c( new Compound("TRP"));
+  c->SetOneLetterCode('W');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C11 H12 N2 O2");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD1", "CD1", "C", false, true),
+    AtomSpec(7, "CD2", "CD2", "C", false, true),
+    AtomSpec(8, "NE1", "NE1", "N", false, true),
+    AtomSpec(9, "CE2", "CE2", "C", false, true),
+    AtomSpec(10, "CE3", "CE3", "C", false, true),
+    AtomSpec(11, "CZ2", "CZ2", "C", false, true),
+    AtomSpec(12, "CZ3", "CZ3", "C", false, true),
+    AtomSpec(13, "CH2", "CH2", "C", false, true),
+    AtomSpec(14, "OXT", "OXT", "O", true, true),
+    AtomSpec(15, "H", "H", "H", false, true),
+    AtomSpec(16, "H2", "HN2", "H", true, true),
+    AtomSpec(17, "HA", "HA", "H", false, true),
+    AtomSpec(18, "HB2", "1HB", "H", false, true),
+    AtomSpec(19, "HB3", "2HB", "H", false, true),
+    AtomSpec(20, "HD1", "HD1", "H", false, true),
+    AtomSpec(21, "HE1", "HE1", "H", false, true),
+    AtomSpec(22, "HE3", "HE3", "H", false, true),
+    AtomSpec(23, "HZ2", "HZ2", "H", false, true),
+    AtomSpec(24, "HZ3", "HZ3", "H", false, true),
+    AtomSpec(25, "HH2", "HH2", "H", false, true),
+    AtomSpec(26, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<27; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 15, 1),
+    BondSpec(0, 16, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 17, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 14, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 18, 1),
+    BondSpec(4, 19, 1),
+    BondSpec(5, 6, 2),
+    BondSpec(5, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 20, 1),
+    BondSpec(7, 9, 2),
+    BondSpec(7, 10, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 21, 1),
+    BondSpec(9, 11, 1),
+    BondSpec(10, 12, 2),
+    BondSpec(10, 22, 1),
+    BondSpec(11, 13, 2),
+    BondSpec(11, 23, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 24, 1),
+    BondSpec(13, 25, 1),
+    BondSpec(14, 26, 1)
+  };
+  for (int i=0; i<28; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeTYRCompound() {
+  CompoundPtr c( new Compound("TYR"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('L'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H11 N O3");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "N", "N", "N", false, true),
+    AtomSpec(1, "CA", "CA", "C", false, true),
+    AtomSpec(2, "C", "C", "C", false, true),
+    AtomSpec(3, "O", "O", "O", false, true),
+    AtomSpec(4, "CB", "CB", "C", false, true),
+    AtomSpec(5, "CG", "CG", "C", false, true),
+    AtomSpec(6, "CD1", "CD1", "C", false, true),
+    AtomSpec(7, "CD2", "CD2", "C", false, true),
+    AtomSpec(8, "CE1", "CE1", "C", false, true),
+    AtomSpec(9, "CE2", "CE2", "C", false, true),
+    AtomSpec(10, "CZ", "CZ", "C", false, true),
+    AtomSpec(11, "OH", "OH", "O", false, true),
+    AtomSpec(12, "OXT", "OXT", "O", true, true),
+    AtomSpec(13, "H", "H", "H", false, true),
+    AtomSpec(14, "H2", "HN2", "H", true, true),
+    AtomSpec(15, "HA", "HA", "H", false, true),
+    AtomSpec(16, "HB2", "1HB", "H", false, true),
+    AtomSpec(17, "HB3", "2HB", "H", false, true),
+    AtomSpec(18, "HD1", "HD1", "H", false, true),
+    AtomSpec(19, "HD2", "HD2", "H", false, true),
+    AtomSpec(20, "HE1", "HE1", "H", false, true),
+    AtomSpec(21, "HE2", "HE2", "H", false, true),
+    AtomSpec(22, "HH", "HH", "H", false, true),
+    AtomSpec(23, "HXT", "HXT", "H", true, true)
+  };
+  for (int i=0; i<24; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 13, 1),
+    BondSpec(0, 14, 1),
+    BondSpec(1, 2, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(1, 15, 1),
+    BondSpec(2, 3, 2),
+    BondSpec(2, 12, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(4, 16, 1),
+    BondSpec(4, 17, 1),
+    BondSpec(5, 6, 2),
+    BondSpec(5, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 18, 1),
+    BondSpec(7, 9, 2),
+    BondSpec(7, 19, 1),
+    BondSpec(8, 10, 2),
+    BondSpec(8, 20, 1),
+    BondSpec(9, 10, 1),
+    BondSpec(9, 21, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(11, 22, 1),
+    BondSpec(12, 23, 1)
+  };
+  for (int i=0; i<24; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeGCompound() {
+  CompoundPtr c( new Compound("G"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('R'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H14 N5 O8 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "O2'", "O2*", "O", false, true),
+    AtomSpec(12, "C1'", "C1*", "C", false, true),
+    AtomSpec(13, "N9", "N9", "N", false, true),
+    AtomSpec(14, "C8", "C8", "C", false, true),
+    AtomSpec(15, "N7", "N7", "N", false, true),
+    AtomSpec(16, "C5", "C5", "C", false, true),
+    AtomSpec(17, "C6", "C6", "C", false, true),
+    AtomSpec(18, "O6", "O6", "O", false, true),
+    AtomSpec(19, "N1", "N1", "N", false, true),
+    AtomSpec(20, "C2", "C2", "C", false, true),
+    AtomSpec(21, "N2", "N2", "N", false, true),
+    AtomSpec(22, "N3", "N3", "N", false, true),
+    AtomSpec(23, "C4", "C4", "C", false, true),
+    AtomSpec(24, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(25, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(26, "H5'", "1H5*", "H", false, true),
+    AtomSpec(27, "H5''", "2H5*", "H", false, true),
+    AtomSpec(28, "H4'", "H4*", "H", false, true),
+    AtomSpec(29, "H3'", "H3*", "H", false, true),
+    AtomSpec(30, "HO3'", "H3T", "H", true, true),
+    AtomSpec(31, "H2'", "H2*", "H", false, true),
+    AtomSpec(32, "HO2'", "2HO*", "H", false, true),
+    AtomSpec(33, "H1'", "H1*", "H", false, true),
+    AtomSpec(34, "H8", "H8", "H", false, true),
+    AtomSpec(35, "H1", "H1", "H", false, true),
+    AtomSpec(36, "H21", "1H2", "H", false, true),
+    AtomSpec(37, "H22", "2H2", "H", false, true)
+  };
+  for (int i=0; i<38; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 24, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 25, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 26, 1),
+    BondSpec(5, 27, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 28, 1),
+    BondSpec(7, 12, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 29, 1),
+    BondSpec(9, 30, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 12, 1),
+    BondSpec(10, 31, 1),
+    BondSpec(11, 32, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 33, 1),
+    BondSpec(13, 14, 1),
+    BondSpec(13, 23, 1),
+    BondSpec(14, 15, 2),
+    BondSpec(14, 34, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(16, 17, 1),
+    BondSpec(16, 23, 2),
+    BondSpec(17, 18, 2),
+    BondSpec(17, 19, 1),
+    BondSpec(19, 20, 1),
+    BondSpec(19, 35, 1),
+    BondSpec(20, 21, 1),
+    BondSpec(20, 22, 2),
+    BondSpec(21, 36, 1),
+    BondSpec(21, 37, 1),
+    BondSpec(22, 23, 1)
+  };
+  for (int i=0; i<40; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeTCompound() {
+  CompoundPtr c( new Compound("T"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H15 N2 O8 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N1", "N1", "N", false, true),
+    AtomSpec(13, "C2", "C2", "C", false, true),
+    AtomSpec(14, "O2", "O2", "O", false, true),
+    AtomSpec(15, "N3", "N3", "N", false, true),
+    AtomSpec(16, "C4", "C4", "C", false, true),
+    AtomSpec(17, "O4", "O4", "O", false, true),
+    AtomSpec(18, "C5", "C5", "C", false, true),
+    AtomSpec(19, "C7", "C5M", "C", false, true),
+    AtomSpec(20, "C6", "C6", "C", false, true),
+    AtomSpec(21, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(22, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(23, "H5'", "1H5*", "H", false, true),
+    AtomSpec(24, "H5''", "2H5*", "H", false, true),
+    AtomSpec(25, "H4'", "H4*", "H", false, true),
+    AtomSpec(26, "H3'", "H3*", "H", false, true),
+    AtomSpec(27, "HO3'", "H3T", "H", true, true),
+    AtomSpec(28, "H2'", "1H2*", "H", false, true),
+    AtomSpec(29, "H2''", "2H2*", "H", false, true),
+    AtomSpec(30, "H1'", "H1*", "H", false, true),
+    AtomSpec(31, "H3", "H3", "H", false, true),
+    AtomSpec(32, "H71", "1H5M", "H", false, true),
+    AtomSpec(33, "H72", "2H5M", "H", false, true),
+    AtomSpec(34, "H73", "3H5M", "H", false, true),
+    AtomSpec(35, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<36; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 21, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 22, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(5, 24, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 25, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 26, 1),
+    BondSpec(9, 27, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(10, 29, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 30, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 20, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 15, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(15, 31, 1),
+    BondSpec(16, 17, 2),
+    BondSpec(16, 18, 1),
+    BondSpec(18, 19, 1),
+    BondSpec(18, 20, 2),
+    BondSpec(19, 32, 1),
+    BondSpec(19, 33, 1),
+    BondSpec(19, 34, 1),
+    BondSpec(20, 35, 1)
+  };
+  for (int i=0; i<37; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeACompound() {
+  CompoundPtr c( new Compound("A"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('R'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H14 N5 O7 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "O2'", "O2*", "O", false, true),
+    AtomSpec(12, "C1'", "C1*", "C", false, true),
+    AtomSpec(13, "N9", "N9", "N", false, true),
+    AtomSpec(14, "C8", "C8", "C", false, true),
+    AtomSpec(15, "N7", "N7", "N", false, true),
+    AtomSpec(16, "C5", "C5", "C", false, true),
+    AtomSpec(17, "C6", "C6", "C", false, true),
+    AtomSpec(18, "N6", "N6", "N", false, true),
+    AtomSpec(19, "N1", "N1", "N", false, true),
+    AtomSpec(20, "C2", "C2", "C", false, true),
+    AtomSpec(21, "N3", "N3", "N", false, true),
+    AtomSpec(22, "C4", "C4", "C", false, true),
+    AtomSpec(23, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(24, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(25, "H5'", "1H5*", "H", false, true),
+    AtomSpec(26, "H5''", "2H5*", "H", false, true),
+    AtomSpec(27, "H4'", "H4*", "H", false, true),
+    AtomSpec(28, "H3'", "H3*", "H", false, true),
+    AtomSpec(29, "HO3'", "H3T", "H", true, true),
+    AtomSpec(30, "H2'", "H2*", "H", false, true),
+    AtomSpec(31, "HO2'", "2HO*", "H", false, true),
+    AtomSpec(32, "H1'", "H1*", "H", false, true),
+    AtomSpec(33, "H8", "H8", "H", false, true),
+    AtomSpec(34, "H61", "1H6", "H", false, true),
+    AtomSpec(35, "H62", "2H6", "H", false, true),
+    AtomSpec(36, "H2", "H2", "H", false, true)
+  };
+  for (int i=0; i<37; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 23, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 24, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 25, 1),
+    BondSpec(5, 26, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 27, 1),
+    BondSpec(7, 12, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 28, 1),
+    BondSpec(9, 29, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 12, 1),
+    BondSpec(10, 30, 1),
+    BondSpec(11, 31, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 32, 1),
+    BondSpec(13, 14, 1),
+    BondSpec(13, 22, 1),
+    BondSpec(14, 15, 2),
+    BondSpec(14, 33, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(16, 17, 1),
+    BondSpec(16, 22, 2),
+    BondSpec(17, 18, 1),
+    BondSpec(17, 19, 2),
+    BondSpec(18, 34, 1),
+    BondSpec(18, 35, 1),
+    BondSpec(19, 20, 1),
+    BondSpec(20, 21, 2),
+    BondSpec(20, 36, 1),
+    BondSpec(21, 22, 1)
+  };
+  for (int i=0; i<39; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeCCompound() {
+  CompoundPtr c( new Compound("C"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('R'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H14 N3 O8 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "O2'", "O2*", "O", false, true),
+    AtomSpec(12, "C1'", "C1*", "C", false, true),
+    AtomSpec(13, "N1", "N1", "N", false, true),
+    AtomSpec(14, "C2", "C2", "C", false, true),
+    AtomSpec(15, "O2", "O2", "O", false, true),
+    AtomSpec(16, "N3", "N3", "N", false, true),
+    AtomSpec(17, "C4", "C4", "C", false, true),
+    AtomSpec(18, "N4", "N4", "N", false, true),
+    AtomSpec(19, "C5", "C5", "C", false, true),
+    AtomSpec(20, "C6", "C6", "C", false, true),
+    AtomSpec(21, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(22, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(23, "H5'", "1H5*", "H", false, true),
+    AtomSpec(24, "H5''", "2H5*", "H", false, true),
+    AtomSpec(25, "H4'", "H4*", "H", false, true),
+    AtomSpec(26, "H3'", "H3*", "H", false, true),
+    AtomSpec(27, "HO3'", "H3T", "H", true, true),
+    AtomSpec(28, "H2'", "H2*", "H", false, true),
+    AtomSpec(29, "HO2'", "2HO*", "H", false, true),
+    AtomSpec(30, "H1'", "H1*", "H", false, true),
+    AtomSpec(31, "H41", "1H4", "H", false, true),
+    AtomSpec(32, "H42", "2H4", "H", false, true),
+    AtomSpec(33, "H5", "H5", "H", false, true),
+    AtomSpec(34, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<35; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 21, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 22, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(5, 24, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 25, 1),
+    BondSpec(7, 12, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 26, 1),
+    BondSpec(9, 27, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 12, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(11, 29, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 30, 1),
+    BondSpec(13, 14, 1),
+    BondSpec(13, 20, 1),
+    BondSpec(14, 15, 2),
+    BondSpec(14, 16, 1),
+    BondSpec(16, 17, 2),
+    BondSpec(17, 18, 1),
+    BondSpec(17, 19, 1),
+    BondSpec(18, 31, 1),
+    BondSpec(18, 32, 1),
+    BondSpec(19, 20, 2),
+    BondSpec(19, 33, 1),
+    BondSpec(20, 34, 1)
+  };
+  for (int i=0; i<36; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeUCompound() {
+  CompoundPtr c( new Compound("U"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('R'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H13 N2 O9 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "O2'", "O2*", "O", false, true),
+    AtomSpec(12, "C1'", "C1*", "C", false, true),
+    AtomSpec(13, "N1", "N1", "N", false, true),
+    AtomSpec(14, "C2", "C2", "C", false, true),
+    AtomSpec(15, "O2", "O2", "O", false, true),
+    AtomSpec(16, "N3", "N3", "N", false, true),
+    AtomSpec(17, "C4", "C4", "C", false, true),
+    AtomSpec(18, "O4", "O4", "O", false, true),
+    AtomSpec(19, "C5", "C5", "C", false, true),
+    AtomSpec(20, "C6", "C6", "C", false, true),
+    AtomSpec(21, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(22, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(23, "H5'", "1H5*", "H", false, true),
+    AtomSpec(24, "H5''", "2H5*", "H", false, true),
+    AtomSpec(25, "H4'", "H4*", "H", false, true),
+    AtomSpec(26, "H3'", "H3*", "H", false, true),
+    AtomSpec(27, "HO3'", "H3T", "H", true, true),
+    AtomSpec(28, "H2'", "H2*", "H", false, true),
+    AtomSpec(29, "HO2'", "2HO*", "H", false, true),
+    AtomSpec(30, "H1'", "H1*", "H", false, true),
+    AtomSpec(31, "H3", "H3", "H", false, true),
+    AtomSpec(32, "H5", "H5", "H", false, true),
+    AtomSpec(33, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<34; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 21, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 22, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(5, 24, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 25, 1),
+    BondSpec(7, 12, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 26, 1),
+    BondSpec(9, 27, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 12, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(11, 29, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 30, 1),
+    BondSpec(13, 14, 1),
+    BondSpec(13, 20, 1),
+    BondSpec(14, 15, 2),
+    BondSpec(14, 16, 1),
+    BondSpec(16, 17, 1),
+    BondSpec(16, 31, 1),
+    BondSpec(17, 18, 2),
+    BondSpec(17, 19, 1),
+    BondSpec(19, 20, 2),
+    BondSpec(19, 32, 1),
+    BondSpec(20, 33, 1)
+  };
+  for (int i=0; i<35; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeDGCompound() {
+  CompoundPtr c( new Compound("DG"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H14 N5 O7 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N9", "N9", "N", false, true),
+    AtomSpec(13, "C8", "C8", "C", false, true),
+    AtomSpec(14, "N7", "N7", "N", false, true),
+    AtomSpec(15, "C5", "C5", "C", false, true),
+    AtomSpec(16, "C6", "C6", "C", false, true),
+    AtomSpec(17, "O6", "O6", "O", false, true),
+    AtomSpec(18, "N1", "N1", "N", false, true),
+    AtomSpec(19, "C2", "C2", "C", false, true),
+    AtomSpec(20, "N2", "N2", "N", false, true),
+    AtomSpec(21, "N3", "N3", "N", false, true),
+    AtomSpec(22, "C4", "C4", "C", false, true),
+    AtomSpec(23, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(24, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(25, "H5'", "1H5*", "H", false, true),
+    AtomSpec(26, "H5''", "2H5*", "H", false, true),
+    AtomSpec(27, "H4'", "H4*", "H", false, true),
+    AtomSpec(28, "H3'", "H3*", "H", false, true),
+    AtomSpec(29, "HO3'", "H3T", "H", true, true),
+    AtomSpec(30, "H2'", "1H2*", "H", false, true),
+    AtomSpec(31, "H2''", "2H2*", "H", false, true),
+    AtomSpec(32, "H1'", "H1*", "H", false, true),
+    AtomSpec(33, "H8", "H8", "H", false, true),
+    AtomSpec(34, "H1", "H1", "H", false, true),
+    AtomSpec(35, "H21", "1H2", "H", false, true),
+    AtomSpec(36, "H22", "2H2", "H", false, true)
+  };
+  for (int i=0; i<37; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 23, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 24, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 25, 1),
+    BondSpec(5, 26, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 27, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 28, 1),
+    BondSpec(9, 29, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 30, 1),
+    BondSpec(10, 31, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 32, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 22, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 33, 1),
+    BondSpec(14, 15, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(15, 22, 2),
+    BondSpec(16, 17, 2),
+    BondSpec(16, 18, 1),
+    BondSpec(18, 19, 1),
+    BondSpec(18, 34, 1),
+    BondSpec(19, 20, 1),
+    BondSpec(19, 21, 2),
+    BondSpec(20, 35, 1),
+    BondSpec(20, 36, 1),
+    BondSpec(21, 22, 1)
+  };
+  for (int i=0; i<39; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeDTCompound() {
+  CompoundPtr c( new Compound("DT"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H15 N2 O8 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N1", "N1", "N", false, true),
+    AtomSpec(13, "C2", "C2", "C", false, true),
+    AtomSpec(14, "O2", "O2", "O", false, true),
+    AtomSpec(15, "N3", "N3", "N", false, true),
+    AtomSpec(16, "C4", "C4", "C", false, true),
+    AtomSpec(17, "O4", "O4", "O", false, true),
+    AtomSpec(18, "C5", "C5", "C", false, true),
+    AtomSpec(19, "C7", "C5M", "C", false, true),
+    AtomSpec(20, "C6", "C6", "C", false, true),
+    AtomSpec(21, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(22, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(23, "H5'", "1H5*", "H", false, true),
+    AtomSpec(24, "H5''", "2H5*", "H", false, true),
+    AtomSpec(25, "H4'", "H4*", "H", false, true),
+    AtomSpec(26, "H3'", "H3*", "H", false, true),
+    AtomSpec(27, "HO3'", "H3T", "H", true, true),
+    AtomSpec(28, "H2'", "1H2*", "H", false, true),
+    AtomSpec(29, "H2''", "2H2*", "H", false, true),
+    AtomSpec(30, "H1'", "H1*", "H", false, true),
+    AtomSpec(31, "H3", "H3", "H", false, true),
+    AtomSpec(32, "H71", "1H5M", "H", false, true),
+    AtomSpec(33, "H72", "2H5M", "H", false, true),
+    AtomSpec(34, "H73", "3H5M", "H", false, true),
+    AtomSpec(35, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<36; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 21, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 22, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(5, 24, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 25, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 26, 1),
+    BondSpec(9, 27, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(10, 29, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 30, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 20, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 15, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(15, 31, 1),
+    BondSpec(16, 17, 2),
+    BondSpec(16, 18, 1),
+    BondSpec(18, 19, 1),
+    BondSpec(18, 20, 2),
+    BondSpec(19, 32, 1),
+    BondSpec(19, 33, 1),
+    BondSpec(19, 34, 1),
+    BondSpec(20, 35, 1)
+  };
+  for (int i=0; i<37; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeDUCompound() {
+  CompoundPtr c( new Compound("DU"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H13 N2 O8 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N1", "N1", "N", false, true),
+    AtomSpec(13, "C2", "C2", "C", false, true),
+    AtomSpec(14, "O2", "O2", "O", false, true),
+    AtomSpec(15, "N3", "N3", "N", false, true),
+    AtomSpec(16, "C4", "C4", "C", false, true),
+    AtomSpec(17, "O4", "O4", "O", false, true),
+    AtomSpec(18, "C5", "C5", "C", false, true),
+    AtomSpec(19, "C6", "C6", "C", false, true),
+    AtomSpec(20, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(21, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(22, "H5'", "1H5*", "H", false, true),
+    AtomSpec(23, "H5''", "2H5*", "H", false, true),
+    AtomSpec(24, "H4'", "H4*", "H", false, true),
+    AtomSpec(25, "H3'", "H3*", "H", false, true),
+    AtomSpec(26, "HO3'", "H3T", "H", true, true),
+    AtomSpec(27, "H2'", "1H2*", "H", false, true),
+    AtomSpec(28, "H2''", "2H2*", "H", false, true),
+    AtomSpec(29, "H1'", "H1*", "H", false, true),
+    AtomSpec(30, "H3", "H3", "H", false, true),
+    AtomSpec(31, "H5", "H5", "H", false, true),
+    AtomSpec(32, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<33; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 20, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 21, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 22, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 24, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 25, 1),
+    BondSpec(9, 26, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 27, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 29, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 19, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 15, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(15, 30, 1),
+    BondSpec(16, 17, 2),
+    BondSpec(16, 18, 1),
+    BondSpec(18, 19, 2),
+    BondSpec(18, 31, 1),
+    BondSpec(19, 32, 1)
+  };
+  for (int i=0; i<34; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeDCCompound() {
+  CompoundPtr c( new Compound("DC"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C9 H14 N3 O7 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N1", "N1", "N", false, true),
+    AtomSpec(13, "C2", "C2", "C", false, true),
+    AtomSpec(14, "O2", "O2", "O", false, true),
+    AtomSpec(15, "N3", "N3", "N", false, true),
+    AtomSpec(16, "C4", "C4", "C", false, true),
+    AtomSpec(17, "N4", "N4", "N", false, true),
+    AtomSpec(18, "C5", "C5", "C", false, true),
+    AtomSpec(19, "C6", "C6", "C", false, true),
+    AtomSpec(20, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(21, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(22, "H5'", "1H5*", "H", false, true),
+    AtomSpec(23, "H5''", "2H5*", "H", false, true),
+    AtomSpec(24, "H4'", "H4*", "H", false, true),
+    AtomSpec(25, "H3'", "H3*", "H", false, true),
+    AtomSpec(26, "HO3'", "H3T", "H", true, true),
+    AtomSpec(27, "H2'", "1H2*", "H", false, true),
+    AtomSpec(28, "H2''", "2H2*", "H", false, true),
+    AtomSpec(29, "H1'", "H1*", "H", false, true),
+    AtomSpec(30, "H41", "1H4", "H", false, true),
+    AtomSpec(31, "H42", "2H4", "H", false, true),
+    AtomSpec(32, "H5", "H5", "H", false, true),
+    AtomSpec(33, "H6", "H6", "H", false, true)
+  };
+  for (int i=0; i<34; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 20, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 21, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 22, 1),
+    BondSpec(5, 23, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 24, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 25, 1),
+    BondSpec(9, 26, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 27, 1),
+    BondSpec(10, 28, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 29, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 19, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 15, 1),
+    BondSpec(15, 16, 2),
+    BondSpec(16, 17, 1),
+    BondSpec(16, 18, 1),
+    BondSpec(17, 30, 1),
+    BondSpec(17, 31, 1),
+    BondSpec(18, 19, 2),
+    BondSpec(18, 32, 1),
+    BondSpec(19, 33, 1)
+  };
+  for (int i=0; i<35; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}
+CompoundPtr MakeDACompound() {
+  CompoundPtr c( new Compound("DA"));
+  c->SetOneLetterCode('Y');
+  c->SetChemClass(mol::ChemClass('S'));
+  c->SetChemType(mol::ChemType('U'));
+  c->SetFormula("C10 H14 N5 O6 P");
+  AtomSpec atoms[] = {
+    AtomSpec(0, "OP3", "O3P", "O", true, true),
+    AtomSpec(1, "P", "P", "P", false, true),
+    AtomSpec(2, "OP1", "O1P", "O", false, true),
+    AtomSpec(3, "OP2", "O2P", "O", false, true),
+    AtomSpec(4, "O5'", "O5*", "O", false, true),
+    AtomSpec(5, "C5'", "C5*", "C", false, true),
+    AtomSpec(6, "C4'", "C4*", "C", false, true),
+    AtomSpec(7, "O4'", "O4*", "O", false, true),
+    AtomSpec(8, "C3'", "C3*", "C", false, true),
+    AtomSpec(9, "O3'", "O3*", "O", false, true),
+    AtomSpec(10, "C2'", "C2*", "C", false, true),
+    AtomSpec(11, "C1'", "C1*", "C", false, true),
+    AtomSpec(12, "N9", "N9", "N", false, true),
+    AtomSpec(13, "C8", "C8", "C", false, true),
+    AtomSpec(14, "N7", "N7", "N", false, true),
+    AtomSpec(15, "C5", "C5", "C", false, true),
+    AtomSpec(16, "C6", "C6", "C", false, true),
+    AtomSpec(17, "N6", "N6", "N", false, true),
+    AtomSpec(18, "N1", "N1", "N", false, true),
+    AtomSpec(19, "C2", "C2", "C", false, true),
+    AtomSpec(20, "N3", "N3", "N", false, true),
+    AtomSpec(21, "C4", "C4", "C", false, true),
+    AtomSpec(22, "HOP3", "3HOP", "H", false, true),
+    AtomSpec(23, "HOP2", "2HOP", "H", false, true),
+    AtomSpec(24, "H5'", "1H5*", "H", false, true),
+    AtomSpec(25, "H5''", "2H5*", "H", false, true),
+    AtomSpec(26, "H4'", "H4*", "H", false, true),
+    AtomSpec(27, "H3'", "H3*", "H", false, true),
+    AtomSpec(28, "HO3'", "H3T", "H", true, true),
+    AtomSpec(29, "H2'", "1H2*", "H", false, true),
+    AtomSpec(30, "H2''", "2H2*", "H", false, true),
+    AtomSpec(31, "H1'", "H1*", "H", false, true),
+    AtomSpec(32, "H8", "H8", "H", false, true),
+    AtomSpec(33, "H61", "1H6", "H", false, true),
+    AtomSpec(34, "H62", "2H6", "H", false, true),
+    AtomSpec(35, "H2", "H2", "H", false, true)
+  };
+  for (int i=0; i<36; ++i) { c->AddAtom(atoms[i]); }
+  BondSpec bonds[] = {
+    BondSpec(0, 1, 1),
+    BondSpec(0, 22, 1),
+    BondSpec(1, 2, 2),
+    BondSpec(1, 3, 1),
+    BondSpec(1, 4, 1),
+    BondSpec(3, 23, 1),
+    BondSpec(4, 5, 1),
+    BondSpec(5, 6, 1),
+    BondSpec(5, 24, 1),
+    BondSpec(5, 25, 1),
+    BondSpec(6, 7, 1),
+    BondSpec(6, 8, 1),
+    BondSpec(6, 26, 1),
+    BondSpec(7, 11, 1),
+    BondSpec(8, 9, 1),
+    BondSpec(8, 10, 1),
+    BondSpec(8, 27, 1),
+    BondSpec(9, 28, 1),
+    BondSpec(10, 11, 1),
+    BondSpec(10, 29, 1),
+    BondSpec(10, 30, 1),
+    BondSpec(11, 12, 1),
+    BondSpec(11, 31, 1),
+    BondSpec(12, 13, 1),
+    BondSpec(12, 21, 1),
+    BondSpec(13, 14, 2),
+    BondSpec(13, 32, 1),
+    BondSpec(14, 15, 1),
+    BondSpec(15, 16, 1),
+    BondSpec(15, 21, 2),
+    BondSpec(16, 17, 1),
+    BondSpec(16, 18, 2),
+    BondSpec(17, 33, 1),
+    BondSpec(17, 34, 1),
+    BondSpec(18, 19, 1),
+    BondSpec(19, 20, 2),
+    BondSpec(19, 35, 1),
+    BondSpec(20, 21, 1)
+  };
+  for (int i=0; i<38; ++i) { c->AddBond(bonds[i]); }
+  return c;
+}