testing
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt
index b0902bc..055c5b5 100644
--- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt
@@ -67,6 +67,9 @@
 
     public val CODE_FRAGMENT_CONTEXT_MODIFICATION: Topic<KotlinCodeFragmentContextModificationListener> =
         Topic(KotlinCodeFragmentContextModificationListener::class.java, Topic.BroadcastDirection.TO_CHILDREN, true)
+
+    public val SCRIPTS_STATE_MODIFICATION: Topic<KotlinScriptsStateModificationListener> =
+        Topic(KotlinScriptsStateModificationListener::class.java, Topic.BroadcastDirection.TO_CHILDREN, true)
 }
 
 /**
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt
new file mode 100644
index 0000000..bfc081c
--- /dev/null
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.platform.modification
+
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
+
+public fun interface KotlinScriptsStateModificationListener {
+    /**
+     * [onModification] is invoked in a write action before or after global module state modification.
+     *
+     * The module structure, source code, and binary content of all [KtModule]s in the project should be considered modified when this event
+     * is received. This includes source files being moved or removed, binary content being added, removed, or changed, and modules possibly
+     * being removed. Thus, all caches related to module structure, source code, and binaries should be invalidated.
+     *
+     * @see KotlinModificationTopics
+     */
+    public fun onModification()
+}
diff --git a/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml b/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml
index 0aaabc2..c4bb772 100644
--- a/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml
+++ b/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml
@@ -67,5 +67,10 @@
         class="org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionInvalidationService$LLPsiModificationTrackerListener"
         topic="com.intellij.psi.util.PsiModificationTracker$Listener"
     />
+
+    <listener
+        class="org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionInvalidationService$LLKotlinScriptsStateModificationListener"
+        topic="org.jetbrains.kotlin.analysis.api.platform.modification.KotlinScriptsStateModificationListener"
+    />
   </projectListeners>
 </idea-plugin>
\ No newline at end of file
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt
index 26949a3..eb989b5 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt
@@ -11,13 +11,7 @@
 import org.jetbrains.kotlin.analysis.project.structure.*
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinAnchorModuleProvider
 import org.jetbrains.kotlin.analysis.api.platform.analysisMessageBus
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinCodeFragmentContextModificationListener
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModuleStateModificationListener
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalSourceModuleStateModificationListener
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalSourceOutOfBlockModificationListener
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleOutOfBlockModificationListener
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationKind
-import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationListener
+import org.jetbrains.kotlin.analysis.api.platform.modification.*
 
 /**
  * [LLFirSessionInvalidationService] listens to [modification events][org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTopics] and invalidates [LLFirSession]s which depend on the
@@ -69,6 +63,12 @@
         }
     }
 
+    internal class LLKotlinScriptsStateModificationListener(val project: Project) : KotlinScriptsStateModificationListener {
+        override fun onModification() {
+            getInstance(project).invalidateScriptsSessions()
+        }
+    }
+
     private val sessionCache: LLFirSessionCache by lazy {
         LLFirSessionCache.getInstance(project)
     }
@@ -112,6 +112,8 @@
         }
     }
 
+    private fun invalidateScriptsSessions() = sessionCache.removeAllScriptSessions()
+
     private fun invalidateAll(includeLibraryModules: Boolean) {
         ApplicationManager.getApplication().assertWriteAccessAllowed()