diff --git a/beat/web/reports/static/reports/app/app.js b/beat/web/reports/static/reports/app/app.js
index 5372e9c8c8bf9c037c2ce764d85109c37a7d8e23..569fbec8bef5d28ad34bd09930343aa8ec04da6d 100644
--- a/beat/web/reports/static/reports/app/app.js
+++ b/beat/web/reports/static/reports/app/app.js
@@ -19,7 +19,7 @@
  * You should have received a copy of the GNU Affero Public License along
  * with the BEAT platform. If not, see http://www.gnu.org/licenses/.
 */
-var app = angular.module('reportApp', ['ui.router']);
+var app = angular.module('reportApp', ['ui.router', 'angular.filter']);
 
 
 app.config(function ($stateProvider, $urlRouterProvider){
diff --git a/beat/web/reports/static/reports/app/controllers/reportController.js b/beat/web/reports/static/reports/app/controllers/reportController.js
index 751359cdbd305413a51cf5d87ceb661d8d831d37..e5acb779935a334c71a0acf89fe6f68b1abfc893 100644
--- a/beat/web/reports/static/reports/app/controllers/reportController.js
+++ b/beat/web/reports/static/reports/app/controllers/reportController.js
@@ -48,6 +48,11 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory
    $scope.floating_point_precision.selected = 10;
    $scope.report_algorithm_parameters = {};
    $scope.report_algorithm_parameters_experiment = {};
+   $scope.sorted_tables = [];   //tables that were sorted
+   $scope.sorted_experiments_keys_tables = {};
+   $scope.sorted_experiments_alias_keys_tables = {};
+   $scope.sorted_experiments_keys_reverse = {};
+   $scope.sorted_experiments_keys_tables_sortkey = {};
 
    $scope.init = function(user, report_id, url_prefix, data_itemcontent_file, data_table_itemcontent_file)
    {
@@ -190,6 +195,26 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory
                     intersectBlocks(experiment_alias);
                     algorithmParameters(experiment_alias);
                  }
+                 //sort experiments in case it's sorted
+                 if(!(jQuery.isEmptyObject($scope.report.content.sorted_tables_experiments)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_alias_experiments)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_keys_reverse)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_sortkey)))
+                 {
+                      $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_experiments;
+                      if($scope.report.status == "locked")
+                      {
+                          //special case for locked reports
+                          $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_alias_experiments;
+                      }
+                      $scope.sorted_experiments_alias_keys_tables = $scope.report.content.sorted_tables_alias_experiments;
+                      $scope.sorted_experiments_keys_reverse = $scope.report.content.sorted_tables_keys_reverse;
+                      $scope.sorted_experiments_keys_tables_sortkey = $scope.report.content.sorted_tables_sortkey;
+                 }
+                 for(var i = 0; i < Object.keys($scope.sorted_experiments_keys_tables_sortkey).length; i++)
+                 {
+                      $scope.sorted_tables.push(Object.keys($scope.sorted_experiments_keys_tables_sortkey)[i]);
+                 }
             })
    }
 
@@ -223,6 +248,28 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory
                     intersectBlocks(experiment_alias);
                     algorithmParameters(experiment_alias);
                  }
+
+                 //sort experiments in case it's sorted
+                 if(!(jQuery.isEmptyObject($scope.report.content.sorted_tables_experiments)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_alias_experiments)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_keys_reverse)) &&
+                    !(jQuery.isEmptyObject($scope.report.content.sorted_tables_sortkey)))
+                 {
+                      $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_experiments;
+                      if($scope.report.status == "locked")
+                      {
+                          //special case for locked reports
+                          $scope.sorted_experiments_keys_tables = $scope.report.content.sorted_tables_alias_experiments;
+                      }
+                      $scope.sorted_experiments_alias_keys_tables = $scope.report.content.sorted_tables_alias_experiments;
+                      $scope.sorted_experiments_keys_reverse = $scope.report.content.sorted_tables_keys_reverse;
+                      $scope.sorted_experiments_keys_tables_sortkey = $scope.report.content.sorted_tables_sortkey;
+                 }
+                 for(var i = 0; i < Object.keys($scope.sorted_experiments_keys_tables_sortkey).length; i++)
+                 {
+                      $scope.sorted_tables.push(Object.keys($scope.sorted_experiments_keys_tables_sortkey)[i]);
+                 }
+
             })
    }
 
