diff --git a/stmts.py b/stmts.py
index 4edc22f28e8795d631a387cd4855411fa1a88356_c3RtdHMucHk=..1db3a36561cfb050df246511e972ea406ac3cc30_c3RtdHMucHk= 100644
--- a/stmts.py
+++ b/stmts.py
@@ -605,7 +605,7 @@
             from rql.undo import SelectVarOperation
             self.undo_manager.add_operation(SelectVarOperation(term))
 
-    def add_group_var(self, var):
+    def add_group_var(self, var, index=None):
         """add var in 'orderby' constraints
         asc is a boolean indicating the group order (ascendent or descendent)
         """
@@ -613,7 +613,10 @@
             self.groupby = []
         vref = nodes.variable_ref(var)
         vref.register_reference()
-        self.groupby.append(vref)
+        if index is None:
+            self.groupby.append(vref)
+        else:
+            self.groupby.insert(index, vref)
         vref.parent = self
         if self.should_register_op:
             from rql.undo import AddGroupOperation
@@ -621,8 +624,6 @@
 
     def remove_group_var(self, vref):
         """remove the group variable and the group node if necessary"""
-        vref.unregister_reference()
-        self.groupby.remove(vref)
         if self.should_register_op:
             from rql.undo import RemoveGroupOperation
             self.undo_manager.add_operation(RemoveGroupOperation(vref))
@@ -626,6 +627,8 @@
         if self.should_register_op:
             from rql.undo import RemoveGroupOperation
             self.undo_manager.add_operation(RemoveGroupOperation(vref))
+        vref.unregister_reference()
+        self.groupby.remove(vref)
 
     def remove_groups(self):
         for vref in self.groupby[:]:
@@ -640,6 +643,6 @@
         term = nodes.SortTerm(vref, asc)
         self.add_sort_term(term)
         
-    def add_sort_term(self, term):
+    def add_sort_term(self, term, index=None):
         if not self.orderby:
             self.orderby = []
@@ -644,6 +647,9 @@
         if not self.orderby:
             self.orderby = []
-        self.orderby.append(term)
+        if index is None:
+            self.orderby.append(term)
+        else:
+            self.orderby.insert(index, term)
         term.parent = self
         for vref in term.iget_nodes(nodes.VariableRef):
             try:
diff --git a/test/unittest_nodes.py b/test/unittest_nodes.py
index 4edc22f28e8795d631a387cd4855411fa1a88356_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ==..1db3a36561cfb050df246511e972ea406ac3cc30_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ== 100644
--- a/test/unittest_nodes.py
+++ b/test/unittest_nodes.py
@@ -97,8 +97,8 @@
         self.assertEquals(tree.as_string(), 'Any X')
 
     def test_select_remove_sort_terms(self):
-        tree = self._parse('Any X ORDERBY X')
+        tree = self._parse('Any X,Y ORDERBY X,Y')
         tree.save_state()
         select = tree.children[0]
         select.remove_sort_terms()
         tree.check_references()
@@ -101,7 +101,7 @@
         tree.save_state()
         select = tree.children[0]
         select.remove_sort_terms()
         tree.check_references()
-        self.assertEquals(tree.as_string(), 'Any X')
+        self.assertEquals(tree.as_string(), 'Any X,Y')
         tree.recover()
         tree.check_references()
@@ -106,6 +106,6 @@
         tree.recover()
         tree.check_references()
-        self.assertEquals(tree.as_string(), 'Any X ORDERBY X')
+        self.assertEquals(tree.as_string(), 'Any X,Y ORDERBY X,Y')
 
     def test_select_set_distinct(self):
         tree = self._parse('DISTINCT Any X')
@@ -154,7 +154,7 @@
         tree.recover()
         tree.check_references()
         self.assertEquals(tree.as_string(), 'Any X,Y GROUPBY X,Y')
-                             
+
     def test_select_base_1(self):
         tree = self._parse("Any X WHERE X is Person")
         self.assertIsInstance(tree, stmts.Union)
diff --git a/undo.py b/undo.py
index 4edc22f28e8795d631a387cd4855411fa1a88356_dW5kby5weQ==..1db3a36561cfb050df246511e972ea406ac3cc30_dW5kby5weQ== 100644
--- a/undo.py
+++ b/undo.py
@@ -171,6 +171,9 @@
     
 class RemoveSortOperation(NodeOperation):
     """defines how to undo 'remove sort'"""
+    def __init__(self, node):
+        NodeOperation.__init__(self, node)
+        self.index = self.stmt.orderby.index(self.node)
 
     def undo(self, selection):
         """undo the operation on the selection"""
@@ -174,7 +177,7 @@
 
     def undo(self, selection):
         """undo the operation on the selection"""
-        self.stmt.add_sort_term(self.node)
+        self.stmt.add_sort_term(self.node, self.index)
     
 class AddGroupOperation(NodeOperation):
     """defines how to undo 'add group'"""
@@ -178,10 +181,10 @@
     
 class AddGroupOperation(NodeOperation):
     """defines how to undo 'add group'"""
-
+    
     def undo(self, selection):
         """undo the operation on the selection"""
         self.stmt.remove_group_var(self.node)
     
 class RemoveGroupOperation(NodeOperation):
     """defines how to undo 'remove group'"""
@@ -182,9 +185,13 @@
     def undo(self, selection):
         """undo the operation on the selection"""
         self.stmt.remove_group_var(self.node)
     
 class RemoveGroupOperation(NodeOperation):
     """defines how to undo 'remove group'"""
-
+    
+    def __init__(self, node):
+        NodeOperation.__init__(self, node)
+        self.index = self.stmt.groupby.index(self.node)
+        
     def undo(self, selection):
         """undo the operation on the selection"""
@@ -189,6 +196,6 @@
     def undo(self, selection):
         """undo the operation on the selection"""
-        self.stmt.add_group_var(self.node)
+        self.stmt.add_group_var(self.node, self.index)
 
 # misc operations #############################################################