diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
index f32db360ace36a08950712174d970cfa3b9ef3c7..5ee9a57bb682cd2e278cabef6d952cbdc5c3a8c6 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
@@ -201,99 +201,11 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
     }
 
 
-    public void addStep(ItineraryFile itineraryFile, StepFile parentStep) {
-        if(parentStep != null && parentStep.getFather() != null) {
-            Alert notPossible = new Alert(Alert.AlertType.INFORMATION);
-            notPossible.setTitle("Add substep");
-            notPossible.setContentText("Adding substep here is not allowed");
-            notPossible.initModality(Modality.APPLICATION_MODAL);
-            notPossible.initOwner(MainApp.primaryStage);
-            notPossible.showAndWait();
-            return;
-        }
-
-        GeneralFile current = itineraryFile.getProcessFile();
-
-        Dialog<String> diagNewStep = new Dialog();
-        diagNewStep.initModality(Modality.WINDOW_MODAL);
-        diagNewStep.initOwner(MainApp.primaryStage);
-        diagNewStep.setTitle("Create new step");
-
-        GridPane g1 = new GridPane();
-        ColumnConstraints c1 = new ColumnConstraints();
-        c1.setPercentWidth(50);
-        g1.getColumnConstraints().add(c1);
-        diagNewStep.getDialogPane().setContent(g1);
-        VBox bg = new VBox(10);
-        TextField nextStepName = new TextField();
-        bg.getChildren().addAll(new Label("New step name :"), nextStepName);
-        g1.add(bg, 0, 0);
-
-        VBox vd = new VBox(5);
-        RadioButton rbScratch = new RadioButton("Create from scratch");
-        RadioButton rbCopy = new RadioButton("Copy an existing step :");
-        rbCopy.setGraphic(new ImageView(UITools.getImage("resources/images/help_16.png")));
-        rbCopy.setTooltip(new Tooltip("Itineraries are not cloned"));
-        rbCopy.setContentDisplay(ContentDisplay.RIGHT);
-        final ToggleGroup group = new ToggleGroup();
-        rbScratch.setToggleGroup(group);
-        rbCopy.setToggleGroup(group);
-        rbScratch.setSelected(true);
-
-        Callback<ListView<StepFile>, ListCell<StepFile>> cellFactoryStepFile = new Callback<ListView<StepFile>, ListCell<StepFile>>() {
-            @Override
-            public ListCell<StepFile> call(ListView<StepFile> l) {
-                return new ListCell<StepFile>() {
-                    @Override
-                    protected void updateItem(StepFile item, boolean empty) {
-                        super.updateItem(item, empty);
-                        if (item == null || empty) {
-                            setGraphic(null);
-                        } else {
-                            setText(item.getNameProperty().getValue());
-                        }
-                    }
-                } ;
-            }
-        };
-
-        ComboBox<StepFile> comboStep = new ComboBox<>();
-        comboStep.setCellFactory(cellFactoryStepFile);
-        comboStep.setButtonCell(cellFactoryStepFile.call(null));
-
-        ObservableList<StepFile> listCombo = FXCollections.observableArrayList(current.getListStep());
-        comboStep.setItems(listCombo);
-
-        vd.getChildren().addAll(rbScratch, rbCopy,comboStep);
-
-        g1.add(vd, 1,0);
-        diagNewStep.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
-        Button bok = (Button) diagNewStep.getDialogPane().lookupButton(ButtonType.OK);
-        bok.disableProperty().bind(Bindings.or(nextStepName.textProperty().isEmpty(), Bindings.and(rbCopy.selectedProperty(), comboStep.valueProperty().isNull())));
-        bok.setOnAction(actionEvent -> {
-            addStepData(itineraryFile, parentStep, current, nextStepName.getText(), rbCopy.isSelected(), comboStep);
-            if(parentStep != null && !parentStep.getCompositionFile().isEmpty()) {
-                Platform.runLater(() -> {
-                    Alert warningMoveComposition = new Alert(Alert.AlertType.WARNING);
-                    warningMoveComposition.getDialogPane().setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
-                    warningMoveComposition.setTitle("Composition on " + parentStep.getNameProperty().get());
-                    warningMoveComposition.setContentText("Please keep in mind that composition on step " + parentStep.getNameProperty().get() + " are not allowed.\n You can move or remove it");
-                    warningMoveComposition.initModality(Modality.APPLICATION_MODAL);
-                    warningMoveComposition.initOwner(MainApp.primaryStage);
-                    warningMoveComposition.showAndWait();
-                });
-            }
-        });
-        diagNewStep.showAndWait();
-
-    }
-
-    private static StepFile addStepData(ItineraryFile itiFile, StepFile parentStep, GeneralFile current, String stepName, boolean rbCopy, ComboBox<StepFile> comboStep) {
+    private static StepFile addStepData(ItineraryFile itiFile, StepFile parentStep, GeneralFile current, boolean rbCopy, StepFile stepToClone) {
         StepFile s = new StepFile("new step", current);
-        s.setId(stepName);
-        if(rbCopy && comboStep != null) {
-            StepFile initial = comboStep.getSelectionModel().getSelectedItem();
-            s.cloneFrom(initial, itiFile, new HashMap<>(), itiFile, null);
+        s.setId("");
+        if(rbCopy && stepToClone != null) {
+            s.cloneFrom(stepToClone, itiFile, new HashMap<>(), itiFile, null);
         }
 
         if(parentStep != null) {
@@ -317,6 +229,38 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
         return s;
     }
 
+    private static void newStepImport(ItineraryFile iti, StepFile parent) {
+        File fileImport = getFile(MainApp.primaryStage);
+        if (fileImport == null) {
+            return;
+        }
+        MainApp.logger.info("start importing file " + fileImport.getName());
+        ImportReport importReport = iti.checkImportStepFromXLSX(fileImport);
+        if(importReport.success()) {
+            StepFile step = iti.importStepFromXLSX(fileImport);
+            if(parent != null && step != null) {
+                parent.addSubStep(step);
+            }
+            handleInterfaceUpdate(step.getGeneralFile(), importReport.success(), importReport.toString());
+        } else {
+            showErrorImportAlert(importReport.toString());
+        }
+    }
+
+    public void addStepFromScratch(ItineraryFile itineraryFile, StepFile parentStep) {
+        if(parentStep != null && parentStep.getFather() != null) {
+            Alert notPossible = new Alert(Alert.AlertType.INFORMATION);
+            notPossible.setTitle("Add substep");
+            notPossible.setContentText("Adding substep here is not allowed");
+            notPossible.initModality(Modality.APPLICATION_MODAL);
+            notPossible.initOwner(MainApp.primaryStage);
+            notPossible.showAndWait();
+            return;
+        }
+        GeneralFile current = itineraryFile.getProcessFile();
+        addStepData(itineraryFile, parentStep, current, false, null);
+    }
+
 
     private static void newItineraryObsImport(ItineraryFile iti) {
         File fileImport = getFile(MainApp.primaryStage);
@@ -335,6 +279,53 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
         }
     }
 
+    public void copyStep(ItineraryFile itineraryFile, StepFile parentStep) {
+        if(parentStep != null && parentStep.getFather() != null) {
+            Alert notPossible = new Alert(Alert.AlertType.INFORMATION);
+            notPossible.setTitle("Add substep");
+            notPossible.setContentText("Adding substep here is not allowed");
+            notPossible.initModality(Modality.APPLICATION_MODAL);
+            notPossible.initOwner(MainApp.primaryStage);
+            notPossible.showAndWait();
+            return;
+        }
+        GeneralFile current = itineraryFile.getProcessFile();
+
+        ChoiceDialog<StepFile> diagCloneStep = new ChoiceDialog<>();
+        diagCloneStep.initModality(Modality.WINDOW_MODAL);
+        diagCloneStep.initOwner(MainApp.primaryStage);
+        diagCloneStep.setTitle("Create a new step by cloning an existing one");
+
+        ObservableList<StepFile> listCombo = FXCollections.observableArrayList(current.getListStep());
+        diagCloneStep.getItems().addAll(listCombo);
+        Optional<StepFile> result = diagCloneStep.showAndWait();
+        result.ifPresent(step -> addStepData(itineraryFile, parentStep, current, true, step));
+    }
+
+    private void newStepObsImport(StepFile step) {
+        File fileImport = getFile(MainApp.primaryStage);
+        if (fileImport == null) {
+            return;
+        }
+        MainApp.logger.info("start importing/create file " + fileImport.getName());
+        Report r = step.checkCreateObservationFromXLSX(fileImport);
+        if(r.success()) {
+            ObservationFile obs = step.createObservationFromXLSX(fileImport);
+            handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), r.success(), "File import completed");
+            MainApp.getDataControler().selectNode(obs);
+            MainApp.logger.info("import done with sucess");
+        } else {
+            showErrorImportAlert(r.prettyPrintError());
+        }
+    }
+
+    private static File getFile(Stage primaryStage) {
+        FileChooser fileChooser = new FileChooser();
+        fileChooser.setTitle("Import file");
+        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)", "*.xlsx"));
+        return fileChooser.showOpenDialog(primaryStage);
+    }
+
     @Override
     public void updateItem(DataNode item, boolean empty) {
         super.updateItem(item, empty);
@@ -650,7 +641,11 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                     menu.getItems().add(downloadSCHACLConstraints);
                     break;
                 case PROCESS:
-                    MenuItem addItinerary = new MenuItem("New Itinerary");
+                    Menu newIti = new Menu("New Itinerary");
+                    newIti.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png")));
+                    newIti.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+
+                    MenuItem addItinerary = new MenuItem("New Itinerary from scratch");
                     addItinerary.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png")));
                     addItinerary.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addItinerary.setOnAction(event -> {
@@ -665,17 +660,17 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                         MainApp.getDataControler().selectNode(itineraryFile);
 
                     });
-                    menu.getItems().add(addItinerary);
+                    newIti.getItems().add(addItinerary);
 
-                    MenuItem addCopyItinerary = new MenuItem("New Itinerary from existing");
+                    MenuItem addCopyItinerary = new MenuItem("Copy an existing Itinerary");
                     addCopyItinerary.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png")));
                     addCopyItinerary.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addCopyItinerary.setOnAction(event -> {
                         GeneralFile current = (GeneralFile) item.getFile();
                         copyItinerary(current);
                     });
-                    menu.getItems().add(addCopyItinerary);
-
+                    newIti.getItems().add(addCopyItinerary);
+                    menu.getItems().add(newIti);
 
                     MenuItem unloadProcess = new MenuItem("Unload Process");
                     unloadProcess.setGraphic(new ImageView(UITools.getImage("resources/images/revert_16.png")));
@@ -1032,39 +1027,69 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
 
                 case STEP:
                     StepFile s = (StepFile) item.getFile();
-                    MenuItem newSubStep = new MenuItem("New SubStep");
+
+                    Menu newSubStep = new Menu("New SubStep");
                     newSubStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
                     newSubStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
-                    newSubStep.setOnAction(event -> {
-                        addStep(item.getItineraryFile(),s );
+
+                    MenuItem newSubStepFC = new MenuItem("New SubStep from scratch");
+                    newSubStepFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
+                    newSubStepFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    newSubStepFC.setOnAction(event -> {
+                        addStepFromScratch(item.getItineraryFile(), s);
                     });
+
+                    MenuItem cloneSubStep = new MenuItem("Copy an existing Step");
+                    cloneSubStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
+                    cloneSubStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    cloneSubStep.setOnAction(event -> {
+                        copyStep(item.getItineraryFile(), s);
+                    });
+
+                    MenuItem addProcessSubStepFromCSV = new MenuItem("New SubStep From CSV");
+                    addProcessSubStepFromCSV.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step_csv.png")));
+                    addProcessSubStepFromCSV.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    addProcessSubStepFromCSV.setOnAction(event -> {
+                        newStepImport(item.getItineraryFile(), s);
+                    });
+
+                    newSubStep.getItems().add(newSubStepFC);
+                    newSubStep.getItems().add(cloneSubStep);
+                    newSubStep.getItems().add(addProcessSubStepFromCSV);
+
                     if (s.getFather() == null) menu.getItems().add(newSubStep);
 
-                    MenuItem newObs = new MenuItem("New Observation File");
-                    newObs.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png")));
+                    Menu newObs = new Menu("New Observation");
                     newObs.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
-                    newObs.setOnAction(event -> {
+                    newObs.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png")));
+
+                    MenuItem newObsFC = new MenuItem("New Observation from scratch");
+                    newObsFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png")));
+                    newObsFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    newObsFC.setOnAction(event -> {
                         ObservationFile newFile = new ObservationFile(s);
                         for(DataNode nodeS : MainApp.getDataControler().getDataNodes(s)) {
                             DataNode obsNode = new DataNode(DataNodeType.OBSERVATION);
                             MainApp.getDataControler().addNode(newFile, obsNode, nodeS);
                         }
 
-//                        s.getGeneralFile().reconstructItineraty();
                         s.getData().setModified(true);
                         MainApp.getDataControler().selectNode(newFile);
                     });
-                    menu.getItems().add(newObs);
 
-                    MenuItem addNewStepObservationFromCsv = new MenuItem("Import New Observation from CSV");
+                    MenuItem addNewStepObservationFromCsv = new MenuItem("New Observation from CSV");
                     addNewStepObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png")));
                     addNewStepObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addNewStepObservationFromCsv.setOnAction(event -> {
                         newStepObsImport(s);
                     });
-                    menu.getItems().add(addNewStepObservationFromCsv);
 
-                    MenuItem newMix = new MenuItem("Add Composition");
+                    newObs.getItems().add(newObsFC);
+                    newObs.getItems().add(addNewStepObservationFromCsv);
+
+                    menu.getItems().add(newObs);
+
+                    MenuItem newMix = new MenuItem("New Composition");
                     newMix.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/composition.png")));
                     newMix.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     newMix.setOnAction(event -> {
@@ -1470,24 +1495,39 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
 
                     });
 
+                    Menu newStep = new Menu("New Step");
+                    newStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
+                    newStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
 
-                    MenuItem addProcessStep = new MenuItem("Create New Step");
+                    MenuItem addProcessStep = new MenuItem("New Step from scratch");
                     addProcessStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
                     addProcessStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addProcessStep.setOnAction(event -> {
                         ItineraryFile iti = (ItineraryFile) item.getFile();
-                        addStep(iti, null);
+                        addStepFromScratch(iti, null);
                     });
 
-                    MenuItem addProcessStepFromCSV = new MenuItem("Create New Step From CSV");
+                    MenuItem cloneStep = new MenuItem("Copy an existing Step");
+                    cloneStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
+                    cloneStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    cloneStep.setOnAction(event -> {
+                        ItineraryFile iti = (ItineraryFile) item.getFile();
+                        copyStep(iti, null);
+                    });
+
+                    MenuItem addProcessStepFromCSV = new MenuItem("New Step From CSV");
                     addProcessStepFromCSV.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step_csv.png")));
                     addProcessStepFromCSV.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addProcessStepFromCSV.setOnAction(event -> {
                         ItineraryFile iti = (ItineraryFile) item.getFile();
-                        newStepImport(iti);
+                        newStepImport(iti, null);
                     });
 
-                    MenuItem addProcessExistingStep = new MenuItem("Add Existing Step");
+                    newStep.getItems().add(addProcessStep);
+                    newStep.getItems().add(cloneStep);
+                    newStep.getItems().add(addProcessStepFromCSV);
+
+                    MenuItem addProcessExistingStep = new MenuItem("Reuse an existing Step");
                     addProcessExistingStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png")));
                     addProcessExistingStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addProcessExistingStep.setOnAction(event -> {
@@ -1495,20 +1535,23 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                         addExistingStep(iti);
                     });
 
-                    MenuItem newObsIti = new MenuItem("New Observation File");
+                    Menu newObsIti = new Menu("New Observation");
                     newObsIti.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png")));
                     newObsIti.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
-                    newObsIti.setOnAction(event -> {
+
+                    MenuItem newObsItiFC = new MenuItem("New Observation from scratch");
+                    newObsItiFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png")));
+                    newObsItiFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
+                    newObsItiFC.setOnAction(event -> {
                         ItineraryFile iti = (ItineraryFile) item.getFile();
                         ObservationFile newFile = new ObservationFile(iti);
                         DataNode obsNode = new DataNode(DataNodeType.OBSERVATION);
                         MainApp.getDataControler().addNode(newFile, obsNode, item);
                         iti.getProcessFile().getData().setModified(true);
                         MainApp.getDataControler().selectNode(newFile);
-
                     });
 
-                    MenuItem addNewItineraryObservationFromCsv = new MenuItem("Import New Observation from CSV");
+                    MenuItem addNewItineraryObservationFromCsv = new MenuItem("New Observation from CSV");
                     addNewItineraryObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png")));
                     addNewItineraryObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     addNewItineraryObservationFromCsv.setOnAction(event -> {
@@ -1516,11 +1559,13 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                         newItineraryObsImport(iti);
                     });
 
-                    menu.getItems().add(addProcessStep);
-                    menu.getItems().add(addProcessStepFromCSV);
+                    newObsIti.getItems().add(newObsItiFC);
+                    newObsIti.getItems().add(addNewItineraryObservationFromCsv);
+
+
+                    menu.getItems().add(newStep);
                     menu.getItems().add(addProcessExistingStep);
                     menu.getItems().add(newObsIti);
-                    menu.getItems().add(addNewItineraryObservationFromCsv);
                     menu.getItems().add(new SeparatorMenuItem());
                     menu.getItems().add(delItinerary);
                     break;
@@ -1532,45 +1577,6 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
         }
     }
 
-    private void newStepObsImport(StepFile step) {
-        File fileImport = getFile(MainApp.primaryStage);
-        if (fileImport == null) {
-            return;
-        }
-        MainApp.logger.info("start importing/create file " + fileImport.getName());
-        Report r = step.checkCreateObservationFromXLSX(fileImport);
-        if(r.success()) {
-            ObservationFile obs = step.createObservationFromXLSX(fileImport);
-            handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), r.success(), "File import completed");
-            MainApp.getDataControler().selectNode(obs);
-            MainApp.logger.info("import done with sucess");
-        } else {
-            showErrorImportAlert(r.prettyPrintError());
-        }
-    }
-
-    private static File getFile(Stage primaryStage) {
-        FileChooser fileChooser = new FileChooser();
-        fileChooser.setTitle("Import file");
-        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)", "*.xlsx"));
-        return fileChooser.showOpenDialog(primaryStage);
-    }
-
-    private static void newStepImport(ItineraryFile iti) {
-        File fileImport = getFile(MainApp.primaryStage);
-        if (fileImport == null) {
-            return;
-        }
-        MainApp.logger.info("start importing file " + fileImport.getName());
-        ImportReport importReport = iti.checkImportStepFromXLSX(fileImport);
-        if(importReport.success()) {
-            StepFile step = iti.importStepFromXLSX(fileImport);
-            handleInterfaceUpdate(step.getGeneralFile(), importReport.success(), importReport.toString());
-        } else {
-            showErrorImportAlert(importReport.toString());
-        }
-    }
-
         private static void stepImport(StepFile file, boolean isNewStep) {
             File fileImport = getFile(MainApp.primaryStage);
             if (fileImport != null) {
diff --git a/src/main/resources/resources/changelog.txt b/src/main/resources/resources/changelog.txt
index c4fb0a770af7769a6d12d1af9b239389403b497b..2fb41b10c245b2dee043104781e3059664ac481d 100644
--- a/src/main/resources/resources/changelog.txt
+++ b/src/main/resources/resources/changelog.txt
@@ -1,3 +1,6 @@
+------------------ NEXT ------------------
+    * Enhancement (PO2-Tools/po2manager#95) : uniformiser les fonctionnalités de copies (step / itinerary / ....)
+
 ------------------ V1.8.3.4 ------------------
     * Bug Fix (PO2-Tools/po2-engine#50) : Gestion de troncage de nom dans les sheets excel
     * Bug Fix (PO2-Tools/po2-engine#59) : Problème d'import de template d'observation