@@ -467,4 +514,5 @@ app.controller('reportController',['$scope', 'reportFactory', 'experimentFactory
     return result;
    }
 
+
 }]);
diff --git a/beat/web/reports/static/reports/app/directives/reportItemView.js b/beat/web/reports/static/reports/app/directives/reportItemView.js
index b4f0c3a315f96265ea49b5d39cafdfa859c16221..9920cb50e1c5d0af9d1cfcc3def5f06e84c44ae5 100644
--- a/beat/web/reports/static/reports/app/directives/reportItemView.js
+++ b/beat/web/reports/static/reports/app/directives/reportItemView.js
@@ -98,6 +98,14 @@ app.directive("savereportitems", function($compile)
                 });
                 savecontent["alias_experiments"] = alias_experiments;
             }
+
+            if(!(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_reverse)) && !(jQuery.isEmptyObject(scope.sorted_experiments_keys_tables_sortkey)))
+            {
+                savecontent["sorted_tables_experiments"] = scope.sorted_experiments_keys_tables;
+                savecontent["sorted_tables_alias_experiments"] = scope.sorted_experiments_alias_keys_tables;
+                savecontent["sorted_tables_keys_reverse"] = scope.sorted_experiments_keys_reverse;
+                savecontent["sorted_tables_sortkey"] = scope.sorted_experiments_keys_tables_sortkey;
+            }
             //call set report content from factory
             var mydict = {};
             mydict["experiments"] = scope.report.experiments;
