diff --git a/core/DataTable.php b/core/DataTable.php
index 2e94d5e89e2717b87808be1151d36bce67bd6bc2..6a76350fd689edba4301006857ae64347bbb20d7 100644
--- a/core/DataTable.php
+++ b/core/DataTable.php
@@ -591,9 +591,6 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
     public function getRowFromLabel($label)
     {
         $rowId = $this->getRowIdFromLabel($label);
-        if ($rowId instanceof Row) {
-            return $rowId;
-        }
         if (is_int($rowId) && isset($this->rows[$rowId])) {
             return $this->rows[$rowId];
         }
@@ -602,6 +599,9 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
         ) {
             return $this->summaryRow;
         }
+        if ($rowId instanceof Row) {
+            return $rowId;
+        }
         return false;
     }
 
@@ -626,7 +626,8 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
             return self::ID_SUMMARY_ROW;
         }
 
-        $label = (string)$label;
+        $label = (string) $label;
+
         if (!isset($this->rowsIndexByLabel[$label])) {
             return false;
         }
@@ -657,12 +658,19 @@ class DataTable implements DataTableInterface, \IteratorAggregate, \ArrayAccess
     {
         $this->rebuildIndexContinuously = true;
 
-        foreach ($this->getRows() as $id => $row) {
+        foreach ($this->rows as $id => $row) {
             $label = $row->getColumn('label');
             if ($label !== false) {
                 $this->rowsIndexByLabel[$label] = $id;
             }
         }
+        if ($this->summaryRow) {
+            $label = $this->summaryRow->getColumn('label');
+            if ($label !== false) {
+                $this->rowsIndexByLabel[$label] = DataTable::ID_SUMMARY_ROW;
+            }
+        }
+
         $this->indexNotUpToDate = false;
     }
 
diff --git a/core/DataTable/Filter/Sort.php b/core/DataTable/Filter/Sort.php
index 53c21f526a70df42237daef58996eb5c5f310916..7f590607cd0198482c5f6e528d6adc877027c197 100644
--- a/core/DataTable/Filter/Sort.php
+++ b/core/DataTable/Filter/Sort.php
@@ -95,15 +95,12 @@ class Sort extends BaseFilter
     /**
      * Sorting method used for sorting values natural
      *
-     * @param array $rowA  array[0 => value of column to sort, 1 => label]
-     * @param array $rowB  array[0 => value of column to sort, 1 => label]
+     * @param mixed $valA
+     * @param mixed $valB
      * @return int
      */
-    function naturalSort($rowA, $rowB)
+    function naturalSort($valA, $valB)
     {
-        $valA = $rowA[0];
-        $valB = $rowB[0];
-
         return !isset($valA)
         && !isset($valB)
             ? 0
@@ -122,15 +119,12 @@ class Sort extends BaseFilter
     /**
      * Sorting method used for sorting values
      *
-     * @param array $rowA  array[0 => value of column to sort, 1 => label]
-     * @param array $rowB  array[0 => value of column to sort, 1 => label]
+     * @param mixed $valA
+     * @param mixed $valB
      * @return int
      */
-    function sortString($rowA, $rowB)
+    function sortString($valA, $valB)
     {
-        $valA = $rowA[0];
-        $valB = $rowB[0];
-
         return !isset($valA)
         && !isset($valB)
             ? 0
@@ -150,11 +144,10 @@ class Sort extends BaseFilter
     {
         $value = $row->getColumn($this->columnToSort);
 
-        if ($value === false
-            || is_array($value)
-        ) {
+        if ($value === false || is_array($value)) {
             return null;
         }
+
         return $value;
     }
 
@@ -239,7 +232,7 @@ class Sort extends BaseFilter
 
     private function getFirstValueFromDataTable($table)
     {
-        foreach ($table->getRows() as $row) {
+        foreach ($table->getRowsWithoutSummaryRow() as $row) {
             $value = $this->getColumnValue($row);
             if (!is_null($value)) {
                 return $value;
@@ -262,8 +255,14 @@ class Sort extends BaseFilter
 
         // get column value and label only once for performance tweak
         $values = array();
-        foreach ($rows as $key => $row) {
-            $values[$key] = array($this->getColumnValue($row), $row->getColumn('label'));
+        if ($functionCallback === 'numberSort') {
+            foreach ($rows as $key => $row) {
+                $values[$key] = array($this->getColumnValue($row), $row->getColumn('label'));
+            }
+        } else {
+            foreach ($rows as $key => $row) {
+                $values[$key] = $this->getColumnValue($row);
+            }
         }
 
         uasort($values, array($this, $functionCallback));