diff --git a/assets/course_data_format.html b/assets/course_data_format.html
index 686579221d16c611799f2d3d3de7034878947ae7..59a308599b718ef461a3a08c1d8b296d39541ac0 100644
--- a/assets/course_data_format.html
+++ b/assets/course_data_format.html
@@ -6,15 +6,20 @@
 </head>
 <body>
 
-<h1> What kind course_data_format.html of model, data, or instance can I upload ? </h1>
+<h1> Data format requirements</h1>
 
-<h2> What is the option to add information on model ? </h2>
+<h2> An option to add information on model </h2>
 
 <h3> Why ? </h3>
-<p> There is a switch button, you can use it when you want to attach the csv you trained your model on or a feature mapping. This is useful when you didn't dump the features names in your pkl of model but still wants them to show up, or when the values are categorical.
+<p> There is a switch button, you can use it when you want to attach the csv you trained your model on or a feature mapping. This is useful when the values are categorical.
 </p>
+
 <h3> How ? </h3>
 
+<p> If you decide to upload the dataset, it should be a .csv.
+If you decide to upload the feature mapping, it is a .txt file.
+</p>
+
 <h2> What kind of model can I upload ? </h2>
 
 <p> You can only import .pkl models.</p>
diff --git a/callbacks.py b/callbacks.py
index 18c46c5be617a681f43bb20e37006203dff82e5d..1ebc2a10a97e52ba95bcac967d0ac8ac2933cbf6 100644
--- a/callbacks.py
+++ b/callbacks.py
@@ -37,12 +37,31 @@ def register_callbacks(page_home, page_course, page_application, app):
     def update_ml_type_options(value_ml_model):
         model_application = page_application.model
         model_application.update_ml_model(value_ml_model)
