diff --git a/modules/mol/base/pymod/export_editors.cc b/modules/mol/base/pymod/export_editors.cc
index eb1720a1de10dcfde86e1ba7c47105bd4e4368be..6cee09765c2ce84e7a07bbddf4d05abebdd84cf6 100644
--- a/modules/mol/base/pymod/export_editors.cc
+++ b/modules/mol/base/pymod/export_editors.cc
@@ -220,6 +220,7 @@ void export_Editors()
     .def("AddTorsion", &EditorBase::AddTorsion)
     .def("ReorderResidues",&EditorBase::ReorderResidues)
     .def("ReorderAllResidues",&EditorBase::ReorderAllResidues)
+    .def("RenumberAllResidues",&EditorBase::RenumberAllResidues)
   ;
   
   class_<XCSEditor, bases<EditorBase> >("XCSEditor", no_init)
diff --git a/modules/mol/base/src/editor_base.cc b/modules/mol/base/src/editor_base.cc
index e9fed6874cf52057b0ad21b82dc8fa3980bc3ba8..ba822f0f5e3f57535d1ae59ab9837819f447221d 100644
--- a/modules/mol/base/src/editor_base.cc
+++ b/modules/mol/base/src/editor_base.cc
@@ -165,6 +165,11 @@ void EditorBase::ReorderAllResidues()
   ent_.Impl()->ReorderAllResidues();
 }
 
+void EditorBase::RenumberAllResidues(int start, bool keep_spacing)
+{
+  ent_.Impl()->RenumberAllResidues(start, keep_spacing);
+}
+
 void EditorBase::RenameAtom(AtomHandle atom, const String& new_name)
 {
   CheckHandleValidity(atom);
diff --git a/modules/mol/base/src/editor_base.hh b/modules/mol/base/src/editor_base.hh
index 0527a0a7b1291a2cac7b77387076c915207d5b83..c6309cce3ee22f5c792b6240487d16b15c6ed48c 100644
--- a/modules/mol/base/src/editor_base.hh
+++ b/modules/mol/base/src/editor_base.hh
@@ -205,6 +205,17 @@ public:
 
   /// \brief reorder residues of all chains based on their residue number
   void ReorderAllResidues();
+
+  /// \brief renumber residues of all chains
+  ///
+  /// \param start
+  ///           Residues of every chain will be renumbered, whereas the first
+  ///           residue gets the residue number start.
+  ///
+  /// \param keep_spacing
+  ///           If set to false, residues will continously be renumbered ongoing from start.
+  ///           Otherwise the spacings between the residues are kept.
+  void RenumberAllResidues(int start, bool keep_spacing);
     
   /// \brief Get edit mode of editor
   EditMode GetMode() const {return mode_;}
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index 5ac2b91ab1d6cf372769d9135ecffd38a97773a1..009f436a5406a42caeda27605574587d48decbe3 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -484,6 +484,28 @@ void ChainImpl::ReorderResidues()
   UpdateShifts();
 }
 
+void ChainImpl::RenumberAllResidues(int start, bool keep_spacing)
+{
+  ResNum actual_num=ResNum(start);
+  ResNum original_start_num=residue_list_[0]->GetNumber();
+  ResNum start_diff=ResNum(start)-original_start_num;
+
+
+  for (ResidueImplList::const_iterator i=residue_list_.begin(); 
+         i!=residue_list_.end(); ++i) {
+
+      if(keep_spacing){
+         ResNum temp=(*i)->GetNumber();
+         (*i)->SetNumber(temp+start_diff);
+        continue;
+      }
+
+      (*i)->SetNumber(actual_num);
+      actual_num++;
+  }
+  UpdateShifts();
+}
+
 void ChainImpl::SetInSequence(const int index)
 {
   ResNum num=residue_list_[index]->GetNumber();
diff --git a/modules/mol/base/src/impl/chain_impl.hh b/modules/mol/base/src/impl/chain_impl.hh
index 8e99792dd1597eefe4a28658d46d2a6fd97fed87..bcb3436e2bc463dadcfe1ca6af4e1bbac48af24b 100644
--- a/modules/mol/base/src/impl/chain_impl.hh
+++ b/modules/mol/base/src/impl/chain_impl.hh
@@ -169,6 +169,8 @@ public:
   void DeleteAllResidues();
 
   void ReorderResidues();
+
+  void RenumberAllResidues(int start, bool keep_spacing);
   
   int GetIndex(const ResidueImplPtr& res) const;
   void AssignSecondaryStructure(SecStructure ss,
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index bc3fba841fe6798db72963e07bbbf79d718344c9..daf9c7c1fbcc33970c7acf316c12a69f786b8ffb 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -1210,4 +1210,12 @@ void EntityImpl::ReorderAllResidues()
   }
 }
 
+void EntityImpl::RenumberAllResidues(int start, bool keep_spacing)
+{
+  for(ChainImplList::iterator cit=chain_list_.begin();cit!=chain_list_.end();++cit) {
+    (*cit)->RenumberAllResidues(start, keep_spacing);
+  }
+
+}
+
 }}} // ns
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 3c5000920c23a959ab631e62874d54df6cce6878..dd88fb32575437e74bb95bc8e7df90c26976b4aa 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -254,6 +254,8 @@ public:
 
   void ReorderAllResidues();
 
+  void RenumberAllResidues(int start, bool keep_spacing);
+
 private:
   void DoCopy(EntityImplPtr dest);
   
diff --git a/modules/mol/base/src/residue_prop.hh b/modules/mol/base/src/residue_prop.hh
index 19bccc98e7e39e4f27c2001feb7efe58ceaf3fbe..168c9744c44c7c7188f1259a6ff33eabeed85a1b 100644
--- a/modules/mol/base/src/residue_prop.hh
+++ b/modules/mol/base/src/residue_prop.hh
@@ -75,6 +75,16 @@ public:
     return num_;
   }
 
+  ResNum operator+(const ResNum& r)
+  {
+    return ResNum(num_+r.num_);
+  }
+  
+  ResNum operator-(const ResNum& r)
+  {
+    return ResNum(num_-r.num_);
+  }
+  
   ResNum& operator++()
   {
     ++num_;