diff --git a/src/Engine/ActionExpressionContainer.php b/src/Engine/ActionExpressionContainer.php
index 5f3084a3..8bfae568 100644
--- a/src/Engine/ActionExpressionContainer.php
+++ b/src/Engine/ActionExpressionContainer.php
@@ -85,8 +85,9 @@ abstract class ActionExpressionContainer extends ExpressionContainerBase impleme
    * {@inheritdoc}
    */
   public function getIterator() {
+    ExpressionContainerBase::mergesort($this->actions, [ExpressionContainerBase::class, 'sortByWeightProperty']);
     $iterator = new \ArrayIterator($this->actions);
-    $iterator->uasort([ExpressionContainerBase::class, 'sortByWeightProperty']);
+    //$iterator->uasort([ExpressionContainerBase::class, 'sortByWeightProperty']);
     return $iterator;
   }
 
diff --git a/src/Engine/ConditionExpressionContainer.php b/src/Engine/ConditionExpressionContainer.php
index e5e26625..d5143208 100644
--- a/src/Engine/ConditionExpressionContainer.php
+++ b/src/Engine/ConditionExpressionContainer.php
@@ -113,8 +113,9 @@ abstract class ConditionExpressionContainer extends ExpressionContainerBase impl
    * {@inheritdoc}
    */
   public function getIterator() {
+    ExpressionContainerBase::mergesort($this->conditions, [ExpressionContainerBase::class, 'sortByWeightProperty']);
     $iterator = new \ArrayIterator($this->conditions);
-    $iterator->uasort([ExpressionContainerBase::class, 'sortByWeightProperty']);
+    //$iterator->uasort([ExpressionContainerBase::class, 'sortByWeightProperty']);
     return $iterator;
   }
 
diff --git a/src/Engine/ExpressionContainerBase.php b/src/Engine/ExpressionContainerBase.php
index bdb0ba20..e222720d 100644
--- a/src/Engine/ExpressionContainerBase.php
+++ b/src/Engine/ExpressionContainerBase.php
@@ -52,6 +52,38 @@ abstract class ExpressionContainerBase extends ExpressionBase implements Express
     return ($a_weight < $b_weight) ? -1 : 1;
   }
 
+  public static function mergesort(&$array, $cmp_function = 'strcmp') {
+    // Arrays of size < 2 require no action.
+    if (count($array) < 2) return $array;
+    // Split the array in half
+    $halfway = count($array) / 2;
+    $array1 = array_slice($array, 0, $halfway);
+    $array2 = array_slice($array, $halfway);
+    // Recurse to sort the two halves
+    self::mergesort($array1, $cmp_function);
+    self::mergesort($array2, $cmp_function);
+    // If all of $array1 is <= all of $array2, just append them.
+    if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
+      $array = array_merge($array1, $array2);
+      return;
+    }
+    // Merge the two sorted arrays into a single sorted array
+    $array = array();
+    $ptr1 = $ptr2 = 0;
+    while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
+      if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
+        $array[] = $array1[$ptr1++];
+      }
+      else {
+        $array[] = $array2[$ptr2++];
+      }
+    }
+    // Merge the remainder
+    while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
+    while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
+    return;
+  }
+
   /**
    * {@inheritdoc}
    */
