diff --git a/modules/db/pymod/export_linear_db.cc b/modules/db/pymod/export_linear_db.cc
index 6ee2d2f0191be3b4a78a3652d0edf3da2ca33483..2908bdb8c6eea57c988bd11c9605b2825ab0891b 100644
--- a/modules/db/pymod/export_linear_db.cc
+++ b/modules/db/pymod/export_linear_db.cc
@@ -166,23 +166,32 @@ struct DisCoDataContainers {
   LinearPositionContainerPtr position_container;
 };
 
+// helper struct to wrap output
 
-void WrapExtractTemplateDataDisCo(const String& entry_name, const String& chain_name,
-                                  const ost::seq::AlignmentHandle& aln,
-                                  DisCoDataContainers& data_containers,
-                                  boost::python::list& residue_numbers,
-                                  geom::Vec3List& positions) {
+struct ExtractedDisCoData{
+  std::vector<int> residue_numbers;
+  geom::Vec3List ca_positions;
+};
+typedef boost::shared_ptr<ExtractedDisCoData> ExtractedDisCoDataPtr;
+list WrapExtractedDisCoDataGetResNums(ExtractedDisCoDataPtr ptr) {
+  list residue_numbers;
+  VecToList(ptr->residue_numbers, residue_numbers); 
+  return residue_numbers;
+}
 
-  std::vector<int> v_residue_numbers;
+ExtractedDisCoDataPtr WrapExtractTemplateDataDisCo(const String& entry_name, 
+                                                   const String& chain_name,
+                                                   const ost::seq::AlignmentHandle& aln,
+                                                   DisCoDataContainers& data_containers) {
+  ExtractedDisCoDataPtr ptr(new ExtractedDisCoData);
   ost::db::ExtractTemplateDataDisCo(entry_name, chain_name, aln, 
                                     data_containers.indexer, 
                                     data_containers.seqres_container, 
                                     data_containers.atomseq_container, 
                                     data_containers.position_container, 
-                                    v_residue_numbers,
-                                    positions);
-  residue_numbers = boost::python::list();
-  VecToList(v_residue_numbers, residue_numbers);
+                                    ptr->residue_numbers,
+                                    ptr->ca_positions);
+  return ptr;
 } 
 
 
@@ -217,19 +226,27 @@ struct GMQEDataContainers {
   LinearPositionContainerPtr cb_position_container;
 };
 
+// helper struct to wrap output
+struct ExtractedGMQEData{
+  std::vector<int> residue_numbers;
+  String dssp;
+  geom::Vec3List n_positions;
+  geom::Vec3List ca_positions;
+  geom::Vec3List c_positions;
+  geom::Vec3List cb_positions; 
+};
+typedef boost::shared_ptr<ExtractedGMQEData> ExtractedGMQEDataPtr;
+list WrapExtractedGMQEDataGetResNums(ExtractedGMQEDataPtr ptr) {
+  list residue_numbers;
+  VecToList(ptr->residue_numbers, residue_numbers);
+  return residue_numbers;
+}
 
-void WrapExtractTemplateDataGMQE(const String& entry_name, 
-                                                const String& chain_name,
-                                                const ost::seq::AlignmentHandle& aln,
-                                                GMQEDataContainers& data_containers,
-                                                boost::python::list& residue_numbers,
-                                                String& dssp,
-                                                geom::Vec3List& n_positions,
-                                                geom::Vec3List& ca_positions,
-                                                geom::Vec3List& c_positions,
-                                                geom::Vec3List& cb_positions) {
-
-  std::vector<int> v_residue_numbers;
+ExtractedGMQEDataPtr WrapExtractTemplateDataGMQE(const String& entry_name, 
+                                                 const String& chain_name,
+                                                 const ost::seq::AlignmentHandle& aln,
+                                                 GMQEDataContainers& data_containers) {
+  ExtractedGMQEDataPtr ptr(new ExtractedGMQEData);
   ost::db::ExtractTemplateDataGMQE(entry_name, chain_name, aln, 
                                    data_containers.indexer, 
                                    data_containers.seqres_container, 
@@ -239,9 +256,10 @@ void WrapExtractTemplateDataGMQE(const String& entry_name,
                                    data_containers.ca_position_container, 
                                    data_containers.c_position_container,
                                    data_containers.cb_position_container, 
-                                   v_residue_numbers, dssp, n_positions, 
-                                   ca_positions, c_positions, cb_positions);
-  VecToList(v_residue_numbers, residue_numbers);
+                                   ptr->residue_numbers, ptr->dssp, 
+                                   ptr->n_positions, ptr->ca_positions, 
+                                   ptr->c_positions, ptr->cb_positions);
+  return ptr;
 }
 
 }
@@ -309,15 +327,18 @@ void export_linear_db() {
     .def_readonly("indexer", &DisCoDataContainers::indexer)
     .def_readonly("seqres_container", &DisCoDataContainers::seqres_container)
     .def_readonly("atomseq_container", &DisCoDataContainers::atomseq_container)
-    .def_readonly("position_container", &DisCoDataContainers::position_container)
+    .def_readonly("ca_position_container", &DisCoDataContainers::position_container)
+  ;
+
+  class_<ExtractedDisCoData, ExtractedDisCoDataPtr>("ExtractedDisCoData", no_init)
+    .add_property("residue_numbers", &WrapExtractedDisCoDataGetResNums)
+    .def_readonly("ca_positions", &ExtractedDisCoData::ca_positions)
   ;
 
   def("ExtractTemplateDataDisCo", &WrapExtractTemplateDataDisCo, (arg("entry_name"),
                                                                   arg("chain_name"),
                                                                   arg("aln"),
-                                                                  arg("data_containers"),
-                                                                  arg("residue_numbers"),
-                                                                  arg("positions")));
+                                                                  arg("data_containers")));
 
   class_<GMQEDataContainers>("GMQEDataContainers", init<const String&, 
                                                         const String&, 
@@ -337,16 +358,18 @@ void export_linear_db() {
     .def_readonly("cb_position_container", &GMQEDataContainers::cb_position_container)
   ;
 
+  class_<ExtractedGMQEData, ExtractedGMQEDataPtr>("ExtractedGMQEData", no_init)
+    .add_property("residue_numbers", &WrapExtractedGMQEDataGetResNums)
+    .def_readonly("dssp", &ExtractedGMQEData::dssp)
+    .def_readonly("n_positions", &ExtractedGMQEData::n_positions)
+    .def_readonly("ca_positions", &ExtractedGMQEData::ca_positions)
+    .def_readonly("c_positions", &ExtractedGMQEData::c_positions)
+    .def_readonly("cb_positions", &ExtractedGMQEData::cb_positions)
+  ;
+
   def("ExtractTemplateDataGMQE", &WrapExtractTemplateDataGMQE, (arg("entry_name"),
                                                                 arg("chain_name"),
                                                                 arg("aln"),
-                                                                arg("data_containers"),
-                                                                arg("residue_numbers"),
-                                                                arg("dssp"),
-                                                                arg("n_positions"),
-                                                                arg("ca_positions"),
-                                                                arg("c_positions"),
-                                                                arg("cb_positions")));
-
+                                                                arg("data_containers")));
 }