Several major changes in hyracks:
-- reduced CC/NC communications for reporting partition request and availability; partition request/availability are only reported for the case of send-side materialized (without pipelining) policies in case of task re-attempt.
-- changed buffer cache to dynamically allocate memory based on needs instead of pre-allocating
-- changed each network channel to lazily allocate memory based on needs, and changed materialized connectors to lazily allocate files based on needs
-- changed several major CCNCCFunctions to use non-java serde
-- added a sort-based group-by operator which pushes group-by aggregations into an external sort
-- make external sort a stable sort

1,3,and 4 is to reduce the job overhead.
2 is to reduce the unecessary NC resource consumptions such as memory and files.
5 and 6 are improvements to runtime operators.

One change in algebricks:
-- implemented a rule to push group-by aggregation into sort, i.e., using the sort-based gby operator

Several important changes in pregelix:
-- remove static states in vertex
-- direct check halt bit without deserialization
-- optimize the sort algorithm by packing yet-another 2-byte normalized key into the tPointers array

Change-Id: Id696f9a9f1647b4a025b8b33d20b3a89127c60d6
Reviewed-on: http://fulliautomatix.ics.uci.edu:8443/35
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <westmann@gmail.com>
diff --git a/hivesterix-dist/src/main/java/edu/uci/ics/hivesterix/runtime/exec/HyracksExecutionEngine.java b/hivesterix-dist/src/main/java/edu/uci/ics/hivesterix/runtime/exec/HyracksExecutionEngine.java
index 7b88de4..a95edd8 100644
--- a/hivesterix-dist/src/main/java/edu/uci/ics/hivesterix/runtime/exec/HyracksExecutionEngine.java
+++ b/hivesterix-dist/src/main/java/edu/uci/ics/hivesterix/runtime/exec/HyracksExecutionEngine.java
@@ -589,6 +589,7 @@
             }
         }
 
+        job.setReportTaskDetails(false);
         long start = System.currentTimeMillis();
         JobId jobId = hcc.startJob(job);
         hcc.waitForCompletion(jobId);
diff --git a/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestCase.java b/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestCase.java
index 570f151..c21d2d6 100644
--- a/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestCase.java
+++ b/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestCase.java
@@ -14,7 +14,10 @@
  */
 package edu.uci.ics.hivesterix.test.optimizer;
 
+import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
@@ -60,6 +63,10 @@
         }
         StringBuilder buf = new StringBuilder();
         readFileToString(resultFile, buf);
+        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("optest/"
+                + resultFile.getName())));
+        writer.write(sw.toString());
+        writer.close();
         if (!buf.toString().equals(sw.toString())) {
             throw new Exception("Result for " + queryFile + " changed:\n" + sw.toString());
         }
diff --git a/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestSuite.java b/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestSuite.java
index a33ac7e..31268cb 100644
--- a/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestSuite.java
+++ b/hivesterix-dist/src/test/java/edu/uci/ics/hivesterix/test/optimizer/OptimizerTestSuite.java
@@ -21,6 +21,9 @@
 import java.util.List;
 
 import junit.framework.Test;
+
+import org.apache.commons.io.FileUtils;
+
 import edu.uci.ics.hivesterix.test.base.AbstractTestSuiteClass;
 
 public class OptimizerTestSuite extends AbstractTestSuiteClass {
@@ -41,6 +44,7 @@
         try {
             testSuite.setup();
             testSuite.loadData();
+            FileUtils.forceMkdir(new File("optest"));
         } catch (Exception e) {
             e.printStackTrace();
             throw new IllegalStateException(e.getMessage());
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q10_returned_item.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q10_returned_item.plan
index bda1113..c709f25 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q10_returned_item.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q10_returned_item.plan
@@ -22,16 +22,16 @@
                               nested tuple source
                               -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
-                  -- EXTERNAL_GROUP_BY[$$48, $$49, $$50, $$51, $$52, $$53, $$54]  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$48, $$49, $$50, $$51, $$52, $$53, $$54]  |PARTITIONED|
                     exchange 
-                    -- HASH_PARTITION_EXCHANGE [$$48, $$49, $$50, $$51, $$52, $$53, $$54]  |PARTITIONED|
+                    -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$48(ASC), $$49(ASC), $$50(ASC), $$51(ASC), $$52(ASC), $$53(ASC), $$54(ASC)] HASH:[$$48, $$49, $$50, $$51, $$52, $$53, $$54]  |PARTITIONED|
                       group by ([$$48 := %0->$$21; $$49 := %0->$$22; $$50 := %0->$$26; $$51 := %0->$$25; $$52 := %0->$$18; $$53 := %0->$$23; $$54 := %0->$$28]) decor ([]) {
                                 aggregate [$$47] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]]]]
                                 -- AGGREGATE  |LOCAL|
                                   nested tuple source
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
-                      -- EXTERNAL_GROUP_BY[$$21, $$22, $$26, $$25, $$18, $$23, $$28]  |PARTITIONED|
+                      -- SORT_GROUP_BY[$$21, $$22, $$26, $$25, $$18, $$23, $$28]  |PARTITIONED|
                         exchange 
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           project ([$$21, $$22, $$23, $$25, $$26, $$28, $$18, $$6, $$7])
@@ -99,4 +99,4 @@
                                                     exchange 
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       empty-tuple-source
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q11_important_stock.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q11_important_stock.plan
index 8195ef0..9bb9788 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q11_important_stock.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q11_important_stock.plan
@@ -10,16 +10,16 @@
                   nested tuple source
                   -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
-      -- EXTERNAL_GROUP_BY[$$21]  |PARTITIONED|
+      -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
         exchange 
-        -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$21(ASC)] HASH:[$$21]  |PARTITIONED|
           group by ([$$21 := %0->$$1]) decor ([]) {
                     aggregate [$$20] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$4, %0->$$3]]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$1]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$1]  |PARTITIONED|
             exchange 
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               project ([$$1, $$3, $$4])
@@ -76,7 +76,7 @@
                 nested tuple source
                 -- NESTED_TUPLE_SOURCE  |LOCAL|
            }
