diff --git a/.idea/runConfigurations/Generate_icon_classes__ex_icons_gant_.xml b/.idea/runConfigurations/Generate_icon_classes__ex_icons_gant_.xml
new file mode 100644
index 000000000000..2448d1d44be0
--- /dev/null
+++ b/.idea/runConfigurations/Generate_icon_classes__ex_icons_gant_.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/Optimize_images_for_tips_tricks.xml b/.idea/runConfigurations/Optimize_images_for_tips_tricks.xml
new file mode 100644
index 000000000000..a0e7db6f4f19
--- /dev/null
+++ b/.idea/runConfigurations/Optimize_images_for_tips_tricks.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/generateIconClasses.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/generateIconClasses.kt
new file mode 100644
index 000000000000..f6567447cccd
--- /dev/null
+++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/generateIconClasses.kt
@@ -0,0 +1,35 @@
+package org.jetbrains.intellij.build.images
+
+import com.intellij.openapi.application.PathManager
+import org.jetbrains.jps.model.serialization.JpsSerializationManager
+import java.io.File
+
+fun main(args: Array) {
+ val homePath = PathManager.getHomePath()
+ val home = File(homePath)
+ val project = JpsSerializationManager.getInstance().loadModel(homePath, null).project
+
+ val util = project.modules.find { it.name == "util" } ?: throw IllegalStateException("Can't load module 'util'")
+
+ val generator = IconsClassGenerator(home, util)
+ project.modules.forEach { module ->
+ generator.processModule(module)
+ }
+ generator.printStats()
+
+ val optimizer = ImageSizeOptimizer(home)
+ project.modules.forEach { module ->
+ optimizer.optimizeIcons(module)
+ }
+ optimizer.printStats()
+
+ val checker = ImageSanityChecker(home)
+ project.modules.forEach { module ->
+ checker.check(module)
+ }
+// checker.printInfo()
+ checker.printWarnings()
+
+ println()
+ println("Done")
+}
\ No newline at end of file
diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/optimizeTipsImages.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/optimizeTipsImages.kt
new file mode 100644
index 000000000000..07e3c6a666ea
--- /dev/null
+++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/optimizeTipsImages.kt
@@ -0,0 +1,27 @@
+package org.jetbrains.intellij.build.images
+
+import com.intellij.openapi.application.PathManager
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes
+import org.jetbrains.jps.model.serialization.JpsSerializationManager
+import java.io.File
+
+fun main(args: Array) {
+ val homePath = PathManager.getHomePath()
+ val home = File(homePath)
+ val project = JpsSerializationManager.getInstance().loadModel(homePath, null).project
+
+ val optimizer = ImageSizeOptimizer(home)
+ project.modules.forEach { module ->
+ module.sourceRoots.forEach { root ->
+ val imagesDir = File(root.file, "tips/images")
+ if (JavaModuleSourceRootTypes.PRODUCTION.contains(root.rootType) && imagesDir.isDirectory) {
+ val images = optimizer.optimizeImages(imagesDir)
+ println("Processed root ${root.file} with $images images")
+ }
+ }
+ }
+ optimizer.printStats()
+
+ println()
+ println("Done")
+}
\ No newline at end of file