-        return model_application.solvers, model_application.solvers[0], model_application.xtypes, [list(model_application.xtypes.keys())[0]]
+        return model_application.solvers, model_application.solvers[0], model_application.xtypes, [
+            list(model_application.xtypes.keys())[0]]
+
+    @app.callback(Output('pretrained_model_filename', 'children'),
+                  Input('ml_pretrained_model_choice', 'filename'),
+                  prevent_initial_call=True
+                  )
+    def update_model_prertrained_name(pretrained_model_filename):
+        return pretrained_model_filename
+
+    @app.callback(Output('info_filename', 'children'),
+                  Input('model_info_choice', 'filename'),
+                  prevent_initial_call=True
+                  )
+    def update_model_info_filename(model_info_filename):
+        return model_info_filename
+
+    @app.callback(Output('instance_filename', 'children'),
+                  Input('ml_instance_choice', 'filename'),
+                  prevent_initial_call=True
+                  )
+    def update_instance_filename(instance_filename):
+        return instance_filename
 
     @app.callback(
-        Output('pretrained_model_filename', 'children'),
-        Output('info_filename', 'children'),
-        Output('instance_filename', 'children'),
         Output('graph', 'children'),
         Output('explanation', 'children'),
         Input('ml_model_choice', 'value'),
@@ -70,7 +89,7 @@ def register_callbacks(page_home, page_course, page_application, app):
             # Choice of model
             if ihm_id == 'ml_model_choice':
                 model_application.update_ml_model(value_ml_model)
-                return None, None, None, None, None
+                return None, None
 
             # Choice of pkl pretrained model
             elif ihm_id == 'ml_pretrained_model_choice':
@@ -80,17 +99,22 @@ def register_callbacks(page_home, page_course, page_application, app):
                 model_application.update_pretrained_model(graph)
                 if not model_application.add_info:
                     model_application.update_pretrained_model_layout()
-                    return pretrained_model_filename, None, None, model_application.component.network, None
+                    return model_application.component.network, None
                 else:
-                    return pretrained_model_filename, None, None, None, None
+                    if model_application.model_info is None:
+                        raise PreventUpdate
+                    model_application.update_pretrained_model_layout_with_info(model_application.model_info,
+                                                                               model_info_filename)
+                    return model_application.component.network, None
 
             # Choice of information for the model
             elif ihm_id == 'model_info_choice':
-                if model_application.ml_model is None:
-                    raise PreventUpdate
                 model_info = parse_contents_data(model_info, model_info_filename)
+                model_application.model_info = model_info
+                if model_application.ml_model is None or model_application.pretrained_model is None:
+                    raise PreventUpdate
                 model_application.update_pretrained_model_layout_with_info(model_info, model_info_filename)
-                return pretrained_model_filename, model_info_filename, None, model_application.component.network, None
+                return model_application.component.network, None
 
             # Choice of instance to explain
             elif ihm_id == 'ml_instance_choice':
@@ -98,50 +122,42 @@ def register_callbacks(page_home, page_course, page_application, app):
                     raise PreventUpdate
                 instance = parse_contents_instance(instance_contents, instance_filename)
                 model_application.update_instance(instance)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
-                # Choice of number of expls
+            # Choice of number of expls
             elif ihm_id == 'number_explanations':
-                if model_application.ml_model is None or model_application.pretrained_model is None or len(
-                        model_application.instance) == 0 or model_application.xtype is None:
+                if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.solver is None or model_application.xtype is None:
                     raise PreventUpdate
                 model_application.update_enum(enum)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
-                # Choice of AxP or CxP
+            # Choice of AxP or CxP
             elif ihm_id == 'explanation_type':
-                if model_application.ml_model is None or model_application.pretrained_model is None or len(
-                        model_application.instance) == 0 or model_application.enum <= 0:
+                if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.solver is None:
                     raise PreventUpdate
                 model_application.update_xtype(xtype)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
             # Choice of solver 
             elif ihm_id == 'solver_sat':
-                if model_application.ml_model is None or model_application.pretrained_model is None or len(
-                        model_application.instance) == 0 or model_application.enum <= 0 or len(
-                        model_application.xtype) == 0:
+                if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None:
                     raise PreventUpdate
                 model_application.update_solver(solver)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
-                # Choice of AxP to draw
+            # Choice of AxP to draw
             elif ihm_id == 'expl_choice':
-                if model_application.ml_model is None or model_application.pretrained_model is None or len(
-                        model_application.instance) == 0 or model_application.enum <= 0 or len(
-                        model_application.xtype) == 0:
+                if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None:
                     raise PreventUpdate
                 model_application.update_expl(expl_choice)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
-                # Choice of CxP to draw
+            # Choice of CxP to draw
             elif ihm_id == 'cont_expl_choice':
-                if model_application.ml_model is None or model_application.pretrained_model is None or len(
-                        model_application.instance) == 0 or model_application.enum <= 0 or len(
-                        model_application.xtype) == 0:
+                if model_application.ml_model is None or model_application.pretrained_model is None or model_application.instance is None or model_application.enum <= 0 or model_application.xtype is None:
                     raise PreventUpdate
                 model_application.update_cont_expl(cont_expl_choice)
-                return pretrained_model_filename, model_info_filename, instance_filename, model_application.component.network, model_application.component.explanation
+                return model_application.component.network, model_application.component.explanation
 
     @app.callback(
         Output('explanation', 'hidden'),
diff --git a/pages/application/DecisionTree/DecisionTreeComponent.py b/pages/application/DecisionTree/DecisionTreeComponent.py
index c177652e7f2be781a7b1bdba4bccb94bec80e34d..edb89a4d4c0a863ee9cfe80c6a35b28745038eca 100644
--- a/pages/application/DecisionTree/DecisionTreeComponent.py
+++ b/pages/application/DecisionTree/DecisionTreeComponent.py
@@ -119,6 +119,7 @@ class DecisionTreeComponent():
         instance_translated = self.translate_instance(instance)
         self.explanation = []
         list_explanations_path = []
+        list_contrastive_explanations_path = []
         explanation = self.dt.explain(instance_translated, enum=enum, xtype=xtype, solver=solver)
 
         dot_source = visualize_instance(self.dt, instance_translated)
diff --git a/pages/application/application.py b/pages/application/application.py
index 84ffdd5b2db368a22794ba2be29a6bf6246ebc85..d08f756289f0ef0a550344be6efd0a42e1b679e7 100644
--- a/pages/application/application.py
+++ b/pages/application/application.py
@@ -18,31 +18,31 @@ class Model():
         self.dic_xtypes = dic_xtypes
 
         self.ml_models = names_models
-        self.ml_model = ''
+        self.ml_model = None
 
-        self.pretrained_model = ''
+        self.pretrained_model = None
 
         self.add_info = False
-        self.model_info = ''
+        self.model_info = None
 
         self.enum = 1
 
         self.xtypes = []
-        self.xtype = ""
+        self.xtype = None
 
         self.solvers = []
-        self.solver = ""
+        self.solver = None
 
-        self.instance = ''
+        self.instance = None
 
         self.list_expls = []
         self.list_cont_expls = []
 
-        self.expl = ''
-        self.cont_expl = ''
+        self.expl = None
+        self.cont_expl = None
 
-        self.component_class = ''
-        self.component = ''
+        self.component_class = None
+        self.component = None
 
     def update_ml_model(self, ml_model_update):
         self.ml_model = ml_model_update