-    -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+    -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
       exchange 
       -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
         group by ([]) decor ([]) {
@@ -85,7 +85,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             data-scan [$$2]<-[$$1, $$2] <- default.q11_part_tmp
@@ -123,4 +123,4 @@
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     empty-tuple-source
-                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q12_shipping.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q12_shipping.plan
index d976bba..a6aa730 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q12_shipping.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q12_shipping.plan
@@ -6,53 +6,49 @@
     -- ASSIGN  |PARTITIONED|
       exchange 
       -- SORT_MERGE_EXCHANGE [$$26(ASC) ]  |PARTITIONED|
-        order (ASC, %0->$$26) 
-        -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
+        group by ([$$26 := %0->$$34]) decor ([]) {
+                  aggregate [$$27, $$28] <- [function-call: hive:sum(FINAL), Args:[%0->$$32], function-call: hive:sum(FINAL), Args:[%0->$$33]]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$34]  |PARTITIONED|
           exchange 
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            group by ([$$26 := %0->$$34]) decor ([]) {
-                      aggregate [$$27, $$28] <- [function-call: hive:sum(FINAL), Args:[%0->$$32], function-call: hive:sum(FINAL), Args:[%0->$$33]]
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$34(ASC)] HASH:[$$34]  |PARTITIONED|
+            group by ([$$34 := %0->$$24]) decor ([]) {
+                      aggregate [$$32, $$33] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:or, Args:[function-call: algebricks:eq, Args:[%0->$$6, 1-URGENT], function-call: algebricks:eq, Args:[%0->$$6, 2-HIGH]], 1, 0]], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:and, Args:[function-call: algebricks:neq, Args:[%0->$$6, 1-URGENT], function-call: algebricks:neq, Args:[%0->$$6, 2-HIGH]], 1, 0]]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$34]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$24]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$34]  |PARTITIONED|
-                group by ([$$34 := %0->$$24]) decor ([]) {
-                          aggregate [$$32, $$33] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:or, Args:[function-call: algebricks:eq, Args:[%0->$$6, 1-URGENT], function-call: algebricks:eq, Args:[%0->$$6, 2-HIGH]], 1, 0]], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:and, Args:[function-call: algebricks:neq, Args:[%0->$$6, 1-URGENT], function-call: algebricks:neq, Args:[%0->$$6, 2-HIGH]], 1, 0]]]
-                          -- AGGREGATE  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       }
-                -- EXTERNAL_GROUP_BY[$$24]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                project ([$$6, $$24])
+                -- STREAM_PROJECT  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$6, $$24])
-                    -- STREAM_PROJECT  |PARTITIONED|
+                    join (function-call: algebricks:eq, Args:[%0->$$10, %0->$$1])
+                    -- HYBRID_HASH_JOIN [$$10][$$1]  |PARTITIONED|
                       exchange 
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (function-call: algebricks:eq, Args:[%0->$$10, %0->$$1])
-                        -- HYBRID_HASH_JOIN [$$10][$$1]  |PARTITIONED|
-                          exchange 
-                          -- HASH_PARTITION_EXCHANGE [$$10]  |PARTITIONED|
-                            project ([$$10, $$24])
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              select (function-call: algebricks:and, Args:[function-call: algebricks:lt, Args:[%0->$$21, %0->$$22], function-call: algebricks:lt, Args:[%0->$$20, %0->$$21], function-call: algebricks:ge, Args:[%0->$$22, 1994-01-01], function-call: algebricks:lt, Args:[%0->$$22, 1995-01-01], function-call: algebricks:or, Args:[function-call: algebricks:eq, Args:[%0->$$24, MAIL], function-call: algebricks:eq, Args:[%0->$$24, SHIP]]])
-                              -- STREAM_SELECT  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$10]  |PARTITIONED|
+                        project ([$$10, $$24])
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          select (function-call: algebricks:and, Args:[function-call: algebricks:lt, Args:[%0->$$21, %0->$$22], function-call: algebricks:lt, Args:[%0->$$20, %0->$$21], function-call: algebricks:ge, Args:[%0->$$22, 1994-01-01], function-call: algebricks:lt, Args:[%0->$$22, 1995-01-01], function-call: algebricks:or, Args:[function-call: algebricks:eq, Args:[%0->$$24, MAIL], function-call: algebricks:eq, Args:[%0->$$24, SHIP]]])
+                          -- STREAM_SELECT  |PARTITIONED|
+                            exchange 
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan [$$21, $$20, $$22, $$24, $$10]<-[$$10, $$11, $$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19, $$20, $$21, $$22, $$23, $$24, $$25] <- default.lineitem
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange 
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan [$$21, $$20, $$22, $$24, $$10]<-[$$10, $$11, $$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19, $$20, $$21, $$22, $$23, $$24, $$25] <- default.lineitem
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange 
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      exchange 
+                      -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                        data-scan [$$1, $$6]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.orders
+                        -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange 
-                          -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
-                            data-scan [$$1, $$6]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.orders
-                            -- DATASOURCE_SCAN  |PARTITIONED|
-                              exchange 
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                empty-tuple-source
-                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            empty-tuple-source
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q13_customer_distribution.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q13_customer_distribution.plan
index 40cedd6..690b312 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q13_customer_distribution.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q13_customer_distribution.plan
@@ -16,16 +16,16 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$26]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$26]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$26]  |PARTITIONED|
+              -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$26(ASC)] HASH:[$$26]  |PARTITIONED|
                 group by ([$$26 := %0->$$19]) decor ([]) {
                           aggregate [$$25] <- [function-call: hive:count(PARTIAL1), Args:[1]]
                           -- AGGREGATE  |LOCAL|
                             nested tuple source
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
-                -- EXTERNAL_GROUP_BY[$$19]  |PARTITIONED|
+                -- SORT_GROUP_BY[$$19]  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     project ([$$19])
@@ -38,7 +38,7 @@
                                     nested tuple source
                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
-                        -- EXTERNAL_GROUP_BY[$$10]  |PARTITIONED|
+                        -- SORT_GROUP_BY[$$10]  |PARTITIONED|
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             project ([$$10, $$1])
@@ -68,4 +68,4 @@
                                             exchange 
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               empty-tuple-source
-                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q14_promotion_effect.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q14_promotion_effect.plan
index e6d1c1d..fbdb1de 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q14_promotion_effect.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q14_promotion_effect.plan
@@ -12,7 +12,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
             group by ([]) decor ([]) {
@@ -21,7 +21,7 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 project ([$$5, $$15, $$16])
@@ -51,4 +51,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q15_top_supplier.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q15_top_supplier.plan
index c61ed37..2f7aeb3 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q15_top_supplier.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q15_top_supplier.plan
@@ -10,16 +10,16 @@
                   nested tuple source
                   -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
-      -- EXTERNAL_GROUP_BY[$$21]  |PARTITIONED|
+      -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
         exchange 
-        -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$21(ASC)] HASH:[$$21]  |PARTITIONED|
           group by ([$$21 := %0->$$3]) decor ([]) {
                     aggregate [$$20] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]]]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$3]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$3]  |PARTITIONED|
             exchange 
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               project ([$$3, $$6, $$7])
@@ -107,4 +107,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q16_parts_supplier_relationship.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q16_parts_supplier_relationship.plan
index c986cb4..1839e9b 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q16_parts_supplier_relationship.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q16_parts_supplier_relationship.plan
@@ -74,16 +74,16 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$5, $$6, $$7]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$5, $$6, $$7]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$5, $$6, $$7]  |PARTITIONED|
+              -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$5(ASC), $$6(ASC), $$7(ASC), $$8(ASC)] HASH:[$$5, $$6, $$7]  |PARTITIONED|
                 group by ([$$5 := %0->$$1; $$6 := %0->$$2; $$7 := %0->$$3; $$8 := %0->$$4]) decor ([]) {
                           aggregate [] <- []
                           -- AGGREGATE  |LOCAL|
                             nested tuple source
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                        }
-                -- EXTERNAL_GROUP_BY[$$1, $$2, $$3, $$4]  |PARTITIONED|
+                -- SORT_GROUP_BY[$$1, $$2, $$3, $$4]  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     select (function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:or, Args:[function-call: algebricks:eq, Args:[%0->$$3, 49], function-call: algebricks:eq, Args:[%0->$$3, 14]], function-call: algebricks:eq, Args:[%0->$$3, 23]], function-call: algebricks:eq, Args:[%0->$$3, 45]], function-call: algebricks:eq, Args:[%0->$$3, 19]], function-call: algebricks:eq, Args:[%0->$$3, 3]], function-call: algebricks:eq, Args:[%0->$$3, 36]], function-call: algebricks:eq, Args:[%0->$$3, 9]])
@@ -95,4 +95,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q17_small_quantity_order_revenue.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q17_small_quantity_order_revenue.plan
index 8a75f64..23b98c7 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q17_small_quantity_order_revenue.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q17_small_quantity_order_revenue.plan
@@ -12,16 +12,16 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[$$22]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[$$22]  |PARTITIONED|
           exchange 
-          -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$22(ASC)] HASH:[$$22]  |PARTITIONED|
             group by ([$$22 := %0->$$2]) decor ([]) {
                       aggregate [$$21] <- [function-call: hive:avg(PARTIAL1), Args:[%0->$$5]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$2]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$2]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 data-scan [$$2, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
@@ -44,7 +44,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
             group by ([]) decor ([]) {
@@ -53,7 +53,7 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 project ([$$17])
@@ -101,4 +101,4 @@
                             exchange 
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q18_large_volume_customer.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q18_large_volume_customer.plan
index eb78f1d..2aae626 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q18_large_volume_customer.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q18_large_volume_customer.plan
@@ -10,16 +10,16 @@
                   nested tuple source
                   -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
-      -- EXTERNAL_GROUP_BY[$$21]  |PARTITIONED|
+      -- PRE_CLUSTERED_GROUP_BY[$$21]  |PARTITIONED|
         exchange 
-        -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$21(ASC)] HASH:[$$21]  |PARTITIONED|
           group by ([$$21 := %0->$$1]) decor ([]) {
                     aggregate [$$20] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$5]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$1]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$1]  |PARTITIONED|
             exchange 
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               data-scan [$$1, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
@@ -52,16 +52,16 @@
                               nested tuple source
                               -- NESTED_TUPLE_SOURCE  |LOCAL|
                          }
-                  -- EXTERNAL_GROUP_BY[$$44, $$45, $$46, $$47, $$48]  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$44, $$45, $$46, $$47, $$48]  |PARTITIONED|
                     exchange 
-                    -- HASH_PARTITION_EXCHANGE [$$44, $$45, $$46, $$47, $$48]  |PARTITIONED|
+                    -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$44(ASC), $$45(ASC), $$46(ASC), $$47(ASC), $$48(ASC)] HASH:[$$44, $$45, $$46, $$47, $$48]  |PARTITIONED|
                       group by ([$$44 := %0->$$20; $$45 := %0->$$19; $$46 := %0->$$27; $$47 := %0->$$31; $$48 := %0->$$30]) decor ([]) {
                                 aggregate [$$43] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$7]]
                                 -- AGGREGATE  |LOCAL|
                                   nested tuple source
                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                              }
-                      -- EXTERNAL_GROUP_BY[$$20, $$19, $$27, $$31, $$30]  |PARTITIONED|
+                      -- SORT_GROUP_BY[$$20, $$19, $$27, $$31, $$30]  |PARTITIONED|
                         exchange 
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           project ([$$19, $$20, $$27, $$30, $$31, $$7])
@@ -123,4 +123,4 @@
                                             exchange 
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               empty-tuple-source
-                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q19_discounted_revenue.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q19_discounted_revenue.plan
index 9e97b7a..839f09a 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q19_discounted_revenue.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q19_discounted_revenue.plan
@@ -8,7 +8,7 @@
                 nested tuple source
                 -- NESTED_TUPLE_SOURCE  |LOCAL|
            }