@@ -1116,11 +1124,18 @@ app.directive("thecolumn",['$compile', function ($compile) {
       template: '{{itemValue}}',
       controller: ['$scope', function ($scope) {
 
+         var the_parent = $scope.$parent.$parent.$parent.$parent;
          var report_experiments = $scope.$parent.$parent.$parent.$parent.report_experiments;
          var report_experiments_alias = $scope.$parent.$parent.$parent.$parent.report_experiments_alias;
          var floating_point_precision = $scope.$parent.$parent.$parent.$parent.floating_point_precision;
          var report = $scope.$parent.$parent.$parent.report;
          var experiment_name = $scope.$parent.item;
+
+         if(jQuery.isEmptyObject(report_experiments) || (report_experiments[experiment_name] == undefined))
+         {
+            return
+         }
+
          var analyzer_block = report_experiments[experiment_name].analyzer_block;
          var report_algorithm_parameters_experiment = $scope.$parent.$parent.$parent.$parent.report_algorithm_parameters_experiment;
 
@@ -1226,8 +1241,8 @@ app.directive("thecolumn",['$compile', function ($compile) {
          }
          else
          {
-            var experiment_alias = report_experiments_alias[experiment_name];
-            $scope.itemValue = experiment_alias;
+                var experiment_alias = report_experiments_alias[experiment_name];
+                $scope.itemValue = experiment_alias;
          }
       }]//,
       //link: function(scope, element, attrs)
@@ -1334,6 +1349,261 @@ app.directive("buttonsettings", function()
     };
 });
 
+//Directive used to handle table settings click
+app.directive("sortdata", function($compile)
+{
+    return {
+        link:function(scope, element, attrs)
+        {
+            element.bind("click", function()
+            {
+                var the_parent = scope.$parent.$parent.$parent.$parent;
+                var analyzer_block = undefined;
+                var report_experiments = the_parent.report_experiments;
+                var report = the_parent.report;
+                var table_id = attrs.sorttblid;   //get table id
+                the_parent.sorted_tables.push(table_id);
+
+                if(the_parent.sorted_experiments_keys_reverse[table_id] == undefined)
+                {
+                    the_parent.sorted_experiments_keys_reverse[table_id] = true;
+                }
+                else
+                {
+                    the_parent.sorted_experiments_keys_reverse[table_id] = !the_parent.sorted_experiments_keys_reverse[table_id];
+                }
+
+                the_parent.sorted_experiments_keys_tables_sortkey[table_id] = attrs.sortth;   //set the sortKey to the param passed
+
+                if(the_parent.sorted_experiments_keys_tables_sortkey[table_id] != "experiment")
+                {
+                   var local_sort_list = [];
+
+                   if(analyzer_block == undefined)
+                   {
+                       angular.forEach(report_experiments, function(value, key)
+                       {
+                           angular.forEach(value.declaration.analyzers, function(value_analyzer, key_analyzer)
+                           {
+                               if(value_analyzer.algorithm == report.analyzer && (key_analyzer in report_experiments[key].declaration.analyzers))
+                               {
+                                   report_experiments[key].analyzer_block = key_analyzer;
+                                   analyzer_block = report_experiments[key].analyzer_block;
+                               }
+                           });
+                       });
+                   }
+
+                   if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("execution_time.") == 0)
+                   {
+                       //execution time information
+                       var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("execution_time.")[1].split("[s]")[0];
+                       angular.forEach(report_experiments, function(value, key)
+                       {
+                            var local_sort_dict = {};
+                            local_sort_dict["experiment"] = key;
+                            var itemValue = "";
+
+                            if(Object.keys(report_experiments[key].execution_info).length === 0)
+                            {
+                                itemValue = "-";
+                            }
+                            else
+                            {
+                                if(report_experiments[key].execution_info[block_name] == undefined)
+                                {
+                                    itemValue = "-";
+                                }
+                                else
+                                {
+                                    itemValue = (report_experiments[key].execution_info[block_name].linear_execution_time);
+                                }
+                            }
+
+                            local_sort_dict["value"] = itemValue;
+                            local_sort_list.push(local_sort_dict);
+                       });
+                   }
+                   else if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("experiment.") == 0)
+                   {
+                       //total execution time information
+                       var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("execution_time.")[1];
+                       var total_time = 0;
+
+                       angular.forEach(report_experiments, function(value, key)
+                       {
+                            var local_sort_dict = {};
+                            local_sort_dict["experiment"] = key;
+                            var itemValue = "";
+
+                            if(Object.keys(report_experiments[key].execution_info).length === 0)
+                            {
+                                total_time = "-";
+                            }
+                            else
+                            {
+                                angular.forEach(report_experiments[key].execution_info, function(value, key)
+                                {
+                                    total_time += value.linear_execution_time;
+                                });
+                            }
+
+                            itemValue = total_time;
+
+                            local_sort_dict["value"] = itemValue;
+                            local_sort_list.push(local_sort_dict);
+                       });
+                   }
+                   else if(the_parent.sorted_experiments_keys_tables_sortkey[table_id].indexOf("algorithm_parameter.") == 0)
+                   {
+                       //total execution time information
+                       var block_name = the_parent.sorted_experiments_keys_tables_sortkey[table_id].split("algorithm_parameter.")[1];
+                       var algorithm_name = block_name.split("__")[0];
+                       var parameter_name = block_name.split("__")[1];
+
+                       angular.forEach(report_experiments, function(value, key)
+                       {
+
+                            var local_sort_dict = {};
+                            local_sort_dict["experiment"] = key;
+                            var itemValue = "";
+
+                            if(the_parent.report_algorithm_parameters_experiment[key][algorithm_name] != undefined)
+                            {
+                                var value = "";
+                                if(the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name] != undefined)
+                                {
+                                    for(var i = 0; i < the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name].length; i++)
+                                    {
+                                        if(i > 0 && i < the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name].length -1 )
+                                        {
+                                            value += ",";
+                                        }
+                                        value = the_parent.report_algorithm_parameters_experiment[key][algorithm_name][parameter_name][i];
+                                    }
+                                }
+                                else if(the_parent.report["all_experiments"][key]["declaration"]["globals"][algorithm_name][parameter_name] != undefined)
+                                {
+                                    //get globals value
+                                    value = the_parent.report["all_experiments"][key]["declaration"]["globals"][algorithm_name][parameter_name];
+                                }
+                                else
+                                {
+                                    //nothing is defined
+                                    value = "-";
+                                }
+
+                                itemValue = value;
+                            }
+                            else
+                            {
+                                itemValue = "-";
+                            }
+
+                            local_sort_dict["value"] = itemValue;
+                            local_sort_list.push(local_sort_dict);
+                       });
+                   }
+                   else
+                   {
+                       //results information
+                       angular.forEach(report_experiments, function(value, key)
+                       {
+                            var local_sort_dict = {};
+                            local_sort_dict["experiment"] = key;
+                            local_sort_dict["value"] = report_experiments[key].results[analyzer_block][the_parent.sorted_experiments_keys_tables_sortkey[table_id]].value;
+
+                            local_sort_list.push(local_sort_dict);
+
+                       });
+
+                   }
+
+                   if(the_parent.sorted_experiments_keys_reverse[table_id])
+                   {
+                        local_sort_list.sort(function(a, b)
+                        {
+                             return a.value > b.value;
+                        });
+                   }
+                   else
+                   {
+                        local_sort_list.sort(function(a, b)
+                        {
+                             return a.value < b.value;
+                        });
+                   }
+
+                   the_parent.sorted_experiments_keys_tables[table_id] = [];
+                   the_parent.sorted_experiments_alias_keys_tables[table_id] = [];
+                   for(var i = 0; i < local_sort_list.length; i++)
+                   {
+                       the_parent.sorted_experiments_keys_tables[table_id].push(local_sort_list[i]["experiment"]);
+                       if(the_parent.report.status ==  "editable")
+                       {
+                           the_parent.sorted_experiments_alias_keys_tables[table_id].push(the_parent.report_experiments_alias[local_sort_list[i]["experiment"]]);
+                       }
+                   }
+
+                }
+                else
+                {
+                    var experiments_aliases = [];
+                    for(var i = 0; i < the_parent.report.experiments.length; i++)
+                    {
+                        var experiment_name  = the_parent.report.experiments[i];
+                        var experiment_alias = the_parent.report_experiments_alias[experiment_name];
+                        experiments_aliases.push(experiment_alias);
+                    }
+                    if(the_parent.sorted_experiments_keys_reverse[table_id])
+                    {
+                        experiments_aliases.sort();
+                    }
+                    else
+                    {
+                        experiments_aliases.reverse();
+                    }
+
+                    the_parent.sorted_experiments_keys_tables[table_id] = [];
+                    the_parent.sorted_experiments_alias_keys_tables[table_id] = [];
+                    for(var i = 0; i < experiments_aliases.length; i++)
+                    {
+                        for(var the_experiment_key in the_parent.report_experiments_alias)
+                        {
+                            if(the_parent.report_experiments_alias[the_experiment_key] == experiments_aliases[i])
+                            {
+                                the_parent.sorted_experiments_keys_tables[table_id].push(the_experiment_key);
+                                if(the_parent.report.status ==  "editable")
+                                {
+                                    the_parent.sorted_experiments_alias_keys_tables[table_id].push(the_parent.report_experiments_alias[the_experiment_key]);
+                                }
+                            }
+
+                        }
+                    }
+                }
+
+                var name_to_remove = "experiment";
+                var tables_details = the_parent.tables_details[table_id];
+                for(var i = 0; i < tables_details.length; i++)
+                {
+                    if(tables_details[i].name == "experiment")
+                    {
+                        tables_details.splice(i,1);
+                        break;
+                    }
+                }
+
+                var element = document.getElementById(table_id);
+
+                $(element).attr('id', null);
+                $compile(element)(scope.$parent.$parent);
+                $(element).attr('id', table_id);
+            });
+        }
+    };
+});
+
 //Directive used to handle table settings click
 app.directive("tableprecision", function($compile)
 {
diff --git a/beat/web/reports/templates/reports/partials/reportSingleTable.html b/beat/web/reports/templates/reports/partials/reportSingleTable.html
index 446ed234ba85c196d4c09dfb66f08c9a7ed02155..b1e3c168c755ce592823ff175f63fc6deb2080af 100644
--- a/beat/web/reports/templates/reports/partials/reportSingleTable.html
+++ b/beat/web/reports/templates/reports/partials/reportSingleTable.html
@@ -36,13 +36,17 @@
     <table class="table table-hover table-striped table-condensed report-table">
       <thead>
         <tr>
-          <th ng-repeat="(key, value) in tables_details[dattrs.tableid]" ng-if="value.selected" class="tableitemspace">
+          <th ng-repeat="(key, value) in tables_details[dattrs.tableid]" ng-if="value.selected" class="tableitemspace" sortth="{$ value.name $}" sorttblid="{$ dattrs.tableid $}" sortdata>
+          <span ng-if="(sorted_tables | contains:dattrs.tableid)" class="glyphicon sort-icon" ng-show="sorted_experiments_keys_tables_sortkey[dattrs.tableid]==value.name" ng-class="{'glyphicon-chevron-up':sorted_experiments_keys_reverse[dattrs.tableid],'glyphicon-chevron-down':!(sorted_experiments_keys_reverse[dattrs.tableid])}"></span>
+          <span ng-if="!(sorted_tables | contains:dattrs.tableid) && sorted_experiments_keys_reverse[dattrs.tableid]!=undefined" class="glyphicon sort-icon" ng-show="sorted_experiments_keys_tables_sortkey[dattrs.tableid]==value.name" ng-class="{'glyphicon-chevron-up':sorted_experiments_keys_reverse[dattrs.tableid],'glyphicon-chevron-down':!(sorted_experiments_keys_reverse[dattrs.tableid])}"></span>
             {$ value.name $}
           </th>
         </tr>
       </thead>
       <tbody>
-        <tr ng-repeat="(exp_key, exp_val) in report_experiments" item="exp_key">
+        <tr ng-if="!(sorted_tables | contains:dattrs.tableid)" ng-repeat="(exp_key, exp_val) in report_experiments" item="exp_key">
+        <tr ng-if="(dattrs.reportstatus == 'editable' || dattrs.reportstatus == 'published')  && sorted_tables | contains:dattrs.tableid" ng-repeat="(exp_key, exp_val) in sorted_experiments_keys_tables[dattrs.tableid]" item="exp_val">
+        <tr ng-if="(dattrs.reportstatus == 'locked') && sorted_tables | contains:dattrs.tableid" ng-repeat="(exp_key, exp_val) in sorted_experiments_keys_tables[dattrs.tableid]" item="exp_val">
         </tr>
       </tbody>
     </table>
diff --git a/beat/web/reports/templates/reports/report.html b/beat/web/reports/templates/reports/report.html
index 44463c09faff8ce3d138e2279df140815593377a..30a0da96b75384d4dc1820fa47db21b13d54ad92 100644
--- a/beat/web/reports/templates/reports/report.html
+++ b/beat/web/reports/templates/reports/report.html
@@ -57,9 +57,8 @@
     <!-- Use Google's CDN for angular-js with a local fallback -->
     <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
     <script>window.angular || document.write('<script src="{% fingerprint "angular/angular.min.js" %}"><\/script>');</script>
-
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.8/angular-filter.min.js"></script>
     <script src="{% fingerprint "angular-ui-router/release/angular-ui-router.min.js" %}" type="text/javascript" charset="utf-8"></script>
-
     <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.core.min.js" %}" type="text/javascript" charset="utf-8"></script>
     <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.position.min.js" %}" type="text/javascript" charset="utf-8"></script>
     <script src="{% fingerprint "jquery-ui/ui/minified/jquery.ui.widget.min.js" %}" type="text/javascript" charset="utf-8"></script>
@@ -179,7 +178,6 @@ jQuery(document).ready(function() {
       xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken'));
     }
   });
-
 });
 </script>
 
diff --git a/beat/web/ui/static/ui/js/reportdialog.js b/beat/web/ui/static/ui/js/reportdialog.js
index 4a206950d72f4b9d89ca0eb230ac749c36535fc3..c7efcf3461aad12012bf074e03bac034e96132ba 100644
--- a/beat/web/ui/static/ui/js/reportdialog.js
+++ b/beat/web/ui/static/ui/js/reportdialog.js
@@ -517,7 +517,6 @@ beat.ui.report.remove_item = function(dialog_id, elementToRemove, scope)
 
 beat.ui.report.report_saved = function(dialog_id, scope)
 {
-    console.log("ici");
     var num_click = 0;
     // Create the dialog
     $('#' + dialog_id).dialog({