diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java b/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
index 32a2e7fe0675c19e3d1c8b16bab9955d8a8bbaf9..a9e88ca005dfd3f37a9ca81f07b774c8cb516d88 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/RecursiveTreeItem.java
@@ -28,6 +28,7 @@ import javafx.util.Callback;
 
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class RecursiveTreeItem<T> extends TreeItem<T> {
@@ -38,6 +39,35 @@ public class RecursiveTreeItem<T> extends TreeItem<T> {
 
     private OntologyOverviewController controller;
 
+    // Méthode récursive pour obtenir le chemin d'un TreeItem
+    public static String getPath(TreeItem<?> item) {
+        if (item.getParent() == null) {
+            return "/"; // Retourne la racine
+        }
+        int index = item.getParent().getChildren().indexOf(item);
+        return getPath(item.getParent()) + index + "/";
+    }
+
+    // Méthode pour sauvegarder l'état d'ouverture des nœuds en fonction de leur chemin
+    public static void saveExpandedState(TreeItem<?> item, Map<String, Boolean> expandedStates) {
+        if(item == null) return;
+        expandedStates.put(RecursiveTreeItem.getPath(item), item.isExpanded());
+        for (TreeItem<?> child : item.getChildren()) {
+            saveExpandedState(child, expandedStates);
+        }
+    }
+
+    // Méthode pour restaurer l'état d'ouverture des nœuds en fonction de leur chemin
+    public static void restoreExpandedState(TreeItem<?> item, Map<String, Boolean> expandedStates) {
+        Boolean isExpanded = expandedStates.get(RecursiveTreeItem.getPath(item));
+        if (isExpanded != null) {
+            item.setExpanded(isExpanded);
+        }
+        for (TreeItem<?> child : item.getChildren()) {
+            restoreExpandedState(child, expandedStates);
+        }
+    }
+
     private Comparator<TreeItem<? extends T>> comparator = (o1, o2) -> {
         if(o1.getValue() instanceof DataNode && o2.getValue() instanceof DataNode) {
             DataNode do1 = ((DataNode) o1.getValue());
diff --git a/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java b/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
index 827d62cf315ac5299a768d483788a75ba7f1549b..9d1f277633a56001c15cfa39fb0375463d77b9c6 100644
--- a/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
+++ b/src/main/java/fr/inra/po2vocabmanager/view/ontoView/OntologyOverviewController.java
@@ -581,12 +581,22 @@ TableView<SimpleStringProperty> tableClose;
     }
 
     public void refreshTree(){
-        vocabTree.refresh();
+        rebuildTree(false, false);
     }
 
 
     public void rebuildTree(boolean rebuildConstraint) {
+        rebuildTree(rebuildConstraint, false);
+    }
+    public void rebuildTree(boolean rebuildConstraint, boolean resetState) {
+        // Sauvegarde de l'état des nœuds ouverts
+        Map<String, Boolean> expandedStates = new HashMap<>();
+        if(!resetState) {
+            RecursiveTreeItem.saveExpandedState(rootItem, expandedStates);
+        }
         rootItem = new RecursiveTreeItem<>(currentOntology.getRootNode(), VocabConcept::getGraphic, VocabConcept::getSubNodeInScheme, this);
+        // Restauration de l'état des nœuds ouverts
+        RecursiveTreeItem.restoreExpandedState(rootItem, expandedStates);
         setTree(rootItem);
         if(rebuildConstraint) {
             currentOntology.rebuildConstraints();
@@ -680,7 +690,7 @@ TableView<SimpleStringProperty> tableClose;
                         MainApp.getOntologyControler().setIsOnMainScheme(true);
 
                         MainApp.updateConceptScheme();
-                        rebuildTree(false);
+                        rebuildTree(false, true);
 
                         try {
                             MutablePair<String, Date> versionDate = CloudConnector.getDavVersion(currentOntology);
@@ -1016,7 +1026,6 @@ TableView<SimpleStringProperty> tableClose;
             labelChemin.setText(sb.toString());
 
 
-            MainApp.logger.debug("node :" + currentNode + " selected");
             ObservableList<VocabNodeWLang> print = FXCollections.observableArrayList();
 
             for(String l : VocabConcept.listLang) {