@Override public boolean hasUnsavedChanges() { Screen rootScreen = getRootScreenOrNull(); if (rootScreen instanceof ChangeTracker && ((ChangeTracker) rootScreen).hasUnsavedChanges()) { return true; } Predicate<Screen> hasUnsavedChanges = screen -> screen instanceof ChangeTracker && ((ChangeTracker) screen).hasUnsavedChanges(); return getDialogScreensStream().anyMatch(hasUnsavedChanges) || getOpenedWorkAreaScreensStream().anyMatch(hasUnsavedChanges); }