diff --git a/workflow/rules/igv_session.rules b/workflow/rules/igv_session.rules
new file mode 100755
index 0000000000000000000000000000000000000000..2f08b56d13597ecace581b1d1a63bc46c24d2df2
--- /dev/null
+++ b/workflow/rules/igv_session.rules
@@ -0,0 +1,95 @@
+#########################################################################
+# RNAflow: an automated pipeline to analyse transcriptomic data         #
+#                                                                       #
+# Authors: Rachel Legendre                                              #
+# Copyright (c) 2021-2022  Institut Pasteur (Paris).                    #
+#                                                                       #
+# This file is part of RNAflow workflow.                                #
+#                                                                       #
+# RNAflow is free software: you can redistribute it and/or modify       #
+# it under the terms of the GNU General Public License as published by  #
+# the Free Software Foundation, either version 3 of the License, or     #
+# (at your option) any later version.                                   #
+#                                                                       #
+# RNAflow is distributed in the hope that it will be useful,            #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of        #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          #
+# GNU General Public License for more details .                         #
+#                                                                       #
+# You should have received a copy of the GNU General Public License     #
+# along with RNAflow (LICENSE).                                         #
+# If not, see <https://www.gnu.org/licenses/>.                          #
+#########################################################################
+
+
+rule igv_session:
+    input :
+        igv_session_input
+    output :
+        igv_session_output 
+    params:
+        genome = igv_session_genome,
+        wdir = igv_session_wdir,
+        autoScale = igv_session_autoScale,
+        normalize = igv_session_normalize
+    log :
+        igv_session_log_out
+    params :
+    run: 
+        import os
+        import sys
+        import shutil
+        import itertools
+
+
+        colors= ["135,86,146", "243,132,0", "161,202,241", "190,0,50", "243,195,0", 
+                "194,178,128", "132,132,130", "0,136,86", "230,143,172", "0,103,165", 
+                "249,147,121", "96,78,151", "46,166,0", "179,68,108", "220,211,0", 
+                "136,45,23", "141,182,0", "101,69,34", "226,88,34", "43,61,38"]
+        
+
+
+        # get real path of xml output file
+        output = os.path.realpath(output[0])
+
+        with open(output, 'w') as f:
+            sys.stdout = f 
+            #print header of XML
+            blockcode="<Session genome=\"%s\" hasGeneTrack=\"true\" hasSequenceTrack=\"true\" nextAutoscaleGroup=\"7\" path=\"%s\" version=\"8\">"
+            print(blockcode % (params.genome, output))
+
+            #print list of files in resources
+            print("<Resources>")
+            for file in input:
+                # copy files in IGV directory
+                try:
+                    shutil.copy2(file, params.wdir)
+                except shutil.SameFileError:
+                    pass
+                
+                # get id and print ressources
+                id = os.path.basename(file)
+                blockcode="<Resource path=\"%s\"/>"
+                print(blockcode % (id))
+            print("</Resources>")
+
+            #print custom panels
+            print("<Panel height=\"1180\" name=\"DataPanel\" width=\"3077\">")
+
+            idx = 0
+            for file in input:
+                id = os.path.basename(file)
+                name = id.split(".bw")[0]
+                idx += 1 
+                blockcode = "<Track altColor=\"%s\" autoScale=\"%s\" clazz=\"org.broad.igv.track.DataSourceTrack\" color=\"%s\" displayMode=\"COLLAPSED\" featureVisibilityWindow=\"-1\" fontSize=\"10\" id=\"%s\" name=\"%s\" normalize=\"%s\" renderer=\"BAR_CHART\" sortable=\"true\" visible=\"true\" windowFunction=\"mean\">"
+                print(blockcode % (colors[idx], params.autoScale, colors[idx], id, name, params.normalize))
+                print("<DataRange baseline=\"0.0\" drawBaseline=\"true\" flipAxis=\"false\" maximum=\"100.808\" minimum=\"0.0\" type=\"LINEAR\"/>")
+                print("</Track>")
+  
+
+            print("</Panel>")
+            print("</Session>")
+
+
+
+