diff --git a/src/graph.py b/src/graph.py
index 925f15f5989aa30b5ceea892fbb689bcb56af0c4..e4910e4e713b9f1f837d2ddec5de77b38396bb4c 100644
--- a/src/graph.py
+++ b/src/graph.py
@@ -300,7 +300,14 @@ class Graph():
         with open(self.get_output_dir()/ "graphs/user_view.json", 'w') as output_file :
             json.dump(user_view, output_file, indent=4)
         
+
+        user_view_with_subworkflows = add_subworkflows_2_dico(self.dico_process_dependency_graph, user_view)
+        with open(self.get_output_dir()/ "graphs/user_view_with_subworkflows.json", 'w') as output_file :
+            json.dump(user_view_with_subworkflows, output_file, indent=4)
+
         generate_graph(self.get_output_dir()/'graphs'/"user_view", user_view, label_edge=True, label_node=True, render_graphs = render_graphs)
+        generate_graph(self.get_output_dir()/'graphs'/"user_view_with_subworkflows", user_view_with_subworkflows, label_edge=True, label_node=True, render_graphs = render_graphs)
+
         
 
 
diff --git a/src/nextflow_file.py b/src/nextflow_file.py
index 87dd9c2d5c46b95df3499124aca244241612de21..a90e4bbb78488d148f1a2606410d51aa2d66ea0a 100644
--- a/src/nextflow_file.py
+++ b/src/nextflow_file.py
@@ -699,6 +699,14 @@ class Nextflow_File(Nextflow_Building_Blocks):
         self.graph.get_metadata_dependency_graph()
         self.graph.get_metadata_process_dependency_graph()
 
+    def generate_specification_graph(self, render_graphs = True, processes_2_remove = []):
+        self.graph.initialise(processes_2_remove = processes_2_remove)
+        self.graph.get_specification_graph(render_graphs = render_graphs)
+    
+    def generate_process_dependency_graph(self, render_graphs = True, processes_2_remove = []):
+        self.graph.initialise(processes_2_remove = processes_2_remove)
+        self.graph.render_graph_wo_operations(render_graphs = render_graphs)
+
     def generate_user_view(self, relevant_processes = [], render_graphs = True, processes_2_remove = []):
         self.graph.initialise(processes_2_remove = processes_2_remove)
         self.graph.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs)
diff --git a/src/outils_graph.py b/src/outils_graph.py
index 3ba0f6d228325881dd176264a843f317008b2cf9..3d75e09020ae5876817f23252eef7f2a02fb5dcb 100644
--- a/src/outils_graph.py
+++ b/src/outils_graph.py
@@ -748,4 +748,29 @@ def relev_user_view_builder(dico, relevant_modules):
         new_dico["edges"].append({'A':"input", 'B':input, "label": ""})
     return new_dico
 
+#This function fills the new_dico with the flattened_dico but 
+#reintegrates the subworkflows (from the full workflow)
+def add_subworkflows_2_dico(full_dico, flattened_dico, add_root_nodes = True):
+    #Add nodes with subworkflows
+    def add_nodes(full_dico, flattened_dico):
+        new_dico = {}
+        new_dico['nodes'] = []
+        new_dico['edges'] = []
+        new_dico['subworkflows'] = {}
+        for n1 in full_dico["nodes"]:
+            for n2 in flattened_dico["nodes"]:
+                if(n1['id'][1:-1] in n2['id'] and n1['name'] == n2['name']):
+                    new_dico["nodes"].append(n2)
+        for sub in full_dico["subworkflows"]:
+            new_dico['subworkflows'][sub] = add_nodes(full_dico["subworkflows"][sub], flattened_dico)
+        return new_dico
+            
+    new_dico = add_nodes(full_dico, flattened_dico)
+    new_dico["edges"] = flattened_dico["edges"]
+    if(add_root_nodes):
+        new_dico["nodes"].append({"id": "input","name": "i","shape": "triangle", "fillcolor":"#ffffff"})
+        new_dico["nodes"].append({"id": "output","name": "o","shape": "triangle", "fillcolor":"#ffffff"})
+    return new_dico
+
+
 
diff --git a/src/workflow.py b/src/workflow.py
index 3fa3c1fac4e23bd6c26db8b9489f3ee007725eec..03e0146bb5c2be0e06cdd1590297048a7e271331 100644
--- a/src/workflow.py
+++ b/src/workflow.py
@@ -83,6 +83,7 @@ class Workflow:
         self.keywords = keywords
         self.producer = producer
         self.publisher = publisher
+        self.tab_processes_2_remove  = None
         self.personnal_acces_token = personnal_acces_token
         self.processes_2_tools = processes_2_tools
         if(processes_2_remove==""):
@@ -515,26 +516,35 @@ George Marchment, Bryan Brancotte, Marie Schmit, Frédéric Lemoine, Sarah Cohen
             print()
             print(citation)
 
+    def iniatilise_tab_processes_2_remove(self):
+        if(self.tab_processes_2_remove==None):
+            tab_processes_2_remove = []
+            if(self.processes_2_remove!=None):
+                temp = self.processes_2_remove.split(",")
+                for t in temp:
+                    tab_processes_2_remove.append(t.strip())
+            self.tab_processes_2_remove = tab_processes_2_remove
+
     def generate_all_graphs(self, render_graphs = True):
         """Method that generates all graphs representing the workflow
 
         Keyword arguments:
         
         """
-        tab_processes_2_remove = []
-        if(self.processes_2_remove!=None):
-            temp = self.processes_2_remove.split(",")
-            for t in temp:
-                tab_processes_2_remove.append(t.strip())
-        self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove)
+        self.iniatilise_tab_processes_2_remove()
+        self.nextflow_file.generate_all_graphs(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove)
+
+    def generate_specification_graph(self, render_graphs = True):
+        self.iniatilise_tab_processes_2_remove()
+        self.nextflow_file.generate_specification_graph(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove)
+    
+    def generate_process_dependency_graph(self, render_graphs = True):
+        self.iniatilise_tab_processes_2_remove()
+        self.nextflow_file.generate_process_dependency_graph(render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove)
 
     def generate_user_view(self, relevant_processes = [], render_graphs = True):
-        tab_processes_2_remove = []
-        if(self.processes_2_remove!=None):
-            temp = self.processes_2_remove.split(",")
-            for t in temp:
-                tab_processes_2_remove.append(t.strip())
-        self.nextflow_file.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs, processes_2_remove = tab_processes_2_remove)
+        self.iniatilise_tab_processes_2_remove()
+        self.nextflow_file.generate_user_view(relevant_processes = relevant_processes, render_graphs = render_graphs, processes_2_remove = self.tab_processes_2_remove)
 
     def build_processes_2_tools(self):