diff --git a/Tools/PyUtils/python/RootUtils.py b/Tools/PyUtils/python/RootUtils.py
index 45e4b9b88035fdca5f07adf5a94a52fc81123d8e..0877c21fd817f5d2ba05535b93b49eb60272a223 100644
--- a/Tools/PyUtils/python/RootUtils.py
+++ b/Tools/PyUtils/python/RootUtils.py
@@ -277,6 +277,8 @@ class RootFileDumper(object):
                 except ValueError:
                     print ("** err ** invalid 'itr_entries' argument. will iterate over all entries.")
                     itr_entries = xrange(nentries)
+        elif isinstance(itr_entries, list):
+            itr_entries = itr_entries
         else:
             itr_entries = xrange(itr_entries)
                 
diff --git a/Tools/PyUtils/python/scripts/diff_root_files.py b/Tools/PyUtils/python/scripts/diff_root_files.py
index af5f22a5e7ea73c2f7afe427bca41c4429b4f7f4..d3907ecee816c788a82da97fd356424ccf4aaaab 100644
--- a/Tools/PyUtils/python/scripts/diff_root_files.py
+++ b/Tools/PyUtils/python/scripts/diff_root_files.py
@@ -55,6 +55,10 @@ def _is_exit_early():
                   action='store_true',
                   default=False,
                   help="""Enable verbose printout""")
+@acmdlib.argument('--order-trees',
+                  action='store_true',
+                  default=False,
+                  help="""To order trees according to event numbers""")
 @acmdlib.argument('--mode',
                   choices=g_ALLOWED_MODES,
                   default='detailed',
@@ -107,6 +111,7 @@ def main(args):
     msg.info('entries:        %s', args.entries)
     msg.info('mode:           %s', args.mode)
     msg.info('error mode:     %s', args.error_mode)
+    msg.info('order trees:    %s', args.order_trees)
 
     import PyUtils.Helpers as H
     with H.ShutUp() :
@@ -124,6 +129,40 @@ def main(args):
             'leaves': set(leaves),
             }
     
+    def ordered_indices(tree, reverse_order = False):
+        from collections import OrderedDict
+        import operator
+
+        dict_in = {}
+        nevts = tree.GetEntriesFast()
+
+        for idx in range(0, nevts):
+            if idx % 100 == 0: msg.debug('Read {} events from the input so far'.format(idx))
+            tree.GetEntry(idx)
+            if hasattr(tree,'xAOD::EventAuxInfo_v1_EventInfoAux.'):
+                event_info = getattr(tree,'xAOD::EventAuxInfo_v1_EventInfoAux.')
+                event_number = event_info.eventNumber
+            elif hasattr(tree,'EventInfo_p4_McEventInfo'):
+                event_info = getattr(tree,'EventInfo_p4_McEventInfo')
+                event_number = event_info.m_event_ID.m_event_number
+            elif hasattr(tree,'EventInfo_p4_ByteStreamEventInfo'):
+                event_info = getattr(tree,'EventInfo_p4_ByteStreamEventInfo')
+                event_number = event_info.m_event_ID.m_event_number
+            elif hasattr(tree,'ByteStreamEventInfo'):
+                event_info = getattr(tree,'ByteStreamEventInfo')
+                event_number = event_info.m_event_ID.m_event_number
+            else:
+                msg.error('Cannot read event info, will bail out.')
+                break
+            msg.debug('Idx : EvtNum {:10d} : {}'.format(idx,event_number))
+            dict_in[idx] = event_number
+
+        # Sort the dictionary by event numbers
+        dict_out = OrderedDict(sorted(dict_in.items(), key=operator.itemgetter(1), reverse = reverse_order))
+
+        # Write out the ordered index list
+        return [idx for idx in dict_out]
+
     def diff_tree(fold, fnew, args):
         infos = {
             'old' : tree_infos(fold.tree, args),
@@ -145,7 +184,7 @@ def main(args):
             itr_entries = args.entries
             pass
         msg.info('comparing over [%s] entries...', itr_entries)
-                
+
         old_leaves = infos['old']['leaves'] - infos['new']['leaves']
         if old_leaves:
             msg.warning('the following variables exist only in the old file !')
@@ -171,8 +210,18 @@ def main(args):
         from itertools import izip
         summary = collections.defaultdict(int)
 
-        old_dump_iter = fold.dump(args.tree_name, itr_entries)
-        new_dump_iter = fnew.dump(args.tree_name, itr_entries)
+        if args.order_trees:
+            slice_max = int(itr_entries) if int(itr_entries) > 0 else None
+            itr_entries_old = ordered_indices(fold.tree)[0:slice_max]
+            itr_entries_new = ordered_indices(fnew.tree)[0:slice_max]
+            msg.debug('List of old indices {}'.format(itr_entries_old))
+            msg.debug('List of new indices {}'.format(itr_entries_new))
+        else:
+            itr_entries_old = itr_entries
+            itr_entries_new = itr_entries
+
+        old_dump_iter = fold.dump(args.tree_name, itr_entries_old)
+        new_dump_iter = fnew.dump(args.tree_name, itr_entries_new)
 
         def leafname_fromdump(entry):
             return '.'.join([s for s in entry[2] if not s.isdigit()])
@@ -215,14 +264,15 @@ def main(args):
             
             read_old = True
             read_new = True
-            if d_old == d_new:
+
+            if (args.order_trees and d_old[-1] == d_new[-1]) or d_old == d_new:
                 n_good += 1
                 continue
             
             if d_old:    
                 tree_name, ientry, name, iold = d_old
             if d_new:
-                tree_name, ientry, name, inew = d_new
+                tree_name, jentry, name, inew = d_new
 
             # FIXME: that's a plain (temporary?) hack
             if name[-1] in args.known_hacks:
@@ -238,7 +288,7 @@ def main(args):
                     else:
                         print '::sync-old ABSENT'
                     if d_new:
-                        print '::sync-new %s' %'.'.join(["%03i"%ientry]+map(str, d_new[2]))
+                        print '::sync-new %s' %'.'.join(["%03i"%jentry]+map(str, d_new[2]))
                     else:
                         print '::sync-new ABSENT'
                     pass
@@ -251,7 +301,7 @@ def main(args):
                     summary[d_old[2][0]] += 1
                 else:
                     branch_old = '.'.join(["%03i"%ientry, d_old[2][0]])
-                    branch_new = '.'.join(["%03i"%ientry, d_new[2][0]])
+                    branch_new = '.'.join(["%03i"%jentry, d_new[2][0]])
                     if branch_old < branch_new: 
                         if not _is_summary():
                             print '::sync-old skipping entry'