-    -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+    -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
       exchange 
       -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
         group by ([]) decor ([]) {
@@ -17,7 +17,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             project ([$$15, $$16])
@@ -43,4 +43,4 @@
                         exchange 
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           empty-tuple-source
-                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q1_pricing_summary_report.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q1_pricing_summary_report.plan
index de964ac..3505205 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q1_pricing_summary_report.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q1_pricing_summary_report.plan
@@ -6,37 +6,33 @@
     -- ASSIGN  |PARTITIONED|
       exchange 
       -- SORT_MERGE_EXCHANGE [$$17(ASC), $$18(ASC) ]  |PARTITIONED|
-        order (ASC, %0->$$17) (ASC, %0->$$18) 
-        -- STABLE_SORT [$$17(ASC), $$18(ASC)]  |PARTITIONED|
+        group by ([$$17 := %0->$$37; $$18 := %0->$$38]) decor ([]) {
+                  aggregate [$$19, $$20, $$21, $$22, $$23, $$24, $$25, $$26] <- [function-call: hive:sum(FINAL), Args:[%0->$$29], function-call: hive:sum(FINAL), Args:[%0->$$30], function-call: hive:sum(FINAL), Args:[%0->$$31], function-call: hive:sum(FINAL), Args:[%0->$$32], function-call: hive:avg(FINAL), Args:[%0->$$33], function-call: hive:avg(FINAL), Args:[%0->$$34], function-call: hive:avg(FINAL), Args:[%0->$$35], function-call: hive:count(FINAL), Args:[%0->$$36]]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$37, $$38]  |PARTITIONED|
           exchange 
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            group by ([$$17 := %0->$$37; $$18 := %0->$$38]) decor ([]) {
-                      aggregate [$$19, $$20, $$21, $$22, $$23, $$24, $$25, $$26] <- [function-call: hive:sum(FINAL), Args:[%0->$$29], function-call: hive:sum(FINAL), Args:[%0->$$30], function-call: hive:sum(FINAL), Args:[%0->$$31], function-call: hive:sum(FINAL), Args:[%0->$$32], function-call: hive:avg(FINAL), Args:[%0->$$33], function-call: hive:avg(FINAL), Args:[%0->$$34], function-call: hive:avg(FINAL), Args:[%0->$$35], function-call: hive:count(FINAL), Args:[%0->$$36]]
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$37(ASC), $$38(ASC)] HASH:[$$37, $$38]  |PARTITIONED|
+            group by ([$$37 := %0->$$9; $$38 := %0->$$10]) decor ([]) {
+                      aggregate [$$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$5], function-call: hive:sum(PARTIAL1), Args:[%0->$$6], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]]], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPPlus, Args:[1, %0->$$8]]], function-call: hive:avg(PARTIAL1), Args:[%0->$$5], function-call: hive:avg(PARTIAL1), Args:[%0->$$6], function-call: hive:avg(PARTIAL1), Args:[%0->$$7], function-call: hive:count(PARTIAL1), Args:[1]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$37, $$38]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$9, $$10]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$37, $$38]  |PARTITIONED|
-                group by ([$$37 := %0->$$9; $$38 := %0->$$10]) decor ([]) {
-                          aggregate [$$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$5], function-call: hive:sum(PARTIAL1), Args:[%0->$$6], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]]], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPPlus, Args:[1, %0->$$8]]], function-call: hive:avg(PARTIAL1), Args:[%0->$$5], function-call: hive:avg(PARTIAL1), Args:[%0->$$6], function-call: hive:avg(PARTIAL1), Args:[%0->$$7], function-call: hive:count(PARTIAL1), Args:[1]]
-                          -- AGGREGATE  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       }
-                -- EXTERNAL_GROUP_BY[$$9, $$10]  |PARTITIONED|
-                  exchange 
-                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$9, $$10, $$5, $$6, $$7, $$8])
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      select (function-call: algebricks:le, Args:[%0->$$11, 1998-09-02])
-                      -- STREAM_SELECT  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                project ([$$9, $$10, $$5, $$6, $$7, $$8])
+                -- STREAM_PROJECT  |PARTITIONED|
+                  select (function-call: algebricks:le, Args:[%0->$$11, 1998-09-02])
+                  -- STREAM_SELECT  |PARTITIONED|
+                    exchange 
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      data-scan [$$5, $$6, $$7, $$8, $$9, $$10, $$11]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
+                      -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange 
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan [$$5, $$6, $$7, $$8, $$9, $$10, $$11]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            exchange 
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                          empty-tuple-source
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q20_potential_part_promotion.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q20_potential_part_promotion.plan
index ded599c..cecf482 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q20_potential_part_promotion.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q20_potential_part_promotion.plan
@@ -36,16 +36,16 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[$$23, $$24]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[$$23, $$24]  |PARTITIONED|
           exchange 
-          -- HASH_PARTITION_EXCHANGE [$$23, $$24]  |PARTITIONED|
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$23(ASC), $$24(ASC)] HASH:[$$23, $$24]  |PARTITIONED|
             group by ([$$23 := %0->$$2; $$24 := %0->$$3]) decor ([]) {
                       aggregate [$$22] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$5]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$2, $$3]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$2, $$3]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 project ([$$2, $$3, $$5])
@@ -175,4 +175,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q21_suppliers_who_kept_orders_waiting.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q21_suppliers_who_kept_orders_waiting.plan
index e4f2cd6..28bc66b 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q21_suppliers_who_kept_orders_waiting.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q21_suppliers_who_kept_orders_waiting.plan
@@ -21,19 +21,15 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- PRE_CLUSTERED_GROUP_BY[$$1, $$3]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$1, $$3]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, %0->$$1) (ASC, %0->$$3) 
-                -- STABLE_SORT [$$1(ASC), $$3(ASC)]  |PARTITIONED|
+                data-scan [$$1, $$3]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
+                -- DATASOURCE_SCAN  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    data-scan [$$1, $$3]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
-                    -- DATASOURCE_SCAN  |PARTITIONED|
-                      exchange 
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        empty-tuple-source
-                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                    empty-tuple-source
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
 write [%0->$$21, %0->$$24, %0->$$23]
 -- SINK_WRITE  |PARTITIONED|
   project ([$$21, $$24, $$23])
@@ -57,25 +53,21 @@
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- PRE_CLUSTERED_GROUP_BY[$$1, $$3]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$1, $$3]  |PARTITIONED|
               exchange 
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, %0->$$1) (ASC, %0->$$3) 
-                -- STABLE_SORT [$$1(ASC), $$3(ASC)]  |PARTITIONED|
-                  exchange 
-                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$1, $$3])
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      select (function-call: algebricks:gt, Args:[%0->$$13, %0->$$12])
-                      -- STREAM_SELECT  |PARTITIONED|
+                project ([$$1, $$3])
+                -- STREAM_PROJECT  |PARTITIONED|
+                  select (function-call: algebricks:gt, Args:[%0->$$13, %0->$$12])
+                  -- STREAM_SELECT  |PARTITIONED|
+                    exchange 
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      data-scan [$$1, $$3, $$12, $$13]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
+                      -- DATASOURCE_SCAN  |PARTITIONED|
                         exchange 
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan [$$1, $$3, $$12, $$13]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16] <- default.lineitem
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            exchange 
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          empty-tuple-source
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
 write [%0->$$43, %0->$$45]
 -- SINK_WRITE  |UNPARTITIONED|
   project ([$$43, $$45])
@@ -102,16 +94,16 @@
                                 nested tuple source
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                            }
-                    -- EXTERNAL_GROUP_BY[$$48]  |PARTITIONED|
+                    -- PRE_CLUSTERED_GROUP_BY[$$48]  |PARTITIONED|
                       exchange 
-                      -- HASH_PARTITION_EXCHANGE [$$48]  |PARTITIONED|
+                      -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$48(ASC)] HASH:[$$48]  |PARTITIONED|
                         group by ([$$48 := %0->$$37]) decor ([]) {
                                   aggregate [$$47] <- [function-call: hive:count(PARTIAL1), Args:[1]]
                                   -- AGGREGATE  |LOCAL|
                                     nested tuple source
                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                                }
-                        -- EXTERNAL_GROUP_BY[$$37]  |PARTITIONED|
+                        -- SORT_GROUP_BY[$$37]  |PARTITIONED|
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             project ([$$37])
@@ -221,4 +213,4 @@
                                         exchange 
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q22_global_sales_opportunity.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q22_global_sales_opportunity.plan
index c5897f7..15208bd 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q22_global_sales_opportunity.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q22_global_sales_opportunity.plan
@@ -24,7 +24,7 @@
                 nested tuple source
                 -- NESTED_TUPLE_SOURCE  |LOCAL|
            }
