diff --git a/modules/seq/base/pymod/export_hmm.cc b/modules/seq/base/pymod/export_hmm.cc
index 8ca85193958010d44d02c1b6506268ee7b2e7f1b..72a072215b33285509424a35e8f80dcb9db8265b 100644
--- a/modules/seq/base/pymod/export_hmm.cc
+++ b/modules/seq/base/pymod/export_hmm.cc
@@ -52,6 +52,7 @@ void export_hmm()
   class_<HMM, HMMPtr>("HMM", init<>())
     .def("Load", &HMM::Load).staticmethod("Load")
     .def("AddColumn", &HMM::push_back)
+    .def("Extract", &HMM::Extract)
     .add_property("null_model", make_function(&HMM::GetNullModel,
                   return_value_policy<copy_const_reference>()))
     .add_property("columns", 
diff --git a/modules/seq/base/src/hmm.cc b/modules/seq/base/src/hmm.cc
index 390a55b82eb556ced56dbda62bf97de31dc8cb35..fd953d5f5f5e5126864b373bc28e7a212118ae30 100644
--- a/modules/seq/base/src/hmm.cc
+++ b/modules/seq/base/src/hmm.cc
@@ -159,6 +159,27 @@ String HMM::GetSequence() const{
   return ss.str();
 }
 
+HMMPtr HMM::Extract(uint from, uint to){
+
+  if(to <= from){
+    throw std::runtime_error("Second index must be bigger than first one!");
+  }
+
+  if(to >= this->size()){
+    throw std::runtime_error("Invalid index!");
+  }
+
+  HMMPtr return_hmm(new HMM);
+  return_hmm->SetNullModel(null_model_);
+  for(uint i = from; i < to; ++i){
+    return_hmm->push_back(columns_[i]);
+  }
+
+  return return_hmm;
+}
+
+
+
 
 Real HMM::GetAverageEntropy() const {
   Real n_eff=0.0;
diff --git a/modules/seq/base/src/hmm.hh b/modules/seq/base/src/hmm.hh
index 82826948e6a81e4d96d815357196dd0bfa5d2bdd..68b83db1e666c15e4761a4c682ae3833b1287fa5 100644
--- a/modules/seq/base/src/hmm.hh
+++ b/modules/seq/base/src/hmm.hh
@@ -194,6 +194,8 @@ class HMM {
 
   String GetSequence() const;
 
+  HMMPtr Extract(uint from, uint to);
+
   //some functions to make it behave like a vector
 
   size_t size() const { return columns_.size(); }