diff --git a/modules/io/src/mol/sdf_reader.cc b/modules/io/src/mol/sdf_reader.cc
index 72488aa989ec1bc26e690d211fb39ae25cad4b06..45b6aeca15ae479a8eea927407744ace12edc257 100644
--- a/modules/io/src/mol/sdf_reader.cc
+++ b/modules/io/src/mol/sdf_reader.cc
@@ -71,11 +71,11 @@ void SDFReader::Import(mol::EntityHandle& ent)
     }
 
     if (line_num<=4) {
-      ParseAndAddHeader(line, line_num, ent, editor);
+      ParseHeader(line, line_num, ent, editor);
     } else if (line_num<=atom_count_+4) {
-      ParseAndAddAtom(line, line_num, ent, true, editor);
+      AddAtom(ParseAtom(line, line_num), line_num, ent, true, editor);
     } else if (line_num<=bond_count_+atom_count_+4) {
-      ParseAndAddBond(line, line_num, ent, editor);
+      AddBond(ParseBond(line, line_num), line_num, ent, editor);
     } else if (boost::iequals(line.substr(0,2), "> ")) {
       // parse data items
       int data_header_start = line.find('<');
@@ -129,7 +129,7 @@ void SDFReader::NextMolecule()
   curr_chain_ = ost::mol::ChainHandle();
 }
 
-void SDFReader::ParseAndAddHeader(const String& line, int line_num,
+void SDFReader::ParseHeader(const String& line, int line_num,
                                   mol::EntityHandle& ent, mol::XCSEditor& editor)
 {
   LOG_TRACE( "line: [" << line << "]" );
@@ -190,9 +190,7 @@ void SDFReader::ParseAndAddHeader(const String& line, int line_num,
   }
 }
 
-void SDFReader::ParseAndAddAtom(const String& line, int line_num,
-                                mol::EntityHandle& ent, bool hetatm,
-                                mol::XCSEditor& editor)
+SDFReader::atom_data SDFReader::ParseAtom(const String& line, int line_num)
 {
 
   LOG_TRACE( "line: [" << line << "]" );
@@ -215,6 +213,16 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num,
   String s_ele=line.substr(31,3);
   String s_charge=line.substr(36,3);
 
+  return std::make_tuple(anum, s_posx, s_posy, s_posz, s_ele, s_charge);
+}
+
+void SDFReader::AddAtom(const atom_data& atom_tuple, int line_num, mol::EntityHandle& ent,
+               bool hetatm, mol::XCSEditor& editor)
+{
+  int anum;
+  String s_posx, s_posy, s_posz, s_ele, s_charge;
+  tie(anum, s_posx, s_posy, s_posz, s_ele, s_charge) = atom_tuple;
+
   geom::Vec3 apos;
   try {
     apos=geom::Vec3(boost::lexical_cast<Real>(boost::trim_copy(s_posx)),
@@ -262,8 +270,7 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num,
 }
 
 
-void SDFReader::ParseAndAddBond(const String& line, int line_num,
-                                mol::EntityHandle& ent, mol::XCSEditor& editor)
+SDFReader::bond_data SDFReader::ParseBond(const String& line, int line_num)
 {
 
   LOG_TRACE( "line: [" << line << "]" );
@@ -283,10 +290,20 @@ void SDFReader::ParseAndAddBond(const String& line, int line_num,
   String s_first_name=line.substr(0,3);
   String s_second_name=line.substr(3,3);
   String s_type=line.substr(6,3);
-  String first_name, second_name;
+
+  return std::make_tuple(s_first_name, s_second_name, s_type);
+}
+
+void SDFReader::AddBond(const bond_data& bond_tuple, int line_num, mol::EntityHandle& ent,
+               mol::XCSEditor& editor)
+{
+  String s_first_name, s_second_name, s_type;
+  tie(s_first_name, s_second_name, s_type) = bond_tuple;
+
   unsigned char type;
   mol::BondHandle bond;
 
+  String first_name, second_name;
   first_name=boost::trim_copy(s_first_name);
   second_name=boost::trim_copy(s_second_name);
 
diff --git a/modules/io/src/mol/sdf_reader.hh b/modules/io/src/mol/sdf_reader.hh
index f786f4e5426bf5068022ef0f8ed3657c8481be2c..7863fb7840fda692e60fa5e3a9c6cbc09e396953 100644
--- a/modules/io/src/mol/sdf_reader.hh
+++ b/modules/io/src/mol/sdf_reader.hh
@@ -22,6 +22,7 @@
 #ifndef OST_IO_SDF_READER_HH
 #define OST_IO_SDF_READER_HH
 
+#include <tuple>
 #include <boost/iostreams/filtering_stream.hpp>
 #include <boost/filesystem/fstream.hpp>
 #include <ost/mol/chain_handle.hh>
@@ -30,6 +31,9 @@
 
 namespace ost { namespace io {
 
+
+
+
 class DLLEXPORT_OST_IO SDFReader {
 public:
   SDFReader(const String& filename);
@@ -41,17 +45,22 @@ public:
   void Import(mol::EntityHandle& ent);
 
 private:
+  typedef std::tuple<int, String, String, String, String, String> atom_data;
+  typedef std::tuple<String, String, String> bond_data;
+
   void ClearState(const boost::filesystem::path& loc);
   void NextMolecule();
 
-  void ParseAndAddHeader(const String& line, int line_num, mol::EntityHandle& ent,
+  void ParseHeader(const String& line, int line_num, mol::EntityHandle& ent,
                          mol::XCSEditor& editor);
 
-  void ParseAndAddAtom(const String& line, int line_num, mol::EntityHandle& ent,
-                       bool hetatm, mol::XCSEditor& editor);
+  void AddAtom(const atom_data& atom_tuple, int line_num, mol::EntityHandle& ent,
+               bool hetatm, mol::XCSEditor& editor);
+  atom_data ParseAtom(const String& line, int line_num);
 
-  void ParseAndAddBond(const String& line, int line_num, mol::EntityHandle& ent,
+  void AddBond(const bond_data& bond_tuple, int line_num, mol::EntityHandle& ent,
                        mol::XCSEditor& editor);
+  bond_data ParseBond(const String& line, int line_num);
 
   String curr_chain_name_;
   mol::ResidueKey curr_res_key_;