-    -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+    -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
       exchange 
       -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
         group by ([]) decor ([]) {
@@ -33,7 +33,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             select (function-call: algebricks:gt, Args:[%0->$$1, 0.0])
@@ -72,65 +72,61 @@
     -- ASSIGN  |PARTITIONED|
       exchange 
       -- SORT_MERGE_EXCHANGE [$$6(ASC) ]  |PARTITIONED|
-        order (ASC, %0->$$6) 
-        -- STABLE_SORT [$$6(ASC)]  |PARTITIONED|
+        group by ([$$6 := %0->$$13]) decor ([]) {
+                  aggregate [$$7, $$8] <- [function-call: hive:count(FINAL), Args:[%0->$$11], function-call: hive:sum(FINAL), Args:[%0->$$12]]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$13]  |PARTITIONED|
           exchange 
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            group by ([$$6 := %0->$$13]) decor ([]) {
-                      aggregate [$$7, $$8] <- [function-call: hive:count(FINAL), Args:[%0->$$11], function-call: hive:sum(FINAL), Args:[%0->$$12]]
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$13(ASC)] HASH:[$$13]  |PARTITIONED|
+            group by ([$$13 := %0->$$5]) decor ([]) {
+                      aggregate [$$11, $$12] <- [function-call: hive:count(PARTIAL1), Args:[1], function-call: hive:sum(PARTIAL1), Args:[%0->$$3]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$13]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$5]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$13]  |PARTITIONED|
-                group by ([$$13 := %0->$$5]) decor ([]) {
-                          aggregate [$$11, $$12] <- [function-call: hive:count(PARTIAL1), Args:[1], function-call: hive:sum(PARTIAL1), Args:[%0->$$3]]
-                          -- AGGREGATE  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       }
-                -- EXTERNAL_GROUP_BY[$$5]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                project ([$$5, $$3])
+                -- STREAM_PROJECT  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$5, $$3])
-                    -- STREAM_PROJECT  |PARTITIONED|
+                    join (function-call: algebricks:and, Args:[function-call: algebricks:gt, Args:[%0->$$3, %0->$$1], true])
+                    -- NESTED_LOOP  |PARTITIONED|
+                      exchange 
+                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                        project ([$$5, $$3])
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          select (function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNull, Args:[%0->$$2])
+                          -- STREAM_SELECT  |PARTITIONED|
+                            exchange 
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              left outer join (function-call: algebricks:eq, Args:[%0->$$4, %0->$$2])
+                              -- HYBRID_HASH_JOIN [$$4][$$2]  |PARTITIONED|
+                                exchange 
+                                -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
+                                  data-scan []<-[$$3, $$4, $$5] <- default.q22_customer_tmp
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    exchange 
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                exchange 
+                                -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
+                                  data-scan [$$2]<-[$$2] <- default.q22_orders_tmp
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    exchange 
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                       exchange 
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (function-call: algebricks:and, Args:[function-call: algebricks:gt, Args:[%0->$$3, %0->$$1], true])
-                        -- NESTED_LOOP  |PARTITIONED|
-                          exchange 
-                          -- BROADCAST_EXCHANGE  |PARTITIONED|
-                            project ([$$5, $$3])
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              select (function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNull, Args:[%0->$$2])
-                              -- STREAM_SELECT  |PARTITIONED|
-                                exchange 
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  left outer join (function-call: algebricks:eq, Args:[%0->$$4, %0->$$2])
-                                  -- HYBRID_HASH_JOIN [$$4][$$2]  |PARTITIONED|
-                                    exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$4]  |PARTITIONED|
-                                      data-scan []<-[$$3, $$4, $$5] <- default.q22_customer_tmp
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange 
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
-                                      data-scan [$$2]<-[$$2] <- default.q22_orders_tmp
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                        exchange 
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        data-scan [$$1]<-[$$1] <- default.q22_customer_tmp1
+                        -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            data-scan [$$1]<-[$$1] <- default.q22_customer_tmp1
-                            -- DATASOURCE_SCAN  |PARTITIONED|
-                              exchange 
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                empty-tuple-source
-                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            empty-tuple-source
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q2_minimum_cost_supplier.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q2_minimum_cost_supplier.plan
index 6138f7a..2714806 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q2_minimum_cost_supplier.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q2_minimum_cost_supplier.plan
@@ -103,19 +103,15 @@
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- PRE_CLUSTERED_GROUP_BY[$$4]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$4]  |PARTITIONED|
             exchange 
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              order (ASC, %0->$$4) 
-              -- STABLE_SORT [$$4(ASC)]  |PARTITIONED|
+              data-scan [$$4, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.q2_minimum_cost_supplier_tmp1
+              -- DATASOURCE_SCAN  |PARTITIONED|
                 exchange 
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  data-scan [$$4, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.q2_minimum_cost_supplier_tmp1
-                  -- DATASOURCE_SCAN  |PARTITIONED|
-                    exchange 
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      empty-tuple-source
-                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                  empty-tuple-source
+                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
 write [%0->$$3, %0->$$4, %0->$$5, %0->$$6, %0->$$8, %0->$$9, %0->$$10, %0->$$11]
 -- SINK_WRITE  |UNPARTITIONED|
   limit 100
@@ -153,4 +149,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q3_shipping_priority.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q3_shipping_priority.plan
index 31c4210..05563e2 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q3_shipping_priority.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q3_shipping_priority.plan
@@ -67,4 +67,4 @@
                                             exchange 
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                               empty-tuple-source
-                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q4_order_priority.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q4_order_priority.plan
index be5a66a..23a64fe 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q4_order_priority.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q4_order_priority.plan
@@ -30,53 +30,49 @@
     -- ASSIGN  |PARTITIONED|
       exchange 
       -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-        order (ASC, %0->$$11) 
-        -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        group by ([$$11 := %0->$$16]) decor ([]) {
+                  aggregate [$$12] <- [function-call: hive:count(FINAL), Args:[%0->$$15]]
+                  -- AGGREGATE  |LOCAL|
+                    nested tuple source
+                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+               }
+        -- PRE_CLUSTERED_GROUP_BY[$$16]  |PARTITIONED|
           exchange 
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            group by ([$$11 := %0->$$16]) decor ([]) {
-                      aggregate [$$12] <- [function-call: hive:count(FINAL), Args:[%0->$$15]]
+          -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$16(ASC)] HASH:[$$16]  |PARTITIONED|
+            group by ([$$16 := %0->$$7]) decor ([]) {
+                      aggregate [$$15] <- [function-call: hive:count(PARTIAL1), Args:[1]]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                    }
-            -- EXTERNAL_GROUP_BY[$$16]  |PARTITIONED|
+            -- SORT_GROUP_BY[$$7]  |PARTITIONED|
               exchange 
-              -- HASH_PARTITION_EXCHANGE [$$16]  |PARTITIONED|
-                group by ([$$16 := %0->$$7]) decor ([]) {
-                          aggregate [$$15] <- [function-call: hive:count(PARTIAL1), Args:[1]]
-                          -- AGGREGATE  |LOCAL|
-                            nested tuple source
-                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       }
-                -- EXTERNAL_GROUP_BY[$$7]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                project ([$$7])
+                -- STREAM_PROJECT  |PARTITIONED|
                   exchange 
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$7])
-                    -- STREAM_PROJECT  |PARTITIONED|
+                    join (function-call: algebricks:eq, Args:[%0->$$1, %0->$$2])
+                    -- HYBRID_HASH_JOIN [$$1][$$2]  |PARTITIONED|
                       exchange 
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        join (function-call: algebricks:eq, Args:[%0->$$1, %0->$$2])
-                        -- HYBRID_HASH_JOIN [$$1][$$2]  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                        data-scan []<-[$$1] <- default.q4_order_priority_tmp
+                        -- DATASOURCE_SCAN  |PARTITIONED|
                           exchange 
-                          -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
-                            data-scan []<-[$$1] <- default.q4_order_priority_tmp
-                            -- DATASOURCE_SCAN  |PARTITIONED|
-                              exchange 
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                empty-tuple-source
-                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          exchange 
-                          -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
-                            project ([$$2, $$7])
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$6, 1993-07-01], function-call: algebricks:lt, Args:[%0->$$6, 1993-10-01]])
-                              -- STREAM_SELECT  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            empty-tuple-source
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                      exchange 
+                      -- HASH_PARTITION_EXCHANGE [$$2]  |PARTITIONED|
+                        project ([$$2, $$7])
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$6, 1993-07-01], function-call: algebricks:lt, Args:[%0->$$6, 1993-10-01]])
+                          -- STREAM_SELECT  |PARTITIONED|
+                            exchange 
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              data-scan [$$2, $$6, $$7]<-[$$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10] <- default.orders
+                              -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange 
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  data-scan [$$2, $$6, $$7]<-[$$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10] <- default.orders
-                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                    exchange 
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      empty-tuple-source
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                  empty-tuple-source
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan
index 383e550..a0f5b8c 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q5_local_supplier_volume.plan
@@ -14,16 +14,16 @@
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$52]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$52]  |PARTITIONED|
             exchange 
