[FIR] Render outer type parameters differently
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt
index be64d22..1823338 100644
--- a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt
+++ b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructor.txt
@@ -116,7 +116,7 @@
 
         public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> {
             ^foo [ResolvedTo(RAW_FIR)] fun <implicit>.<anonymous>(): <implicit> <inline=Unknown>  {
-                local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> : R|kotlin/Any| {
+                local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] Outer(E), [ResolvedTo(CONTRACTS)] Outer(F)> : R|kotlin/Any| {
                     public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                         super<R|kotlin/Any|>()
                     }
@@ -151,7 +151,7 @@
 
         public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun <[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] E, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
             ^foo [ResolvedTo(RAW_FIR)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] E, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] F> : R|kotlin/Any| {
+                local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Outer(E), [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                     public [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                         super<R|kotlin/Any|>()
                     }
@@ -186,7 +186,7 @@
 
         public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun <[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] E, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] F> foo(): R|() -> Q.C<F, E, F>| {
             ^foo [ResolvedTo(RAW_FIR)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] E, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] F> : R|kotlin/Any| {
+                local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Outer(E), [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Outer(F)> : R|kotlin/Any| {
                     public [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                         super<R|kotlin/Any|>()
                     }
@@ -221,7 +221,7 @@
 
         public final [ResolvedTo(BODY_RESOLVE)] fun <[ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
             ^foo [ResolvedTo(BODY_RESOLVE)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> : R|kotlin/Any| {
+                local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] Outer(E), [ResolvedTo(BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                     public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor<[ResolvedTo(BODY_RESOLVE)] G>(): R|Q.C<G, E, F>| {
                         super<R|kotlin/Any|>()
                     }
@@ -256,7 +256,7 @@
 
         public final [ResolvedTo(BODY_RESOLVE)] fun <[ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
             ^foo [ResolvedTo(BODY_RESOLVE)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> : R|kotlin/Any| {
+                local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] Outer(E), [ResolvedTo(BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                     public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor<[ResolvedTo(BODY_RESOLVE)] G>(): R|Q.C<G, E, F>| {
                         super<R|kotlin/Any|>()
                     }
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructorScript.txt b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructorScript.txt
index 60843cc..d2ea1f6 100644
--- a/analysis/low-level-api-fir/testdata/lazyResolve/localConstructorScript.txt
+++ b/analysis/low-level-api-fir/testdata/lazyResolve/localConstructorScript.txt
@@ -175,7 +175,7 @@
 
             public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> foo(): <implicit> {
                 ^foo [ResolvedTo(RAW_FIR)] fun <implicit>.<anonymous>(): <implicit> <inline=Unknown>  {
-                    local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] E, [ResolvedTo(CONTRACTS)] F> : R|kotlin/Any| {
+                    local final? [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(CONTRACTS)] Outer(E), [ResolvedTo(CONTRACTS)] Outer(F)> : R|kotlin/Any| {
                         public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                             super<R|kotlin/Any|>()
                         }
@@ -202,7 +202,7 @@
 IMPLICIT_TYPES_BODY_RESOLVE:
 FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] T> magic(): R|T| {
@@ -216,7 +216,7 @@
 
             public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun <[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] E, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
                 ^foo [ResolvedTo(RAW_FIR)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                    local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] E, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] F> : R|kotlin/Any| {
+                    local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Outer(E), [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                         public [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                             super<R|kotlin/Any|>()
                         }
@@ -243,7 +243,7 @@
 ANNOTATIONS_ARGUMENTS_MAPPING:
 FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] T> magic(): R|T| {
@@ -257,7 +257,7 @@
 
             public final [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] fun <[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] E, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] F> foo(): R|() -> Q.C<F, E, F>| {
                 ^foo [ResolvedTo(RAW_FIR)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                    local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] E, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] F> : R|kotlin/Any| {
+                    local final [ResolvedTo(RAW_FIR)] class C<[ResolvedTo(RAW_FIR)] G, [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Outer(E), [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Outer(F)> : R|kotlin/Any| {
                         public [ResolvedTo(RAW_FIR)] [ContainingClassKey=C] constructor<[ResolvedTo(RAW_FIR)] G>(): R|Q.C<G, E, F>| {
                             super<R|kotlin/Any|>()
                         }
@@ -284,7 +284,7 @@
 BODY_RESOLVE:
 FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(CONTRACTS)] fun <[ResolvedTo(CONTRACTS)] T> magic(): R|T| {
@@ -298,7 +298,7 @@
 
             public final [ResolvedTo(BODY_RESOLVE)] fun <[ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
                 ^foo [ResolvedTo(BODY_RESOLVE)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                    local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> : R|kotlin/Any| {
+                    local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] Outer(E), [ResolvedTo(BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                         public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor<[ResolvedTo(BODY_RESOLVE)] G>(): R|Q.C<G, E, F>| {
                             super<R|kotlin/Any|>()
                         }
@@ -325,7 +325,7 @@
 FILE RAW TO BODY:
 FILE: [ResolvedTo(IMPORTS)] localConstructorScript.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(BODY_RESOLVE)] 
+    SCRIPT: [ResolvedTo(BODY_RESOLVE)]
         [ResolvedTo(BODY_RESOLVE)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(BODY_RESOLVE)] fun <[ResolvedTo(BODY_RESOLVE)] T> magic(): R|T| {
@@ -339,7 +339,7 @@
 
             public final [ResolvedTo(BODY_RESOLVE)] fun <[ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> foo(): R|() -> Q.C<F, E, F>| {
                 ^foo [ResolvedTo(BODY_RESOLVE)] fun <anonymous>(): R|Q.C<F, E, F>| <inline=Unknown>  {
-                    local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] E, [ResolvedTo(BODY_RESOLVE)] F> : R|kotlin/Any| {
+                    local final [ResolvedTo(BODY_RESOLVE)] class C<[ResolvedTo(BODY_RESOLVE)] G, [ResolvedTo(BODY_RESOLVE)] Outer(E), [ResolvedTo(BODY_RESOLVE)] Outer(F)> : R|kotlin/Any| {
                         public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor<[ResolvedTo(BODY_RESOLVE)] G>(): R|Q.C<G, E, F>| {
                             super<R|kotlin/Any|>()
                         }
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2.txt
index e5b07fd..fe11ddf 100644
--- a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2.txt
+++ b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2.txt
@@ -5,7 +5,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(RAW_FIR)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -21,7 +21,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(RAW_FIR)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -37,7 +37,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] class Second<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] class Second<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -53,7 +53,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(COMPANION_GENERATION)] class Second<[ResolvedTo(COMPANION_GENERATION)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(COMPANION_GENERATION)] class Second<[ResolvedTo(COMPANION_GENERATION)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(COMPANION_GENERATION)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -69,7 +69,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(SUPER_TYPES)] class Second<[ResolvedTo(SUPER_TYPES)] Type2, [ResolvedTo(SUPER_TYPES)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(SUPER_TYPES)] class Second<[ResolvedTo(SUPER_TYPES)] Type2, [ResolvedTo(SUPER_TYPES)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(SUPER_TYPES)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -85,7 +85,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner [ResolvedTo(TYPES)] class Second<[ResolvedTo(TYPES)] Type2, [ResolvedTo(TYPES)] Type> : R|kotlin/Any| {
+        public? final? inner [ResolvedTo(TYPES)] class Second<[ResolvedTo(TYPES)] Type2, [ResolvedTo(TYPES)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(TYPES)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -101,7 +101,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(STATUS)] class Second<[ResolvedTo(STATUS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(STATUS)] class Second<[ResolvedTo(STATUS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(STATUS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -117,7 +117,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(EXPECT_ACTUAL_MATCHING)] class Second<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(EXPECT_ACTUAL_MATCHING)] class Second<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -133,7 +133,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] class Second<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] class Second<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -149,7 +149,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(CONTRACTS)] class Second<[ResolvedTo(CONTRACTS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(CONTRACTS)] class Second<[ResolvedTo(CONTRACTS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(CONTRACTS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -165,7 +165,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] class Second<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] class Second<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -181,7 +181,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] class Second<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] class Second<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 LAZY_super<R|kotlin/Any|>
             }
@@ -197,7 +197,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
             public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 super<R|kotlin/Any|>()
             }
@@ -213,7 +213,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(BODY_RESOLVE)] Type> : R|kotlin/Any| {
+        public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(BODY_RESOLVE)] Outer(Type)> : R|kotlin/Any| {
             public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2Script.txt b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2Script.txt
index 08a5249..4bc8eb0 100644
--- a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2Script.txt
+++ b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass2Script.txt
@@ -9,7 +9,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(RAW_FIR)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -30,7 +30,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(RAW_FIR)] class Second<[ResolvedTo(RAW_FIR)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(RAW_FIR)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -43,7 +43,7 @@
 COMPILER_REQUIRED_ANNOTATIONS:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public? final? [ResolvedTo(RAW_FIR)] class MyClass<[ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
@@ -51,7 +51,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] class Second<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] class Second<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -64,7 +64,7 @@
 COMPANION_GENERATION:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public? final? [ResolvedTo(RAW_FIR)] class MyClass<[ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
@@ -72,7 +72,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(COMPANION_GENERATION)] class Second<[ResolvedTo(COMPANION_GENERATION)] Type2, [ResolvedTo(RAW_FIR)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(COMPANION_GENERATION)] class Second<[ResolvedTo(COMPANION_GENERATION)] Type2, [ResolvedTo(RAW_FIR)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(COMPANION_GENERATION)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -85,7 +85,7 @@
 SUPER_TYPES:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public? final? [ResolvedTo(SUPER_TYPES)] class MyClass<[ResolvedTo(SUPER_TYPES)] Type> : R|kotlin/Any| {
@@ -93,7 +93,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(SUPER_TYPES)] class Second<[ResolvedTo(SUPER_TYPES)] Type2, [ResolvedTo(SUPER_TYPES)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(SUPER_TYPES)] class Second<[ResolvedTo(SUPER_TYPES)] Type2, [ResolvedTo(SUPER_TYPES)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(SUPER_TYPES)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -106,7 +106,7 @@
 TYPES:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public? final? [ResolvedTo(TYPES)] class MyClass<[ResolvedTo(TYPES)] Type> : R|kotlin/Any| {
@@ -114,7 +114,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public? final? inner [ResolvedTo(TYPES)] class Second<[ResolvedTo(TYPES)] Type2, [ResolvedTo(TYPES)] Type> : R|kotlin/Any| {
+            public? final? inner [ResolvedTo(TYPES)] class Second<[ResolvedTo(TYPES)] Type2, [ResolvedTo(TYPES)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(TYPES)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -127,7 +127,7 @@
 STATUS:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -135,7 +135,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(STATUS)] class Second<[ResolvedTo(STATUS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(STATUS)] class Second<[ResolvedTo(STATUS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(STATUS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -148,7 +148,7 @@
 EXPECT_ACTUAL_MATCHING:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
-    SCRIPT: [ResolvedTo(RAW_FIR)] 
+    SCRIPT: [ResolvedTo(RAW_FIR)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -156,7 +156,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(EXPECT_ACTUAL_MATCHING)] class Second<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(EXPECT_ACTUAL_MATCHING)] class Second<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(EXPECT_ACTUAL_MATCHING)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -169,7 +169,7 @@
 ARGUMENTS_OF_ANNOTATIONS:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -177,7 +177,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] class Second<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] class Second<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(ARGUMENTS_OF_ANNOTATIONS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -190,7 +190,7 @@
 CONTRACTS:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -198,7 +198,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(CONTRACTS)] class Second<[ResolvedTo(CONTRACTS)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(CONTRACTS)] class Second<[ResolvedTo(CONTRACTS)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(CONTRACTS)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -211,7 +211,7 @@
 IMPLICIT_TYPES_BODY_RESOLVE:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -219,7 +219,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] class Second<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] class Second<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -232,7 +232,7 @@
 ANNOTATIONS_ARGUMENTS_MAPPING:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -240,7 +240,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] class Second<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] class Second<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     LAZY_super<R|kotlin/Any|>
                 }
@@ -253,7 +253,7 @@
 BODY_RESOLVE:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(TYPES)] 
+    SCRIPT: [ResolvedTo(TYPES)]
         [ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(STATUS)] class MyClass<[ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
@@ -261,7 +261,7 @@
                 LAZY_super<R|kotlin/Any|>
             }
 
-            public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(STATUS)] Outer(Type)> : R|kotlin/Any| {
                 public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     super<R|kotlin/Any|>()
                 }
@@ -274,7 +274,7 @@
 FILE RAW TO BODY:
 FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass2Script.kts
     context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
-    SCRIPT: [ResolvedTo(BODY_RESOLVE)] 
+    SCRIPT: [ResolvedTo(BODY_RESOLVE)]
         [ResolvedTo(BODY_RESOLVE)] lval args: R|kotlin/Array<kotlin/String>|
 
         public final [ResolvedTo(BODY_RESOLVE)] class MyClass<[ResolvedTo(BODY_RESOLVE)] Type> : R|kotlin/Any| {
@@ -282,7 +282,7 @@
                 super<R|kotlin/Any|>()
             }
 
-            public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(BODY_RESOLVE)] Type> : R|kotlin/Any| {
+            public final inner [ResolvedTo(BODY_RESOLVE)] class Second<[ResolvedTo(BODY_RESOLVE)] Type2, [ResolvedTo(BODY_RESOLVE)] Outer(Type)> : R|kotlin/Any| {
                 public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Second] MyClass<Type>.constructor<[ResolvedTo(BODY_RESOLVE)] Type2>(): R|MyClass.Second<Type2, Type>| {
                     super<R|kotlin/Any|>()
                 }
diff --git a/analysis/low-level-api-fir/testdata/onAirResolve/classInClass.txt b/analysis/low-level-api-fir/testdata/onAirResolve/classInClass.txt
index 60d6766..cfa0130 100644
--- a/analysis/low-level-api-fir/testdata/onAirResolve/classInClass.txt
+++ b/analysis/low-level-api-fir/testdata/onAirResolve/classInClass.txt
@@ -1,4 +1,4 @@
-public final inner [ResolvedTo(BODY_RESOLVE)] class ONAIR<[ResolvedTo(STATUS)] T> : R|X.BASE| {
+public final inner [ResolvedTo(BODY_RESOLVE)] class ONAIR<[ResolvedTo(STATUS)] Outer(T)> : R|X.BASE| {
     public [ResolvedTo(BODY_RESOLVE)] X<T>.constructor(): R|X.ONAIR<T>| {
         super<R|X.BASE|>()
     }
diff --git a/compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.fir.txt b/compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.fir.txt
index 840c093..f791ada 100644
--- a/compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.fir.txt
@@ -19,7 +19,7 @@
 
         }
 
-        public final inner class LeafBuilderConfigurationContext<T : R|AbstractFirTreeBuilder|> : R|AbstractBuilderConfigurator.BuilderConfigurationContext| {
+        public final inner class LeafBuilderConfigurationContext<Outer(T) : R|AbstractFirTreeBuilder|> : R|AbstractBuilderConfigurator.BuilderConfigurationContext| {
             public AbstractBuilderConfigurator<T>.constructor(): R|AbstractBuilderConfigurator.LeafBuilderConfigurationContext<T>| {
                 super<R|AbstractBuilderConfigurator.BuilderConfigurationContext|>()
             }
@@ -43,7 +43,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Inner<E> : R|kotlin/Any| {
+        public final inner class Inner<Outer(E)> : R|kotlin/Any| {
             public Outer<E>.constructor(): R|Outer.Inner<E>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingProjection.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingProjection.fir.txt
index 5ee67bb..98cf735 100644
--- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingProjection.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/conflictingProjection.fir.txt
@@ -67,12 +67,12 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Intermediate<K, T> : R|kotlin/Any| {
+        public final inner class Intermediate<K, Outer(T)> : R|kotlin/Any| {
             public Outer<T>.constructor<K>(): R|Outer.Intermediate<K, T>| {
                 super<R|kotlin/Any|>()
             }
 
-            public final inner class Inner<G, K, T> : R|kotlin/Any| {
+            public final inner class Inner<G, Outer(K), Outer(T)> : R|kotlin/Any| {
                 public Outer.Intermediate<K, T>.constructor<G>(): R|Outer.Intermediate.Inner<G, K, T>| {
                     super<R|kotlin/Any|>()
                 }
@@ -114,12 +114,12 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class OutIntermediate<out K, in T> : R|kotlin/Any| {
+        public final inner class OutIntermediate<out K, in Outer(T)> : R|kotlin/Any| {
             public InOuter<T>.constructor<out K>(): R|InOuter.OutIntermediate<K, T>| {
                 super<R|kotlin/Any|>()
             }
 
-            public final inner class InInner<in G, out K, in T> : R|kotlin/Any| {
+            public final inner class InInner<in G, out Outer(K), in Outer(T)> : R|kotlin/Any| {
                 public InOuter.OutIntermediate<K, T>.constructor<in G>(): R|InOuter.OutIntermediate.InInner<G, K, T>| {
                     super<R|kotlin/Any|>()
                 }
@@ -161,12 +161,12 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class TwoParametersIntermediate<out K, K1, T, in T1> : R|kotlin/Any| {
+        public final inner class TwoParametersIntermediate<out K, K1, Outer(T), in Outer(T1)> : R|kotlin/Any| {
             public TwoParametersOuter<T, T1>.constructor<out K, K1>(): R|TwoParametersOuter.TwoParametersIntermediate<K, K1, T, T1>| {
                 super<R|kotlin/Any|>()
             }
 
-            public final inner class InInner<in G, G1, out K, K1, T, in T1> : R|kotlin/Any| {
+            public final inner class InInner<in G, G1, out Outer(K), Outer(K1), Outer(T), in Outer(T1)> : R|kotlin/Any| {
                 public TwoParametersOuter.TwoParametersIntermediate<K, K1, T, T1>.constructor<in G, G1>(): R|TwoParametersOuter.TwoParametersIntermediate.InInner<G, G1, K, K1, T, T1>| {
                     super<R|kotlin/Any|>()
                 }
diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt
index a1ef651..cb14558 100644
--- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt
@@ -44,7 +44,7 @@
         public final fun <T1, T2> foo2(): R|kotlin/Unit| {
         }
 
-        internal final inner class B<T, T2, T1, T2 : R|T1|> : R|kotlin/Any| {
+        internal final inner class B<T, T2, Outer(T1), Outer(T2) : R|T1|> : R|kotlin/Any| {
             public Foo2<T1, T2>.constructor<T, T2>(): R|Foo2.B<T, T2, T1, T2>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt
index 5b382e9..449283a 100644
--- a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt
@@ -6,7 +6,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class D<R, in P, T, out S> : R|kotlin/Any| {
+        public final inner class D<R, in P, Outer(T), out Outer(S)> : R|kotlin/Any| {
             public a/b/C<T, S>.constructor<R, in P>(): R|a/b/C.D<R, P, T, S>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypeFromSuperClassInBody.fir.txt b/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypeFromSuperClassInBody.fir.txt
index 596a06b..671f0ae 100644
--- a/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypeFromSuperClassInBody.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypeFromSuperClassInBody.fir.txt
@@ -4,7 +4,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Inner<X : R|kotlin/CharSequence|> : R|kotlin/Any| {
+        public final inner class Inner<Outer(X) : R|kotlin/CharSequence|> : R|kotlin/Any| {
             public A<X>.constructor(): R|A.Inner<X>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypes.fir.txt b/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypes.fir.txt
index f76469e..83e437d 100644
--- a/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypes.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/innerClasses/innerTypes.fir.txt
@@ -4,7 +4,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Inner<K, T> : R|kotlin/Any| {
+        public final inner class Inner<K, Outer(T)> : R|kotlin/Any| {
             public Outer<T>.constructor<K>(): R|Outer.Inner<K, T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.fir.txt b/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.fir.txt
index bd75a97..8ca5c9d 100644
--- a/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/references/incorrectReferenceOnInnerClassMember.fir.txt
@@ -6,7 +6,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Inner<T> : R|kotlin/Any| {
+        public final inner class Inner<Outer(T)> : R|kotlin/Any| {
             public foo/Outer<T>.constructor(): R|foo/Outer.Inner<T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/throwableSubclass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/throwableSubclass.fir.txt
index ed4ec31..35b9cce 100644
--- a/compiler/fir/analysis-tests/testData/resolve/throwableSubclass.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/throwableSubclass.fir.txt
@@ -4,7 +4,7 @@
             super<R|kotlin/Exception|>()
         }
 
-        public final inner class Test2<S, T, B> : R|kotlin/Throwable| {
+        public final inner class Test2<S, Outer(T), Outer(B)> : R|kotlin/Throwable| {
             public Test1<T, B>.constructor<S>(): R|Test1.Test2<S, T, B>| {
                 super<R|kotlin/Throwable|>()
             }
@@ -31,7 +31,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class Test6<T, B> : R|kotlin/Exception| {
+        public final inner class Test6<Outer(T), Outer(B)> : R|kotlin/Exception| {
             public Test5<T, B>.constructor(): R|Test5.Test6<T, B>| {
                 super<R|kotlin/Exception|>()
             }
@@ -39,7 +39,7 @@
         }
 
         public final fun foo(): R|kotlin/Unit| {
-            local final class Test7<T, B> : R|kotlin/Throwable| {
+            local final class Test7<Outer(T), Outer(B)> : R|kotlin/Throwable| {
                 public constructor(): R|Test5.Test7<T, B>| {
                     super<R|kotlin/Throwable|>()
                 }
@@ -50,7 +50,7 @@
 
     }
     public final fun <Z> topLevelFun(): R|kotlin/Unit| {
-        local final class Test8<Z> : R|kotlin/Error| {
+        local final class Test8<Outer(Z)> : R|kotlin/Error| {
             public constructor(): R|Test8<Z>| {
                 super<R|kotlin/Error|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolve/types/capturedParametersOfInnerClasses.fir.txt b/compiler/fir/analysis-tests/testData/resolve/types/capturedParametersOfInnerClasses.fir.txt
index 4e860d7..e3de404 100644
--- a/compiler/fir/analysis-tests/testData/resolve/types/capturedParametersOfInnerClasses.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/types/capturedParametersOfInnerClasses.fir.txt
@@ -4,12 +4,12 @@
             super<R|kotlin/Any|>()
         }
 
-        public final inner class B<K1, K2, T1, T2> : R|kotlin/Any| {
+        public final inner class B<K1, K2, Outer(T1), Outer(T2)> : R|kotlin/Any| {
             public A<T1, T2>.constructor<K1, K2>(): R|A.B<K1, K2, T1, T2>| {
                 super<R|kotlin/Any|>()
             }
 
-            public final inner class C<U1, U2, K1, K2, T1, T2> : R|kotlin/Any| {
+            public final inner class C<U1, U2, Outer(K1), Outer(K2), Outer(T1), Outer(T2)> : R|kotlin/Any| {
                 public A.B<K1, K2, T1, T2>.constructor<U1, U2>(): R|A.B.C<U1, U2, K1, K2, T1, T2>| {
                     super<R|kotlin/Any|>()
                 }
diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/InnerClassOfThrowableOnObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/InnerClassOfThrowableOnObject.fir.txt
index 396f1e2b..1af3cbb 100644
--- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/InnerClassOfThrowableOnObject.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/InnerClassOfThrowableOnObject.fir.txt
@@ -38,7 +38,7 @@
 
         }
 
-        public final inner class Inner<T> : R|kotlin/Any| {
+        public final inner class Inner<Outer(T)> : R|kotlin/Any| {
             public Generic<T>.constructor(): R|Generic.Inner<T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt
index a438205..3a95d66 100644
--- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/baseIntrospector.fir.txt
@@ -13,7 +13,7 @@
 
         protected abstract fun createDatabaseRetriever(database: R|D|): R|m1/BaseIntrospector.AbstractDatabaseRetriever<out D, D, S>|
 
-        protected abstract inner class AbstractDatabaseRetriever<D : R|m1/BasicDatabase|, D : R|m1/BasicDatabase|, S : R|m1/BasicSchema|> : R|m1/BaseIntrospector.AbstractRetriever<D, S>| {
+        protected abstract inner class AbstractDatabaseRetriever<D : R|m1/BasicDatabase|, Outer(D) : R|m1/BasicDatabase|, Outer(S) : R|m1/BasicSchema|> : R|m1/BaseIntrospector.AbstractRetriever<D, S>| {
             protected m1/BaseIntrospector<D, S>.constructor<D : R|m1/BasicDatabase|>(database: R|D|): R|m1/BaseIntrospector.AbstractDatabaseRetriever<D, D, S>| {
                 this@R|m1/BaseIntrospector|.super<R|m1/BaseIntrospector.AbstractRetriever<D, S>|>()
             }
@@ -23,7 +23,7 @@
 
         }
 
-        protected abstract inner class AbstractRetriever<D : R|m1/BasicDatabase|, S : R|m1/BasicSchema|> : R|kotlin/Any| {
+        protected abstract inner class AbstractRetriever<Outer(D) : R|m1/BasicDatabase|, Outer(S) : R|m1/BasicSchema|> : R|kotlin/Any| {
             public m1/BaseIntrospector<D, S>.constructor(): R|m1/BaseIntrospector.AbstractRetriever<D, S>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/KJKComplexHierarchyWithNested.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/KJKComplexHierarchyWithNested.fir.txt
index 367eb1b..470d6fe 100644
--- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/KJKComplexHierarchyWithNested.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/KJKComplexHierarchyWithNested.fir.txt
@@ -24,7 +24,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public open inner class NestedInSuperClass<T> : R|kotlin/Any| {
+        public open inner class NestedInSuperClass<Outer(T)> : R|kotlin/Any| {
             public SuperClass<T>.constructor(): R|SuperClass.NestedInSuperClass<T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.lazyBodies.txt
index 0a5ddec..a97a72d 100644
--- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.lazyBodies.txt
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.lazyBodies.txt
@@ -4,7 +4,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner class D<R, in P, T, out S> : R|kotlin/Any| {
+        public? final? inner class D<R, in P, Outer(T), out Outer(S)> : R|kotlin/Any| {
             public? a/b/C<T, S>.constructor<R, in P>(): R|a/b/C.D<R, P, T, S>| {
                 LAZY_super<R|kotlin/Any|>
             }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.txt
index 3eed4dc..7b1767d 100644
--- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.txt
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.txt
@@ -4,7 +4,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public? final? inner class D<R, in P, T, out S> : R|kotlin/Any| {
+        public? final? inner class D<R, in P, Outer(T), out Outer(S)> : R|kotlin/Any| {
             public? [ContainingClassKey=D] a/b/C<T, S>.constructor<R, in P>(): R|a/b/C.D<R, P, T, S>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.lazyBodies.txt
index 7486022..11725fb 100644
--- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.lazyBodies.txt
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.lazyBodies.txt
@@ -6,7 +6,7 @@
             LAZY_super<R|kotlin/Any|>
         }
 
-        public? final? inner class T<T : Some> : R|kotlin/Any| {
+        public? final? inner class T<Outer(T) : Some> : R|kotlin/Any| {
             public? test/My<T>.constructor(): R|test/My.T<T>| {
                 LAZY_super<R|kotlin/Any|>
             }
diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.txt
index 1cf69b7..c0a4eaa 100644
--- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.txt
+++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.txt
@@ -6,7 +6,7 @@
             super<R|kotlin/Any|>()
         }
 
-        public? final? inner class T<T : Some> : R|kotlin/Any| {
+        public? final? inner class T<Outer(T) : Some> : R|kotlin/Any| {
             public? [ContainingClassKey=T] test/My<T>.constructor(): R|test/My.T<T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
index e7621e8..f8123cd 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
@@ -269,7 +269,7 @@
         }
 
         override fun visitOuterClassTypeParameterRef(outerClassTypeParameterRef: FirOuterClassTypeParameterRef) {
-            visitTypeParameterRef(outerClassTypeParameterRef)
+            renderTypeParameter(outerClassTypeParameterRef.symbol.fir, forOuterTypeRef = true)
         }
 
         override fun visitConstructedClassTypeParameterRef(constructedClassTypeParameterRef: FirConstructedClassTypeParameterRef) {
@@ -466,11 +466,20 @@
         }
 
         override fun visitTypeParameter(typeParameter: FirTypeParameter) {
+            renderTypeParameter(typeParameter)
+        }
+
+        private fun renderTypeParameter(typeParameter: FirTypeParameter, forOuterTypeRef: Boolean = false) {
             annotationRenderer?.render(typeParameter)
             modifierRenderer?.renderModifiers(typeParameter)
             resolvePhaseRenderer?.render(typeParameter)
             typeParameter.variance.renderVariance()
-            print(typeParameter.name)
+
+            if (!forOuterTypeRef) {
+                print(typeParameter.name)
+            } else {
+                print("Outer(${typeParameter.name})")
+            }
 
             val meaningfulBounds = typeParameter.bounds.filter {
                 if (it !is FirResolvedTypeRef) return@filter true
diff --git a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt
index 1af7b8a..5391bfd 100644
--- a/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt
+++ b/compiler/testData/diagnostics/tests/visibility/privateToThis.fir.txt
@@ -23,7 +23,7 @@
             R|<local>/a|.R|SubstitutionOverride</A.t: R|CapturedType(*)|><HIDDEN: /A.t is invisible>#|
         }
 
-        public final inner class B<in T> : R|kotlin/Any| {
+        public final inner class B<in Outer(T)> : R|kotlin/Any| {
             public A<T>.constructor(): R|A.B<T>| {
                 super<R|kotlin/Any|>()
             }
diff --git a/compiler/testData/loadJava/compiledJava/InnerClassReferencesOuterTP.fir.txt b/compiler/testData/loadJava/compiledJava/InnerClassReferencesOuterTP.fir.txt
index 1937cc2..4d41a38 100644
--- a/compiler/testData/loadJava/compiledJava/InnerClassReferencesOuterTP.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/InnerClassReferencesOuterTP.fir.txt
@@ -1,7 +1,7 @@
 public open class InnerClassReferencesOuterTP<P : R|kotlin/Any!|> : R|kotlin/Any| {
     public constructor<P : R|kotlin/Any!|>(): R|test/InnerClassReferencesOuterTP<P>|
 
-    public open inner class Inner<Q : R|ft<P & Any, P?>|, P : R|kotlin/Any!|> : R|kotlin/Any| {
+    public open inner class Inner<Q : R|ft<P & Any, P?>|, Outer(P) : R|kotlin/Any!|> : R|kotlin/Any| {
         public test/InnerClassReferencesOuterTP<P>.constructor<Q : R|ft<P & Any, P?>|>(): R|test/InnerClassReferencesOuterTP.Inner<Q, P>|
 
     }
diff --git a/compiler/testData/loadJava/compiledJava/InnerClassTypeMultipleGeneric.fir.txt b/compiler/testData/loadJava/compiledJava/InnerClassTypeMultipleGeneric.fir.txt
index 5f63b4e..5ae3060 100644
--- a/compiler/testData/loadJava/compiledJava/InnerClassTypeMultipleGeneric.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/InnerClassTypeMultipleGeneric.fir.txt
@@ -6,7 +6,7 @@
     public open inner class BaseOuter<H1 : R|kotlin/Any!|, H2 : R|kotlin/Any!|> : R|kotlin/Any| {
         public test/InnerClassTypeMultipleGeneric.constructor<H1 : R|kotlin/Any!|, H2 : R|kotlin/Any!|>(): R|test/InnerClassTypeMultipleGeneric.BaseOuter<H1, H2>|
 
-        public abstract inner class BaseInner<H3 : R|kotlin/Any!|, H4 : R|kotlin/Any!|, H1 : R|kotlin/Any!|, H2 : R|kotlin/Any!|> : R|kotlin/Any| {
+        public abstract inner class BaseInner<H3 : R|kotlin/Any!|, H4 : R|kotlin/Any!|, Outer(H1) : R|kotlin/Any!|, Outer(H2) : R|kotlin/Any!|> : R|kotlin/Any| {
             public test/InnerClassTypeMultipleGeneric.BaseOuter<H1, H2>.constructor<H3 : R|kotlin/Any!|, H4 : R|kotlin/Any!|>(): R|test/InnerClassTypeMultipleGeneric.BaseOuter.BaseInner<H3, H4, H1, H2>|
 
         }
@@ -16,7 +16,7 @@
 
         public test/InnerClassTypeMultipleGeneric.constructor<E1 : R|kotlin/Any!|, E2 : R|kotlin/Any!|>(): R|test/InnerClassTypeMultipleGeneric.Outer<E1, E2>|
 
-        public open inner class Inner<E3 : R|kotlin/Any!|, E1 : R|kotlin/Any!|, E2 : R|kotlin/Any!|> : R|test/InnerClassTypeMultipleGeneric.BaseOuter.BaseInner<kotlin/Double!, kotlin/String!, ft<E2 & Any, E2?>, ft<E3 & Any, E3?>>| {
+        public open inner class Inner<E3 : R|kotlin/Any!|, Outer(E1) : R|kotlin/Any!|, Outer(E2) : R|kotlin/Any!|> : R|test/InnerClassTypeMultipleGeneric.BaseOuter.BaseInner<kotlin/Double!, kotlin/String!, ft<E2 & Any, E2?>, ft<E3 & Any, E3?>>| {
             public test/InnerClassTypeMultipleGeneric.Outer<E1, E2>.constructor<E3 : R|kotlin/Any!|>(): R|test/InnerClassTypeMultipleGeneric.Outer.Inner<E3, E1, E2>|
 
         }
diff --git a/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.fir.txt b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.fir.txt
index e604ed7..f277fb1 100644
--- a/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.fir.txt
@@ -1,11 +1,11 @@
 public open class InnerClassesInGeneric<P : R|kotlin/Any!|, Q : R|kotlin/Any!|> : R|kotlin/Any| {
     public constructor<P : R|kotlin/Any!|, Q : R|kotlin/Any!|>(): R|test/InnerClassesInGeneric<P, Q>|
 
-    public open inner class Inner<P : R|kotlin/Any!|, Q : R|kotlin/Any!|> : R|kotlin/Any| {
+    public open inner class Inner<Outer(P) : R|kotlin/Any!|, Outer(Q) : R|kotlin/Any!|> : R|kotlin/Any| {
         public test/InnerClassesInGeneric<P, Q>.constructor(): R|test/InnerClassesInGeneric.Inner<P, Q>|
 
     }
-    public open inner class Inner2<P : R|kotlin/Any!|, Q : R|kotlin/Any!|> : R|test/InnerClassesInGeneric.Inner<ft<P & Any, P?>, ft<Q & Any, Q?>>| {
+    public open inner class Inner2<Outer(P) : R|kotlin/Any!|, Outer(Q) : R|kotlin/Any!|> : R|test/InnerClassesInGeneric.Inner<ft<P & Any, P?>, ft<Q & Any, Q?>>| {
         public open operator fun iterator(): R|ft<kotlin/collections/MutableIterator<ft<P & Any, P?>>, kotlin/collections/Iterator<ft<P & Any, P?>>?>|
 
         public test/InnerClassesInGeneric<P, Q>.constructor(): R|test/InnerClassesInGeneric.Inner2<P, Q>|
diff --git a/compiler/testData/loadJava/compiledJava/InnerOfGeneric.fir.txt b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.fir.txt
index 78c5f51..41e41ad 100644
--- a/compiler/testData/loadJava/compiledJava/InnerOfGeneric.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.fir.txt
@@ -4,7 +4,7 @@
     public abstract inner class A<K : R|kotlin/Any!|> : R|kotlin/Any| {
         public test/InnerOfGeneric.constructor<K : R|kotlin/Any!|>(): R|test/InnerOfGeneric.A<K>|
 
-        public abstract inner class Inner<K : R|kotlin/Any!|> : R|test/InnerOfGeneric.S<ft<K & Any, K?>>| {
+        public abstract inner class Inner<Outer(K) : R|kotlin/Any!|> : R|test/InnerOfGeneric.S<ft<K & Any, K?>>| {
             public test/InnerOfGeneric.A<K>.constructor(): R|test/InnerOfGeneric.A.Inner<K>|
 
         }
@@ -12,7 +12,7 @@
     public open inner class B<L : R|kotlin/Any!|> : R|test/InnerOfGeneric.A<ft<L & Any, L?>>| {
         public test/InnerOfGeneric.constructor<L : R|kotlin/Any!|>(): R|test/InnerOfGeneric.B<L>|
 
-        public open inner class SubInner<L : R|kotlin/Any!|> : R|test/InnerOfGeneric.A.Inner<ft<L & Any, L?>>| {
+        public open inner class SubInner<Outer(L) : R|kotlin/Any!|> : R|test/InnerOfGeneric.A.Inner<ft<L & Any, L?>>| {
             @R|java/lang/Override|() public open operator fun iterator(): R|ft<kotlin/collections/MutableIterator<ft<L & Any, L?>>, kotlin/collections/Iterator<ft<L & Any, L?>>?>|
 
             public test/InnerOfGeneric.B<L>.constructor(): R|test/InnerOfGeneric.B.SubInner<L>|
diff --git a/compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.fir.txt b/compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.fir.txt
index 7204a94..ced6ac2 100644
--- a/compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.fir.txt
@@ -1,7 +1,7 @@
 public final class MethodReferencesOuterClassTP<P : R|kotlin/Any!|> : R|kotlin/Any| {
     public constructor<P : R|kotlin/Any!|>(): R|test/MethodReferencesOuterClassTP<P>|
 
-    public final inner class Inner<P : R|kotlin/Any!|> : R|kotlin/Any| {
+    public final inner class Inner<Outer(P) : R|kotlin/Any!|> : R|kotlin/Any| {
         public final fun <Q : R|ft<P & Any, P?>|> f(): R|kotlin/Unit|
 
         public test/MethodReferencesOuterClassTP<P>.constructor(): R|test/MethodReferencesOuterClassTP.Inner<P>|
diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfOuterClass.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfOuterClass.fir.txt
index 2ebb843..85916bb 100644
--- a/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfOuterClass.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfOuterClass.fir.txt
@@ -1,7 +1,7 @@
 public open class TypeParameterOfOuterClass<T : R|kotlin/Any!|> : R|kotlin/Any| {
     public constructor<T : R|kotlin/Any!|>(): R|test/TypeParameterOfOuterClass<T>|
 
-    public open inner class Inner<T : R|kotlin/Any!|> : R|kotlin/Any| {
+    public open inner class Inner<Outer(T) : R|kotlin/Any!|> : R|kotlin/Any| {
         public open fun foo(comparator: R|ft<java/util/Comparator<ft<T & Any, T?>>, java/util/Comparator<ft<T & Any, T?>>?>|): R|kotlin/Unit|
 
         public test/TypeParameterOfOuterClass<T>.constructor(): R|test/TypeParameterOfOuterClass.Inner<T>|
diff --git a/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.fir.txt b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.fir.txt
index 1b99af5..4964d6e 100644
--- a/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.fir.txt
+++ b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.fir.txt
@@ -2,7 +2,7 @@
     public open class Sub<B : R|kotlin/Any!|> : R|test/ReturnInnerSubclassOfSupersInner.Super<ft<B & Any, B?>>| {
         public constructor<B : R|kotlin/Any!|>(): R|test/ReturnInnerSubclassOfSupersInner.Sub<B>|
 
-        public/*package*/ open inner class Inner<B : R|kotlin/Any!|> : R|test/ReturnInnerSubclassOfSupersInner.Super.Inner<ft<B & Any, B?>>| {
+        public/*package*/ open inner class Inner<Outer(B) : R|kotlin/Any!|> : R|test/ReturnInnerSubclassOfSupersInner.Super.Inner<ft<B & Any, B?>>| {
             public/*package*/ open fun get(): R|ft<test/ReturnInnerSubclassOfSupersInner.Sub<ft<B & Any, B?>>, test/ReturnInnerSubclassOfSupersInner.Sub<ft<B & Any, B?>>?>|
 
             public/*package*/ test/ReturnInnerSubclassOfSupersInner.Sub<B>.constructor(): R|test/ReturnInnerSubclassOfSupersInner.Sub.Inner<B>|
@@ -12,7 +12,7 @@
     public open class Super<A : R|kotlin/Any!|> : R|kotlin/Any| {
         public constructor<A : R|kotlin/Any!|>(): R|test/ReturnInnerSubclassOfSupersInner.Super<A>|
 
-        public/*package*/ open inner class Inner<A : R|kotlin/Any!|> : R|kotlin/Any| {
+        public/*package*/ open inner class Inner<Outer(A) : R|kotlin/Any!|> : R|kotlin/Any| {
             public/*package*/ open fun get(): R|ft<test/ReturnInnerSubclassOfSupersInner.Super<ft<A & Any, A?>>, test/ReturnInnerSubclassOfSupersInner.Super<ft<A & Any, A?>>?>|
 
             public/*package*/ test/ReturnInnerSubclassOfSupersInner.Super<A>.constructor(): R|test/ReturnInnerSubclassOfSupersInner.Super.Inner<A>|
diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k1.txt b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k1.txt
index b3e1617..5cd0547 100644
--- a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k1.txt
+++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k1.txt
@@ -27,7 +27,7 @@
 public final class InnerGeneric<A, B> : R|kotlin/Any| {
     public constructor<A, B>(): R|test/InnerGeneric<A, B>|
 
-    public final inner class Inner<in C, D : R|A|, A, B> : R|kotlin/Any| {
+    public final inner class Inner<in C, D : R|A|, Outer(A), Outer(B)> : R|kotlin/Any| {
         public test/InnerGeneric<A, B>.constructor<in C, D : R|A|>(): R|test/InnerGeneric.Inner<C, D, A, B>|
 
     }
diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k2.txt b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k2.txt
index 895810f..9a28a3e 100644
--- a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k2.txt
+++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.fir.k2.txt
@@ -27,7 +27,7 @@
 public final class InnerGeneric<A, B> : R|kotlin/Any| {
     public constructor<A, B>(): R|test/InnerGeneric<A, B>|
 
-    public final inner class Inner<in C, D : R|A|, A, B> : R|kotlin/Any| {
+    public final inner class Inner<in C, D : R|A|, Outer(A), Outer(B)> : R|kotlin/Any| {
         public test/InnerGeneric<A, B>.constructor<in C, D : R|A|>(): R|test/InnerGeneric.Inner<C, D, A, B>|
 
     }
diff --git a/compiler/testData/loadJava/compiledKotlin/class/InnerTypes.fir.txt b/compiler/testData/loadJava/compiledKotlin/class/InnerTypes.fir.txt
index 1e33bec..2fd128d8 100644
--- a/compiler/testData/loadJava/compiledKotlin/class/InnerTypes.fir.txt
+++ b/compiler/testData/loadJava/compiledKotlin/class/InnerTypes.fir.txt
@@ -3,10 +3,10 @@
 
     public constructor<E, F>(): R|test/Outer<E, F>|
 
-    public final inner class Inner<G, H, E, F> : R|kotlin/Any| {
+    public final inner class Inner<G, H, Outer(E), Outer(F)> : R|kotlin/Any| {
         public test/Outer<E, F>.constructor<G, H>(): R|test/Outer.Inner<G, H, E, F>|
 
-        public final inner class Inner3<I, G, H, E, F> : R|kotlin/Any| {
+        public final inner class Inner3<I, Outer(G), Outer(H), Outer(E), Outer(F)> : R|kotlin/Any| {
             public final fun foo(x: R|test/Outer.Inner<G, kotlin/Int, kotlin/String, F>|, y: R|test/Outer.Inner<E, kotlin/Double, E, F>|, z: R|test/Outer.Inner.Inner3<kotlin/Double, G, kotlin/Int, kotlin/String, F>|, w: R|test/Outer.Inner.Inner3<*, G, H, E, F>|): R|kotlin/Unit|
 
             public test/Outer.Inner<G, H, E, F>.constructor<I>(): R|test/Outer.Inner.Inner3<I, G, H, E, F>|
@@ -15,7 +15,7 @@
 
     }
 
-    public final inner class Inner2<E, F> : R|kotlin/Any| {
+    public final inner class Inner2<Outer(E), Outer(F)> : R|kotlin/Any| {
         public test/Outer<E, F>.constructor(): R|test/Outer.Inner2<E, F>|
 
     }
diff --git a/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k1.txt b/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k1.txt
index 384216a..6c0ee91 100644
--- a/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k1.txt
+++ b/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k1.txt
@@ -1,13 +1,13 @@
 public final class A<TA> : R|kotlin/Any| {
     public constructor<TA>(): R|test/A<TA>|
 
-    public final inner class B<TB, TA> : R|kotlin/Any| {
+    public final inner class B<TB, Outer(TA)> : R|kotlin/Any| {
         public test/A<TA>.constructor<TB>(): R|test/A.B<TB, TA>|
 
-        public final inner class C<TC, TB, TA> : R|kotlin/Any| {
+        public final inner class C<TC, Outer(TB), Outer(TA)> : R|kotlin/Any| {
             public test/A.B<TB, TA>.constructor<TC>(): R|test/A.B.C<TC, TB, TA>|
 
-            public final inner class D<TD, TC, TB, TA> : R|kotlin/Any| {
+            public final inner class D<TD, Outer(TC), Outer(TB), Outer(TA)> : R|kotlin/Any| {
                 public final fun bar(ta: R|TA|, tb: R|TB|, tc: R|TC|, td: R|TD|): R|test/A.B.C.D<TD, TC, TB, TA>|
 
                 public final fun <P1, P2, P3, P4> foo(p1: R|P1|, p2: R|P2|, p3: R|P3|, p4: R|P4|): R|kotlin/Nothing|
diff --git a/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k2.txt b/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k2.txt
index 29d017f..3a4f417 100644
--- a/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k2.txt
+++ b/compiler/testData/loadJava/compiledKotlin/nestedClasses/deepInnerGeneric.fir.k2.txt
@@ -1,13 +1,13 @@
 public final class A<TA> : R|kotlin/Any| {
     public constructor<TA>(): R|test/A<TA>|
 
-    public final inner class B<TB, TA> : R|kotlin/Any| {
+    public final inner class B<TB, Outer(TA)> : R|kotlin/Any| {
         public test/A<TA>.constructor<TB>(): R|test/A.B<TB, TA>|
 
-        public final inner class C<TC, TB, TA> : R|kotlin/Any| {
+        public final inner class C<TC, Outer(TB), Outer(TA)> : R|kotlin/Any| {
             public test/A.B<TB, TA>.constructor<TC>(): R|test/A.B.C<TC, TB, TA>|
 
-            public final inner class D<TD, TC, TB, TA> : R|kotlin/Any| {
+            public final inner class D<TD, Outer(TC), Outer(TB), Outer(TA)> : R|kotlin/Any| {
                 public final fun <P1, P2, P3, P4> foo(p1: R|P1|, p2: R|P2|, p3: R|P3|, p4: R|P4|): R|kotlin/Nothing|
 
                 public final fun bar(ta: R|TA|, tb: R|TB|, tc: R|TC|, td: R|TD|): R|test/A.B.C.D<TD, TC, TB, TA>|
diff --git a/compiler/testData/loadJava/compiledKotlin/nestedClasses/innerClassReferencesOuterTP.fir.txt b/compiler/testData/loadJava/compiledKotlin/nestedClasses/innerClassReferencesOuterTP.fir.txt
index d42158d..2184a06 100644
--- a/compiler/testData/loadJava/compiledKotlin/nestedClasses/innerClassReferencesOuterTP.fir.txt
+++ b/compiler/testData/loadJava/compiledKotlin/nestedClasses/innerClassReferencesOuterTP.fir.txt
@@ -1,7 +1,7 @@
 public final class InnerClassReferencesOuterTP<P> : R|kotlin/Any| {
     public constructor<P>(): R|test/InnerClassReferencesOuterTP<P>|
 
-    public final inner class Inner<Q : R|P|, P> : R|kotlin/Any| {
+    public final inner class Inner<Q : R|P|, Outer(P)> : R|kotlin/Any| {
         public test/InnerClassReferencesOuterTP<P>.constructor<Q : R|P|>(): R|test/InnerClassReferencesOuterTP.Inner<Q, P>|
 
     }
diff --git a/compiler/testData/loadJava/compiledKotlin/nestedClasses/membersReferenceOuterTP.fir.txt b/compiler/testData/loadJava/compiledKotlin/nestedClasses/membersReferenceOuterTP.fir.txt
index 9329351..11addb8 100644
--- a/compiler/testData/loadJava/compiledKotlin/nestedClasses/membersReferenceOuterTP.fir.txt
+++ b/compiler/testData/loadJava/compiledKotlin/nestedClasses/membersReferenceOuterTP.fir.txt
@@ -1,7 +1,7 @@
 public final class MembersReferenceOuterTP<P> : R|kotlin/Any| {
     public constructor<P>(): R|test/MembersReferenceOuterTP<P>|
 
-    public final inner class Inner<P> : R|kotlin/Any| {
+    public final inner class Inner<Outer(P)> : R|kotlin/Any| {
         public final fun <Q : R|P|> f(): R|kotlin/Unit|
 
         public final fun g(p: R|P|): R|P|