diff --git a/modules/conop/src/chemdict_tool.cc b/modules/conop/src/chemdict_tool.cc
index eff12c73e5096d821da1577137a10f594a77767e..4b040f1d23aa5cec5f684f31f968d0ae60e0ddff 100644
--- a/modules/conop/src/chemdict_tool.cc
+++ b/modules/conop/src/chemdict_tool.cc
@@ -42,16 +42,18 @@ void PrintUsage()
   std::cout << "supported dialects are: pdb, charmm, amber, opls" << std::endl;
   std::cout << "supported options are:" << std::endl;
   std::cout << "  -i  - ignore compounds reserved by the PDB (01-99, DRG, INH, LIG)" << std::endl;
+  std::cout << "  -o  - ignore obsolete compounds" << std::endl;
 }
 
 int main(int argc, char const *argv[])
 {
-  if (argc!=4 && argc!=5 && argc!=6) {
+  if (argc < 4) {
     PrintUsage();
     return 0;
   }
   conop::Compound::Dialect dialect=conop::Compound::PDB;
   bool ignore_reserved=false;
+  bool ignore_obsolete=false;
   for (int i = 4; i < argc; i++) {
     String param=argv[i];
 
@@ -65,6 +67,8 @@ int main(int argc, char const *argv[])
       dialect=conop::Compound::AMBER;
     } else if (param=="-i") {
       ignore_reserved=true;
+    } else if (param=="-o") {
+      ignore_obsolete=true;
     } else {
       PrintUsage();
       return 0;
@@ -81,7 +85,7 @@ int main(int argc, char const *argv[])
     filtered_istream.push(boost::iostreams::gzip_decompressor());
   }
   filtered_istream.push(istream);  
-  io::ChemdictParser cdp(filtered_istream, dialect, ignore_reserved);
+  io::ChemdictParser cdp(filtered_istream, dialect, ignore_reserved, ignore_obsolete);
   conop::CompoundLibPtr compound_lib;
   bool in_mem=false;
   if (!strncmp(argv[1], "create", 6)) {
diff --git a/modules/io/src/mol/chemdict_parser.cc b/modules/io/src/mol/chemdict_parser.cc
index d838d232a89d2eacb8a7c5c581dd14fd94294962..cf997f5b6b9e8f72149deb2f6d818f70b62e0d8c 100644
--- a/modules/io/src/mol/chemdict_parser.cc
+++ b/modules/io/src/mol/chemdict_parser.cc
@@ -5,11 +5,7 @@ namespace ost { namespace io {
 using namespace ost::conop;
   
 bool ChemdictParser::OnBeginData(const StringRef& data_name) 
-{    
-  if (data_name==StringRef("UNL",3)) {
-    compound_=CompoundPtr();
-    return false;    
-  }
+{
   compound_.reset(new Compound(data_name.str()));
   compound_->SetDialect(dialect_);
   if (last_!=data_name[0]) {
@@ -17,12 +13,6 @@ bool ChemdictParser::OnBeginData(const StringRef& data_name)
     std::cout << last_ << std::flush;
   }
   atom_map_.clear();
-  if (ignore_reserved_ && IsNameReserved(data_name))  {
-    insert_=false;
-  }
-  else {
-    insert_=true;
-  }
   return true;
 }
 
@@ -183,11 +173,17 @@ void ChemdictParser::OnDataItem(const StarDataItem& item)
 
 void ChemdictParser::OnEndData()
 {
-  if (insert_ && compound_) {
-    if (compound_->GetAtomSpecs().empty()) {
-      compound_->AddAtom(atom_);
+  if (compound_)
+  {
+    if (compound_->GetID() != "UNL" &&
+        ! (ignore_reserved_ && IsNameReserved(compound_->GetID())) &&
+        ! (ignore_obsolete_ && compound_->GetObsolete()))
+    {
+      if (compound_->GetAtomSpecs().empty()) {
+        compound_->AddAtom(atom_);
+      }
+      lib_->AddCompound(compound_);
     }
-    lib_->AddCompound(compound_);      
   }
 }
 
@@ -257,7 +253,7 @@ void ChemdictParser::InitPDBXTypeMap()
   xtm_["?"]=mol::ChemType(mol::ChemType::UNKNOWN);
 }
 
-bool ChemdictParser::IsNameReserved(const StringRef& data_name)
+bool ChemdictParser::IsNameReserved(const String& data_name)
 {
   // This checks if the compound name is one of the reserved name that will
   // never be used in the PDB. See
@@ -266,10 +262,10 @@ bool ChemdictParser::IsNameReserved(const StringRef& data_name)
        (data_name.length() == 2 &&
          data_name[0] >= '0' && data_name[0] <= '9' &&
          data_name[1] >= '0' && data_name[1] <= '9' &&
-         data_name != StringRef("00", 2)) ||
-       data_name == StringRef("DRG", 3) ||
-       data_name == StringRef("INH", 3) ||
-       data_name == StringRef("LIG", 3)
+         data_name != "00") ||
+       data_name == "DRG" ||
+       data_name == "INH" ||
+       data_name == "LIG"
      )
   {
     std::cout << "Ignoring reserved compound " << data_name << std::endl;
diff --git a/modules/io/src/mol/chemdict_parser.hh b/modules/io/src/mol/chemdict_parser.hh
index 00a395b989eb471b05b6fc9d752cd5daffd6494c..7a30cc8fcb434fe825ed887b3159ac5f7ed16180 100644
--- a/modules/io/src/mol/chemdict_parser.hh
+++ b/modules/io/src/mol/chemdict_parser.hh
@@ -41,10 +41,10 @@ typedef enum {
 class DLLEXPORT_OST_IO ChemdictParser : public StarParser {
 public:
   ChemdictParser(std::istream& stream, conop::Compound::Dialect dialect,
-    bool ignore_reserved=false):
+    bool ignore_reserved=false, bool ignore_obsolete=false):
     StarParser(stream), compound_(new conop::Compound("UNK")), 
     last_(0), loop_type_(DONT_KNOW), dialect_(dialect),
-    ignore_reserved_(ignore_reserved)
+    ignore_reserved_(ignore_reserved), ignore_obsolete_(ignore_obsolete)
   {
     this->InitTypeMap();
     this->InitPDBXTypeMap();
@@ -68,7 +68,7 @@ public:
 private:
   void InitTypeMap();  
   void InitPDBXTypeMap();
-  bool IsNameReserved(const StringRef& data_name);
+  bool IsNameReserved(const String& data_name);
   conop::CompoundLibPtr                   lib_;
   conop::CompoundPtr                      compound_;
   typedef enum {
@@ -88,14 +88,14 @@ private:
   } PropIndex;
   char                                    last_;
   int                                     indices_[10];
-  bool                                    insert_;
-  static std::map<String, mol::ChemClass> tm_;  
+  static std::map<String, mol::ChemClass> tm_;
   static std::map<String, mol::ChemType>  xtm_;
   std::map<String, int>                   atom_map_;
   LoopType                                loop_type_;  
   conop::AtomSpec                         atom_;
   conop::Compound::Dialect                dialect_;
   bool                                    ignore_reserved_;
+  bool                                    ignore_obsolete_;
 };