-            -- HASH_PARTITION_EXCHANGE [$$52]  |PARTITIONED|
+            -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$52(ASC)] HASH:[$$52]  |PARTITIONED|
               group by ([$$52 := %0->$$42]) decor ([]) {
                         aggregate [$$51] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$23, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$24]]]]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- EXTERNAL_GROUP_BY[$$42]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$42]  |PARTITIONED|
                 exchange 
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   project ([$$42, $$23, $$24])
@@ -123,4 +123,4 @@
                             exchange 
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               empty-tuple-source
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q6_forecast_revenue_change.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q6_forecast_revenue_change.plan
index aac9a5b..03363f3 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q6_forecast_revenue_change.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q6_forecast_revenue_change.plan
@@ -8,7 +8,7 @@
                 nested tuple source
                 -- NESTED_TUPLE_SOURCE  |LOCAL|
            }
-    -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+    -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
       exchange 
       -- HASH_PARTITION_EXCHANGE []  |PARTITIONED|
         group by ([]) decor ([]) {
@@ -17,7 +17,7 @@
                     nested tuple source
                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                }
-        -- EXTERNAL_GROUP_BY[]  |PARTITIONED|
+        -- PRE_CLUSTERED_GROUP_BY[]  |PARTITIONED|
           exchange 
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             project ([$$6, $$7])
@@ -31,4 +31,4 @@
                     exchange 
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       empty-tuple-source
-                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q7_volume_shipping.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q7_volume_shipping.plan
index c1d5b26..9f62e7b 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q7_volume_shipping.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q7_volume_shipping.plan
@@ -90,103 +90,99 @@
   -- STREAM_PROJECT  |PARTITIONED|
     exchange 
     -- SORT_MERGE_EXCHANGE [$$47(ASC), $$48(ASC), $$49(ASC) ]  |PARTITIONED|
-      order (ASC, %0->$$47) (ASC, %0->$$48) (ASC, %0->$$49) 
-      -- STABLE_SORT [$$47(ASC), $$48(ASC), $$49(ASC)]  |PARTITIONED|
+      group by ([$$47 := %0->$$53; $$48 := %0->$$54; $$49 := %0->$$55]) decor ([]) {
+                aggregate [$$50] <- [function-call: hive:sum(FINAL), Args:[%0->$$52]]
+                -- AGGREGATE  |LOCAL|
+                  nested tuple source
+                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+             }
+      -- PRE_CLUSTERED_GROUP_BY[$$53, $$54, $$55]  |PARTITIONED|
         exchange 
-        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$$47 := %0->$$53; $$48 := %0->$$54; $$49 := %0->$$55]) decor ([]) {
-                    aggregate [$$50] <- [function-call: hive:sum(FINAL), Args:[%0->$$52]]
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$53(ASC), $$54(ASC), $$55(ASC)] HASH:[$$53, $$54, $$55]  |PARTITIONED|
+          group by ([$$53 := %0->$$1; $$54 := %0->$$2; $$55 := %0->$$45]) decor ([]) {
+                    aggregate [$$52] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$46]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$53, $$54, $$55]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$1, $$2, $$45]  |PARTITIONED|
             exchange 
-            -- HASH_PARTITION_EXCHANGE [$$53, $$54, $$55]  |PARTITIONED|
-              group by ([$$53 := %0->$$1; $$54 := %0->$$2; $$55 := %0->$$45]) decor ([]) {
-                        aggregate [$$52] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$46]]
-                        -- AGGREGATE  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                     }
-              -- EXTERNAL_GROUP_BY[$$1, $$2, $$45]  |PARTITIONED|
-                exchange 
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$1, $$2, $$45, $$46])
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              project ([$$1, $$2, $$45, $$46])
+              -- STREAM_PROJECT  |PARTITIONED|
+                assign [$$45, $$46] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$30], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$25, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$26]]]
+                -- ASSIGN  |PARTITIONED|
+                  project ([$$1, $$2, $$30, $$25, $$26])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$45, $$46] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$30], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$25, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$26]]]
-                    -- ASSIGN  |PARTITIONED|
-                      project ([$$1, $$2, $$30, $$25, $$26])
-                      -- STREAM_PROJECT  |PARTITIONED|
+                    exchange 
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      join (function-call: algebricks:and, Args:[function-call: algebricks:eq, Args:[%0->$$15, %0->$$4], function-call: algebricks:eq, Args:[%0->$$8, %0->$$3]])
+                      -- HYBRID_HASH_JOIN [$$15, $$8][$$4, $$3]  |PARTITIONED|
                         exchange 
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          join (function-call: algebricks:and, Args:[function-call: algebricks:eq, Args:[%0->$$15, %0->$$4], function-call: algebricks:eq, Args:[%0->$$8, %0->$$3]])
-                          -- HYBRID_HASH_JOIN [$$15, $$8][$$4, $$3]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$15, $$8]  |PARTITIONED|
+                          project ([$$8, $$30, $$25, $$26, $$15])
+                          -- STREAM_PROJECT  |PARTITIONED|
                             exchange 
-                            -- HASH_PARTITION_EXCHANGE [$$15, $$8]  |PARTITIONED|
-                              project ([$$8, $$30, $$25, $$26, $$15])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              join (function-call: algebricks:eq, Args:[%0->$$22, %0->$$5])
+                              -- HYBRID_HASH_JOIN [$$22][$$5]  |PARTITIONED|
                                 exchange 
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  join (function-call: algebricks:eq, Args:[%0->$$22, %0->$$5])
-                                  -- HYBRID_HASH_JOIN [$$22][$$5]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                                  project ([$$15, $$30, $$25, $$26, $$22])
+                                  -- STREAM_PROJECT  |PARTITIONED|
                                     exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
-                                      project ([$$15, $$30, $$25, $$26, $$22])
-                                      -- STREAM_PROJECT  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      join (function-call: algebricks:eq, Args:[%0->$$37, %0->$$12])
+                                      -- HYBRID_HASH_JOIN [$$37][$$12]  |PARTITIONED|
                                         exchange 
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          join (function-call: algebricks:eq, Args:[%0->$$37, %0->$$12])
-                                          -- HYBRID_HASH_JOIN [$$37][$$12]  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
+                                          project ([$$37, $$22, $$25, $$26, $$30])
+                                          -- STREAM_PROJECT  |PARTITIONED|
                                             exchange 
-                                            -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
-                                              project ([$$37, $$22, $$25, $$26, $$30])
-                                              -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              join (function-call: algebricks:eq, Args:[%0->$$20, %0->$$36])
+                                              -- HYBRID_HASH_JOIN [$$20][$$36]  |PARTITIONED|
                                                 exchange 
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  join (function-call: algebricks:eq, Args:[%0->$$20, %0->$$36])
-                                                  -- HYBRID_HASH_JOIN [$$20][$$36]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
+                                                  select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$30, 1995-01-01], function-call: algebricks:le, Args:[%0->$$30, 1996-12-31]])
+                                                  -- STREAM_SELECT  |PARTITIONED|
                                                     exchange 
-                                                    -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
-                                                      select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$30, 1995-01-01], function-call: algebricks:le, Args:[%0->$$30, 1996-12-31]])
-                                                      -- STREAM_SELECT  |PARTITIONED|
-                                                        exchange 
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          data-scan [$$20, $$22, $$25, $$26, $$30]<-[$$20, $$21, $$22, $$23, $$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35] <- default.lineitem
-                                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                                            exchange 
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              empty-tuple-source
-                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                    exchange 
-                                                    -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
-                                                      data-scan [$$36, $$37]<-[$$36, $$37, $$38, $$39, $$40, $$41, $$42, $$43, $$44] <- default.orders
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      data-scan [$$20, $$22, $$25, $$26, $$30]<-[$$20, $$21, $$22, $$23, $$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35] <- default.lineitem
                                                       -- DATASOURCE_SCAN  |PARTITIONED|
                                                         exchange 
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                           empty-tuple-source
                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            exchange 
-                                            -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
-                                              data-scan [$$12, $$15]<-[$$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19] <- default.customer
-                                              -- DATASOURCE_SCAN  |PARTITIONED|
                                                 exchange 
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  empty-tuple-source
-                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
-                                      data-scan [$$5, $$8]<-[$$5, $$6, $$7, $$8, $$9, $$10, $$11] <- default.supplier
-                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                                                  data-scan [$$36, $$37]<-[$$36, $$37, $$38, $$39, $$40, $$41, $$42, $$43, $$44] <- default.orders
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                    exchange 
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      empty-tuple-source
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                         exchange 
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          empty-tuple-source
-                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                            exchange 
-                            -- HASH_PARTITION_EXCHANGE [$$4, $$3]  |PARTITIONED|
-                              data-scan [$$4, $$3, $$1, $$2]<-[$$1, $$2, $$3, $$4] <- default.q7_volume_shipping_tmp
-                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
+                                          data-scan [$$12, $$15]<-[$$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19] <- default.customer
+                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                            exchange 
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              empty-tuple-source
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                                 exchange 
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  empty-tuple-source
-                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
+                                  data-scan [$$5, $$8]<-[$$5, $$6, $$7, $$8, $$9, $$10, $$11] <- default.supplier
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    exchange 
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      empty-tuple-source
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        exchange 
+                        -- HASH_PARTITION_EXCHANGE [$$4, $$3]  |PARTITIONED|
+                          data-scan [$$4, $$3, $$1, $$2]<-[$$1, $$2, $$3, $$4] <- default.q7_volume_shipping_tmp
+                          -- DATASOURCE_SCAN  |PARTITIONED|
+                            exchange 
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              empty-tuple-source
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q8_national_market_share.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q8_national_market_share.plan
index b9916e2..e02580a 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q8_national_market_share.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q8_national_market_share.plan
@@ -2,189 +2,185 @@
 -- SINK_WRITE  |PARTITIONED|
   exchange 
   -- SORT_MERGE_EXCHANGE [$$63(ASC) ]  |PARTITIONED|
