--- /dev/null
+package org.simantics.structural.synchronization.base;
+
+import java.util.function.BiConsumer;
+
+public interface SolverNameUtil {
+
+ String getFreshName(String parentName, String name);
+ String ensureNameIsVariationOf(String parentName, int id, String name);
+
+ /**
+ * The name utility can internally keep track of
+ * <code>suggested name -> generated
+ * fresh name</code> associations that it has had to perform during its
+ * lifetime in {@link #getFreshName(String, String)}. If the implementation
+ * keeps track of these renames, the purpose of this method is to check
+ * whether at the time of invocation it is possible to rename the solver
+ * components to their suggested names or not. For every rename that is
+ * performed, the specified consumer shall be invoked with the arguments
+ * <code>(previous name, new name)</code> after the rename has been
+ * performed.
+ *
+ * <p>
+ * This method is intended to be invoked right at the end of
+ * synchronization.
+ *
+ * @param callback
+ * a binary consumer that takes as first argument the previous
+ * name of the renamed component and as second argument the new
+ * (current) name of the component or <code>null</code> to skip
+ * callback invocation
+ */
+ default void applySuggestedNames(BiConsumer<String, String> callback) {}
+
+}