diff --git a/tracking/monitors/tools.py b/tracking/monitors/tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..97215db8d1b8472978f3e47a74564ce6b0e59891
--- /dev/null
+++ b/tracking/monitors/tools.py
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+"""
+This module defines utilities functions, helping to deals with tracking output 
+and hdf5 files.
+
+@author: Alexis Gamelin
+"""
+
+import h5py as hp
+
+def merge_files(files_prefix, files_number, file_name=None):
+    """
+    Merge several hdf5 files into one.
+    
+    The function assumes that the files to merge have names in the follwing 
+    format:
+        - "files_prefix_0.hdf5"
+        - "files_prefix_1.hdf5"
+        ...
+        - "files_prefix_files_number.hdf5"
+
+    Parameters
+    ----------
+    files_prefix : str
+        Name of the files to merge.
+    files_number : int
+        Number of files to merge.
+    file_name : str, optional
+        Name of the file with the merged data. If None, files_prefix without
+        number is used.
+
+    """
+    if file_name == None:
+        file_name = files_prefix
+    f = hp.File(file_name + ".hdf5", "a")
+    
+    ## Create file architecture
+    f0 = hp.File(files_prefix + "_" + str(0) + ".hdf5", "r")
+    for group in list(f0):
+        f.require_group(group)
+        for dataset_name in list(f0[group]):
+            shape = f0[group][dataset_name].shape
+            dtype = f0[group][dataset_name].dtype
+            shape_needed = list(shape)
+            shape_needed[-1] = shape_needed[-1]*files_number
+            shape_needed = tuple(shape_needed)
+            f[group].create_dataset(dataset_name, shape_needed, dtype)
+            
+    f0.close()
+    
+    ## Copy data
+    for i in range(files_number):
+        fi = hp.File(files_prefix + "_" + str(i) + ".hdf5", "r")
+        for group in list(fi):
+            for dataset_name in list(fi[group]):
+                shape = fi[group][dataset_name].shape
+                n_slice = int(len(shape) - 1)
+                length = shape[-1]
+                slice_list = []
+                for n in range(n_slice):
+                    slice_list.append(slice(None))
+                slice_list.append(slice(length*i,length*(i+1)))
+                if (dataset_name == "time") and (i != 0):
+                    f[group][dataset_name][tuple(slice_list)] = f[group][dataset_name][(length*i) - 1] + fi[group][dataset_name]
+                else:
+                    f[group][dataset_name][tuple(slice_list)] = fi[group][dataset_name]
+        fi.close()
+    f.close()
+
+            
\ No newline at end of file