diff --git a/Tools/PyUtils/python/MetaReader.py b/Tools/PyUtils/python/MetaReader.py
index ad72dbc0ac50cca956f8ddac5dc7add070e38473..ebea1ac30ee48e3016cb249b99dd792c1451582f 100644
--- a/Tools/PyUtils/python/MetaReader.py
+++ b/Tools/PyUtils/python/MetaReader.py
@@ -6,6 +6,9 @@ import re
 import ast
 import sys
 
+
+from PyCool import coral
+
 def read_metadata(filenames, file_type=None, mode='lite'):
     """
     This tool is independent of Athena framework and returns the metadata from a given file.
@@ -81,6 +84,8 @@ def read_metadata(filenames, file_type=None, mode='lite'):
                 # fill metadata_items
                 metaDict[filename]['metadata_items'].append(('DataHeader', ';00;MetaDataSvc'))
 
+                metadata = {}
+
                 for name, cls in meta_data_srv:
                     try:
                         a = evt.retrieveMetaInput(cls, name)
@@ -89,20 +94,56 @@ def read_metadata(filenames, file_type=None, mode='lite'):
 
                     # fill metadata_items
                     metaDict[filename]['metadata_items'].append((cls, name))
+                    # print("{0} {1}".format(cls, name))
 
                     if cls == 'IOVMetaDataContainer':
-                        metaDict[filename][name] = __convert_IOVMetaDataContainer(a)
+                        metadata[name] = __convert_IOVMetaDataContainer(a)
                     if cls == 'xAOD::EventFormat':
-                        metaDict[filename][name] = __convert_EventFormat(a)
+                        metadata[name] = __convert_EventFormat(a)
                     if cls == 'EventStreamInfo':
-                        metaDict[filename][name] = __convert_EventStreamInfo(a)
-
-                # if the flag full is set to true then grab all metadata
-                if mode == 'lite':
-                    for key in list(metaDict[filename]):
-                        if key not in ['file_type', 'file_size', 'file_guid', 'nentries', 'run_number']:
-                            metaDict[filename].pop(key, None)
-
+                        metadata[name] = __convert_EventStreamInfo(a)
+
+
+                # Aggregate common information who needs to be promoted up one level
+                promote_list = {
+                    'EventStreamInfo': [
+                        ('run_number', 'run_number'),
+                        ('processing_tags', 'stream_names'),
+                        ('lumi_block', 'lumi_block'),
+                        ('evt_number', 'evt_number'),
+                        ('mc_channel_number', 'mc_channel_number'),
+                        ('mc_event_weight', 'mc_event_weight'),
+                        ('evt_type', 'evt_type'),
+                        ('detdescr_tags', 'detdescr_tags'),
+                    ],
+                    'IOVMetaDataContainer': [
+                        ('beam_energy', 'beam_energy'),
+                        ('beam_type', 'beam_type'),
+                        ('GeoAtlas', 'geometry'),
+                        ('IOVDbGlobalTag', 'conditions_tag')
+                    ]
+                }
+
+                for cls, cls_name in metaDict[filename]['metadata_items']:
+                    if cls in promote_list:
+                        for name_orig, name_new in promote_list[cls]:
+
+                            if name_new not in metaDict[filename]:
+                                metaDict[filename][name_new] = []
+
+                            if name_orig in metadata[cls_name]:
+
+                                value = metadata[cls_name][name_orig]
+
+                                if isinstance(value, (list, tuple)):
+                                    metaDict[filename][name_new] += value
+                                else:
+                                    metaDict[filename][name_new].append(value)
+
+                if mode == 'full':
+                    metaDict[filename]['metadata'] = metadata
+                else:
+                    metaDict[filename]['metadata'] = list(metadata.keys())
 
         # ----------------------------------------------------------------------------------------------------------------#
         # retrieves metadata from bytestream (BS) files (RAW, DRAW)
@@ -187,7 +228,6 @@ def read_metadata(filenames, file_type=None, mode='lite'):
                     print('This is the lite version for BS files')
                     pass
 
-
         # ----------------------------------------------------------------------------------------------------------------#
         # Thow an error if the user provide other file types
         else:
@@ -214,9 +254,9 @@ def __convert_EventStreamInfo(esi):
         d['mc_event_weight'].append(evt_type.mc_event_weight())
         d['detdescr_tags'].append(evt_type.get_detdescr_tags())
 
-        d['evt_type'].append( 'IS_SIMULATION' if evt_type.test(evt_type.IS_SIMULATION) else 'IS_DATA')
-        d['evt_type'].append( 'IS_TESTBEAM' if evt_type.test(evt_type.IS_TESTBEAM) else 'IS_ATLAS')
-        d['evt_type'].append( 'IS_CALIBRATION' if evt_type.test(evt_type.IS_CALIBRATION) else 'IS_PHYSICS')
+        d['evt_type'].append('IS_SIMULATION' if evt_type.test(evt_type.IS_SIMULATION) else 'IS_DATA')
+        d['evt_type'].append('IS_TESTBEAM' if evt_type.test(evt_type.IS_TESTBEAM) else 'IS_ATLAS')
+        d['evt_type'].append('IS_CALIBRATION' if evt_type.test(evt_type.IS_CALIBRATION) else 'IS_PHYSICS')
 
     d['eventdata_items'] = []
     for e in esi.getItemList():
@@ -231,27 +271,20 @@ def __convert_EventStreamInfo(esi):
 
 
 def __convert_IOVMetaDataContainer(iovmetadata):
-    return [__convert_CondAttributeList(e) for e in iovmetadata.payloadContainer()]
-
+    data = {}
 
-def __convert_CondAttributeList(condattrlist):
-    r = []
-    for i in range(0, condattrlist.size()):
-        chanNum = condattrlist.chanNum(i)
+    for cond_attr_list_collection in iovmetadata.payloadContainer():
 
-        d = dict(condattrlist.attributeList(chanNum))
+        for pair_attr_list in cond_attr_list_collection:
+            # i = pair_attr_list.first
+            attr_list = pair_attr_list.second
+            spec = attr_list.specification()
 
-        chanName = condattrlist.chanName(chanNum)
-        if chanName is not '':
-            d['chanName'] = chanName
+            for i in range(len(spec)):
+                # print("{0}: {1} ({2})".format(spec[i].name(), attr_list[i], spec[i].typeName()))
+                data[spec[i].name()] = attr_list[i]
 
-        for k, v in d.iteritems():
-            try: # to cast the strings into relevant Python types/data structures
-                d[k] = ast.literal_eval(v)
-            except:
-                pass
-        r.append(d)
-    return r
+    return data
 
 
 def __convert_EventFormat(evfmt):