-    order (ASC, %0->$$63) 
-    -- STABLE_SORT [$$63(ASC)]  |PARTITIONED|
-      exchange 
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        project ([$$63, $$66])
-        -- STREAM_PROJECT  |PARTITIONED|
-          assign [$$66] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPDivide, Args:[%0->$$64, %0->$$65]]
-          -- ASSIGN  |PARTITIONED|
+    project ([$$63, $$66])
+    -- STREAM_PROJECT  |PARTITIONED|
+      assign [$$66] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPDivide, Args:[%0->$$64, %0->$$65]]
+      -- ASSIGN  |PARTITIONED|
+        exchange 
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          group by ([$$63 := %0->$$70]) decor ([]) {
+                    aggregate [$$64, $$65] <- [function-call: hive:sum(FINAL), Args:[%0->$$68], function-call: hive:sum(FINAL), Args:[%0->$$69]]
+                    -- AGGREGATE  |LOCAL|
+                      nested tuple source
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                 }
+          -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
             exchange 
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              group by ([$$63 := %0->$$70]) decor ([]) {
-                        aggregate [$$64, $$65] <- [function-call: hive:sum(FINAL), Args:[%0->$$68], function-call: hive:sum(FINAL), Args:[%0->$$69]]
+            -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$70(ASC)] HASH:[$$70]  |PARTITIONED|
+              group by ([$$70 := %0->$$61]) decor ([]) {
+                        aggregate [$$68, $$69] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:eq, Args:[%0->$$2, BRAZIL], %0->$$62, 0.0]], function-call: hive:sum(PARTIAL1), Args:[%0->$$62]]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- EXTERNAL_GROUP_BY[$$70]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$61]  |PARTITIONED|
                 exchange 
-                -- HASH_PARTITION_EXCHANGE [$$70]  |PARTITIONED|
-                  group by ([$$70 := %0->$$61]) decor ([]) {
-                            aggregate [$$68, $$69] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen, Args:[function-call: algebricks:eq, Args:[%0->$$2, BRAZIL], %0->$$62, 0.0]], function-call: hive:sum(PARTIAL1), Args:[%0->$$62]]
-                            -- AGGREGATE  |LOCAL|
-                              nested tuple source
-                              -- NESTED_TUPLE_SOURCE  |LOCAL|
-                         }
-                  -- EXTERNAL_GROUP_BY[$$61]  |PARTITIONED|
-                    exchange 
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      project ([$$61, $$62, $$2])
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  project ([$$61, $$62, $$2])
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    assign [$$61, $$62] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$41], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$26, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$27]]]
+                    -- ASSIGN  |PARTITIONED|
+                      project ([$$2, $$41, $$27, $$26])
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$61, $$62] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$41], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$26, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$27]]]
-                        -- ASSIGN  |PARTITIONED|
-                          project ([$$2, $$41, $$27, $$26])
-                          -- STREAM_PROJECT  |PARTITIONED|
+                        exchange 
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          join (function-call: algebricks:eq, Args:[%0->$$8, %0->$$1])
+                          -- HYBRID_HASH_JOIN [$$8][$$1]  |PARTITIONED|
                             exchange 
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              join (function-call: algebricks:eq, Args:[%0->$$8, %0->$$1])
-                              -- HYBRID_HASH_JOIN [$$8][$$1]  |PARTITIONED|
+                            -- HASH_PARTITION_EXCHANGE [$$8]  |PARTITIONED|
+                              project ([$$8, $$41, $$27, $$26])
+                              -- STREAM_PROJECT  |PARTITIONED|
                                 exchange 
-                                -- HASH_PARTITION_EXCHANGE [$$8]  |PARTITIONED|
-                                  project ([$$8, $$41, $$27, $$26])
-                                  -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  join (function-call: algebricks:eq, Args:[%0->$$23, %0->$$5])
+                                  -- HYBRID_HASH_JOIN [$$23][$$5]  |PARTITIONED|
                                     exchange 
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      join (function-call: algebricks:eq, Args:[%0->$$23, %0->$$5])
-                                      -- HYBRID_HASH_JOIN [$$23][$$5]  |PARTITIONED|
+                                    -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                                      project ([$$41, $$27, $$26, $$23])
+                                      -- STREAM_PROJECT  |PARTITIONED|
                                         exchange 
-                                        -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
-                                          project ([$$41, $$27, $$26, $$23])
-                                          -- STREAM_PROJECT  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          join (function-call: algebricks:eq, Args:[%0->$$22, %0->$$12])
+                                          -- HYBRID_HASH_JOIN [$$22][$$12]  |PARTITIONED|
                                             exchange 
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              join (function-call: algebricks:eq, Args:[%0->$$22, %0->$$12])
-                                              -- HYBRID_HASH_JOIN [$$22][$$12]  |PARTITIONED|
+                                            -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                                              project ([$$41, $$22, $$23, $$26, $$27])
+                                              -- STREAM_PROJECT  |PARTITIONED|
                                                 exchange 
-                                                -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
-                                                  project ([$$41, $$22, $$23, $$26, $$27])
-                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  join (function-call: algebricks:eq, Args:[%0->$$21, %0->$$37])
+                                                  -- HYBRID_HASH_JOIN [$$21][$$37]  |PARTITIONED|
                                                     exchange 
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      join (function-call: algebricks:eq, Args:[%0->$$21, %0->$$37])
-                                                      -- HYBRID_HASH_JOIN [$$21][$$37]  |PARTITIONED|
+                                                    -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
+                                                      data-scan [$$21, $$22, $$23, $$26, $$27]<-[$$21, $$22, $$23, $$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36] <- default.lineitem
+                                                      -- DATASOURCE_SCAN  |PARTITIONED|
                                                         exchange 
-                                                        -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
-                                                          data-scan [$$21, $$22, $$23, $$26, $$27]<-[$$21, $$22, $$23, $$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36] <- default.lineitem
-                                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                                            exchange 
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              empty-tuple-source
-                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          empty-tuple-source
+                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                    exchange 
+                                                    -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
+                                                      project ([$$37, $$41])
+                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                         exchange 
-                                                        -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
-                                                          project ([$$37, $$41])
-                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          join (function-call: algebricks:eq, Args:[%0->$$46, %0->$$38])
+                                                          -- HYBRID_HASH_JOIN [$$46][$$38]  |PARTITIONED|
                                                             exchange 
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              join (function-call: algebricks:eq, Args:[%0->$$46, %0->$$38])
-                                                              -- HYBRID_HASH_JOIN [$$46][$$38]  |PARTITIONED|
+                                                            -- HASH_PARTITION_EXCHANGE [$$46]  |PARTITIONED|
+                                                              project ([$$46])
+                                                              -- STREAM_PROJECT  |PARTITIONED|
                                                                 exchange 
-                                                                -- HASH_PARTITION_EXCHANGE [$$46]  |PARTITIONED|
-                                                                  project ([$$46])
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  join (function-call: algebricks:eq, Args:[%0->$$54, %0->$$49])
+                                                                  -- HYBRID_HASH_JOIN [$$54][$$49]  |PARTITIONED|
                                                                     exchange 
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      join (function-call: algebricks:eq, Args:[%0->$$54, %0->$$49])
-                                                                      -- HYBRID_HASH_JOIN [$$54][$$49]  |PARTITIONED|
+                                                                    -- HASH_PARTITION_EXCHANGE [$$54]  |PARTITIONED|
+                                                                      project ([$$54])
+                                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                                         exchange 
-                                                                        -- HASH_PARTITION_EXCHANGE [$$54]  |PARTITIONED|
-                                                                          project ([$$54])
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          join (function-call: algebricks:eq, Args:[%0->$$58, %0->$$56])
+                                                                          -- HYBRID_HASH_JOIN [$$58][$$56]  |PARTITIONED|
                                                                             exchange 
-                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              join (function-call: algebricks:eq, Args:[%0->$$58, %0->$$56])
-                                                                              -- HYBRID_HASH_JOIN [$$58][$$56]  |PARTITIONED|
-                                                                                exchange 
-                                                                                -- HASH_PARTITION_EXCHANGE [$$58]  |PARTITIONED|
-                                                                                  project ([$$58])
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    select (function-call: algebricks:eq, Args:[%0->$$59, AMERICA])
-                                                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                                            -- HASH_PARTITION_EXCHANGE [$$58]  |PARTITIONED|
+                                                                              project ([$$58])
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                select (function-call: algebricks:eq, Args:[%0->$$59, AMERICA])
+                                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                                  exchange 
+                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                    data-scan [$$59, $$58]<-[$$58, $$59, $$60] <- default.region
+                                                                                    -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                       exchange 
                                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        data-scan [$$59, $$58]<-[$$58, $$59, $$60] <- default.region
