diff --git a/.gitignore b/.gitignore
index da71b5ba0d26201e9fe25fde79e37d09d1d3da55..8fa0d36751913400596408757340dc5a56ca4d97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@ CMakeLists.txt.user
 OpenStructure.cbp
 DartConfiguration.tcl
 Testing
+*~
diff --git a/examples/dokk/datafiles/hud.ini b/examples/dokk/datafiles/hud.ini
index c53f99455b46c22d94147ce10bee3141032b408f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/examples/dokk/datafiles/hud.ini
+++ b/examples/dokk/datafiles/hud.ini
@@ -1,3 +0,0 @@
-[TEXT]
-RMSD: Sie sind %.1f von der Lösung entfernt
-SECONDS: noch %i Sekunden
diff --git a/modules/gfx/pymod/export_entity.cc b/modules/gfx/pymod/export_entity.cc
index 2df144bbc1a5bae4727d1632718d77a2993cb80c..4edf1a012ee42117f0b9167a1cea35498e56bd23 100644
--- a/modules/gfx/pymod/export_entity.cc
+++ b/modules/gfx/pymod/export_entity.cc
@@ -228,12 +228,22 @@ RenderOptionsPtr ent_cpk_opts(Entity* ent)
   return ent->GetOptions(RenderMode::CPK);
 }
 
+void set_query1(Entity* e, const mol::Query& q)
+{
+  e->SetQuery(q);
+}
+
+void set_query2(Entity* e, const std::string& q)
+{
+  e->SetQuery(mol::Query(q));
+}
+
 }
 
 void export_Entity()
 {
-  class_<Entity, boost::shared_ptr<Entity>, bases<GfxObj>, boost::noncopyable>("Entity", init<const String&, const mol:: EntityHandle&, optional<const mol:: Query&> >())
-    .def(init<const String&, RenderMode::Type, const mol::EntityHandle&, optional<const mol::Query&> >())
+  class_<Entity, boost::shared_ptr<Entity>, bases<GfxObj>, boost::noncopyable>("Entity", init<const String&, const mol:: EntityHandle&, optional<const mol:: Query&, mol::QueryFlags> >())
+    .def(init<const String&, RenderMode::Type, const mol::EntityHandle&, optional<const mol::Query&, mol::QueryFlags> >())
     .def(init<const String&, const mol::EntityView&>())
     .def(init<const String&, RenderMode::Type, const mol::EntityView&>())
     .def("SetColor",ent_set_color1)
@@ -252,6 +262,8 @@ void export_Entity()
                   &Entity::SetSelection)
     .def("GetView", &Entity::GetView)
     .def("UpdateView", &Entity::UpdateView)
+    .def("SetQuery", set_query1)
+    .def("SetQuery", set_query2)
     .def("GetRenderModeName", &Entity::GetRenderModeName)
     .def("GetNotEmptyRenderModes", &Entity::GetNotEmptyRenderModes)
     .def("SetRenderMode", set_rm1, arg("keep")=false)
diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc
index 84d0a1bb7ed1f1207f75c7dab3454c0861bc4b22..7b816f33c3752fa6a95e6b4287d2d0cbf30030de 100644
--- a/modules/gfx/src/entity.cc
+++ b/modules/gfx/src/entity.cc
@@ -64,9 +64,10 @@ using namespace impl;
 
 Entity::Entity(const String& name,
                const EntityHandle& h,
-               const Query& q):
+               const Query& q,
+               QueryFlags f):
   GfxObj(name),
-  qv_(q, h),
+  qv_(q, h, f),
   bbox_(geom::Vec3(), geom::Vec3()),
   sel_(),
   sel_update_(),
@@ -82,9 +83,10 @@ Entity::Entity(const String& name,
 Entity::Entity(const String& name,
                RenderMode::Type m,
                const EntityHandle& h,
-               const Query& q):
+               const Query& q,
+               QueryFlags f):
   GfxObj(name),
-  qv_(q, h),
+  qv_(q, h, f),
   bbox_(geom::Vec3(), geom::Vec3()),
   sel_(),
   sel_update_(),
