diff --git a/modules/mol/base/pymod/export_chain.cc b/modules/mol/base/pymod/export_chain.cc
index 56bdf94ad66b184b34e592a0710f45c1cc505dda..45823447129d8e4b90d08829578ab1ee6323cbe3 100644
--- a/modules/mol/base/pymod/export_chain.cc
+++ b/modules/mol/base/pymod/export_chain.cc
@@ -55,6 +55,14 @@ void export_Chain()
     .def("IsValid", &ChainBase::IsValid)
     .def("GetType", &ChainBase::GetType)
     .def("GetDescription", &ChainBase::GetDescription)
+    .def("IsPolypeptide", &ChainBase::IsPolypeptide)
+    .def("IsPolynucleotide", &ChainBase::IsPolynucleotide)
+    .def("IsPolysaccharide", &ChainBase::IsPolysaccharide)
+    .def("IsPolymer", &ChainBase::IsPolymer)
+    .add_property("is_polypeptide", &ChainBase::IsPolypeptide)
+    .add_property("is_polynucleotide", &ChainBase::IsPolynucleotide)
+    .add_property("is_polysaccharide", &ChainBase::IsPolysaccharide)
+    .add_property("is_polymer", &ChainBase::IsPolymer)
   ;
   generic_prop_def<ChainBase>(chain_base);
   class_<ChainHandle, bases<ChainBase> >("ChainHandle", init<>())
diff --git a/modules/mol/base/src/chain_base.cc b/modules/mol/base/src/chain_base.cc
index 6e534a4dc529dcb7a653a677a6e8bb47df6369ac..bbf0cfdad68397971844ba49fb5e2ba4b378d953 100644
--- a/modules/mol/base/src/chain_base.cc
+++ b/modules/mol/base/src/chain_base.cc
@@ -67,5 +67,32 @@ std::ostream& operator<<(std::ostream& os, const ChainBase& chain)
   return os;
 }
 
+bool ChainBase::IsPolymer() const
+{
+  this->CheckValidity();
+  return impl_->IsPolymer();
+  
+}
+
+bool ChainBase::IsPolysaccharide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolysaccharide();
+  
+}
+
+bool ChainBase::IsPolypeptide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolypeptide();
+  
+}
+
+bool ChainBase::IsPolynucleotide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolynucleotide();
+}
+
 }} // ns
 
diff --git a/modules/mol/base/src/chain_base.hh b/modules/mol/base/src/chain_base.hh
index 525ad36583e516250047bdb8d49db4abc15f411d..984c948fd94b934656f4920baf3e1da739efd89a 100644
--- a/modules/mol/base/src/chain_base.hh
+++ b/modules/mol/base/src/chain_base.hh
@@ -74,6 +74,21 @@ public:
     return impl_;
   }
 
+  /// \brief whether the chain is a polymer
+  ///
+  /// True if one of IsPolysaccharide(), IsPolynucleotide(), IsPolypeptide() is 
+  /// true or the chain is of type CHAINTYPE_POLYMER.
+  bool IsPolymer() const;
+  
+  /// \brief whether the chain is a polysaccharide
+  bool IsPolysaccharide() const;
+  
+  /// \brief whether the chain is a polypeptide
+  bool IsPolypeptide() const;
+  
+  /// \brief whether the chain is a polynucleotide
+  bool IsPolynucleotide() const;
+  
   impl::ChainImplPtr& Impl() {
     return impl_;
   }
diff --git a/modules/mol/base/src/impl/chain_impl.hh b/modules/mol/base/src/impl/chain_impl.hh
index 546a2ae8d9977b423ec26237553b0fd8ddecb736..1f871d504768d260daac80b4e9239b98f76e95e6 100644
--- a/modules/mol/base/src/impl/chain_impl.hh
+++ b/modules/mol/base/src/impl/chain_impl.hh
@@ -63,6 +63,29 @@ public:
   {
     return type_;
   }
+  
+  /// \brief whether the chain is a polymer
+  bool IsPolymer() const
+  {
+    return type_==CHAINTYPE_POLY || this->IsPolypeptide() || 
+          this->IsPolynucleotide() || this->IsPolysaccharide();
+  }
+  /// \brief whether the chain is a polysaccharide
+  bool IsPolysaccharide() const
+  {
+    return type_==CHAINTYPE_POLY_SAC_D || type_==CHAINTYPE_POLY_SAC_L;
+  }
+  /// \brief whether the chain is a polypeptide
+  bool IsPolypeptide() const
+  {
+    return type_==CHAINTYPE_POLY_PEPTIDE_D || type_==CHAINTYPE_POLY_PEPTIDE_L;
+  }
+  /// \brief whether the chain is a polynucleotide
+  bool IsPolynucleotide() const
+  {
+    return type_==CHAINTYPE_POLY_DN || type_==CHAINTYPE_POLY_RN || 
+           type_==CHAINTYPE_POLY_DN_RN;
+  }
 
   /// \brief Assign a description to a chain.
   ///
diff --git a/modules/mol/base/tests/test_chain.cc b/modules/mol/base/tests/test_chain.cc
index b0ffc3087eeaa0817c5a1be51311bcd48c171939..3b7bbd85b15bee45ec61832548dfc97541893257 100644
--- a/modules/mol/base/tests/test_chain.cc
+++ b/modules/mol/base/tests/test_chain.cc
@@ -210,26 +210,70 @@ BOOST_AUTO_TEST_CASE(chain_type)
 
    // setting/ getting
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_UNKNOWN);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_POLY);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_NON_POLY);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_NON_POLY);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_WATER);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_WATER);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_POLY_PEPTIDE_D);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_PEPTIDE_D);
    e.SetChainType(ch1, CHAINTYPE_POLY_PEPTIDE_L);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_PEPTIDE_L);
    e.SetChainType(ch1, CHAINTYPE_POLY_DN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_DN);
    e.SetChainType(ch1, CHAINTYPE_POLY_RN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_RN);
    e.SetChainType(ch1, CHAINTYPE_POLY_SAC_D);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_SAC_D);
    e.SetChainType(ch1, CHAINTYPE_POLY_SAC_L);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_SAC_L);
    e.SetChainType(ch1, CHAINTYPE_POLY_DN_RN);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_DN_RN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_N_CHAINTYPES);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_N_CHAINTYPES);
    e.SetChainType(ch1, CHAINTYPE_UNKNOWN);