-                                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                          exchange 
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            empty-tuple-source
-                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                        empty-tuple-source
+                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                            exchange 
+                                                                            -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
+                                                                              project ([$$56, $$54])
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
                                                                                 exchange 
-                                                                                -- HASH_PARTITION_EXCHANGE [$$56]  |PARTITIONED|
-                                                                                  project ([$$56, $$54])
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  replicate 
+                                                                                  -- SPLIT  |PARTITIONED|
                                                                                     exchange 
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      replicate 
-                                                                                      -- SPLIT  |PARTITIONED|
+                                                                                      data-scan []<-[$$54, $$55, $$56, $$57] <- default.nation
+                                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                         exchange 
                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          data-scan []<-[$$54, $$55, $$56, $$57] <- default.nation
-                                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                            exchange 
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              empty-tuple-source
-                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                          empty-tuple-source
+                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    exchange 
+                                                                    -- HASH_PARTITION_EXCHANGE [$$49]  |PARTITIONED|
+                                                                      data-scan [$$49, $$46]<-[$$46, $$47, $$48, $$49, $$50, $$51, $$52, $$53] <- default.customer
+                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
                                                                         exchange 
-                                                                        -- HASH_PARTITION_EXCHANGE [$$49]  |PARTITIONED|
-                                                                          data-scan [$$49, $$46]<-[$$46, $$47, $$48, $$49, $$50, $$51, $$52, $$53] <- default.customer
-                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                            exchange 
-                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              empty-tuple-source
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                exchange 
-                                                                -- HASH_PARTITION_EXCHANGE [$$38]  |PARTITIONED|
-                                                                  project ([$$38, $$37, $$41])
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$41, 1995-01-01], function-call: algebricks:lt, Args:[%0->$$41, 1996-12-31]])
-                                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          empty-tuple-source
+                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                            exchange 
+                                                            -- HASH_PARTITION_EXCHANGE [$$38]  |PARTITIONED|
+                                                              project ([$$38, $$37, $$41])
+                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                select (function-call: algebricks:and, Args:[function-call: algebricks:ge, Args:[%0->$$41, 1995-01-01], function-call: algebricks:lt, Args:[%0->$$41, 1996-12-31]])
+                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                  exchange 
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    data-scan [$$38, $$37, $$41]<-[$$37, $$38, $$39, $$40, $$41, $$42, $$43, $$44, $$45] <- default.orders
+                                                                    -- DATASOURCE_SCAN  |PARTITIONED|
                                                                       exchange 
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        data-scan [$$38, $$37, $$41]<-[$$37, $$38, $$39, $$40, $$41, $$42, $$43, $$44, $$45] <- default.orders
-                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                          exchange 
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            empty-tuple-source
-                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                exchange 
-                                                -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
-                                                  project ([$$12])
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    select (function-call: algebricks:eq, Args:[%0->$$16, ECONOMY ANODIZED STEEL])
-                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                                        empty-tuple-source
+                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            exchange 
+                                            -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
+                                              project ([$$12])
+                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                select (function-call: algebricks:eq, Args:[%0->$$16, ECONOMY ANODIZED STEEL])
+                                                -- STREAM_SELECT  |PARTITIONED|
+                                                  exchange 
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    data-scan [$$16, $$12]<-[$$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19, $$20] <- default.part
+                                                    -- DATASOURCE_SCAN  |PARTITIONED|
                                                       exchange 
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        data-scan [$$16, $$12]<-[$$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19, $$20] <- default.part
-                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                          exchange 
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            empty-tuple-source
-                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        empty-tuple-source
+                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                    exchange 
+                                    -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
+                                      data-scan [$$5, $$8]<-[$$5, $$6, $$7, $$8, $$9, $$10, $$11] <- default.supplier
+                                      -- DATASOURCE_SCAN  |PARTITIONED|
                                         exchange 
-                                        -- HASH_PARTITION_EXCHANGE [$$5]  |PARTITIONED|
-                                          data-scan [$$5, $$8]<-[$$5, $$6, $$7, $$8, $$9, $$10, $$11] <- default.supplier
-                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                            exchange 
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              empty-tuple-source
-                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                exchange 
-                                -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
-                                  project ([$$1, $$2])
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    assign [$$1, $$2, $$3, $$4] <- [%0->$$54, %0->$$55, %0->$$56, %0->$$57]
-                                    -- ASSIGN  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          empty-tuple-source
+                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                            exchange 
+                            -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                              project ([$$1, $$2])
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                assign [$$1, $$2, $$3, $$4] <- [%0->$$54, %0->$$55, %0->$$56, %0->$$57]
+                                -- ASSIGN  |PARTITIONED|
+                                  exchange 
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    replicate 
+                                    -- SPLIT  |PARTITIONED|
                                       exchange 
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        replicate 
-                                        -- SPLIT  |PARTITIONED|
+                                        data-scan []<-[$$54, $$55, $$56, $$57] <- default.nation
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
                                           exchange 
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            data-scan []<-[$$54, $$55, $$56, $$57] <- default.nation
-                                            -- DATASOURCE_SCAN  |PARTITIONED|
-                                              exchange 
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                empty-tuple-source
-                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                            empty-tuple-source
+                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/q9_product_type_profit.plan b/hivesterix-dist/src/test/resources/optimizerts/results/q9_product_type_profit.plan
index ecf4acb..c5d8052 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/q9_product_type_profit.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/q9_product_type_profit.plan
@@ -4,121 +4,117 @@
   -- STREAM_PROJECT  |PARTITIONED|
     exchange 
     -- SORT_MERGE_EXCHANGE [$$53(ASC), $$54(DESC) ]  |PARTITIONED|
-      order (ASC, %0->$$53) (DESC, %0->$$54) 
-      -- STABLE_SORT [$$53(ASC), $$54(DESC)]  |PARTITIONED|
+      group by ([$$53 := %0->$$58; $$54 := %0->$$59]) decor ([]) {
+                aggregate [$$55] <- [function-call: hive:sum(FINAL), Args:[%0->$$57]]
+                -- AGGREGATE  |LOCAL|
+                  nested tuple source
+                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+             }
+      -- PRE_CLUSTERED_GROUP_BY[$$58, $$59]  |PARTITIONED|
         exchange 
-        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$$53 := %0->$$58; $$54 := %0->$$59]) decor ([]) {
-                    aggregate [$$55] <- [function-call: hive:sum(FINAL), Args:[%0->$$57]]
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$58(ASC), $$59(DESC)] HASH:[$$58, $$59]  |PARTITIONED|
+          group by ([$$58 := %0->$$48; $$59 := %0->$$51]) decor ([]) {
+                    aggregate [$$57] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$52]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$58, $$59]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$48, $$51]  |PARTITIONED|
             exchange 
-            -- HASH_PARTITION_EXCHANGE [$$58, $$59]  |PARTITIONED|
-              group by ([$$58 := %0->$$48; $$59 := %0->$$51]) decor ([]) {
-                        aggregate [$$57] <- [function-call: hive:sum(PARTIAL1), Args:[%0->$$52]]
-                        -- AGGREGATE  |LOCAL|
-                          nested tuple source
-                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                     }
-              -- EXTERNAL_GROUP_BY[$$48, $$51]  |PARTITIONED|
-                exchange 
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$48, $$51, $$52])
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              project ([$$48, $$51, $$52])
+              -- STREAM_PROJECT  |PARTITIONED|
+                assign [$$51, $$52] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$5], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$29, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$30]], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$22, %0->$$28]]]
+                -- ASSIGN  |PARTITIONED|
+                  project ([$$5, $$29, $$30, $$28, $$48, $$22])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$51, $$52] <- [function-call: hive:org.apache.hadoop.hive.ql.udf.UDFYear, Args:[%0->$$5], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$29, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$30]], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$22, %0->$$28]]]
-                    -- ASSIGN  |PARTITIONED|
-                      project ([$$5, $$29, $$30, $$28, $$48, $$22])
-                      -- STREAM_PROJECT  |PARTITIONED|
+                    exchange 
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      join (function-call: algebricks:eq, Args:[%0->$$24, %0->$$1])
+                      -- HYBRID_HASH_JOIN [$$24][$$1]  |PARTITIONED|
                         exchange 
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          join (function-call: algebricks:eq, Args:[%0->$$24, %0->$$1])
-                          -- HYBRID_HASH_JOIN [$$24][$$1]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$24]  |PARTITIONED|
+                          project ([$$29, $$30, $$28, $$24, $$48, $$22])
+                          -- STREAM_PROJECT  |PARTITIONED|
                             exchange 