@@ -839,6 +841,13 @@ mol::EntityView Entity::GetView() const
   return cached_view_;
 }
 
+void Entity::SetQuery(const mol::Query& q)
+{
+  qv_.SetQuery(q);
+  update_view_=true;
+  Rebuild();
+}
+
 void Entity::ColorBy(const String& prop,
                      const Color& c1, const Color& c2,
                      mol::Prop::Level level)
diff --git a/modules/gfx/src/entity.hh b/modules/gfx/src/entity.hh
index d8896375428ffec7f95e3922b073e40a532be064..e1e66cd9e9f2f7fec88ae18dd1916e8325ea2256 100644
--- a/modules/gfx/src/entity.hh
+++ b/modules/gfx/src/entity.hh
@@ -70,13 +70,15 @@ public:
   /// Rebuild() will re-apply the mol::Query to the given mol::EntityHandle
   Entity(const String& name,
          const mol::EntityHandle& eh,
-         const mol::Query& q=mol::Query());
+         const mol::Query& q=mol::Query(),
+         mol::QueryFlags f=0);
 
   /// \brief variant with explicit graphics mode instead of the default
   Entity(const String& name,
          RenderMode::Type m,
          const mol::EntityHandle& eh,
-         const mol::Query& q=mol::Query());
+         const mol::Query& q=mol::Query(),
+         mol::QueryFlags f=0);
 
   /// \brief Initialize with an object name and an explicit mol::Entity view; 
   ///    later calls to Rebuild always use this mol::Entity view
@@ -174,6 +176,7 @@ public:
   /// \brief get view
   mol::EntityView GetView() const;
 
+  void SetQuery(const mol::Query& q);
 
   // turn blur on or off
   void SetBlur(bool f);
diff --git a/modules/gfx/src/impl/backbone_trace.cc b/modules/gfx/src/impl/backbone_trace.cc
index 32fef42cde9ffb8ae17e306fe9510b934fc00b35..26f9f009caacc3b352d9f631a9aeda87931de627 100644
--- a/modules/gfx/src/impl/backbone_trace.cc
+++ b/modules/gfx/src/impl/backbone_trace.cc
@@ -27,6 +27,23 @@
  
 namespace ost { namespace gfx { namespace impl {
 
+namespace {
+
+bool in_sequence(const mol::ResidueHandle& r1, const mol::ResidueHandle& r2)
+{
+  if(!r1.IsValid() || !r2.IsValid()) return false;
+  if(r1.GetChain()!=r2.GetChain()) return false;
+  mol::ResNum n1 = r1.GetNumber();
+  mol::ResNum n2 = r2.GetNumber();
+  if(n2.GetInsCode()!='\0') {
+    if(n1.NextInsertionCode()==n2) return true;
+  }
+  if(n1.GetNum()+1==n2.GetNum()) return true;
+  return false;
+}
+
+} // anon ns
+
 class TraceBuilder: public mol::EntityVisitor {
 public:
   TraceBuilder(BackboneTrace* bb_trace):
@@ -50,7 +67,9 @@ public:
 
   virtual bool VisitResidue(const mol::ResidueHandle& res)
   {
-    if(!mol::InSequence(last_residue_,res)) {
+    // check in-sequence
+    bool in_seq=in_sequence(last_residue_,res);
+    if(!in_seq) {
       if(!list_.empty()) {
         backbone_trace_->AddNodeEntryList(list_);
         list_.clear();
diff --git a/modules/gfx/src/impl/cpk_renderer.cc b/modules/gfx/src/impl/cpk_renderer.cc
index f2d74a4d2fdeec173258e53211d292ef7cb7af03..47bec0384791053608b15f6b6587c955d99e89a1 100644
--- a/modules/gfx/src/impl/cpk_renderer.cc
+++ b/modules/gfx/src/impl/cpk_renderer.cc
@@ -86,6 +86,7 @@ void CPKRenderer::Render(RenderPass pass)
 
 void CPKRenderer::RenderPov(PovState& pov, const std::string& name)
 {
+  if(view_.atom_map.empty()) return;
   pov.write_merge_or_union(name);
   
   for (AtomEntryMap::const_iterator it=view_.atom_map.begin();it!=view_.atom_map.end();++it) {
@@ -172,7 +173,6 @@ void CPKRenderer::Render3DSprites()
 
     glEnd();
     glPopAttrib();
-    glPopMatrix();
 
     Shader::Instance().PopProgram();
     Shader::Instance().UpdateState();
diff --git a/modules/gfx/src/impl/custom_renderer.cc b/modules/gfx/src/impl/custom_renderer.cc
index f8303fbedd3b486e14d40ef01f3b2c8f3aa4c32c..c9e2a2319ea70f3b4c51181ec688c4c964a35da3 100644
--- a/modules/gfx/src/impl/custom_renderer.cc
+++ b/modules/gfx/src/impl/custom_renderer.cc
@@ -79,6 +79,7 @@ void CustomRenderer::PrepareRendering(GfxView& view,
 
 void CustomRenderer::RenderPov(PovState& pov, const std::string& name)
 {
+  if(view_.atom_map.empty() && view_.bond_list.empty()) return;
   pov.write_merge_or_union(name);
   
   for (AtomEntryMap::const_iterator it=view_.atom_map.begin();it!=view_.atom_map.end();++it) {
diff --git a/modules/gfx/src/impl/scene_fx.cc b/modules/gfx/src/impl/scene_fx.cc
index bb3012e88a84868fcd961c5ba33286dd6d0125f4..2370addb637ee8114660a7a67b046866d1d045ed 100644
--- a/modules/gfx/src/impl/scene_fx.cc
+++ b/modules/gfx/src/impl/scene_fx.cc
@@ -61,7 +61,6 @@ SceneFX::~SceneFX()
 
 void SceneFX::Setup()
 {
-  if(!GLEW_VERSION_2_0) return;
   LOGN_DEBUG("SceneFX: setup");
 
   glGenTextures(1,&scene_tex_id_);
@@ -213,7 +212,6 @@ void SceneFX::Resize(unsigned int w, unsigned int h)
 
 void SceneFX::Preprocess() 
 {
-  if(!GLEW_VERSION_2_0) return;
   if(use_fb_) {
 #if GL_VERSION_3_0
     glBindFramebuffer(GL_FRAMEBUFFER, scene_fb_);
@@ -225,7 +223,6 @@ void SceneFX::Preprocess()
 
 void SceneFX::Postprocess()
 {
-  if(!GLEW_VERSION_2_0) return;
   if(use_fb_) {
 #if GL_VERSION_3_0
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
@@ -354,7 +351,6 @@ void SceneFX::Postprocess()
 
 void SceneFX::DrawTex(unsigned int w, unsigned int h, GLuint texid)
 {
-  if(!GLEW_VERSION_2_0) return;
   Shader::Instance().PushProgram();
   Shader::Instance().Activate("");
   glActiveTexture(GL_TEXTURE0);
diff --git a/modules/gfx/src/impl/simple_renderer.cc b/modules/gfx/src/impl/simple_renderer.cc
index 983ef012d4476adf0857c3a747787dfeccb740cf..0d04e47c444ba3c6872a4611f6654f9163fb3185 100644
--- a/modules/gfx/src/impl/simple_renderer.cc
+++ b/modules/gfx/src/impl/simple_renderer.cc
@@ -188,6 +188,7 @@ BondEntryList& SimpleRenderer::GetBondEntryList()
 
 void SimpleRenderer::RenderPov(PovState& pov, const std::string& name)
 {
+  if(view_.atom_map.empty() && view_.bond_list.empty()) return;
   pov.write_merge_or_union(name);
   
   for (AtomEntryMap::const_iterator it=view_.atom_map.begin();
diff --git a/modules/gfx/src/impl/trace_renderer.cc b/modules/gfx/src/impl/trace_renderer.cc
index 838a23a759996ecf97577c87077c93d0f90cc459..e0827989db551a74180065c70ae0244fca080278 100644
--- a/modules/gfx/src/impl/trace_renderer.cc
+++ b/modules/gfx/src/impl/trace_renderer.cc
@@ -119,6 +119,7 @@ void TraceRenderer::PrepareRendering(BackboneTrace& trace_subset,
 
 void TraceRenderer::RenderPov(PovState& pov, const std::string& name)
 {
+  if(trace_subset_.GetListCount()==0) return;
   pov.write_merge_or_union(name);
 
   for (int node_list=0; node_list<trace_subset_.GetListCount(); ++node_list) {
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 886da10c8b0abb2a1b544c3318145c42274a0281..71d4a2ad424fe3577e92d34d488005d1ecdc7dd5 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -126,7 +126,7 @@ Scene::Scene():
   stereo_(0),
   stereo_inverted_(false),
   stereo_eye_(0),
-  stereo_eye_dist_(5.0),
+  stereo_eye_dist_(2.4),
   stereo_eye_off_(0.0),
   scene_left_tex_(),
   scene_right_tex_()
@@ -373,10 +373,8 @@ void Scene::InitGL(bool full)
 
 #if OST_SHADER_SUPPORT_ENABLED
   GLint mbufs=0,msamples=0;
-  if(GLEW_VERSION_2_0) {
-    glGetIntegerv(GL_SAMPLE_BUFFERS, &mbufs);
-    glGetIntegerv(GL_SAMPLES, &msamples);
-  }
+  glGetIntegerv(GL_SAMPLE_BUFFERS, &mbufs);
+  glGetIntegerv(GL_SAMPLES, &msamples);
 
   if(mbufs>0 && msamples>0) {
     LOGN_VERBOSE("Scene: enabling multisampling with: " << msamples << " samples");
@@ -427,9 +425,7 @@ void Scene::InitGL(bool full)
 
   glEnable(GL_TEXTURE_2D);
 #if OST_SHADER_SUPPORT_ENABLED
-  if(GLEW_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+  glActiveTexture(GL_TEXTURE0);
 #endif
 
   glBindTexture(GL_TEXTURE_2D, scene_left_tex_);
@@ -636,6 +632,7 @@ void Scene::RenderGL()
   } else {
     render_scene();
   }
+  check_gl_error();
 }
 
 void Scene::Register(GLWinBase* win)
@@ -1831,9 +1828,7 @@ void Scene::render_stereo()
 
   glEnable(GL_TEXTURE_2D);
 #if OST_SHADER_SUPPORT_ENABLED
-  if(GLEW_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+  glActiveTexture(GL_TEXTURE0);
 #endif
   glBindTexture(GL_TEXTURE_2D, scene_left_tex_);
   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, vp_width_, vp_height_, 0);
@@ -1843,13 +1838,10 @@ void Scene::render_stereo()
   render_scene();
   glEnable(GL_TEXTURE_2D);
 #if OST_SHADER_SUPPORT_ENABLED
-  if(GLEW_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+  glActiveTexture(GL_TEXTURE0);
 #endif
   glBindTexture(GL_TEXTURE_2D, scene_right_tex_);
   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, vp_width_, vp_height_, 0);
-  check_gl_error();
   stereo_eye_=0;
   stereo_projection(0);
 
@@ -1905,9 +1897,7 @@ void Scene::render_stereo()
     glStencilFunc(GL_EQUAL,0x0,0x1);
   }
 #if OST_SHADER_SUPPORT_ENABLED
-  if(GLEW_VERSION_2_0) {
     glActiveTexture(GL_TEXTURE0);
-  }
 #endif
   glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_left_tex_ : scene_right_tex_);
   // draw
@@ -1927,9 +1917,7 @@ void Scene::render_stereo()
     glStencilFunc(GL_EQUAL,0x1,0x1);
   }
 #if OST_SHADER_SUPPORT_ENABLED
-  if(GLEW_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+  glActiveTexture(GL_TEXTURE0);
 #endif
   glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_right_tex_ : scene_left_tex_);
   // draw
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index 79842843783a839390e89608aa80bed46c7338cb..a58a8652c0395199ed486bf1f4e30fe6c9b59be3 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -185,6 +185,8 @@ class DLLEXPORT_OST_GFX Scene {
   */
   void Stereo(unsigned int);
 
+  int GetStereo() const {return stereo_;}
+
   /// \brief invert stereo eyes for stereo mode=0
   void SetStereoInverted(bool f);
 
diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc
index db8e0558a4bad9cea19036126ffcc7002ecd82fc..187be29d940d8e6fed54f24f85fdcc1a4c8dfd7e 100644
--- a/modules/gfx/src/shader.cc
+++ b/modules/gfx/src/shader.cc
@@ -50,9 +50,6 @@ Shader::Shader():
   shader_code_map_(),
   shader_program_map_()
 {
-  if(!GLEW_VERSION_2_0) {
-    LOGN_VERBOSE("OpenGL version smaller 2.0, deactivating shader functionality");
-  }
 }
 
 
@@ -124,8 +121,6 @@ bool link_shader(const std::vector<GLuint>& code_list, String pr_name, GLuint& s
 
 void Shader::Setup() 
 {
-  if(!GLEW_VERSION_2_0) return;
-
   String ost_root = GetSharedDataPath();
   bf::path ost_root_dir(ost_root);
   bf::path shader_dir(ost_root_dir / "shader");
@@ -303,8 +298,6 @@ void Shader::Setup()
 
 void Shader::Activate(const String& name)
 {
-  if(!GLEW_VERSION_2_0) return;
-
   if(!name.empty()) {
     std::map<String, GLuint>::iterator it = shader_program_map_.find(name);
     if(it!=shader_program_map_.end()) {
@@ -339,7 +332,6 @@ String Shader::GetCurrentName() const
 
 bool Shader::IsValid() const
 {
-  if(!GLEW_VERSION_2_0) return false;
   return valid_;
 }
 
@@ -350,13 +342,11 @@ bool Shader::IsActive() const
 
 void Shader::PushProgram()
 {
-  if(!GLEW_VERSION_2_0) return;
   program_stack_.push(current_name_);
 }
 
 void Shader::PopProgram()
 {
-  if(!GLEW_VERSION_2_0) return;
   if(!program_stack_.empty()) {
     current_name_ = program_stack_.top();
     program_stack_.pop();
@@ -366,7 +356,6 @@ void Shader::PopProgram()
 
 void Shader::UpdateState()
 {
-  if(!GLEW_VERSION_2_0) return;
   if(current_program_!=0) {
     // update all settings
     GLint result;
diff --git a/modules/gfx/src/vertex_array.cc b/modules/gfx/src/vertex_array.cc
index 3551ab8ada8b31dbc3627604468353b16dfc385e..b2a30a6df7dc2cc83b64676ac2d166c0db4820c5 100644
--- a/modules/gfx/src/vertex_array.cc
+++ b/modules/gfx/src/vertex_array.cc
@@ -398,9 +398,8 @@ void IndexedVertexArray::RenderGL()
 #endif
   }
   
-  glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT);
+  glPushAttrib(GL_ALL_ATTRIB_BITS);
   glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
-  glPushMatrix();
 
   if(outline_mode_>0) {
     LOGN_TRACE("outline rendering");
@@ -541,7 +540,6 @@ void IndexedVertexArray::RenderGL()
     glEnd();
   }
 
-  glPopMatrix();
   glPopClientAttrib();
   glPopAttrib();
 }
diff --git a/modules/gui/src/gl_canvas.cc b/modules/gui/src/gl_canvas.cc
index 71923254716df1069a4d2e3d281b30e1bb930e60..d1bd25128092851ca528daaeb34bde8395ab1cda 100644
--- a/modules/gui/src/gl_canvas.cc
+++ b/modules/gui/src/gl_canvas.cc
@@ -381,6 +381,14 @@ void GLCanvas::keyPressEvent(QKeyEvent* event)
       gfx::Scene::Instance().SetAmbientOcclusion(!gfx::Scene::Instance().GetAmbientOcclusion());
       DoRefresh();
       return;
+    } else if(event->key()==Qt::Key_Equal) {
+      if(gfx::Scene::Instance().GetStereo()>0) {
+        gfx::Scene::Instance().Stereo(0);
+      } else {
+        gfx::Scene::Instance().Stereo(1);
+      }
+      DoRefresh();
+      return;
     }    
   }
   event->ignore();
diff --git a/modules/mol/base/pymod/export_editors.cc b/modules/mol/base/pymod/export_editors.cc
index d7645c0bbdfa04087986e068d707a784f77a900a..91926f2e797135940d00faeb1f544b07b0d89542 100644
--- a/modules/mol/base/pymod/export_editors.cc
+++ b/modules/mol/base/pymod/export_editors.cc
@@ -83,6 +83,8 @@ void export_Editors()
     .def("Connect", connect_d)    
     .def("RenameChain", &EditorBase::RenameChain)
     .def("AddTorsion", &EditorBase::AddTorsion)
+    .def("ReorderResidues",&EditorBase::ReorderResidues)
+    .def("ReorderAllResidues",&EditorBase::ReorderAllResidues)
   ;
   
   class_<XCSEditor, bases<EditorBase> >("XCSEditor", no_init)
diff --git a/modules/mol/base/pymod/export_query_view_wrapper.cc b/modules/mol/base/pymod/export_query_view_wrapper.cc
index 4af480ff1a151f17e113136bd60f734059724fcb..9c7c58a4b483826cd7f164c2897bc574c939c7cb 100644
--- a/modules/mol/base/pymod/export_query_view_wrapper.cc
+++ b/modules/mol/base/pymod/export_query_view_wrapper.cc
@@ -32,14 +32,16 @@ void export_QueryViewWrapper()
   class_<QueryViewWrapper>("QueryViewWrapper", init<>())
     .def(init<const EntityHandle&>())
     .def(init<const EntityView&>())
-    .def(init<const Query&, const EntityHandle&>())
-    .def(init<const Query&, const EntityView&>())
+    .def(init<const Query&, const EntityHandle&, optional<QueryFlags> >())
+    .def(init<const Query&, const EntityView&, optional<QueryFlags> >())
     .def("GetEntityView",&QueryViewWrapper::GetEntityView)
     .def("DependsOnQuery",&QueryViewWrapper::DependsOnQuery)
     .def("IsDataValid", &QueryViewWrapper::IsDataValid)
     .def("SetQuery", &QueryViewWrapper::SetQuery)
     .def("GetQuery", &QueryViewWrapper::GetQuery
         ,return_value_policy<copy_const_reference>())
+    .def("SetQueryFlags", &QueryViewWrapper::SetQueryFlags)
+    .def("GetQueryFlags", &QueryViewWrapper::GetQueryFlags)
     .add_property("entity_view", &QueryViewWrapper::GetEntityView)
     .add_property("query", make_function(&QueryViewWrapper::GetQuery
         ,return_value_policy<copy_const_reference>()))
diff --git a/modules/mol/base/src/editor_base.cc b/modules/mol/base/src/editor_base.cc
index 410e1b03b20b14553ff5352cbacef18f05d673cd..5cddb05bfbcb8ef0f28d5087baca457f31823982 100644
--- a/modules/mol/base/src/editor_base.cc
+++ b/modules/mol/base/src/editor_base.cc
@@ -114,7 +114,6 @@ void EditorBase::DeleteChain(const ChainHandle& chain)
 
 void EditorBase::DeleteAtom(const AtomHandle& atom_handle) 
 {
-  
   CheckHandleValidity(atom_handle);
   atom_handle.GetResidue().Impl()->DeleteAtom(atom_handle.Impl());
 }
@@ -125,6 +124,17 @@ void EditorBase::DeleteResidue(const ResidueHandle& residue_handle)
   residue_handle.GetChain().Impl()->DeleteResidue(residue_handle.Impl());
 }
 
+void EditorBase::ReorderResidues(const ChainHandle& chain)
+{
+  CheckHandleValidity(chain);
+  chain.Impl()->ReorderResidues();
+}
+
+void EditorBase::ReorderAllResidues()
+{
+  ent_.Impl()->ReorderAllResidues();
+}
+
 BondHandle EditorBase::Connect(const AtomHandle& first,
                                  const AtomHandle& second) {
   CheckHandleValidity(first);
diff --git a/modules/mol/base/src/editor_base.hh b/modules/mol/base/src/editor_base.hh
index 110c6b668f0a314b81e266017a026c999068f766..53246e7a204522d78617c956b3e046e7378e45ae 100644
--- a/modules/mol/base/src/editor_base.hh
+++ b/modules/mol/base/src/editor_base.hh
@@ -184,6 +184,12 @@ public:
   ///
   /// \sa ChainHandle::DeleteResidue, DeleteAtom
   void DeleteResidue(const ResidueHandle& residue_handle);
+
+  /// \brief reorder residues of given chain based on their residue number
+  void ReorderResidues(const ChainHandle& chain);
+
+  /// \brief reorder residues of all chains based on their residue number
+  void ReorderAllResidues();
     
   /// \brief Get edit mode of editor
   EditMode GetMode() const;
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index 02f4636c1cc5e60865ad92b5e7ddcd3901a23ed0..d2171b1d85deac02615c4edba7924a8f0c81e5b7 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -439,4 +439,17 @@ void ChainImpl::SetName(const String& new_name)
   name_=new_name;
 }
 
+namespace {
+  bool rnum_cmp(const ResidueImplPtr& r1, const ResidueImplPtr& r2)
+  {
+    return r1->GetNumber()<r2->GetNumber();
+  }
+}
+
+void ChainImpl::ReorderResidues()
+{
+  std::sort(residue_list_.begin(),residue_list_.end(),rnum_cmp);
+  UpdateShifts();
+}
+
 }}} // ns
diff --git a/modules/mol/base/src/impl/chain_impl.hh b/modules/mol/base/src/impl/chain_impl.hh
index 644bed1e734d8594620164051c80060eb1a33295..c25d23b88cf7653e57fa9bd4940af12e8d5b6474 100644
--- a/modules/mol/base/src/impl/chain_impl.hh
+++ b/modules/mol/base/src/impl/chain_impl.hh
@@ -110,6 +110,8 @@ public:
   void DeleteResidue(const ResidueImplPtr& residue);
   
   void DeleteAllResidues();
+
+  void ReorderResidues();
   
   int GetIndex(const ResNum& number) const;  
   
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index c7eb101630db5e9723d848b50fa4abec29d3f2f7..17937305c55c7a8508fdd2934518b60da60b5113 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -1217,4 +1217,11 @@ void EntityImpl::SetName(const String& ent_name){
   name_=ent_name;
 }
 
+void EntityImpl::ReorderAllResidues()
+{
+  for(ChainImplList::iterator cit=chain_list_.begin();cit!=chain_list_.end();++cit) {
+    (*cit)->ReorderResidues();
+  }
+}
+
 }}} // ns
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 81f533bf0a9f3c696276b7e5e487e14a7125bfaa..89765122f776d7169048bfb9bc3eb074db38369e 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -244,6 +244,8 @@ public:
 
   void SetName(const String& ent_name);
 
+  void ReorderAllResidues();
+
 private:
   void DoCopy(EntityImplPtr dest);
   
diff --git a/modules/mol/base/src/query_view_wrapper.cc b/modules/mol/base/src/query_view_wrapper.cc
index fc755f6e0f162e53158b904ec8892532fd18b09a..ae0aa527ab7d9f80082730a9fec78ac442260728 100644
--- a/modules/mol/base/src/query_view_wrapper.cc
+++ b/modules/mol/base/src/query_view_wrapper.cc
@@ -26,57 +26,80 @@ QueryViewWrapper::QueryViewWrapper():
         view_set_(false),
         entity_handle_(),
         entity_view_(),
-        query_(){}
+        query_(),
+        flags_(0)
+{}
 
 QueryViewWrapper::QueryViewWrapper(const EntityHandle& entity_handle):
     view_set_(false),
     entity_handle_(entity_handle),
     entity_view_(),
-    query_(){}
+    query_(),
+    flags_(0)
+{}
 
 QueryViewWrapper::QueryViewWrapper(const EntityView& entity_view):
     view_set_(true),
     entity_handle_(),
     entity_view_(entity_view),
-    query_(){}
+    query_(),
+    flags_(0)
+{}
 
 QueryViewWrapper::QueryViewWrapper(const Query& query, 
-                                   const EntityHandle& entity_handle):
+                                   const EntityHandle& entity_handle,
+                                   QueryFlags f):
     view_set_(false),
     entity_handle_(entity_handle),
     entity_view_(),
-    query_(query)
-{ }
+    query_(query),
+    flags_(f)
+{}
 
 QueryViewWrapper::QueryViewWrapper(const Query& query, 
-                                   const EntityView& view):
+                                   const EntityView& view,
+                                   QueryFlags f):
     view_set_(true),
     entity_handle_(),
     entity_view_(view),
-    query_(query)
-{ }
+    query_(query),
+    flags_(f)
+{}
 
 EntityView QueryViewWrapper::GetEntityView() const
 {
   if(view_set_) {
-    return query_.MatchAll() ? entity_view_ : entity_view_.Select(query_);
+    return query_.MatchAll() ? entity_view_ : entity_view_.Select(query_,flags_);
   } else {
     if(entity_handle_.IsValid()){
-      return entity_handle_.Select(query_);
+      return entity_handle_.Select(query_,flags_);
     }
     return entity_view_;
   }
 }
 
-const Query& QueryViewWrapper::GetQuery() const{
+const Query& QueryViewWrapper::GetQuery() const
+{
   return query_;
 }
 
-void QueryViewWrapper::SetQuery(const Query& query){
+void QueryViewWrapper::SetQuery(const Query& query)
+{
   query_ = query;
 }
 
-bool QueryViewWrapper::IsDataValid() const{
+void QueryViewWrapper::SetQueryFlags(QueryFlags f)
+{
+  flags_=f;
+}
+
+QueryFlags QueryViewWrapper::GetQueryFlags() const
+{
+  return flags_;
+}
+
+bool QueryViewWrapper::IsDataValid() const
+{
   if(view_set_){
     return entity_view_.IsValid();
   }
@@ -88,4 +111,4 @@ bool QueryViewWrapper::DependsOnQuery() const
   return query_.MatchAll();
 }
 
-} } // ns
+}} // ns
diff --git a/modules/mol/base/src/query_view_wrapper.hh b/modules/mol/base/src/query_view_wrapper.hh
index 596b5cbf12aa464ee01e7a9ebba0f734da387328..483b303c9e6704c596aa0e4ab182de5fa816ecb9 100644
--- a/modules/mol/base/src/query_view_wrapper.hh
+++ b/modules/mol/base/src/query_view_wrapper.hh
@@ -32,8 +32,8 @@ public:
   explicit QueryViewWrapper(const EntityHandle& entity_handle);
   explicit QueryViewWrapper(const EntityView& entity_view);
   QueryViewWrapper();
-  QueryViewWrapper(const Query& query, const EntityHandle& handle);
-  QueryViewWrapper(const Query& query, const EntityView& view);  
+  QueryViewWrapper(const Query& query, const EntityHandle& handle, QueryFlags f=0);
+  QueryViewWrapper(const Query& query, const EntityView& view, QueryFlags f=0);  
   EntityView GetEntityView() const;
   bool DependsOnQuery() const;
   bool IsDataValid() const;
@@ -41,11 +41,15 @@ public:
   void SetQuery(const Query& query);
   const Query& GetQuery() const;
 
+  void SetQueryFlags(QueryFlags f);
+  QueryFlags GetQueryFlags() const;
+
 private:
   bool view_set_;
   EntityHandle entity_handle_;
   EntityView entity_view_;
   Query query_;
+  QueryFlags flags_;
 };
 
 } } // ns