-                            -- HASH_PARTITION_EXCHANGE [$$24]  |PARTITIONED|
-                              project ([$$29, $$30, $$28, $$24, $$48, $$22])
-                              -- STREAM_PROJECT  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              join (function-call: algebricks:eq, Args:[%0->$$25, %0->$$10])
+                              -- HYBRID_HASH_JOIN [$$25][$$10]  |PARTITIONED|
                                 exchange 
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  join (function-call: algebricks:eq, Args:[%0->$$25, %0->$$10])
-                                  -- HYBRID_HASH_JOIN [$$25][$$10]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
+                                  project ([$$22, $$29, $$30, $$28, $$25, $$24, $$48])
+                                  -- STREAM_PROJECT  |PARTITIONED|
                                     exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
-                                      project ([$$22, $$29, $$30, $$28, $$25, $$24, $$48])
-                                      -- STREAM_PROJECT  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      join (function-call: algebricks:and, Args:[function-call: algebricks:eq, Args:[%0->$$26, %0->$$20], function-call: algebricks:eq, Args:[%0->$$25, %0->$$19]])
+                                      -- HYBRID_HASH_JOIN [$$26, $$25][$$20, $$19]  |PARTITIONED|
                                         exchange 
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          join (function-call: algebricks:and, Args:[function-call: algebricks:eq, Args:[%0->$$26, %0->$$20], function-call: algebricks:eq, Args:[%0->$$25, %0->$$19]])
-                                          -- HYBRID_HASH_JOIN [$$26, $$25][$$20, $$19]  |PARTITIONED|
+                                          project ([$$48, $$24, $$25, $$26, $$28, $$29, $$30])
+                                          -- STREAM_PROJECT  |PARTITIONED|
                                             exchange 
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              project ([$$48, $$24, $$25, $$26, $$28, $$29, $$30])
-                                              -- STREAM_PROJECT  |PARTITIONED|
+                                              join (function-call: algebricks:eq, Args:[%0->$$26, %0->$$40])
+                                              -- HYBRID_HASH_JOIN [$$26][$$40]  |PARTITIONED|
                                                 exchange 
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  join (function-call: algebricks:eq, Args:[%0->$$26, %0->$$40])
-                                                  -- HYBRID_HASH_JOIN [$$26][$$40]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$26]  |PARTITIONED|
+                                                  data-scan [$$26, $$24, $$25, $$28, $$29, $$30]<-[$$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36, $$37, $$38, $$39] <- default.lineitem
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
                                                     exchange 
-                                                    -- HASH_PARTITION_EXCHANGE [$$26]  |PARTITIONED|
-                                                      data-scan [$$26, $$24, $$25, $$28, $$29, $$30]<-[$$24, $$25, $$26, $$27, $$28, $$29, $$30, $$31, $$32, $$33, $$34, $$35, $$36, $$37, $$38, $$39] <- default.lineitem
-                                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                                        exchange 
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          empty-tuple-source
-                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      empty-tuple-source
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                exchange 
+                                                -- HASH_PARTITION_EXCHANGE [$$40]  |PARTITIONED|
+                                                  project ([$$40, $$48])
+                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                     exchange 
-                                                    -- HASH_PARTITION_EXCHANGE [$$40]  |PARTITIONED|
-                                                      project ([$$40, $$48])
-                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      join (function-call: algebricks:eq, Args:[%0->$$43, %0->$$47])
+                                                      -- HYBRID_HASH_JOIN [$$43][$$47]  |PARTITIONED|
                                                         exchange 
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          join (function-call: algebricks:eq, Args:[%0->$$43, %0->$$47])
-                                                          -- HYBRID_HASH_JOIN [$$43][$$47]  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$43]  |PARTITIONED|
+                                                          data-scan [$$43, $$40]<-[$$40, $$41, $$42, $$43, $$44, $$45, $$46] <- default.supplier
+                                                          -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange 
-                                                            -- HASH_PARTITION_EXCHANGE [$$43]  |PARTITIONED|
-                                                              data-scan [$$43, $$40]<-[$$40, $$41, $$42, $$43, $$44, $$45, $$46] <- default.supplier
-                                                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                exchange 
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  empty-tuple-source
-                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              empty-tuple-source
+                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        exchange 
+                                                        -- HASH_PARTITION_EXCHANGE [$$47]  |PARTITIONED|
+                                                          data-scan [$$47, $$48]<-[$$47, $$48, $$49, $$50] <- default.nation
+                                                          -- DATASOURCE_SCAN  |PARTITIONED|
                                                             exchange 
-                                                            -- HASH_PARTITION_EXCHANGE [$$47]  |PARTITIONED|
-                                                              data-scan [$$47, $$48]<-[$$47, $$48, $$49, $$50] <- default.nation
-                                                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                exchange 
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  empty-tuple-source
-                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              empty-tuple-source
+                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                        exchange 
+                                        -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
+                                          data-scan [$$20, $$19, $$22]<-[$$19, $$20, $$21, $$22, $$23] <- default.partsupp
+                                          -- DATASOURCE_SCAN  |PARTITIONED|
                                             exchange 
-                                            -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
-                                              data-scan [$$20, $$19, $$22]<-[$$19, $$20, $$21, $$22, $$23] <- default.partsupp
-                                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                                exchange 
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  empty-tuple-source
-                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    exchange 
-                                    -- HASH_PARTITION_EXCHANGE [$$10]  |PARTITIONED|
-                                      project ([$$10])
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        select (function-call: hive:org.apache.hadoop.hive.ql.udf.UDFLike, Args:[%0->$$11, %green%])
-                                        -- STREAM_SELECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              empty-tuple-source
+                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                exchange 
+                                -- HASH_PARTITION_EXCHANGE [$$10]  |PARTITIONED|
+                                  project ([$$10])
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    select (function-call: hive:org.apache.hadoop.hive.ql.udf.UDFLike, Args:[%0->$$11, %green%])
+                                    -- STREAM_SELECT  |PARTITIONED|
+                                      exchange 
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        data-scan [$$10, $$11]<-[$$10, $$11, $$12, $$13, $$14, $$15, $$16, $$17, $$18] <- default.part
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
                                           exchange 
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            data-scan [$$10, $$11]<-[$$10, $$11, $$12, $$13, $$14, $$15, $$16, $$17, $$18] <- default.part
-                                            -- DATASOURCE_SCAN  |PARTITIONED|
-                                              exchange 
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                empty-tuple-source
-                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                            empty-tuple-source
+                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        exchange 
+                        -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
+                          data-scan [$$1, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.orders
+                          -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange 
-                            -- HASH_PARTITION_EXCHANGE [$$1]  |PARTITIONED|
-                              data-scan [$$1, $$5]<-[$$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9] <- default.orders
-                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                exchange 
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  empty-tuple-source
-                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              empty-tuple-source
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/u1_group_by.plan b/hivesterix-dist/src/test/resources/optimizerts/results/u1_group_by.plan
index bec1353..3d8c8f7 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/u1_group_by.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/u1_group_by.plan
@@ -10,16 +10,16 @@
                   nested tuple source
                   -- NESTED_TUPLE_SOURCE  |LOCAL|
              }
-      -- EXTERNAL_GROUP_BY[$$23]  |PARTITIONED|
+      -- PRE_CLUSTERED_GROUP_BY[$$23]  |PARTITIONED|
         exchange 
-        -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+        -- HASH_PARTITION_MERGE_EXCHANGE MERGE:[$$23(ASC)] HASH:[$$23]  |PARTITIONED|
           group by ([$$23 := %0->$$9]) decor ([]) {
                     aggregate [$$21, $$22] <- [function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFAbs, Args:[%0->$$5]], function-call: hive:sum(PARTIAL1), Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMultiply, Args:[%0->$$6, function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPMinus, Args:[1, %0->$$7]], function-call: hive:org.apache.hadoop.hive.ql.udf.UDFOPPlus, Args:[1, %0->$$8]]]]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- EXTERNAL_GROUP_BY[$$9]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$9]  |PARTITIONED|
             exchange 
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               project ([$$9, $$5, $$6, $$7, $$8])
diff --git a/hivesterix-dist/src/test/resources/optimizerts/results/u7_multi_join.plan b/hivesterix-dist/src/test/resources/optimizerts/results/u7_multi_join.plan
index b5f1dc2..897f74b 100644
--- a/hivesterix-dist/src/test/resources/optimizerts/results/u7_multi_join.plan
+++ b/hivesterix-dist/src/test/resources/optimizerts/results/u7_multi_join.plan
@@ -47,4 +47,4 @@
                           exchange 
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             empty-tuple-source
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/hivesterix-dist/src/test/resources/runtimefunctionts/hive/conf/hive-default.xml b/hivesterix-dist/src/test/resources/runtimefunctionts/hive/conf/hive-default.xml
index 49cdedf..e8d87dd 100644
--- a/hivesterix-dist/src/test/resources/runtimefunctionts/hive/conf/hive-default.xml
+++ b/hivesterix-dist/src/test/resources/runtimefunctionts/hive/conf/hive-default.xml
@@ -25,7 +25,7 @@
 
 	<property>
 		<name>hive.algebricks.groupby.external</name>
-		<value>true</value>
+		<value>false</value>
 	</property>
 
 	<property>