diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
index 1eadd8f..c675ed2 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt
@@ -27,7 +27,6 @@
 import org.jetbrains.kotlin.fir.symbols.impl.*
 import org.jetbrains.kotlin.fir.types.*
 import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
-import org.jetbrains.kotlin.fir.visitors.FirVisitor
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.builders.*
@@ -355,7 +354,7 @@
             if (firOverriddenSymbol != null && this is IrSimpleFunction && firFunctionSymbol != null) {
                 val overriddenSymbol = declarationStorage.getIrFunctionSymbol(firOverriddenSymbol)
                 if (overriddenSymbol is IrSimpleFunctionSymbol) {
-                    overriddenSymbols += overriddenSymbol
+                    overridden += overriddenSymbol
                 }
             }
             body = firFunction?.body?.convertToIrBlockBody()
@@ -547,7 +546,7 @@
             if (firOverriddenSymbol != null && backingField != null) {
                 val overriddenSymbol = declarationStorage.getIrPropertyOrFieldSymbol(firOverriddenSymbol.fir.backingFieldSymbol)
                 if (overriddenSymbol is IrFieldSymbol) {
-                    backingField.overriddenSymbols += overriddenSymbol
+                    backingField.overridden += overriddenSymbol
                 }
             }
         }
@@ -556,14 +555,14 @@
             property.getter, this, propertyType, property.getter is FirDefaultPropertyGetter, property.getter == null
         )
         getter?.apply {
-            overriddenProperty?.owner?.getter?.symbol?.let { overriddenSymbols += it }
+            overriddenProperty?.owner?.getter?.symbol?.let { overridden += it }
         }
         if (property.isVar) {
             setter?.setPropertyAccessorContent(
                 property.setter, this, propertyType, property.setter is FirDefaultPropertySetter, property.setter == null
             )
             setter?.apply {
-                overriddenProperty?.owner?.setter?.symbol?.let { overriddenSymbols += it }
+                overriddenProperty?.owner?.setter?.symbol?.let { overridden += it }
             }
         }
         property.annotations.forEach {
@@ -739,7 +738,7 @@
                         }
                     }
                 } else {
-                    val name = if (this is IrCallImpl) symbol.owner.name else "???"
+                    val name = if (this is IrCallImpl) target.name else "???"
                     IrErrorCallExpressionImpl(
                         startOffset, endOffset, type,
                         "Cannot bind $argumentsCount arguments to $name call with $valueArgumentsCount parameters"
@@ -762,14 +761,13 @@
     private fun IrExpression.applyReceivers(qualifiedAccess: FirQualifiedAccess): IrExpression {
         return when (this) {
             is IrCallImpl -> {
-                val ownerFunction = symbol.owner
-                if (ownerFunction.dispatchReceiverParameter != null) {
+                if (target.dispatchReceiverParameter != null) {
                     dispatchReceiver = qualifiedAccess.dispatchReceiver.takeIf { it !is FirNoReceiverExpression }?.toIrExpression()
                         ?: qualifiedAccess.explicitReceiver?.toIrExpression() // NB: this applies to the situation when call is unresolved
                     if (dispatchReceiver == null) {
                         throw AssertionError()
                     }
-                } else if (ownerFunction.extensionReceiverParameter != null) {
+                } else if (target.extensionReceiverParameter != null) {
                     extensionReceiver = qualifiedAccess.extensionReceiver.takeIf { it !is FirNoReceiverExpression }?.toIrExpression()
                         ?: qualifiedAccess.explicitReceiver?.toIrExpression()
                     if (extensionReceiver == null) {
@@ -779,8 +777,7 @@
                 this
             }
             is IrFieldExpressionBase -> {
-                val ownerField = symbol.owner
-                if (!ownerField.isStatic) {
+                if (!target.isStatic) {
                     receiver = qualifiedAccess.dispatchReceiver.takeIf { it !is FirNoReceiverExpression }?.toIrExpression()
                         ?: qualifiedAccess.explicitReceiver?.toIrExpression()
                 }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt
index 0611257..0ec103e 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt
@@ -25,7 +25,6 @@
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
 import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.*
-import org.jetbrains.kotlin.ir.types.defaultType
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
 import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
@@ -63,7 +62,8 @@
         ensureTypesEqual(type, expectedType)
     }
 
-    private fun IrSymbol.ensureBound(expression: IrExpression) {
+    private fun IrSymbolOwner.ensureBound(expression: IrExpression) {
+        if (this !is IrSymbol) return
         if (!this.isBound && expression.type !is IrDynamicType) {
             reportError(expression, "Unbound symbol ${this}")
         }
@@ -102,7 +102,7 @@
     override fun visitGetObjectValue(expression: IrGetObjectValue) {
         super.visitGetObjectValue(expression)
 
-        expression.ensureTypeIs(expression.symbol.createType(false, emptyList()))
+        expression.ensureTypeIs(expression.target.createType(false, emptyList()))
     }
 
     // TODO: visitGetEnumValue
@@ -110,7 +110,7 @@
     override fun visitGetValue(expression: IrGetValue) {
         super.visitGetValue(expression)
 
-        expression.ensureTypeIs(expression.symbol.owner.type)
+        expression.ensureTypeIs(expression.target.type)
     }
 
     override fun visitSetVariable(expression: IrSetVariable) {
@@ -122,7 +122,7 @@
     override fun visitGetField(expression: IrGetField) {
         super.visitGetField(expression)
 
-        val fieldType = expression.symbol.owner.type
+        val fieldType = expression.target.type
         // TODO: We don't have the proper type substitution yet, so skip generics for now.
         if (fieldType is IrSimpleType &&
                 fieldType.classifier is IrClassSymbol &&
@@ -141,14 +141,14 @@
     override fun visitCall(expression: IrCall) {
         super.visitCall(expression)
 
-        val function = expression.symbol.owner
+        val function = expression.target
 
         if (function.dispatchReceiverParameter?.type is IrDynamicType) {
             reportError(expression, "Dispatch receivers with 'dynamic' type are not allowed")
         }
         // TODO: Why don't we check parameters as well?
 
-        val returnType = expression.symbol.owner.returnType
+        val returnType = expression.target.returnType
         // TODO: We don't have the proper type substitution yet, so skip generics for now.
         if (returnType is IrSimpleType &&
             returnType.classifier is IrClassSymbol &&
@@ -158,7 +158,7 @@
             expression.ensureTypeIs(returnType)
         }
 
-        expression.superQualifierSymbol?.ensureBound(expression)
+        expression.irSuperQualifier?.ensureBound(expression)
     }
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall) {
@@ -177,7 +177,7 @@
         super.visitInstanceInitializerCall(expression)
 
         expression.ensureTypeIs(irBuiltIns.unitType)
-        expression.classSymbol.ensureBound(expression)
+        expression.irClass.ensureBound(expression)
     }
 
     override fun visitTypeOperator(expression: IrTypeOperatorCall) {
@@ -228,7 +228,7 @@
         super.visitReturn(expression)
 
         expression.ensureTypeIs(irBuiltIns.nothingType)
-        expression.returnTargetSymbol.ensureBound(expression)
+        expression.irReturnTarget.ensureBound(expression)
     }
 
     override fun visitThrow(expression: IrThrow) {
@@ -294,15 +294,15 @@
                 return
         }
 
-        expression.symbol.ensureBound(expression)
+        expression.target.ensureBound(expression)
     }
 
     override fun visitDeclaration(declaration: IrDeclaration) {
         super.visitDeclaration(declaration)
 
         if (declaration is IrOverridableDeclaration<*>) {
-            for (overriddenSymbol in declaration.overriddenSymbols) {
-                val overriddenDeclaration = overriddenSymbol.owner as? IrDeclarationWithVisibility ?: continue
+            for (overridden in declaration.overridden) {
+                val overriddenDeclaration = overridden as? IrDeclarationWithVisibility ?: continue
                 if (overriddenDeclaration.visibility == Visibilities.PRIVATE) {
                     reportError(declaration, "Overrides private declaration $overriddenDeclaration")
                 }
@@ -313,13 +313,13 @@
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression) {
         super.visitFunctionAccess(expression)
 
-        expression.symbol.ensureBound(expression)
+        expression.target.ensureBound(expression)
     }
 
     override fun visitFunctionReference(expression: IrFunctionReference) {
         super.visitFunctionReference(expression)
 
-        expression.symbol.ensureBound(expression)
+        expression.target.ensureBound(expression)
     }
 
     override fun visitPropertyReference(expression: IrPropertyReference) {
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyIrTreeWithDeclarations.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyIrTreeWithDeclarations.kt
index aa5e680..a56a935 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyIrTreeWithDeclarations.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyIrTreeWithDeclarations.kt
@@ -22,10 +22,7 @@
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.IrLoop
-import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols
-import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
-import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper
-import org.jetbrains.kotlin.ir.util.DescriptorsRemapper
+import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
 
 @Suppress("UNCHECKED_CAST")
@@ -52,5 +49,5 @@
                 }
             },
             null
-    ) as T
+    ).desymbolize() as T
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt
index ad511d1..7021e5e 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt
@@ -20,10 +20,6 @@
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.builders.Scope
 import org.jetbrains.kotlin.ir.declarations.*
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
 
@@ -34,7 +30,7 @@
     private val scopeStack = mutableListOf<ScopeWithIr>()
 
     protected open fun createScope(declaration: IrSymbolOwner): ScopeWithIr =
-        ScopeWithIr(Scope(declaration.symbol), declaration)
+        ScopeWithIr(Scope(declaration), declaration)
 
     final override fun visitFile(declaration: IrFile): IrFile {
         scopeStack.push(createScope(declaration))
@@ -72,9 +68,9 @@
     }
 
     protected val currentFile get() = scopeStack.lastOrNull { it.irElement is IrFile }!!.irElement as IrFile
-    protected val currentClass get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrClassSymbol }
-    protected val currentFunction get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrFunctionSymbol }
-    protected val currentProperty get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrPropertySymbol }
+    protected val currentClass get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrClass }
+    protected val currentFunction get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrFunction }
+    protected val currentProperty get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrProperty }
     protected val currentScope get() = scopeStack.peek()
     protected val parentScope get() = if (scopeStack.size < 2) null else scopeStack[scopeStack.size - 2]
     protected val allScopes get() = scopeStack
@@ -109,7 +105,7 @@
     private val scopeStack = mutableListOf<ScopeWithIr>()
 
     protected open fun createScope(declaration: IrSymbolOwner): ScopeWithIr =
-        ScopeWithIr(Scope(declaration.symbol), declaration)
+        ScopeWithIr(Scope(declaration), declaration)
 
     final override fun visitFile(declaration: IrFile) {
         scopeStack.push(createScope(declaration))
@@ -142,10 +138,10 @@
         scopeStack.pop()
     }
 
-    protected val currentFile get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrFileSymbol }
-    protected val currentClass get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrClassSymbol }
-    protected val currentFunction get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrFunctionSymbol }
-    protected val currentProperty get() = scopeStack.lastOrNull { it.scope.scopeOwnerSymbol is IrPropertySymbol }
+    protected val currentFile get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrFile }
+    protected val currentClass get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrClass }
+    protected val currentFunction get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrFunction }
+    protected val currentProperty get() = scopeStack.lastOrNull { it.scope.irScopeOwner is IrProperty }
     protected val currentScope get() = scopeStack.peek()
     protected val parentScope get() = if (scopeStack.size < 2) null else scopeStack[scopeStack.size - 2]
     protected val allScopes get() = scopeStack
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/TailRecursionCallsCollector.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/TailRecursionCallsCollector.kt
index fa19575..a5fb6cc 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/TailRecursionCallsCollector.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/TailRecursionCallsCollector.kt
@@ -62,7 +62,7 @@
         }
 
         override fun visitReturn(expression: IrReturn, data: ElementKind) {
-            val valueKind = if (expression.returnTargetSymbol == irFunction.symbol) {
+            val valueKind = if (expression.irReturnTarget == irFunction) {
                 ElementKind.TAIL_STATEMENT
             } else {
                 ElementKind.NOT_SURE
@@ -98,18 +98,18 @@
             }
 
             // Is it a recursive call?
-            if (expression.symbol != irFunction.symbol) {
+            if (expression.target != irFunction) {
                 return
             }
             // TODO: check type arguments
 
-            if (irFunction.overriddenSymbols.isNotEmpty() && expression.usesDefaultArguments()) {
+            if (irFunction.overridden.isNotEmpty() && expression.usesDefaultArguments()) {
                 // Overridden functions using default arguments at tail call are not included: KT-4285
                 return
             }
 
             expression.dispatchReceiver?.let {
-                if (it !is IrGetValue || it.symbol.owner != irFunction.dispatchReceiverParameter) {
+                if (it !is IrGetValue || it.target != irFunction.dispatchReceiverParameter) {
                     // A tail call is not allowed to change dispatch receiver
                     //   class C {
                     //       fun foo(other: C) {
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt
index 7e9dd1e..b6f6e4e 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt
@@ -46,12 +46,12 @@
     }
 
     private fun IrConstructorCall.toAnnotationDescriptor(): AnnotationDescriptor {
-        assert(symbol.owner.parentAsClass.isAnnotationClass) {
+        assert(target.parentAsClass.isAnnotationClass) {
             "Expected call to constructor of annotation class but was: ${this.dump()}"
         }
         return AnnotationDescriptorImpl(
-            symbol.owner.parentAsClass.defaultType.toKotlinType(),
-            symbol.owner.valueParameters.map { it.name to getValueArgument(it.index) }
+            target.parentAsClass.defaultType.toKotlinType(),
+            target.valueParameters.map { it.name to getValueArgument(it.index) }
                 .filter { it.second != null }
                 .associate { it.first to it.second!!.toConstantValue() },
             /*TODO*/ SourceElement.NO_SOURCE
@@ -81,7 +81,7 @@
                 }
             }
 
-            this is IrGetEnumValue -> EnumValue(symbol.owner.parentAsClass.descriptor.classId!!, symbol.owner.name)
+            this is IrGetEnumValue -> EnumValue(target.parentAsClass.descriptor.classId!!, target.name)
 
             this is IrClassReference -> KClassValue(classType.classifierOrFail.descriptor.classId!!, /*TODO*/0)
 
@@ -381,7 +381,7 @@
 
     var originalDescriptor: FunctionDescriptor? = null
 
-    override fun getOverriddenDescriptors() = owner.overriddenSymbols.map { it.descriptor }
+    override fun getOverriddenDescriptors() = owner.overridden.map { it.descriptor }
 
     override fun getContainingDeclaration(): DeclarationDescriptor = getContainingDeclaration(owner)
 
@@ -965,7 +965,7 @@
     override fun hasSynthesizedParameterNames() = false
 
     override fun getOverriddenDescriptors(): MutableCollection<out PropertyDescriptor> =
-        owner.overriddenSymbols.map { it.descriptor }.toMutableList()
+        owner.overridden.map { it.descriptor }.toMutableList()
 
     override fun copy(
         newOwner: DeclarationDescriptor?,
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
index 159855a..38cef50 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
@@ -14,12 +14,7 @@
 import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
 import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
 import org.jetbrains.kotlin.incremental.components.NoLookupLocation
-import org.jetbrains.kotlin.ir.declarations.IrFunction
-import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
-import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
+import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.classOrNull
 import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
@@ -60,16 +55,16 @@
         name: Name,
         vararg packageNameSegments: String = arrayOf("kotlin"),
         condition: (SimpleFunctionDescriptor) -> Boolean
-    ): IrSimpleFunctionSymbol =
+    ): IrSimpleFunction =
         symbolTable.referenceSimpleFunction(
             builtInsPackage(*packageNameSegments).getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
                 .first(condition)
-        )
+        ).owner
 
-    private fun getClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClassSymbol =
+    private fun getClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClass =
         symbolTable.referenceClass(
             builtInsPackage(*packageNameSegments).getContributedClassifier(name, NoLookupLocation.FROM_BACKEND) as ClassDescriptor
-        )
+        ).owner
 
     /**
      * Use this table to reference external dependencies.
@@ -77,15 +72,15 @@
     open val externalSymbolTable: ReferenceSymbolTable
         get() = symbolTable
 
-    abstract val ThrowNullPointerException: IrFunctionSymbol
-    abstract val ThrowNoWhenBranchMatchedException: IrFunctionSymbol
-    abstract val ThrowTypeCastException: IrFunctionSymbol
+    abstract val ThrowNullPointerException: IrFunction
+    abstract val ThrowNoWhenBranchMatchedException: IrFunction
+    abstract val ThrowTypeCastException: IrFunction
 
-    abstract val ThrowUninitializedPropertyAccessException: IrSimpleFunctionSymbol
+    abstract val ThrowUninitializedPropertyAccessException: IrSimpleFunction
 
-    abstract val stringBuilder: IrClassSymbol
+    abstract val stringBuilder: IrClass
 
-    abstract val defaultConstructorMarker: IrClassSymbol
+    abstract val defaultConstructorMarker: IrClass
 
     val iterator = getClass(Name.identifier("Iterator"), "kotlin", "collections")
 
@@ -142,11 +137,11 @@
     val array = symbolTable.referenceClass(builtIns.array)
 
     private fun primitiveArrayClass(type: PrimitiveType) =
-        symbolTable.referenceClass(builtIns.getPrimitiveArrayClassDescriptor(type))
+        symbolTable.referenceClass(builtIns.getPrimitiveArrayClassDescriptor(type)).owner
 
     private fun unsignedArrayClass(unsignedType: UnsignedType) =
         builtIns.builtInsModule.findClassAcrossModuleDependencies(unsignedType.arrayClassId)
-            ?.let { symbolTable.referenceClass(it) }
+            ?.let { symbolTable.referenceClass(it).owner }
 
     val byteArray = primitiveArrayClass(PrimitiveType.BYTE)
     val charArray = primitiveArrayClass(PrimitiveType.CHAR)
@@ -182,51 +177,51 @@
     val mutableIterator = symbolTable.referenceClass(builtIns.mutableIterator)
     val mutableListIterator = symbolTable.referenceClass(builtIns.mutableListIterator)
 
-    abstract val copyRangeTo: Map<ClassDescriptor, IrSimpleFunctionSymbol>
+    abstract val copyRangeTo: Map<ClassDescriptor, IrSimpleFunction>
 
-    abstract val coroutineImpl: IrClassSymbol
+    abstract val coroutineImpl: IrClass
 
-    abstract val coroutineSuspendedGetter: IrSimpleFunctionSymbol
+    abstract val coroutineSuspendedGetter: IrSimpleFunction
 
-    abstract val getContinuation: IrSimpleFunctionSymbol
+    abstract val getContinuation: IrSimpleFunction
 
-    abstract val coroutineContextGetter: IrSimpleFunctionSymbol
+    abstract val coroutineContextGetter: IrSimpleFunction
 
-    abstract val suspendCoroutineUninterceptedOrReturn: IrSimpleFunctionSymbol
+    abstract val suspendCoroutineUninterceptedOrReturn: IrSimpleFunction
 
-    abstract val coroutineGetContext: IrSimpleFunctionSymbol
+    abstract val coroutineGetContext: IrSimpleFunction
 
-    abstract val returnIfSuspended: IrSimpleFunctionSymbol
+    abstract val returnIfSuspended: IrSimpleFunction
 
-    private val binaryOperatorCache = mutableMapOf<Triple<Name, KotlinType, KotlinType>, IrSimpleFunctionSymbol>()
+    private val binaryOperatorCache = mutableMapOf<Triple<Name, KotlinType, KotlinType>, IrSimpleFunction>()
 
-    fun getBinaryOperator(name: Name, lhsType: KotlinType, rhsType: KotlinType): IrSimpleFunctionSymbol {
+    fun getBinaryOperator(name: Name, lhsType: KotlinType, rhsType: KotlinType): IrSimpleFunction {
         val key = Triple(name, lhsType, rhsType)
         return binaryOperatorCache.getOrPut(key) {
             symbolTable.referenceSimpleFunction(
                 lhsType.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
                     .first { it.valueParameters.size == 1 && it.valueParameters[0].type == rhsType }
-            )
+            ).owner
         }
     }
 
-    private val unaryOperatorCache = mutableMapOf<Pair<Name, KotlinType>, IrSimpleFunctionSymbol>()
+    private val unaryOperatorCache = mutableMapOf<Pair<Name, KotlinType>, IrSimpleFunction>()
 
-    fun getUnaryOperator(name: Name, receiverType: KotlinType): IrSimpleFunctionSymbol {
+    fun getUnaryOperator(name: Name, receiverType: KotlinType): IrSimpleFunction {
         val key = name to receiverType
         return unaryOperatorCache.getOrPut(key) {
             symbolTable.referenceSimpleFunction(
                 receiverType.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
                     .first { it.valueParameters.isEmpty() }
-            )
+            ).owner
         }
     }
 
     val intAnd = getBinaryOperator(OperatorNameConventions.AND, builtIns.intType, builtIns.intType)
     val intPlusInt = getBinaryOperator(OperatorNameConventions.PLUS, builtIns.intType, builtIns.intType)
 
-    open fun functionN(n: Int): IrClassSymbol = symbolTable.referenceClass(builtIns.getFunction(n))
-    open fun suspendFunctionN(n: Int): IrClassSymbol = symbolTable.referenceClass(builtIns.getSuspendFunction(n))
+    open fun functionN(n: Int): IrClass = symbolTable.referenceClass(builtIns.getFunction(n))
+    open fun suspendFunctionN(n: Int): IrClass = symbolTable.referenceClass(builtIns.getSuspendFunction(n))
 
     val extensionToString = getSimpleFunction(Name.identifier("toString")) {
         it.dispatchReceiverParameter == null && it.extensionReceiverParameter != null &&
@@ -240,22 +235,20 @@
     }
 
     companion object {
-        fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean =
-            symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
-                function.name.asString() == "<get-isInitialized>" &&
-                        function.isTopLevel &&
-                        function.getPackageFragment()!!.fqName.asString() == "kotlin" &&
-                        function.valueParameters.isEmpty() &&
-                        symbol.owner.extensionReceiverParameter?.type?.classOrNull?.owner.let { receiverClass ->
-                            receiverClass?.fqNameWhenAvailable?.toUnsafe() == KotlinBuiltIns.FQ_NAMES.kProperty0
-                        }
-            }
+        fun isLateinitIsInitializedPropertyGetter(function: IrFunction): Boolean =
+            function is IrSimpleFunction &&
+                    function.name.asString() == "<get-isInitialized>" &&
+                    function.isTopLevel &&
+                    function.getPackageFragment()!!.fqName.asString() == "kotlin" &&
+                    function.valueParameters.isEmpty() &&
+                    function.extensionReceiverParameter?.type?.classOrNull?.owner.let { receiverClass ->
+                        receiverClass?.fqNameWhenAvailable?.toUnsafe() == KotlinBuiltIns.FQ_NAMES.kProperty0
+                    }
 
-        fun isTypeOfIntrinsic(symbol: IrFunctionSymbol): Boolean =
-            symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
-                function.name.asString() == "typeOf" &&
-                        function.valueParameters.isEmpty() &&
-                        (function.parent as? IrPackageFragment)?.fqName == KOTLIN_REFLECT_FQ_NAME
-            }
+        fun isTypeOfIntrinsic(function: IrFunction): Boolean =
+            function is IrSimpleFunction &&
+                    function.name.asString() == "typeOf" &&
+                    function.valueParameters.isEmpty() &&
+                    (function.parent as? IrPackageFragment)?.fqName == KOTLIN_REFLECT_FQ_NAME
     }
 }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt
index cb23885..de8cbc4 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt
@@ -27,7 +27,7 @@
     if (this !is IrBlock || statements.size != 2)
         return null
     val (function, reference) = statements
-    if (function !is IrSimpleFunction || reference !is IrFunctionReference || function.symbol != reference.symbol)
+    if (function !is IrSimpleFunction || reference !is IrFunctionReference || function != reference.target)
         return null
     if ((0 until reference.valueArgumentsCount).any { reference.getValueArgument(it) != null })
         return null
@@ -42,11 +42,11 @@
     require(body != null)
     val argumentMap = valueParameters.zip(arguments).toMap()
     val blockSymbol = IrReturnableBlockSymbolImpl(descriptor)
-    val block = IrReturnableBlockImpl(startOffset, endOffset, returnType, blockSymbol, null, symbol)
+    val block = IrReturnableBlockImpl(startOffset, endOffset, returnType, blockSymbol, null, this)
     val remapper = object : VariableRemapper(argumentMap) {
         override fun visitReturn(expression: IrReturn): IrExpression = super.visitReturn(
-            if (expression.returnTargetSymbol == symbol)
-                IrReturnImpl(expression.startOffset, expression.endOffset, expression.type, blockSymbol, expression.value)
+            if (expression.irReturnTarget == this@inline)
+                IrReturnImpl(expression.startOffset, expression.endOffset, expression.type, block, expression.value)
             else
                 expression
         )
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt
index 7887bee..2fe2e62 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt
@@ -83,26 +83,26 @@
             listOf(
                 IrDelegatingConstructorCallImpl(
                     startOffset, endOffset, irBuiltIns.unitType,
-                    superConstructor.symbol, superConstructor.descriptor,
+                    superConstructor, superConstructor.descriptor,
                     0, superConstructor.valueParameters.size
                 ).apply {
                     constructor.valueParameters.forEachIndexed { idx, parameter ->
-                        putValueArgument(idx, IrGetValueImpl(startOffset, endOffset, parameter.type, parameter.symbol))
+                        putValueArgument(idx, IrGetValueImpl(startOffset, endOffset, parameter.type, parameter))
                     }
                 },
-                IrInstanceInitializerCallImpl(startOffset, endOffset, this.symbol, irBuiltIns.unitType)
+                IrInstanceInitializerCallImpl(startOffset, endOffset, this, irBuiltIns.unitType)
             )
         )
     }
 }
 
-val IrCall.isSuspend get() = (symbol.owner as? IrSimpleFunction)?.isSuspend == true
-val IrFunctionReference.isSuspend get() = (symbol.owner as? IrSimpleFunction)?.isSuspend == true
+val IrCall.isSuspend get() = (target as? IrSimpleFunction)?.isSuspend == true
+val IrFunctionReference.isSuspend get() = (target as? IrSimpleFunction)?.isSuspend == true
 
 val IrSimpleFunction.isOverridable: Boolean
     get() = visibility != Visibilities.PRIVATE && modality != Modality.FINAL && (parent as? IrClass)?.isFinalClass != true
 
-val IrSimpleFunction.isOverridableOrOverrides: Boolean get() = isOverridable || overriddenSymbols.isNotEmpty()
+val IrSimpleFunction.isOverridableOrOverrides: Boolean get() = isOverridable || overridden.isNotEmpty()
 
 fun IrReturnTarget.returnType(context: CommonBackendContext) =
     when (this) {
@@ -117,9 +117,8 @@
 
 // For an annotation, get the annotation class.
 fun IrCall.getAnnotationClass(): IrClass {
-    val callable = symbol.owner
-    assert(callable is IrConstructor) { "Constructor call expected, got ${ir2string(this)}" }
-    val annotationClass =  callable.parentAsClass
+    assert(target is IrConstructor) { "Constructor call expected, got ${ir2string(this)}" }
+    val annotationClass =  target.parentAsClass
     assert(annotationClass.isAnnotationClass) { "Annotation class expected, got ${ir2string(annotationClass)}" }
     return annotationClass
 }
@@ -365,7 +364,7 @@
         IrValueParameterSymbolImpl(thisReceiverDescriptor),
         Name.identifier("<this>"),
         index = -1,
-        type = this.symbol.typeWith(this.typeParameters.map { it.defaultType }),
+        type = this.typeWith(this.typeParameters.map { it.defaultType }),
         varargElementType = null,
         isCrossinline = false,
         isNoinline = false
@@ -450,7 +449,7 @@
 
     val overriddenFunctions = declarations
         .flatMap { it.toList() }
-        .flatMap { it.overriddenSymbols.map { it.owner } }
+        .flatMap { it.overridden }
         .toSet()
 
     val unoverriddenSuperFunctions = superTypes
@@ -485,7 +484,7 @@
             ).apply {
                 descriptor.bind(this)
                 parent = this@addFakeOverrides
-                overriddenSymbols += overriddenFunctions.map { it.symbol }
+                overridden += overriddenFunctions
                 copyParameterDeclarationsFrom(irFunction)
             }
         }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/SharedVariablesManager.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/SharedVariablesManager.kt
index 6eb4043..8368cf2 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/SharedVariablesManager.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/SharedVariablesManager.kt
@@ -10,14 +10,13 @@
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrGetValue
 import org.jetbrains.kotlin.ir.expressions.IrSetVariable
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 
 interface SharedVariablesManager {
     fun declareSharedVariable(originalDeclaration: IrVariable): IrVariable
 
     fun defineSharedValue(originalDeclaration: IrVariable, sharedVariableDeclaration: IrVariable): IrStatement
 
-    fun getSharedValue(sharedVariableSymbol: IrVariableSymbol, originalGet: IrGetValue): IrExpression
+    fun getSharedValue(sharedVariable: IrVariable, originalGet: IrGetValue): IrExpression
 
-    fun setSharedValue(sharedVariableSymbol: IrVariableSymbol, originalSet: IrSetVariable): IrExpression
+    fun setSharedValue(sharedVariable: IrVariable, originalSet: IrSetVariable): IrExpression
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt
index b68e3ca..15da1fa 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt
@@ -23,16 +23,12 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
-import org.jetbrains.kotlin.ir.types.IrType
-import org.jetbrains.kotlin.ir.types.classifierOrFail
+import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
-import org.jetbrains.kotlin.ir.types.typeWith
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.visitors.*
 import org.jetbrains.kotlin.name.Name
@@ -43,7 +39,7 @@
     protected object DECLARATION_ORIGIN_COROUTINE_IMPL : IrDeclarationOriginImpl("COROUTINE_IMPL")
 
     protected abstract val stateMachineMethodName: Name
-    protected abstract fun getCoroutineBaseClass(function: IrFunction): IrClassSymbol
+    protected abstract fun getCoroutineBaseClass(function: IrFunction): IrClass
     protected abstract fun nameForCoroutineClass(function: IrFunction): Name
 
     protected abstract fun buildStateMachine(
@@ -84,7 +80,7 @@
     // Suppress since it is used in native
     @Suppress("MemberVisibilityCanBePrivate")
     protected fun IrCall.isReturnIfSuspendedCall() =
-        symbol.owner.run { fqNameWhenAvailable == context.internalPackageFqn.child(Name.identifier("returnIfSuspended")) }
+        target.run { fqNameWhenAvailable == context.internalPackageFqn.child(Name.identifier("returnIfSuspended")) }
 
     private fun tryTransformSuspendFunction(element: IrElement) =
         if (element is IrSimpleFunction && element.isSuspend && element.modality != Modality.ABSTRACT)
@@ -101,7 +97,7 @@
                 expression.acceptChildrenVoid(this)
 
                 if (expression.isSuspend) {
-                    suspendLambdas[expression.symbol.owner] = expression
+                    suspendLambdas[expression.target] = expression
                 }
             }
         })
@@ -115,16 +111,16 @@
 
                 if (!expression.isSuspend)
                     return expression
-                val coroutine = builtCoroutines[expression.symbol.owner]
+                val coroutine = builtCoroutines[expression.target]
                     ?: throw Error("Non-local callable reference to suspend lambda: $expression")
                 val constructorParameters = coroutine.coroutineConstructor.valueParameters
                 val expressionArguments = expression.getArguments().map { it.second }
                 assert(constructorParameters.size == expressionArguments.size) {
                     "Inconsistency between callable reference to suspend lambda and the corresponding coroutine"
                 }
-                val irBuilder = context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset)
+                val irBuilder = context.createIrBuilder(expression.target, expression.startOffset, expression.endOffset)
                 irBuilder.run {
-                    return irCall(coroutine.coroutineConstructor.symbol).apply {
+                    return irCall(coroutine.coroutineConstructor).apply {
                         expressionArguments.forEachIndexed { index, argument ->
                             putValueArgument(index, argument)
                         }
@@ -215,15 +211,15 @@
     }
 
     private val symbols = context.ir.symbols
-    private val getContinuationSymbol = symbols.getContinuation
-    private val continuationClassSymbol = getContinuationSymbol.owner.returnType.classifierOrFail as IrClassSymbol
+    private val getContinuation = symbols.getContinuation
+    private val continuationClass = getContinuation.returnType.getClass()!!
 
     private fun removeReturnIfSuspendedCallAndSimplifyDelegatingCall(irFunction: IrFunction, delegatingCall: IrCall) {
         val returnValue =
             if (delegatingCall.isReturnIfSuspendedCall())
                 delegatingCall.getValueArgument(0)!!
             else delegatingCall
-        context.createIrBuilder(irFunction.symbol).run {
+        context.createIrBuilder(irFunction).run {
             val statements = (irFunction.body as IrBlockBody).statements
             val lastStatement = statements.last()
             assert(lastStatement == delegatingCall || lastStatement is IrReturn) { "Unexpected statement $lastStatement" }
@@ -237,11 +233,11 @@
 
         if (functionReference == null) {
             // It is not a lambda - replace original function with a call to constructor of the built coroutine.
-            val irBuilder = context.createIrBuilder(irFunction.symbol, irFunction.startOffset, irFunction.endOffset)
+            val irBuilder = context.createIrBuilder(irFunction, irFunction.startOffset, irFunction.endOffset)
             irFunction.body = irBuilder.irBlockBody(irFunction) {
                 val constructor = coroutine.coroutineConstructor
                 generateCoroutineStart(coroutine.stateMachineFunction,
-                                       irCallConstructor(constructor.symbol, irFunction.typeParameters.map {
+                                       irCallConstructor(constructor, irFunction.typeParameters.map {
                                            IrSimpleTypeImpl(it.symbol, true, emptyList(), emptyList())
                                        }).apply {
                                            val functionParameters = irFunction.explicitParameters
@@ -251,8 +247,8 @@
                                            putValueArgument(
                                                functionParameters.size,
                                                irCall(
-                                                   getContinuationSymbol,
-                                                   getContinuationSymbol.owner.returnType,
+                                                   getContinuation,
+                                                   getContinuation.returnType,
                                                    listOf(irFunction.returnType)
                                                )
                                            )
@@ -302,7 +298,7 @@
         }
         private val coroutineClassThis = coroutineClass.thisReceiver!!
 
-        private val continuationType = continuationClassSymbol.typeWith(irFunction.returnType)
+        private val continuationType = continuationClass.typeWith(irFunction.returnType)
 
         // Save all arguments to fields.
         private val argumentToPropertiesMap = functionParameters.associate {
@@ -310,15 +306,15 @@
         }
 
         private val coroutineBaseClass = getCoroutineBaseClass(irFunction)
-        private val coroutineBaseClassConstructor = coroutineBaseClass.owner.constructors.single { it.valueParameters.size == 1 }
-        private val create1Function = coroutineBaseClass.owner.simpleFunctions()
+        private val coroutineBaseClassConstructor = coroutineBaseClass.constructors.single { it.valueParameters.size == 1 }
+        private val create1Function = coroutineBaseClass.simpleFunctions()
             .single { it.name.asString() == "create" && it.valueParameters.size == 1 }
         private val create1CompletionParameter = create1Function.valueParameters[0]
 
         private val coroutineConstructors = mutableListOf<IrConstructor>()
 
         fun build(): BuiltCoroutine {
-            val superTypes = mutableListOf(coroutineBaseClass.owner.defaultType)
+            val superTypes = mutableListOf(coroutineBaseClass.defaultType)
             var suspendFunctionClass: IrClass? = null
             var functionClass: IrClass? = null
             val suspendFunctionClassTypeArguments: List<IrType>?
@@ -326,19 +322,19 @@
             if (unboundFunctionParameters != null) {
                 // Suspend lambda inherits SuspendFunction.
                 val numberOfParameters = unboundFunctionParameters.size
-                suspendFunctionClass = symbols.suspendFunctionN(numberOfParameters).owner
+                suspendFunctionClass = symbols.suspendFunctionN(numberOfParameters)
                 val unboundParameterTypes = unboundFunctionParameters.map { it.type }
                 suspendFunctionClassTypeArguments = unboundParameterTypes + irFunction.returnType
                 superTypes += suspendFunctionClass.typeWith(suspendFunctionClassTypeArguments)
 
-                functionClass = symbols.functionN(numberOfParameters + 1).owner
+                functionClass = symbols.functionN(numberOfParameters + 1)
                 functionClassTypeArguments = unboundParameterTypes + continuationType + context.irBuiltIns.anyNType
                 superTypes += functionClass.typeWith(functionClassTypeArguments)
             }
 
             val coroutineConstructor = buildConstructor()
 
-            val superInvokeSuspendFunction = coroutineBaseClass.owner.simpleFunctions().single { it.name == stateMachineMethodName }
+            val superInvokeSuspendFunction = coroutineBaseClass.simpleFunctions().single { it.name == stateMachineMethodName }
             val invokeSuspendMethod = buildInvokeSuspendMethod(superInvokeSuspendFunction, coroutineClass)
 
             var coroutineFactoryConstructor: IrConstructor? = null
@@ -347,24 +343,23 @@
                 // Suspend lambda - create factory methods.
                 coroutineFactoryConstructor = buildFactoryConstructor(boundFunctionParameters!!)
 
-                val createFunctionSymbol = coroutineBaseClass.owner.simpleFunctions()
+                val createFunction = coroutineBaseClass.simpleFunctions()
                     .atMostOne { it.name.asString() == "create" && it.valueParameters.size == unboundFunctionParameters!!.size + 1 }
-                    ?.symbol
 
                 createMethod = buildCreateMethod(
                     unboundArgs = unboundFunctionParameters!!,
-                    superFunctionSymbol = createFunctionSymbol,
+                    superFunction = createFunction,
                     coroutineConstructor = coroutineConstructor
                 )
 
-                val invokeFunctionSymbol =
-                    functionClass!!.simpleFunctions().single { it.name.asString() == "invoke" }.symbol
-                val suspendInvokeFunctionSymbol =
-                    suspendFunctionClass!!.simpleFunctions().single { it.name.asString() == "invoke" }.symbol
+                val invokeFunction =
+                    functionClass!!.simpleFunctions().single { it.name.asString() == "invoke" }
+                val suspendInvokeFunction =
+                    suspendFunctionClass!!.simpleFunctions().single { it.name.asString() == "invoke" }
 
                 buildInvokeMethod(
-                    suspendFunctionInvokeFunctionSymbol = suspendInvokeFunctionSymbol,
-                    functionInvokeFunctionSymbol = invokeFunctionSymbol,
+                    suspendFunctionInvokeFunction = suspendInvokeFunction,
+                    functionInvokeFunction = invokeFunction,
                     createFunction = createMethod,
                     stateMachineFunction = invokeSuspendMethod
                 )
@@ -414,7 +409,7 @@
                     +irDelegatingConstructorCall(coroutineBaseClassConstructor).apply {
                         putValueArgument(0, irGet(completionParameter))
                     }
-                    +IrInstanceInitializerCallImpl(startOffset, endOffset, coroutineClass.symbol, context.irBuiltIns.unitType)
+                    +IrInstanceInitializerCallImpl(startOffset, endOffset, coroutineClass, context.irBuiltIns.unitType)
 
                     functionParameters.forEachIndexed { index, parameter ->
                         +irSetField(
@@ -454,7 +449,7 @@
                         putValueArgument(0, irNull()) // Completion.
                     }
                     +IrInstanceInitializerCallImpl(
-                        startOffset, endOffset, coroutineClass.symbol,
+                        startOffset, endOffset, coroutineClass,
                         context.irBuiltIns.unitType
                     )
                     // Save all arguments to fields.
@@ -470,7 +465,7 @@
 
         private fun buildCreateMethod(
             unboundArgs: List<IrValueParameter>,
-            superFunctionSymbol: IrSimpleFunctionSymbol?,
+            superFunction: IrSimpleFunction?,
             coroutineConstructor: IrConstructor
         ) = WrappedSimpleFunctionDescriptor().let { d ->
             IrFunctionImpl(
@@ -502,9 +497,9 @@
 
                 this.createDispatchReceiverParameter()
 
-                superFunctionSymbol?.let {
-                    overriddenSymbols += it.owner.overriddenSymbols
-                    overriddenSymbols += it
+                superFunction?.let {
+                    overridden += it.overridden
+                    overridden += it
                 }
 
                 val thisReceiver = this.dispatchReceiverParameter!!
@@ -533,8 +528,8 @@
         }
 
         private fun buildInvokeMethod(
-            suspendFunctionInvokeFunctionSymbol: IrSimpleFunctionSymbol,
-            functionInvokeFunctionSymbol: IrSimpleFunctionSymbol,
+            suspendFunctionInvokeFunction: IrSimpleFunction,
+            functionInvokeFunction: IrSimpleFunction,
             createFunction: IrFunction,
             stateMachineFunction: IrFunction
         ) = WrappedSimpleFunctionDescriptor().let { d ->
@@ -569,8 +564,8 @@
 
                 this.createDispatchReceiverParameter()
 
-                overriddenSymbols += functionInvokeFunctionSymbol
-                overriddenSymbols += suspendFunctionInvokeFunctionSymbol
+                overridden += functionInvokeFunction
+                overridden += suspendFunctionInvokeFunction
 
                 val thisReceiver = dispatchReceiverParameter!!
 
@@ -583,7 +578,7 @@
                         }
                         putValueArgument(
                             valueParameters.size,
-                            irCall(getContinuationSymbol, getContinuationSymbol.owner.returnType, listOf(returnType))
+                            irCall(getContinuation, getContinuation.returnType, listOf(returnType))
                         )
                     })
                 }
@@ -623,7 +618,7 @@
 
                     this.createDispatchReceiverParameter()
 
-                    overriddenSymbols += stateMachineFunction.symbol
+                    overridden += stateMachineFunction
                 }
             }
 
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractValueUsageTransformer.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractValueUsageTransformer.kt
index 994c2a5..52630af 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractValueUsageTransformer.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractValueUsageTransformer.kt
@@ -10,10 +10,6 @@
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
-import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
-import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -49,10 +45,10 @@
         this.useAsValue(parameter)
 
     protected open fun IrExpression.useAsDispatchReceiver(expression: IrFunctionAccessExpression): IrExpression =
-        this.useAsArgument(expression.symbol.owner.dispatchReceiverParameter!!)
+        this.useAsArgument(expression.target.dispatchReceiverParameter!!)
 
     protected open fun IrExpression.useAsExtensionReceiver(expression: IrFunctionAccessExpression): IrExpression =
-        this.useAsArgument(expression.symbol.owner.extensionReceiverParameter!!)
+        this.useAsArgument(expression.target.extensionReceiverParameter!!)
 
     protected open fun IrExpression.useAsValueArgument(
         expression: IrFunctionAccessExpression,
@@ -66,11 +62,11 @@
     private fun IrExpression.useForField(field: IrField): IrExpression =
         this.useAs(field.type)
 
-    protected open fun IrExpression.useAsReturnValue(returnTarget: IrReturnTargetSymbol): IrExpression =
+    protected open fun IrExpression.useAsReturnValue(returnTarget: IrReturnTarget): IrExpression =
         when (returnTarget) {
-            is IrSimpleFunctionSymbol -> this.useAs(returnTarget.owner.returnType)
-            is IrConstructorSymbol -> this.useAs(irBuiltIns.unitType)
-            is IrReturnableBlockSymbol -> this.useAs(returnTarget.owner.type)
+            is IrSimpleFunction -> this.useAs(returnTarget.returnType)
+            is IrConstructor -> this.useAs(irBuiltIns.unitType)
+            is IrReturnableBlock -> this.useAs(returnTarget.type)
             else -> error(returnTarget)
         }
 
@@ -99,7 +95,7 @@
             extensionReceiver = extensionReceiver?.useAsExtensionReceiver(expression)
             for (index in descriptor.valueParameters.indices) {
                 val argument = getValueArgument(index) ?: continue
-                val parameter = symbol.owner.valueParameters[index]
+                val parameter = target.valueParameters[index]
                 putValueArgument(index, argument.useAsValueArgument(expression, parameter))
             }
         }
@@ -143,7 +139,7 @@
     override fun visitReturn(expression: IrReturn): IrExpression {
         expression.transformChildrenVoid(this)
 
-        expression.value = expression.value.useAsReturnValue(expression.returnTargetSymbol)
+        expression.value = expression.value.useAsReturnValue(expression.irReturnTarget)
 
         return expression
     }
@@ -151,7 +147,7 @@
     override fun visitSetVariable(expression: IrSetVariable): IrExpression {
         expression.transformChildrenVoid(this)
 
-        expression.value = expression.value.useForVariable(expression.symbol.owner)
+        expression.value = expression.value.useForVariable(expression.target)
 
         return expression
     }
@@ -159,7 +155,7 @@
     override fun visitSetField(expression: IrSetField): IrExpression {
         expression.transformChildrenVoid(this)
 
-        expression.value = expression.value.useForField(expression.symbol.owner)
+        expression.value = expression.value.useForField(expression.target)
 
         return expression
     }
@@ -261,7 +257,7 @@
 
         declaration.body?.let {
             if (it is IrExpressionBody) {
-                it.expression = it.expression.useAsReturnValue(declaration.symbol)
+                it.expression = it.expression.useAsReturnValue(declaration)
             }
         }
 
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt
index 2ec7f11..5d0cb71 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt
@@ -13,11 +13,11 @@
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.declarations.IrFile
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
 import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.getClass
 import org.jetbrains.kotlin.ir.types.toKotlinType
 import org.jetbrains.kotlin.ir.util.constructedClass
@@ -33,12 +33,12 @@
     }
 
     // Array(size, init) -> Array(size)
-    private fun arrayInlineToSizeConstructor(irConstructor: IrConstructor): IrFunctionSymbol? {
-        val clazz = irConstructor.constructedClass.symbol
+    private fun arrayInlineToSizeConstructor(irConstructor: IrConstructor): IrFunction? {
+        val clazz = irConstructor.constructedClass
         return when {
             irConstructor.valueParameters.size != 2 -> null
-            clazz == context.irBuiltIns.arrayClass -> context.ir.symbols.arrayOfNulls // Array<T> has no unary constructor: it can only exist for Array<T?>
-            context.irBuiltIns.primitiveArrays.contains(clazz) -> clazz.constructors.single { it.owner.valueParameters.size == 1 }
+            clazz == context.irBuiltIns.arrayClass.owner -> context.ir.symbols.arrayOfNulls // Array<T> has no unary constructor: it can only exist for Array<T?>
+            context.irBuiltIns.primitiveArrays.contains(clazz.symbol) -> clazz.constructors.single { it.valueParameters.size == 1 }
             else -> null
         }
     }
@@ -53,7 +53,7 @@
     }
 
     override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
-        val sizeConstructor = arrayInlineToSizeConstructor(expression.symbol.owner)
+        val sizeConstructor = arrayInlineToSizeConstructor(expression.target)
             ?: return super.visitConstructorCall(expression)
         // inline fun <reified T> Array(size: Int, invokable: (Int) -> T): Array<T> {
         //     val result = arrayOfNulls<T>(size)
@@ -66,7 +66,7 @@
         val size = expression.getValueArgument(0)!!.transform(this, null)
         val invokable = expression.getValueArgument(1)!!.transform(this, null)
         val scope = currentScope!!.scope
-        return context.createIrBuilder(scope.scopeOwnerSymbol).irBlock(expression.startOffset, expression.endOffset) {
+        return context.createIrBuilder(scope.irScopeOwner).irBlock(expression.startOffset, expression.endOffset) {
             val index = irTemporaryVar(irInt(0))
             val sizeVar = irTemporary(size)
             val result = irTemporary(irCall(sizeConstructor, expression.type).apply {
@@ -85,7 +85,7 @@
                 body = irBlock {
                     val tempIndex = irTemporary(irGet(index))
                     val value = lambda?.inline(listOf(tempIndex)) ?: irCallOp(
-                        invoke.symbol,
+                        invoke,
                         invoke.returnType,
                         irGet(invokableVar!!),
                         irGet(tempIndex)
@@ -96,7 +96,7 @@
                         putValueArgument(1, value)
                     }
                     val inc = index.type.getClass()!!.functions.single { it.name == OperatorNameConventions.INC }
-                    +irSetVar(index.symbol, irCallOp(inc.symbol, index.type, irGet(index)))
+                    +irSetVar(index, irCallOp(inc, index.type, irGet(index)))
                 }
             }
             +irGet(result)
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt
index 80f5f28..a5c8614 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt
@@ -26,13 +26,12 @@
 import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
 import org.jetbrains.kotlin.ir.expressions.IrPropertyReference
 import org.jetbrains.kotlin.ir.expressions.IrValueAccessExpression
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.util.isLocal
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
 import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
 import kotlin.collections.set
 
-class Closure(val capturedValues: List<IrValueSymbol> = emptyList())
+class Closure(val capturedValues: List<IrValueDeclaration> = emptyList())
 
 class ClosureAnnotator(irFile: IrFile) {
     private val closureBuilders = mutableMapOf<IrDeclaration, ClosureBuilder>()
@@ -53,7 +52,7 @@
     }
 
     private class ClosureBuilder(val owner: IrDeclaration) {
-        val capturedValues = mutableSetOf<IrValueSymbol>()
+        val capturedValues = mutableSetOf<IrValueDeclaration>()
         private val declaredValues = mutableSetOf<IrValueDeclaration>()
         private val includes = mutableSetOf<ClosureBuilder>()
 
@@ -65,11 +64,11 @@
          *                  variables declared in the node.
          */
         fun buildClosure(): Closure {
-            val result = mutableSetOf<IrValueSymbol>().apply { addAll(capturedValues) }
+            val result = mutableSetOf<IrValueDeclaration>().apply { addAll(capturedValues) }
             includes.forEach { builder ->
                 if (!builder.processed) {
                     builder.processed = true
-                    builder.buildClosure().capturedValues.filterTo(result) { isExternal(it.owner) }
+                    builder.buildClosure().capturedValues.filterTo(result) { isExternal(it) }
                 }
             }
             // TODO: We can save the closure and reuse it.
@@ -86,8 +85,8 @@
                 declaredValues.add(valueDeclaration)
         }
 
-        fun seeVariable(value: IrValueSymbol) {
-            if (isExternal(value.owner))
+        fun seeVariable(value: IrValueDeclaration) {
+            if (isExternal(value))
                 capturedValues.add(value)
         }
 
@@ -162,7 +161,7 @@
         }
 
         override fun visitVariableAccess(expression: IrValueAccessExpression) {
-            closuresStack.peek()?.seeVariable(expression.symbol)
+            closuresStack.peek()?.seeVariable(expression.target)
             super.visitVariableAccess(expression)
         }
 
@@ -173,18 +172,18 @@
 
         override fun visitFunctionAccess(expression: IrFunctionAccessExpression) {
             super.visitFunctionAccess(expression)
-            processMemberAccess(expression.symbol.owner)
+            processMemberAccess(expression.target)
         }
 
         override fun visitFunctionReference(expression: IrFunctionReference) {
             super.visitFunctionReference(expression)
-            processMemberAccess(expression.symbol.owner)
+            processMemberAccess(expression.target)
         }
 
         override fun visitPropertyReference(expression: IrPropertyReference) {
             super.visitPropertyReference(expression)
-            expression.getter?.let { processMemberAccess(it.owner) }
-            expression.setter?.let { processMemberAccess(it.owner) }
+            expression.getter?.let { processMemberAccess(it) }
+            expression.setter?.let { processMemberAccess(it) }
         }
 
         private fun processMemberAccess(declaration: IrDeclaration) {
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt
index a0aa64e..5fd462ed 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt
@@ -17,8 +17,6 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
@@ -69,7 +67,7 @@
             irFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods, skipExternalMethods)
 
         log { "$irFunction -> $newIrFunction" }
-        val builder = context.createIrBuilder(newIrFunction.symbol)
+        val builder = context.createIrBuilder(newIrFunction)
 
         newIrFunction.body = builder.irBlockBody(newIrFunction) {
             val params = mutableListOf<IrVariable>()
@@ -87,7 +85,7 @@
                 val parameter = newIrFunction.valueParameters[valueParameter.index]
 
                 val argument = if (valueParameter.defaultValue != null) {
-                    val kIntAnd = symbols.intAnd.owner
+                    val kIntAnd = symbols.intAnd
                     val condition = irNotEquals(irCall(kIntAnd).apply {
                         dispatchReceiver = irGet(maskParameter(newIrFunction, valueParameter.index / 32))
                         putValueArgument(0, irInt(1 shl (valueParameter.index % 32)))
@@ -98,9 +96,9 @@
 
                     expressionBody.transformChildrenVoid(object : IrElementTransformerVoid() {
                         override fun visitGetValue(expression: IrGetValue): IrExpression {
-                            log { "GetValue: ${expression.symbol.owner}" }
-                            val valueSymbol = variables[expression.symbol.owner] ?: return expression
-                            return irGet(valueSymbol)
+                            log { "GetValue: ${expression.target}" }
+                            val value = variables[expression.target] ?: return expression
+                            return irGet(value)
                         }
                     })
 
@@ -126,7 +124,7 @@
                     startOffset = irFunction.startOffset,
                     endOffset = irFunction.endOffset,
                     type = context.irBuiltIns.unitType,
-                    symbol = irFunction.symbol, descriptor = irFunction.symbol.descriptor,
+                    target = irFunction, descriptor = irFunction.descriptor,
                     typeArgumentsCount = newIrFunction.parentAsClass.typeParameters.size + newIrFunction.typeParameters.size
                 ).apply {
                     passTypeArgumentsFrom(newIrFunction.parentAsClass)
@@ -153,7 +151,7 @@
         newIrFunction: IrFunction,
         params: MutableList<IrVariable>
     ): IrExpression {
-        val dispatchCall = irCall(irFunction.symbol).apply {
+        val dispatchCall = irCall(irFunction).apply {
             passTypeArgumentsFrom(newIrFunction)
             dispatchReceiver = newIrFunction.dispatchReceiverParameter?.let { irGet(it) }
             extensionReceiver = newIrFunction.extensionReceiverParameter?.let { irGet(it) }
@@ -213,9 +211,9 @@
 
     private fun visitFunctionAccessExpression(
         expression: IrFunctionAccessExpression,
-        builder: (IrFunctionSymbol) -> IrFunctionAccessExpression
+        builder: (IrFunction) -> IrFunctionAccessExpression
     ): IrExpression {
-        val functionDeclaration = expression.symbol.owner
+        val functionDeclaration = expression.target
 
         if (!functionDeclaration.needsDefaultArgumentsLowering(skipInline, skipExternalMethods))
             return expression
@@ -224,16 +222,15 @@
         if (argumentsCount == functionDeclaration.valueParameters.size)
             return expression
 
-        val (symbol, params) = parametersForCall(expression)
-        val descriptor = symbol.descriptor
-        val declaration = symbol.owner
+        val (declaration, params) = parametersForCall(expression)
+        val descriptor = declaration.descriptor
 
         for (i in 0 until expression.typeArgumentsCount) {
             log { "$descriptor [$i]: $expression.getTypeArgument(i)" }
         }
         declaration.typeParameters.forEach { log { "$declaration[${it.index}] : $it" } }
 
-        return builder(symbol).apply {
+        return builder(declaration).apply {
             this.copyTypeArgumentsFrom(expression)
 
             params.forEach {
@@ -257,7 +254,7 @@
                 startOffset = expression.startOffset,
                 endOffset = expression.endOffset,
                 type = context.irBuiltIns.unitType,
-                symbol = it as IrConstructorSymbol,
+                target = it as IrConstructor,
                 descriptor = it.descriptor,
                 typeArgumentsCount = expression.typeArgumentsCount
             )
@@ -272,7 +269,7 @@
                 expression.startOffset,
                 expression.endOffset,
                 expression.type,
-                it as IrConstructorSymbol,
+                it as IrConstructor,
                 DEFAULT_DISPATCH_CALL
             )
         }
@@ -286,7 +283,7 @@
                 expression.startOffset,
                 expression.endOffset,
                 expression.type,
-                it as IrConstructorSymbol
+                it as IrConstructor
             )
         }
     }
@@ -299,11 +296,11 @@
                 startOffset = expression.startOffset,
                 endOffset = expression.endOffset,
                 type = expression.type,
-                symbol = it,
+                target = it,
                 descriptor = it.descriptor,
                 typeArgumentsCount = expression.typeArgumentsCount,
                 origin = DEFAULT_DISPATCH_CALL,
-                superQualifierSymbol = expression.superQualifierSymbol
+                irSuperQualifier = expression.irSuperQualifier
             )
         }
     }
@@ -313,8 +310,8 @@
 
         if (this !is IrSimpleFunction) return this
 
-        for (s in overriddenSymbols) {
-            s.owner.findSuperMethodWithDefaultArguments()?.let { return it }
+        for (s in overridden) {
+            s.findSuperMethodWithDefaultArguments()?.let { return it }
         }
 
         return this
@@ -322,8 +319,8 @@
 
     private fun parametersForCall(
         expression: IrFunctionAccessExpression
-    ): Pair<IrFunctionSymbol, List<Pair<IrValueParameter, IrExpression?>>> {
-        val declaration = expression.symbol.owner
+    ): Pair<IrFunction, List<Pair<IrValueParameter, IrExpression?>>> {
+        val declaration = expression.target
 
         val keyFunction = declaration.findSuperMethodWithDefaultArguments()!!
         val realFunction =
@@ -358,7 +355,7 @@
                 value = maskValue
             )
         }
-        if (expression.symbol is IrConstructorSymbol) {
+        if (expression.target is IrConstructor) {
             params += markerParameterDeclaration(realFunction) to
                     IrConstImpl.constNull(startOffset, endOffset, context.irBuiltIns.nothingNType)
         } else if (context.ir.shouldGenerateHandlerParameterForDefaultBodyFun()) {
@@ -368,7 +365,7 @@
         params.forEach {
             log { "descriptor::${realFunction.name.asString()}#${it.first.index}: ${it.first.name.asString()}" }
         }
-        return Pair(realFunction.symbol, params)
+        return Pair(realFunction, params)
     }
 
     private fun argumentCount(expression: IrMemberAccessExpression): Int {
@@ -416,7 +413,7 @@
     if (this !is IrSimpleFunction) return false
 
     fun IrSimpleFunction.inheritsDefaultValues(): Boolean =
-        valueParameters.any { it.defaultValue != null } || overriddenSymbols.any { it.owner.inheritsDefaultValues() }
+        valueParameters.any { it.defaultValue != null } || overridden.any { it.inheritsDefaultValues() }
 
     return inheritsDefaultValues()
 }
@@ -437,7 +434,7 @@
         syntheticParameters += newFunction.valueParameter(
             syntheticParameters.last().index + 1,
             kConstructorMarkerName,
-            context.ir.symbols.defaultConstructorMarker.owner.defaultType
+            context.ir.symbols.defaultConstructorMarker.defaultType
         )
     } else if (context.ir.shouldGenerateHandlerParameterForDefaultBodyFun()) {
         syntheticParameters += newFunction.valueParameter(
@@ -461,8 +458,7 @@
     annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
 
     if (origin == IrDeclarationOrigin.FAKE_OVERRIDE) {
-        for (baseFunSymbol in (this as IrSimpleFunction).overriddenSymbols) {
-            val baseFun = baseFunSymbol.owner
+        for (baseFun in (this as IrSimpleFunction).overridden) {
             if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods, skipExternalMethods)) {
                 val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) {
                     IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER
@@ -470,7 +466,7 @@
                     IrDeclarationOrigin.FAKE_OVERRIDE
                 }
                 val defaultsBaseFun = baseFun.generateDefaultsFunction(context, baseOrigin, skipInlineMethods, skipExternalMethods)
-                (newFunction as IrSimpleFunction).overriddenSymbols.add((defaultsBaseFun as IrSimpleFunction).symbol)
+                (newFunction as IrSimpleFunction).overridden.add(defaultsBaseFun as IrSimpleFunction)
             }
         }
     }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/Desymbolize.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/Desymbolize.kt
index 0fb38e9..44959aa 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/Desymbolize.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/Desymbolize.kt
@@ -5,5 +5,22 @@
 
 package org.jetbrains.kotlin.backend.common.lower
 
-class Desymbolize {
+import org.jetbrains.kotlin.backend.common.CommonBackendContext
+import org.jetbrains.kotlin.backend.common.FileLoweringPass
+import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
+import org.jetbrains.kotlin.ir.declarations.*
+import org.jetbrains.kotlin.ir.util.desymbolize
+
+val desymbolizePhase = makeIrModulePhase(
+    ::Desymbolize,
+    name = "Desymbolize",
+    description = "Replace symbols by their owners in IR structures"
+)
+
+class Desymbolize() : FileLoweringPass {
+    constructor (context: CommonBackendContext) : this()
+
+    override fun lower(irFile: IrFile) {
+        irFile.desymbolize()
+    }
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/EnumWhenLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/EnumWhenLowering.kt
index e623db4..ad4c622 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/EnumWhenLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/EnumWhenLowering.kt
@@ -37,7 +37,7 @@
         }
 
     protected open fun mapRuntimeEnumEntry(builder: IrBuilderWithScope, subject: IrExpression): IrExpression =
-        builder.irCall(subject.type.getClass()!!.symbol.getPropertyGetter("ordinal")!!).apply { dispatchReceiver = subject }
+        builder.irCall(subject.type.getClass()!!.getPropertyGetter("ordinal")!!).apply { dispatchReceiver = subject }
 
     override fun lower(irFile: IrFile) {
         visitFile(irFile)
@@ -59,7 +59,7 @@
         // Will be initialized only when we found a branch that compares
         // subject with compile-time known enum entry.
         val subjectOrdinalProvider = lazy {
-            context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, subject.startOffset, subject.endOffset).run {
+            context.createIrBuilder(currentScope!!.scope.irScopeOwner, subject.startOffset, subject.endOffset).run {
                 val integer = if (subject.type.isNullable())
                     irIfNull(context.irBuiltIns.intType, irGet(subject), irInt(-1), mapRuntimeEnumEntry(this, irGet(subject)))
                 else
@@ -81,7 +81,7 @@
 
     override fun visitCall(expression: IrCall): IrExpression {
         // We are looking for branch that is a comparison of the subject and another enum entry.
-        if (expression.symbol != context.irBuiltIns.eqeqSymbol) {
+        if (expression.target != context.irBuiltIns.eqeqSymbol.owner) {
             return super.visitCall(expression)
         }
         val lhs = expression.getValueArgument(0)!!
@@ -90,20 +90,20 @@
         val (topmostSubject, topmostOrdinalProvider) = subjectWithOrdinalStack.peek()
             ?: return super.visitCall(expression)
         val other = when {
-            lhs is IrGetValue && lhs.symbol.owner == topmostSubject -> rhs
-            rhs is IrGetValue && rhs.symbol.owner == topmostSubject -> lhs
+            lhs is IrGetValue && lhs.target == topmostSubject -> rhs
+            rhs is IrGetValue && rhs.target == topmostSubject -> lhs
             else -> return super.visitCall(expression)
         }
         val entryOrdinal = when {
-            other is IrGetEnumValue && topmostSubject.type.classifierOrNull?.owner == other.symbol.owner.parent ->
-                mapConstEnumEntry(other.symbol.owner)
+            other is IrGetEnumValue && topmostSubject.type.classifierOrNull?.owner == other.target.parent ->
+                mapConstEnumEntry(other.target)
             other.isNullConst() ->
                 -1
             else -> return super.visitCall(expression)
         }
         val subjectOrdinal = topmostOrdinalProvider.value
-        return IrCallImpl(expression.startOffset, expression.endOffset, expression.type, expression.symbol).apply {
-            putValueArgument(0, IrGetValueImpl(lhs.startOffset, lhs.endOffset, subjectOrdinal.type, subjectOrdinal.symbol))
+        return IrCallImpl(expression.startOffset, expression.endOffset, expression.type, expression.target).apply {
+            putValueArgument(0, IrGetValueImpl(lhs.startOffset, lhs.endOffset, subjectOrdinal.type, subjectOrdinal))
             putValueArgument(1, IrConstImpl.int(rhs.startOffset, rhs.endOffset, context.irBuiltIns.intType, entryOrdinal))
         }
     }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt
index e87789f..92b41e9 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt
@@ -31,7 +31,7 @@
         fun toIr(context: CommonBackendContext, startOffset: Int, endOffset: Int, value: IrExpression): IrExpression
     }
 
-    private data class Return(val target: IrReturnTargetSymbol): HighLevelJump {
+    private data class Return(val target: IrReturnTarget): HighLevelJump {
         override fun toIr(context: CommonBackendContext, startOffset: Int, endOffset: Int, value: IrExpression)
                 =
             IrReturnImpl(startOffset, endOffset, context.irBuiltIns.nothingType, target, value)
@@ -111,7 +111,7 @@
     override fun visitBreak(jump: IrBreak): IrExpression {
         val startOffset = jump.startOffset
         val endOffset = jump.endOffset
-        val irBuilder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, startOffset, endOffset)
+        val irBuilder = context.createIrBuilder(currentScope!!.scope.irScopeOwner, startOffset, endOffset)
         return performHighLevelJump(
             targetScopePredicate = { it is LoopScope && it.loop == jump.loop },
             jump                 = Break(jump.loop),
@@ -124,7 +124,7 @@
     override fun visitContinue(jump: IrContinue): IrExpression {
         val startOffset = jump.startOffset
         val endOffset = jump.endOffset
-        val irBuilder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, startOffset, endOffset)
+        val irBuilder = context.createIrBuilder(currentScope!!.scope.irScopeOwner, startOffset, endOffset)
         return performHighLevelJump(
             targetScopePredicate = { it is LoopScope && it.loop == jump.loop },
             jump                 = Continue(jump.loop),
@@ -138,8 +138,8 @@
         expression.transformChildrenVoid(this)
 
         return performHighLevelJump(
-            targetScopePredicate = { it is ReturnableScope && it.symbol == expression.returnTargetSymbol },
-            jump                 = Return(expression.returnTargetSymbol),
+            targetScopePredicate = { it is ReturnableScope && it.symbol == expression.irReturnTarget },
+            jump                 = Return(expression.irReturnTarget),
             startOffset          = expression.startOffset,
             endOffset            = expression.endOffset,
             value                = expression.value
@@ -173,7 +173,7 @@
 
         val currentTryScope = tryScopes[index]
         currentTryScope.jumps.getOrPut(jump) {
-            val type = (jump as? Return)?.target?.owner?.returnType(context) ?: value.type
+            val type = (jump as? Return)?.target?.returnType(context) ?: value.type
             jump.toString()
             val symbol = IrReturnableBlockSymbolImpl(WrappedSimpleFunctionDescriptor())
             with(currentTryScope) {
@@ -194,7 +194,7 @@
                 startOffset = startOffset,
                 endOffset = endOffset,
                 type = context.irBuiltIns.nothingType,
-                returnTargetSymbol = it,
+                irReturnTarget = it,
                 value = value
             )
         }
@@ -206,7 +206,7 @@
 
         val startOffset = aTry.startOffset
         val endOffset = aTry.endOffset
-        val irBuilder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, startOffset, endOffset)
+        val irBuilder = context.createIrBuilder(currentScope!!.scope.irScopeOwner, startOffset, endOffset)
         val transformer = this
         irBuilder.run {
             val transformedFinallyExpression = finallyExpression.transform(transformer, null)
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FlattenStringConcatenationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FlattenStringConcatenationLowering.kt
index b49bb15..4afa274 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FlattenStringConcatenationLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FlattenStringConcatenationLowering.kt
@@ -16,7 +16,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation
 import org.jetbrains.kotlin.ir.expressions.impl.IrStringConcatenationImpl
 import org.jetbrains.kotlin.ir.types.isStringClassType
-import org.jetbrains.kotlin.ir.util.fqNameSafe
 import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
@@ -83,7 +82,7 @@
             return when (expression) {
                 is IrStringConcatenation -> true
                 is IrCall -> {
-                    val function = expression.symbol.owner
+                    val function = expression.target
                     val receiver = expression.dispatchReceiver ?: expression.extensionReceiver
                     receiver != null &&
                             receiver.type.isStringClassType() &&
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt
index 87f3d60..299df50 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.backend.common.ClassLoweringPass
 import org.jetbrains.kotlin.backend.common.CommonBackendContext
-import org.jetbrains.kotlin.backend.common.deepCopyWithWrappedDescriptors
 import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor
 import org.jetbrains.kotlin.backend.common.ir.SetDeclarationsParentVisitor
 import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
@@ -100,12 +99,12 @@
             if (!declaration.isStatic) // TODO isStaticField
                 IrGetValueImpl(
                     irFieldInitializer.startOffset, irFieldInitializer.endOffset,
-                    irClass.thisReceiver!!.type, irClass.thisReceiver!!.symbol
+                    irClass.thisReceiver!!.type, irClass.thisReceiver!!
                 )
             else null
         return IrSetFieldImpl(
             irFieldInitializer.startOffset, irFieldInitializer.endOffset,
-            declaration.symbol,
+            declaration,
             receiver,
             irFieldInitializer,
             context.irBuiltIns.unitType,
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt
index abb4a4f..a5b1029 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt
@@ -13,8 +13,6 @@
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -24,7 +22,7 @@
 
 // TODO: Support incremental compilation
 class InlineClassLowering(val context: BackendContext) {
-    private val transformedFunction = mutableMapOf<IrFunctionSymbol, IrSimpleFunctionSymbol>()
+    private val transformedFunction = mutableMapOf<IrFunction, IrSimpleFunction>()
 
     val inlineClassDeclarationLowering = object : ClassLoweringPass {
         override fun lower(irClass: IrClass) {
@@ -46,17 +44,17 @@
             if (irConstructor.isPrimary) return irConstructor
 
             // Secondary constructors are lowered into static function
-            val result = transformedFunction.getOrPut(irConstructor.symbol) { createStaticBodilessMethod(irConstructor).symbol }.owner
+            val result = transformedFunction.getOrPut(irConstructor) { createStaticBodilessMethod(irConstructor) }
             val irClass = irConstructor.parentAsClass
 
             // Copied and adapted from Kotlin/Native InlineClassTransformer
-            result.body = context.createIrBuilder(result.symbol).irBlockBody(result) {
+            result.body = context.createIrBuilder(result).irBlockBody(result) {
 
                 // Secondary ctors of inline class must delegate to some other constructors.
                 // Use these delegating call later to initialize this variable.
                 lateinit var thisVar: IrVariable
                 val parameterMapping = result.valueParameters.associateBy {
-                    irConstructor.valueParameters[it.index].symbol
+                    irConstructor.valueParameters[it.index]
                 }
 
                 (irConstructor.body as IrBlockBody).statements.forEach { statement ->
@@ -74,11 +72,11 @@
 
                         override fun visitGetValue(expression: IrGetValue): IrExpression {
                             expression.transformChildrenVoid()
-                            if (expression.symbol == irClass.thisReceiver?.symbol) {
+                            if (expression.target == irClass.thisReceiver) {
                                 return irGet(thisVar)
                             }
 
-                            parameterMapping[expression.symbol]?.let { return irGet(it) }
+                            parameterMapping[expression.target]?.let { return irGet(it) }
                             return expression
                         }
 
@@ -91,7 +89,7 @@
 
                         override fun visitReturn(expression: IrReturn): IrExpression {
                             expression.transformChildrenVoid()
-                            if (expression.returnTargetSymbol == irConstructor.symbol) {
+                            if (expression.irReturnTarget == irConstructor) {
                                 return irReturn(irBlock(expression.startOffset, expression.endOffset) {
                                     +expression.value
                                     +irGet(thisVar)
@@ -116,7 +114,7 @@
                 return listOf(function)
 
             val staticMethod = createStaticBodilessMethod(function)
-            transformedFunction[function.symbol] = staticMethod.symbol
+            transformedFunction[function] = staticMethod
 
             // Move function body to static method, transforming value parameters and nested declarations
             function.body!!.transformChildrenVoid(object : IrElementTransformerVoid() {
@@ -129,9 +127,9 @@
                 }
 
                 override fun visitGetValue(expression: IrGetValue): IrExpression {
-                    val valueDeclaration = expression.symbol.owner as? IrValueParameter ?: return super.visitGetValue(expression)
+                    val valueDeclaration = expression.target as? IrValueParameter ?: return super.visitGetValue(expression)
 
-                    return context.createIrBuilder(staticMethod.symbol).irGet(
+                    return context.createIrBuilder(staticMethod).irGet(
                         when (valueDeclaration) {
                             function.dispatchReceiverParameter, function.parentAsClass.thisReceiver ->
                                 staticMethod.valueParameters[0]
@@ -152,11 +150,11 @@
 
             staticMethod.body = function.body
 
-            if (function.overriddenSymbols.isEmpty())  // Function is used only in unboxed context
+            if (function.overridden.isEmpty())  // Function is used only in unboxed context
                 return listOf(staticMethod)
 
             // Delegate original function to static implementation
-            function.body = context.createIrBuilder(function.symbol).irBlockBody {
+            function.body = context.createIrBuilder(function).irBlockBody {
                 +irReturn(
                     irCall(staticMethod).apply {
                         val parameters =
@@ -183,7 +181,7 @@
 
                 override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
                     expression.transformChildrenVoid(this)
-                    val function = expression.symbol.owner
+                    val function = expression.target
                     if (!function.parentAsClass.isInline || function.isPrimary) {
                         return expression
                     }
@@ -193,7 +191,7 @@
 
                 override fun visitCall(expression: IrCall): IrExpression {
                     expression.transformChildrenVoid(this)
-                    val function = expression.symbol.owner
+                    val function = expression.target
                     if (function.parent !is IrClass ||
                         function.isStaticMethodOfClass ||
                         !function.parentAsClass.isInline ||
@@ -212,7 +210,7 @@
 
                 override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
                     expression.transformChildrenVoid(this)
-                    val function = expression.symbol.owner
+                    val function = expression.target
                     val klass = function.parentAsClass
                     return when {
                         !klass.isInline -> expression
@@ -221,11 +219,11 @@
                     }
                 }
 
-                private fun getOrCreateStaticMethod(function: IrFunction): IrSimpleFunctionSymbol =
-                    transformedFunction.getOrPut(function.symbol) {
+                private fun getOrCreateStaticMethod(function: IrFunction): IrSimpleFunction =
+                    transformedFunction.getOrPut(function) {
                         createStaticBodilessMethod(function).also {
                             function.parentAsClass.declarations.add(it)
-                        }.symbol
+                        }
                     }
             })
         }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt
index 807d6be..e9de632 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt
@@ -13,15 +13,9 @@
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.builders.irGet
 import org.jetbrains.kotlin.ir.builders.irSetField
-import org.jetbrains.kotlin.ir.declarations.IrClass
-import org.jetbrains.kotlin.ir.declarations.IrConstructor
-import org.jetbrains.kotlin.ir.declarations.IrFunction
-import org.jetbrains.kotlin.ir.declarations.IrValueParameter
+import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.types.classOrNull
 import org.jetbrains.kotlin.ir.util.dump
 import org.jetbrains.kotlin.ir.util.parentAsClass
@@ -31,14 +25,14 @@
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 
 class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass {
-    private val IrValueSymbol.classForImplicitThis: IrClass?
+    private val IrValueDeclaration.classForImplicitThis: IrClass?
         // TODO: is this the correct way to get the class?
         get() =
-            if (this is IrValueParameterSymbol && owner.index == -1 &&
-                (owner == (owner.parent as? IrFunction)?.dispatchReceiverParameter ||
-                        owner == (owner.parent as? IrClass)?.thisReceiver)
+            if (this is IrValueParameter && index == -1 &&
+                (this == (parent as? IrFunction)?.dispatchReceiverParameter ||
+                        this == (parent as? IrClass)?.thisReceiver)
             ) {
-                owner.type.classOrNull?.owner
+                type.classOrNull?.owner
             } else
                 null
 
@@ -57,14 +51,14 @@
             }
 
             val blockBody = irConstructor.body as? IrBlockBody ?: throw AssertionError("Unexpected constructor body: ${irConstructor.body}")
-            context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply {
+            context.createIrBuilder(irConstructor, irConstructor.startOffset, irConstructor.endOffset).apply {
                 blockBody.statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter)))
             }
             if (blockBody.statements.find { it is IrInstanceInitializerCall } == null) {
                 val delegatingConstructorCall =
                     blockBody.statements.find { it is IrDelegatingConstructorCall } as IrDelegatingConstructorCall?
                         ?: throw AssertionError("Delegating constructor call expected: ${irConstructor.dump()}")
-                delegatingConstructorCall.apply { dispatchReceiver = IrGetValueImpl(startOffset, endOffset, outerThisParameter.symbol) }
+                delegatingConstructorCall.apply { dispatchReceiver = IrGetValueImpl(startOffset, endOffset, outerThisParameter) }
             }
             blockBody.patchDeclarationParents(loweredConstructor)
             loweredConstructor.body = blockBody
@@ -82,7 +76,7 @@
             override fun visitGetValue(expression: IrGetValue): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val implicitThisClass = expression.symbol.classForImplicitThis
+                val implicitThisClass = expression.target.classForImplicitThis
                 if (implicitThisClass == null || implicitThisClass == irClass) return expression
 
                 val startOffset = expression.startOffset
@@ -91,7 +85,7 @@
                 val function = currentFunction?.irElement as? IrFunction
                 val enclosingThisReceiver = function?.dispatchReceiverParameter ?: irClass.thisReceiver!!
 
-                var irThis: IrExpression = IrGetValueImpl(startOffset, endOffset, enclosingThisReceiver.symbol, origin)
+                var irThis: IrExpression = IrGetValueImpl(startOffset, endOffset, enclosingThisReceiver, origin)
                 var innerClass = irClass
                 while (innerClass != implicitThisClass) {
                     if (!innerClass.isInner) {
@@ -103,10 +97,10 @@
                     irThis = if (function is IrConstructor && irClass == innerClass) {
                         // Might be before a super() call (e.g. an argument to one), in which case the JVM bytecode verifier will reject
                         // an attempt to access the field. Good thing we have a local variable as well.
-                        IrGetValueImpl(startOffset, endOffset, function.valueParameters[0].symbol, origin)
+                        IrGetValueImpl(startOffset, endOffset, function.valueParameters[0], origin)
                     } else {
                         val outerThisField = context.declarationFactory.getOuterThisField(innerClass)
-                        IrGetFieldImpl(startOffset, endOffset, outerThisField.symbol, outerThisField.type, irThis, origin)
+                        IrGetFieldImpl(startOffset, endOffset, outerThisField, outerThisField.type, irThis, origin)
                     }
                     innerClass = innerClass.parentAsClass
                 }
@@ -129,13 +123,13 @@
                 expression.transformChildrenVoid(this)
 
                 val dispatchReceiver = expression.dispatchReceiver ?: return expression
-                val callee = expression.symbol
-                val parent = callee.owner.parentAsClass
+                val callee = expression.target
+                val parent = callee.parentAsClass
                 if (!parent.isInner) return expression
 
-                val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner)
+                val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee)
                 val newCall = IrConstructorCallImpl.fromSymbolOwner(
-                    expression.startOffset, expression.endOffset, expression.type, newCallee.symbol, expression.origin
+                    expression.startOffset, expression.endOffset, expression.type, newCallee, expression.origin
                 )
 
                 newCall.copyTypeArgumentsFrom(expression)
@@ -151,12 +145,12 @@
                 expression.transformChildrenVoid(this)
 
                 val dispatchReceiver = expression.dispatchReceiver ?: return expression
-                val classConstructor = expression.symbol.owner
+                val classConstructor = expression.target
                 if (!classConstructor.parentAsClass.isInner) return expression
 
                 val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor)
                 val newCall = IrDelegatingConstructorCallImpl(
-                    expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, newCallee.symbol, newCallee.descriptor,
+                    expression.startOffset, expression.endOffset, context.irBuiltIns.unitType, newCallee, newCallee.descriptor,
                     expression.typeArgumentsCount
                 ).apply { copyTypeArgumentsFrom(expression) }
 
@@ -171,18 +165,18 @@
             override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val callee = expression.symbol as? IrConstructorSymbol ?: return expression
-                val parent = callee.owner.parent as? IrClass ?: return expression
+                val callee = expression.target as? IrConstructor ?: return expression
+                val parent = callee.parent as? IrClass ?: return expression
                 if (!parent.isInner) return expression
 
-                val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner)
+                val newCallee = context.declarationFactory.getInnerClassConstructorWithOuterThisParameter(callee)
 
                 val newReference = expression.run {
                     IrFunctionReferenceImpl(
                         startOffset,
                         endOffset,
                         type,
-                        newCallee.symbol,
+                        newCallee,
                         newCallee.descriptor,
                         typeArgumentsCount,
                         origin
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt
index 3a03b15..32a7363 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt
@@ -51,7 +51,7 @@
         val callableReference = expression.dispatchReceiver as? IrCallableReference ?: return expression
 
         //TODO rewrite checking
-        val directMember = expression.symbol.owner.let {
+        val directMember = expression.target.let {
             (it as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: it
         }
         val irClass = directMember.parent as? IrClass ?: return expression
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt
index 70cbe59..810c7b4 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt
@@ -96,7 +96,7 @@
                 assert(!type.isPrimitiveType()) { "'lateinit' modifier is not allowed on primitive types" }
                 val startOffset = getter.startOffset
                 val endOffset = getter.endOffset
-                val irBuilder = context.createIrBuilder(getter.symbol, startOffset, endOffset)
+                val irBuilder = context.createIrBuilder(getter, startOffset, endOffset)
                 irBuilder.run {
                     val body = IrBlockBodyImpl(startOffset, endOffset)
                     val resultVar = scope.createTemporaryVariable(
@@ -119,10 +119,10 @@
         // Transform usages
         irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetValue(expression: IrGetValue): IrExpression {
-                val irVar = nullableVariables[expression.symbol.owner] ?: return expression
+                val irVar = nullableVariables[expression.target] ?: return expression
 
                 val parent = irVar.parent as IrSymbolOwner
-                val irBuilder = context.createIrBuilder(parent.symbol, expression.startOffset, expression.endOffset)
+                val irBuilder = context.createIrBuilder(parent, expression.startOffset, expression.endOffset)
 
                 return irBuilder.run {
                     irIfThenElse(
@@ -135,38 +135,38 @@
 
             override fun visitSetVariable(expression: IrSetVariable): IrExpression {
                 expression.transformChildrenVoid(this)
-                val newVar = nullableVariables[expression.symbol.owner] ?: return expression
+                val newVar = nullableVariables[expression.target] ?: return expression
                 return with(expression) {
-                    IrSetVariableImpl(startOffset, endOffset, type, newVar.symbol, value, origin)
+                    IrSetVariableImpl(startOffset, endOffset, type, newVar, value, origin)
                 }
             }
 
             override fun visitGetField(expression: IrGetField): IrExpression {
                 expression.transformChildrenVoid(this)
-                val newField = nullableFields[expression.symbol.owner] ?: return expression
+                val newField = nullableFields[expression.target] ?: return expression
                 return with(expression) {
-                    IrGetFieldImpl(startOffset, endOffset, newField.symbol, newField.type, receiver, origin, superQualifierSymbol)
+                    IrGetFieldImpl(startOffset, endOffset, newField, newField.type, receiver, origin, irSuperQualifier)
                 }
             }
 
             override fun visitSetField(expression: IrSetField): IrExpression {
                 expression.transformChildrenVoid(this)
-                val newField = nullableFields[expression.symbol.owner] ?: return expression
+                val newField = nullableFields[expression.target] ?: return expression
                 return with(expression) {
-                    IrSetFieldImpl(startOffset, endOffset, newField.symbol, receiver, value, type, origin, superQualifierSymbol)
+                    IrSetFieldImpl(startOffset, endOffset, newField, receiver, value, type, origin, irSuperQualifier)
                 }
             }
 
             override fun visitCall(expression: IrCall): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                if (!Symbols.isLateinitIsInitializedPropertyGetter(expression.symbol)) return expression
+                if (!Symbols.isLateinitIsInitializedPropertyGetter(expression.target)) return expression
 
                 val receiver = expression.extensionReceiver as IrPropertyReference
 
-                val property = receiver.getter?.owner?.resolveFakeOverride()?.correspondingProperty!!.also { assert(it.isLateinit) }
+                val property = receiver.getter?.resolveFakeOverride()?.correspondingProperty!!.also { assert(it.isLateinit) }
 
-                return expression.run { context.createIrBuilder(symbol, startOffset, endOffset) }.run {
+                return expression.run { context.createIrBuilder(target, startOffset, endOffset) }.run {
                     irNotEquals(irGetField(receiver.dispatchReceiver, property.backingField!!), irNull())
                 }
             }
@@ -186,5 +186,5 @@
             )
         }
 
-    private val throwErrorFunction by lazy { context.ir.symbols.ThrowUninitializedPropertyAccessException.owner }
+    private val throwErrorFunction by lazy { context.ir.symbols.ThrowUninitializedPropertyAccessException }
 }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt
index ec2e30e..d2a57c4 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt
@@ -25,7 +25,6 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
@@ -105,7 +104,7 @@
         override fun irGet(startOffset: Int, endOffset: Int, valueDeclaration: IrValueDeclaration): IrExpression? {
             val parameter = capturedValueToParameter[valueDeclaration] ?: return null
 
-            return IrGetValueImpl(startOffset, endOffset, parameter.type, parameter.symbol)
+            return IrGetValueImpl(startOffset, endOffset, parameter.type, parameter)
         }
     }
 
@@ -137,8 +136,8 @@
 
             val receiver = declaration.thisReceiver!!
             return IrGetFieldImpl(
-                startOffset, endOffset, field.symbol, field.type,
-                receiver = IrGetValueImpl(startOffset, endOffset, receiver.type, receiver.symbol)
+                startOffset, endOffset, field, field.type,
+                receiver = IrGetValueImpl(startOffset, endOffset, receiver.type, receiver)
             )
         }
     }
@@ -149,8 +148,8 @@
 
             val receiver = member.dispatchReceiverParameter!!
             return IrGetFieldImpl(
-                startOffset, endOffset, field.symbol, field.type,
-                receiver = IrGetValueImpl(startOffset, endOffset, receiver.type, receiver.symbol)
+                startOffset, endOffset, field, field.type,
+                receiver = IrGetValueImpl(startOffset, endOffset, receiver.type, receiver)
             )
         }
 
@@ -168,7 +167,7 @@
 
         val newParameterToOld: MutableMap<IrValueParameter, IrValueParameter> = mutableMapOf()
         val oldParameterToNew: MutableMap<IrValueParameter, IrValueParameter> = mutableMapOf()
-        val newParameterToCaptured: MutableMap<IrValueParameter, IrValueSymbol> = mutableMapOf()
+        val newParameterToCaptured: MutableMap<IrValueParameter, IrValueDeclaration> = mutableMapOf()
 
         fun lowerLocalDeclarations() {
             collectLocalDeclarations()
@@ -242,14 +241,14 @@
             }
 
             override fun visitGetValue(expression: IrGetValue): IrExpression {
-                val declaration = expression.symbol.owner
+                val declaration = expression.target
 
                 localContext?.irGet(expression.startOffset, expression.endOffset, declaration)?.let {
                     return it
                 }
 
                 oldParameterToNew[declaration]?.let {
-                    return IrGetValueImpl(expression.startOffset, expression.endOffset, it.type, it.symbol)
+                    return IrGetValueImpl(expression.startOffset, expression.endOffset, it.type, it)
                 }
 
                 return expression
@@ -258,7 +257,7 @@
             override fun visitCall(expression: IrCall): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val oldCallee = expression.symbol.owner
+                val oldCallee = expression.target
                 val newCallee = (oldCallee.transformed ?: return expression) as IrSimpleFunction
 
                 return createNewCall(expression, newCallee).fillArguments2(expression, newCallee)
@@ -267,7 +266,7 @@
             override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val oldCallee = expression.symbol.owner
+                val oldCallee = expression.target
                 val newCallee = (oldCallee.transformed ?: return expression) as IrConstructor
 
                 return createNewCall(expression, newCallee).fillArguments2(expression, newCallee)
@@ -276,13 +275,13 @@
             override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val oldCallee = expression.symbol.owner
+                val oldCallee = expression.target
                 val newCallee = transformedDeclarations[oldCallee] as IrConstructor? ?: return expression
 
                 return IrDelegatingConstructorCallImpl(
                     expression.startOffset, expression.endOffset,
                     context.irBuiltIns.unitType,
-                    newCallee.symbol,
+                    newCallee,
                     newCallee.descriptor,
                     expression.typeArgumentsCount
                 ).also {
@@ -310,16 +309,14 @@
                         oldExpression.getValueArgument(oldParameter.index)
                     } else {
                         // The callee expects captured value as argument.
-                        val capturedValueSymbol =
+                        val capturedValue =
                             newParameterToCaptured[newValueParameterDeclaration]
                                 ?: throw AssertionError("Non-mapped parameter $newValueParameterDeclaration")
 
-                        val capturedValue = capturedValueSymbol.owner
-
                         localContext?.irGet(oldExpression.startOffset, oldExpression.endOffset, capturedValue) ?: run {
                             // Captured value is directly available for the caller.
                             val value = oldParameterToNew[capturedValue] ?: capturedValue
-                            IrGetValueImpl(oldExpression.startOffset, oldExpression.endOffset, value.symbol)
+                            IrGetValueImpl(oldExpression.startOffset, oldExpression.endOffset, value)
                         }
                     }
 
@@ -334,13 +331,13 @@
             override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val oldCallee = expression.symbol.owner
+                val oldCallee = expression.target
                 val newCallee = oldCallee.transformed ?: return expression
 
                 return IrFunctionReferenceImpl(
                     expression.startOffset, expression.endOffset,
                     expression.type, // TODO functional type for transformed descriptor
-                    newCallee.symbol,
+                    newCallee,
                     newCallee.descriptor,
                     expression.typeArgumentsCount,
                     expression.origin
@@ -354,18 +351,18 @@
             override fun visitReturn(expression: IrReturn): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                val oldReturnTarget = expression.returnTargetSymbol.owner as? IrFunction ?: return expression
+                val oldReturnTarget = expression.irReturnTarget as? IrFunction ?: return expression
                 val newReturnTarget = oldReturnTarget.transformed ?: return expression
 
                 return IrReturnImpl(
                     expression.startOffset, expression.endOffset,
                     context.irBuiltIns.nothingType,
-                    newReturnTarget.symbol, expression.value
+                    newReturnTarget, expression.value
                 )
             }
 
             override fun visitDeclarationReference(expression: IrDeclarationReference): IrExpression {
-                if (expression.symbol.owner in transformedDeclarations) {
+                if (expression.target in transformedDeclarations) {
                     TODO()
                 }
                 return super.visitDeclarationReference(expression)
@@ -408,8 +405,8 @@
                     0,
                     localClassContext.capturedValueToField.map { (capturedValue, field) ->
                         IrSetFieldImpl(
-                            irClass.startOffset, irClass.endOffset, field.symbol,
-                            IrGetValueImpl(irClass.startOffset, irClass.endOffset, irClass.thisReceiver!!.symbol),
+                            irClass.startOffset, irClass.endOffset, field,
+                            IrGetValueImpl(irClass.startOffset, irClass.endOffset, irClass.thisReceiver!!),
                             constructorContext.irGet(irClass.startOffset, irClass.endOffset, capturedValue)!!,
                             context.irBuiltIns.unitType,
                             STATEMENT_ORIGIN_INITIALIZER_OF_FIELD_FOR_CAPTURED_VALUE
@@ -439,10 +436,10 @@
             IrCallImpl(
                 oldCall.startOffset, oldCall.endOffset,
                 newCallee.returnType,
-                newCallee.symbol,
+                newCallee,
                 newCallee.descriptor,
                 oldCall.typeArgumentsCount,
-                oldCall.origin, oldCall.superQualifierSymbol
+                oldCall.origin, oldCall.irSuperQualifier
             ).also {
                 it.copyTypeArgumentsFrom(oldCall)
             }
@@ -451,7 +448,7 @@
             IrConstructorCallImpl.fromSymbolOwner(
                 oldCall.startOffset, oldCall.endOffset,
                 newCallee.returnType,
-                newCallee.symbol,
+                newCallee,
                 oldCall.origin
             ).also {
                 it.copyTypeArgumentsFrom(oldCall)
@@ -545,13 +542,12 @@
         }
 
         private fun createTransformedValueParameters(
-            capturedValues: List<IrValueSymbol>,
+            capturedValues: List<IrValueDeclaration>,
             oldDeclaration: IrFunction,
             newDeclaration: IrFunction
         ) = ArrayList<IrValueParameter>(capturedValues.size + oldDeclaration.valueParameters.size).apply {
-            capturedValues.mapIndexedTo(this) { i, capturedValue ->
+            capturedValues.mapIndexedTo(this) { i, p ->
                 val parameterDescriptor = WrappedValueParameterDescriptor()
-                val p = capturedValue.owner
                 IrValueParameterImpl(
                     p.startOffset,
                     p.endOffset,
@@ -567,7 +563,7 @@
                 ).also {
                     parameterDescriptor.bind(it)
                     it.parent = newDeclaration
-                    newParameterToCaptured[it] = capturedValue
+                    newParameterToCaptured[it] = p
                 }
             }
 
@@ -583,7 +579,7 @@
             valueParameters.forEach {
                 val capturedValue = newParameterToCaptured[it]
                 if (capturedValue != null) {
-                    localContext.capturedValueToParameter[capturedValue.owner] = it
+                    localContext.capturedValueToParameter[capturedValue] = it
                 }
             }
 
@@ -671,13 +667,13 @@
                 val irField = createFieldForCapturedValue(
                     classDeclaration.startOffset,
                     classDeclaration.endOffset,
-                    suggestNameForCapturedValue(capturedValue.owner),
+                    suggestNameForCapturedValue(capturedValue),
                     Visibilities.PRIVATE,
                     classDeclaration,
-                    capturedValue.owner.type
+                    capturedValue.type
                 )
 
-                localClassContext.capturedValueToField[capturedValue.owner] = irField
+                localClassContext.capturedValueToField[capturedValue] = irField
             }
         }
 
@@ -723,7 +719,7 @@
                 }
 
                 override fun createScope(declaration: IrSymbolOwner): ScopeWithIr {
-                    return ScopeWithCounter(Scope(declaration.symbol), declaration)
+                    return ScopeWithCounter(Scope(declaration), declaration)
                 }
 
                 override fun visitSimpleFunction(declaration: IrSimpleFunction) {
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt
index 49cbbdf..f5b4e40 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt
@@ -28,7 +28,6 @@
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrSimpleType
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.classifierOrFail
@@ -43,11 +42,11 @@
 
 class DeclarationIrBuilder(
     backendContext: BackendContext,
-    symbol: IrSymbol,
+    target: IrSymbolOwner,
     startOffset: Int = UNDEFINED_OFFSET, endOffset: Int = UNDEFINED_OFFSET
 ) : IrBuilderWithScope(
     IrLoweringContext(backendContext),
-    Scope(symbol),
+    Scope(target),
     startOffset,
     endOffset
 )
@@ -56,8 +55,8 @@
     protected abstract fun remapVariable(value: IrValueDeclaration): IrValueDeclaration?
 
     override fun visitGetValue(expression: IrGetValue): IrExpression =
-        remapVariable(expression.symbol.owner)?.let {
-            IrGetValueImpl(expression.startOffset, expression.endOffset, it.type, it.symbol, expression.origin)
+        remapVariable(expression.target)?.let {
+            IrGetValueImpl(expression.startOffset, expression.endOffset, it.type, it, expression.origin)
         } ?: expression
 }
 
@@ -72,11 +71,11 @@
 }
 
 fun BackendContext.createIrBuilder(
-    symbol: IrSymbol,
+    target: IrSymbolOwner,
     startOffset: Int = UNDEFINED_OFFSET,
     endOffset: Int = UNDEFINED_OFFSET
 ) =
-    DeclarationIrBuilder(this, symbol, startOffset, endOffset)
+    DeclarationIrBuilder(this, target, startOffset, endOffset)
 
 
 fun <T : IrBuilder> T.at(element: IrElement) = this.at(element.startOffset, element.endOffset)
@@ -131,9 +130,9 @@
     protected val builder: IrBuilderWithScope
         get() = currentBuilder!!
 
-    private inline fun <T> withBuilder(symbol: IrSymbol, block: () -> T): T {
+    private inline fun <T> withBuilder(owner: IrSymbolOwner, block: () -> T): T {
         val oldBuilder = currentBuilder
-        currentBuilder = context.createIrBuilder(symbol)
+        currentBuilder = context.createIrBuilder(owner)
         return try {
             block()
         } finally {
@@ -142,20 +141,20 @@
     }
 
     override fun visitFunction(declaration: IrFunction): IrStatement {
-        withBuilder(declaration.symbol) {
+        withBuilder(declaration) {
             return super.visitFunction(declaration)
         }
     }
 
     override fun visitField(declaration: IrField): IrStatement {
-        withBuilder(declaration.symbol) {
+        withBuilder(declaration) {
             // Transforms initializer:
             return super.visitField(declaration)
         }
     }
 
     override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement {
-        withBuilder(declaration.symbol) {
+        withBuilder(declaration) {
             return super.visitAnonymousInitializer(declaration)
         }
     }
@@ -180,7 +179,7 @@
 
         override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall) {
             assert(++numberOfCalls == 1) { "More than one delegating constructor call: ${symbol.owner}" }
-            val delegatingClass = expression.symbol.owner.parent as IrClass
+            val delegatingClass = expression.target.parent as IrClass
             // TODO: figure out why Lazy IR multiplies Declarations for descriptors and fix it
             // It happens because of IrBuiltIns whose IrDeclarations are different for runtime and test
             if (delegatingClass.descriptor == superClass.classifierOrFail.descriptor)
@@ -228,12 +227,12 @@
 ) : IrElementTransformer<Nothing?> {
     override fun visitGetValue(expression: IrGetValue, data: Nothing?): IrExpression {
         val irGetValue = expression
-        if (irGetValue.symbol == oldThisReceiverParameter.symbol) {
+        if (irGetValue.target == oldThisReceiverParameter) {
             val instanceField = context.declarationFactory.getFieldForObjectInstance(irClass)
             return IrGetFieldImpl(
                 expression.startOffset,
                 expression.endOffset,
-                instanceField.symbol,
+                instanceField,
                 irClass.defaultType
             )
         }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ProvisionalFunctionExpressionLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ProvisionalFunctionExpressionLowering.kt
index e7ab960..11f7026 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ProvisionalFunctionExpressionLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ProvisionalFunctionExpressionLowering.kt
@@ -37,7 +37,7 @@
                 function,
                 IrFunctionReferenceImpl(
                     startOffset, endOffset, type,
-                    function.symbol, function.descriptor, 0,
+                    function, function.descriptor, 0,
                     origin
                 )
             )
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt
index 5bbdede..6de6ebe 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt
@@ -20,7 +20,6 @@
 import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl
-import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
 
 /**
  * Replaces returnable blocks and `return`'s with loops and `break`'s correspondingly.
@@ -77,17 +76,17 @@
 
 private class ReturnableBlockTransformer(val context: CommonBackendContext) : IrElementTransformerVoidWithContext() {
     private var labelCnt = 0
-    private val returnMap = mutableMapOf<IrReturnableBlockSymbol, (IrReturn) -> IrExpression>()
+    private val returnMap = mutableMapOf<IrReturnableBlock, (IrReturn) -> IrExpression>()
 
     override fun visitReturn(expression: IrReturn): IrExpression {
         expression.transformChildrenVoid()
-        return returnMap[expression.returnTargetSymbol]?.invoke(expression) ?: expression
+        return returnMap[expression.irReturnTarget]?.invoke(expression) ?: expression
     }
 
     override fun visitContainerExpression(expression: IrContainerExpression): IrExpression {
         if (expression !is IrReturnableBlock) return super.visitContainerExpression(expression)
 
-        val builder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol)
+        val builder = context.createIrBuilder(currentScope!!.scope.irScopeOwner)
         val variable by lazy {
             builder.scope.createTemporaryVariableDeclaration(expression.type, "tmp\$ret\$${labelCnt++}", true)
         }
@@ -106,26 +105,26 @@
 
         var hasReturned = false
 
-        returnMap[expression.symbol] = { returnExpression ->
+        returnMap[expression] = { returnExpression ->
             hasReturned = true
             builder.irComposite(returnExpression) {
-                +irSetVar(variable.symbol, returnExpression.value)
+                +irSetVar(variable, returnExpression.value)
                 +irBreak(loop)
             }
         }
 
         val newStatements = expression.statements.mapIndexed { i, s ->
-            if (i == expression.statements.lastIndex && s is IrReturn && s.returnTargetSymbol == expression.symbol) {
+            if (i == expression.statements.lastIndex && s is IrReturn && s.irReturnTarget == expression) {
                 s.transformChildrenVoid()
                 if (!hasReturned) s.value else {
-                    builder.irSetVar(variable.symbol, s.value)
+                    builder.irSetVar(variable, s.value)
                 }
             } else {
                 s.transform(this, null)
             }
         }
 
-        returnMap.remove(expression.symbol)
+        returnMap.remove(expression)
 
         if (!hasReturned) {
             return IrCompositeImpl(
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt
index 1f5d54c..105bf1d 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt
@@ -23,8 +23,6 @@
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.util.dump
 import org.jetbrains.kotlin.ir.visitors.*
 import java.util.*
@@ -108,7 +106,7 @@
                 override fun visitValueAccess(expression: IrValueAccessExpression, data: IrDeclarationParent?) {
                     expression.acceptChildren(this, data)
 
-                    val value = expression.symbol.owner
+                    val value = expression.target
                     if (value in relevantVars && (value as IrVariable).parent != data) {
                         sharedVariables.add(value)
                     }
@@ -117,7 +115,7 @@
         }
 
         private fun rewriteSharedVariables() {
-            val transformedSymbols = HashMap<IrValueSymbol, IrVariableSymbol>()
+            val transformed = HashMap<IrValueDeclaration, IrVariable>()
 
             irDeclaration.transformChildrenVoid(object : IrElementTransformerVoid() {
                 override fun visitVariable(declaration: IrVariable): IrStatement {
@@ -127,7 +125,7 @@
 
                     val newDeclaration = context.sharedVariablesManager.declareSharedVariable(declaration)
                     newDeclaration.parent = declaration.parent
-                    transformedSymbols[declaration.symbol] = newDeclaration.symbol
+                    transformed[declaration] = newDeclaration
 
                     return context.sharedVariablesManager.defineSharedValue(declaration, newDeclaration)
                 }
@@ -137,7 +135,7 @@
                 override fun visitGetValue(expression: IrGetValue): IrExpression {
                     expression.transformChildrenVoid(this)
 
-                    val newDeclaration = getTransformedSymbol(expression.symbol) ?: return expression
+                    val newDeclaration = getTransformedSymbol(expression.target) ?: return expression
 
                     return context.sharedVariablesManager.getSharedValue(newDeclaration, expression)
                 }
@@ -145,15 +143,15 @@
                 override fun visitSetVariable(expression: IrSetVariable): IrExpression {
                     expression.transformChildrenVoid(this)
 
-                    val newDeclaration = getTransformedSymbol(expression.symbol) ?: return expression
+                    val newDeclaration = getTransformedSymbol(expression.target) ?: return expression
 
                     return context.sharedVariablesManager.setSharedValue(newDeclaration, expression)
                 }
 
-                private fun getTransformedSymbol(oldSymbol: IrValueSymbol): IrVariableSymbol? =
-                    transformedSymbols.getOrElse(oldSymbol) {
-                        assert(oldSymbol.owner !in sharedVariables) {
-                            "Shared variable is not transformed: ${oldSymbol.owner.dump()}"
+                private fun getTransformedSymbol(old: IrValueDeclaration): IrVariable? =
+                    transformed.getOrElse(old) {
+                        assert(old !in sharedVariables) {
+                            "Shared variable is not transformed: ${old.dump()}"
                         }
                         null
                     }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt
index 5cc6155..ef58810 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt
@@ -46,7 +46,7 @@
         IrConstImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.intType, IrConstKind.Int, -1)
 
     private fun getSecondArg(bridge: IrSimpleFunction) =
-        IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, bridge.valueParameters[1].symbol)
+        IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, bridge.valueParameters[1])
 
     private val SPECIAL_METHODS_WITH_DEFAULTS_MAP = mapOf<SpecialMethodDescription, (IrSimpleFunction) -> IrExpression>(
         makeDescription("kotlin.collections.Collection", "contains", 1) to ::constFalse,
@@ -80,7 +80,7 @@
         return sequence {
             yield(this@search)
             visited.add(this@search)
-            overriddenSymbols.forEach { yieldAll(it.owner.search()) }
+            overridden.forEach { yieldAll(it.search()) }
         }
     }
 
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt
index 39959aa..fdaf67c 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt
@@ -58,7 +58,7 @@
     private val nameToString = Name.identifier("toString")
     private val nameAppend = Name.identifier("append")
 
-    private val stringBuilder = context.ir.symbols.stringBuilder.owner
+    private val stringBuilder = context.ir.symbols.stringBuilder
 
     //TODO: calculate and pass string length to the constructor.
     private val constructor = stringBuilder.constructors.single {
@@ -113,7 +113,7 @@
 
         with(declaration) {
             buildersStack.add(
-                context.createIrBuilder(declaration.symbol, startOffset, endOffset)
+                context.createIrBuilder(declaration, startOffset, endOffset)
             )
             transformChildrenVoid(this@StringConcatenationTransformer)
             buildersStack.removeAt(buildersStack.lastIndex)
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt
index 5ed6571..a3d1f95 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt
@@ -22,7 +22,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
 import org.jetbrains.kotlin.ir.util.explicitParameters
 import org.jetbrains.kotlin.ir.util.getArgumentsWithIr
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -53,14 +52,14 @@
     }
 
     val oldBody = irFunction.body as IrBlockBody
-    val builder = context.createIrBuilder(irFunction.symbol).at(oldBody)
+    val builder = context.createIrBuilder(irFunction).at(oldBody)
 
     val parameters = irFunction.explicitParameters
 
     irFunction.body = builder.irBlockBody {
         // Define variables containing current values of parameters:
         val parameterToVariable = parameters.associate {
-            it to createTmpVariable(irGet(it), nameHint = it.symbol.suggestVariableName(), isMutable = true)
+            it to createTmpVariable(irGet(it), nameHint = it.suggestVariableName(), isMutable = true)
         }
         // (these variables are to be updated on any tail call).
 
@@ -72,7 +71,7 @@
                 // Read variables containing current values of parameters:
                 val parameterToNew = parameters.associate {
                     val variable = parameterToVariable[it]!!
-                    it to createTmpVariable(irGet(variable), nameHint = it.symbol.suggestVariableName())
+                    it to createTmpVariable(irGet(variable), nameHint = it.suggestVariableName())
                 }
 
                 val transformer = BodyTransformer(
@@ -103,7 +102,7 @@
 
     override fun visitGetValue(expression: IrGetValue): IrExpression {
         expression.transformChildrenVoid(this)
-        val value = parameterToNew[expression.symbol.owner] ?: return expression
+        val value = parameterToNew[expression.target] ?: return expression
         return builder.at(expression).irGet(value)
     }
 
@@ -127,7 +126,7 @@
             at(argument)
             // Note that argument can use values of parameters, so it is important that
             // references to parameters are mapped using `parameterToNew`, not `parameterToVariable`.
-            +irSetVar(parameterToVariable[parameter]!!.symbol, argument)
+            +irSetVar(parameterToVariable[parameter]!!, argument)
         }
 
         val specifiedParameters = parameterToArgument.map { (parameter, _) -> parameter }.toSet()
@@ -145,15 +144,15 @@
                     override fun visitGetValue(expression: IrGetValue): IrExpression {
                         expression.transformChildrenVoid(this)
 
-                        val variable = parameterToVariable[expression.symbol.owner] ?: return expression
+                        val variable = parameterToVariable[expression.target] ?: return expression
                         return IrGetValueImpl(
                             expression.startOffset, expression.endOffset, variable.type,
-                            variable.symbol, expression.origin
+                            variable, expression.origin
                         )
                     }
                 }, data = null)
 
-            +irSetVar(parameterToVariable[parameter]!!.symbol, defaultValue)
+            +irSetVar(parameterToVariable[parameter]!!, defaultValue)
         }
 
         // Jump to the entry:
@@ -161,10 +160,10 @@
     }
 }
 
-private fun IrValueParameterSymbol.suggestVariableName(): String =
-    if (owner.name.isSpecial) {
-        val oldNameStr = owner.name.asString()
+private fun IrValueParameter.suggestVariableName(): String =
+    if (name.isSpecial) {
+        val oldNameStr = name.asString()
         "$" + oldNameStr.substring(1, oldNameStr.length - 1)
     } else {
-        owner.name.identifier
+        name.identifier
     }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt
index ade9927..4b01c5d 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt
@@ -20,9 +20,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.isNullable
@@ -39,18 +36,18 @@
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
         expression.transformChildrenVoid(this)
         val callee = when (expression) {
-            is IrCall -> expression.symbol.owner
-            is IrConstructorCall -> expression.symbol.owner
+            is IrCall -> expression.target
+            is IrConstructorCall -> expression.target
             else -> return expression
         }
         if (!callee.needsInlining)
             return expression
-        if (Symbols.isLateinitIsInitializedPropertyGetter(callee.symbol))
+        if (Symbols.isLateinitIsInitializedPropertyGetter(callee))
             return expression
-        if (Symbols.isTypeOfIntrinsic(callee.symbol))
+        if (Symbols.isTypeOfIntrinsic(callee))
             return expression
 
-        val actualCallee = getFunctionDeclaration(callee.symbol)
+        val actualCallee = getFunctionDeclaration(callee)
 
         val parent = allScopes.map { it.irElement }.filterIsInstance<IrDeclarationParent>().lastOrNull()
 
@@ -58,8 +55,8 @@
         return inliner.inline()
     }
 
-    private fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction {
-        val descriptor = symbol.descriptor.original
+    private fun getFunctionDeclaration(function: IrFunction): IrFunction {
+        val descriptor = function.descriptor.original
         val languageVersionSettings = context.configuration.languageVersionSettings
         // TODO: Remove these hacks when coroutine intrinsics are fixed.
         return when {
@@ -67,12 +64,12 @@
                 error("Continuation.intercepted is not available with release coroutines")
 
             descriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(languageVersionSettings) ->
-                context.ir.symbols.suspendCoroutineUninterceptedOrReturn.owner
+                context.ir.symbols.suspendCoroutineUninterceptedOrReturn
 
-            symbol == context.ir.symbols.coroutineContextGetter ->
-                context.ir.symbols.coroutineGetContext.owner
+            function == context.ir.symbols.coroutineContextGetter ->
+                context.ir.symbols.coroutineGetContext
 
-            else -> (symbol.owner as? IrSimpleFunction)?.resolveFakeOverride() ?: symbol.owner
+            else -> (function as? IrSimpleFunction)?.resolveFakeOverride() ?: function
         }
     }
 
@@ -127,10 +124,6 @@
 
             val irReturnableBlockSymbol = IrReturnableBlockSymbolImpl(copiedCallee.descriptor.original)
             val endOffset = callee.endOffset
-            /* creates irBuilder appending to the end of the given returnable block: thus why we initialize
-             * irBuilder with (..., endOffset, endOffset).
-             */
-            val irBuilder = context.createIrBuilder(irReturnableBlockSymbol, endOffset, endOffset)
 
             val transformer = ParameterSubstitutor()
             statements.transform { it.transform(transformer, data = null) }
@@ -147,13 +140,17 @@
                 symbol = irReturnableBlockSymbol,
                 origin = if (isCoroutineIntrinsicCall) CoroutineIntrinsicLambdaOrigin else null,
                 statements = statements,
-                inlineFunctionSymbol = callee.symbol
+                inlineFunction = callee
             ).apply {
+                /* creates irBuilder appending to the end of the given returnable block: thus why we initialize
+                 * irBuilder with (..., endOffset, endOffset).
+                 */
+                val irBuilder = context.createIrBuilder(this, endOffset, endOffset)
                 transformChildrenVoid(object : IrElementTransformerVoid() {
                     override fun visitReturn(expression: IrReturn): IrExpression {
                         expression.transformChildrenVoid(this)
 
-                        if (expression.returnTargetSymbol == copiedCallee.symbol)
+                        if (expression.irReturnTarget == copiedCallee)
                             return irBuilder.irReturn(expression.value)
                         return expression
                     }
@@ -168,7 +165,7 @@
 
             override fun visitGetValue(expression: IrGetValue): IrExpression {
                 val newExpression = super.visitGetValue(expression) as IrGetValue
-                val argument = substituteMap[newExpression.symbol.owner] ?: return newExpression
+                val argument = substituteMap[newExpression.target] ?: return newExpression
 
                 argument.transformChildrenVoid(this) // Default argument can contain subjects for substitution.
 
@@ -184,14 +181,14 @@
                     return super.visitCall(expression)
 
                 val dispatchReceiver = expression.dispatchReceiver as IrGetValue
-                val functionArgument = substituteMap[dispatchReceiver.symbol.owner] ?: return super.visitCall(expression)
-                if ((dispatchReceiver.symbol.owner as? IrValueParameter)?.isNoinline == true)
+                val functionArgument = substituteMap[dispatchReceiver.target] ?: return super.visitCall(expression)
+                if ((dispatchReceiver.target as? IrValueParameter)?.isNoinline == true)
                     return super.visitCall(expression)
 
                 if (functionArgument is IrFunctionReference) {
                     functionArgument.transformChildrenVoid(this)
 
-                    val function = functionArgument.symbol.owner
+                    val function = functionArgument.target
                     val functionParameters = function.explicitParameters
                     val boundFunctionParameters = functionArgument.getArgumentsWithIr()
                     val unboundFunctionParameters = functionParameters - boundFunctionParameters.map { it.first }
@@ -203,9 +200,9 @@
 
                     val immediateCall = with(expression) {
                         if (function is IrConstructor)
-                            IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, function.returnType, function.symbol)
+                            IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, function.returnType, function)
                         else
-                            IrCallImpl(startOffset, endOffset, function.returnType, functionArgument.symbol)
+                            IrCallImpl(startOffset, endOffset, function.returnType, functionArgument.target)
                     }.apply {
                         functionParameters.forEach {
                             val argument =
@@ -264,7 +261,7 @@
                 IrTypeOperatorCallImpl(startOffset, endOffset, type, IrTypeOperator.IMPLICIT_CAST, type, this)
 
         private fun isLambdaCall(irCall: IrCall): Boolean {
-            val callee = irCall.symbol.owner
+            val callee = irCall.target
             val dispatchReceiver = callee.dispatchReceiverParameter ?: return false
             assert(!dispatchReceiver.type.isKFunction())
 
@@ -290,11 +287,11 @@
 
             val isImmutableVariableLoad: Boolean
                 get() = argumentExpression.let {
-                    it is IrGetValue && !it.symbol.owner.let { it is IrVariable && it.isVar }
+                    it is IrGetValue && !it.target.let { it is IrVariable && it.isVar }
                 }
         }
 
-        // callee might be a copied version of callsite.symbol.owner
+        // callee might be a copied version of callsite
         private fun buildParameterToArgument(callSite: IrFunctionAccessExpression, callee: IrFunction): List<ParameterToArgument> {
 
             val parameterToArgument = mutableListOf<ParameterToArgument>()
@@ -306,7 +303,7 @@
                 )
 
             val valueArguments =
-                callSite.symbol.owner.valueParameters.map { callSite.getValueArgument(it.index) }.toMutableList()
+                callSite.target.valueParameters.map { callSite.getValueArgument(it.index) }.toMutableList()
 
             if (callee.extensionReceiverParameter != null) {
                 parameterToArgument += ParameterToArgument(
@@ -374,7 +371,7 @@
             val arguments = functionReference.getArgumentsWithIr().map { ParameterToArgument(it.first, it.second) }
             val evaluationStatements = mutableListOf<IrStatement>()
             val substitutor = ParameterSubstitutor()
-            val referenced = functionReference.symbol.owner
+            val referenced = functionReference.target
             arguments.forEach {
                 val newArgument = if (it.isImmutableVariableLoad) {
                     it.argumentExpression.transform( // Arguments may reference the previous ones - substitute them.
@@ -388,13 +385,13 @@
                                 substitutor,
                                 data = null
                             ),
-                            nameHint = callee.symbol.owner.name.toString(),
+                            nameHint = callee.name.toString(),
                             isMutable = false
                         )
 
                     evaluationStatements.add(newVariable)
 
-                    IrGetValueWithoutLocation(newVariable.symbol)
+                    IrGetValueWithoutLocation(newVariable)
                 }
                 when (it.parameter) {
                     referenced.dispatchReceiverParameter -> functionReference.dispatchReceiver = newArgument
@@ -436,27 +433,27 @@
                         irExpression = IrBlockImpl (variableInitializer.startOffset,
                                 variableInitializer.endOffset,
                                 variableInitializer.type,
-                                InlinerExpressionLocationHint((currentScope.irElement as IrSymbolOwner).symbol)).apply {
+                                InlinerExpressionLocationHint(currentScope.irElement as IrSymbolOwner)).apply {
                             statements.add(variableInitializer)
                         },
-                        nameHint = callee.symbol.owner.name.toString(),
+                        nameHint = callee.name.toString(),
                         isMutable = false
                     )
 
                 evaluationStatements.add(newVariable)
-                substituteMap[it.parameter] = IrGetValueWithoutLocation(newVariable.symbol)
+                substituteMap[it.parameter] = IrGetValueWithoutLocation(newVariable)
             }
             return evaluationStatements
         }
     }
 
     private class IrGetValueWithoutLocation(
-        symbol: IrValueSymbol,
+        target: IrValueDeclaration,
         override val origin: IrStatementOrigin? = null
-    ) : IrTerminalDeclarationReferenceBase<IrValueSymbol, ValueDescriptor>(
+    ) : IrTerminalDeclarationReferenceBase<IrValueDeclaration, ValueDescriptor>(
         UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-        symbol.owner.type,
-        symbol, symbol.descriptor
+        target.type,
+        target, target.descriptor
     ), IrGetValue {
         override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D) =
             visitor.visitGetValue(this, data)
@@ -466,16 +463,16 @@
         }
 
         fun withLocation(startOffset: Int, endOffset: Int) =
-            IrGetValueImpl(startOffset, endOffset, type, symbol, origin)
+            IrGetValueImpl(startOffset, endOffset, type, target, origin)
     }
 }
 
-class InlinerExpressionLocationHint(val inlineAtSymbol: IrSymbol) : IrStatementOrigin {
+class InlinerExpressionLocationHint(val inlineAt: IrSymbolOwner) : IrStatementOrigin {
     override fun toString(): String = "(${this.javaClass.simpleName} : $functionNameOrDefaultToString @${functionFileOrNull?.fileEntry?.name})"
 
     private val functionFileOrNull: IrFile?
-        get() = (inlineAtSymbol as? IrFunction)?.file
+        get() = (inlineAt as? IrFunction)?.file
 
     private val functionNameOrDefaultToString: String
-        get() = (inlineAtSymbol as? IrFunction)?.name?.asString() ?: inlineAtSymbol.toString()
+        get() = (inlineAt as? IrFunction)?.name?.asString() ?: inlineAt.toString()
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt
index 67986de..b34ae52 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt
@@ -15,7 +15,6 @@
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 
@@ -117,11 +116,11 @@
 ) : IrElementTransformerVoidWithContext() {
 
     private val symbols = context.ir.symbols
-    private val iteratorToLoopHeader = mutableMapOf<IrVariableSymbol, ForLoopHeader>()
-    private val headerInfoBuilder = HeaderInfoBuilder(context, this::getScopeOwnerSymbol)
-    private val headerProcessor = HeaderProcessor(context, headerInfoBuilder, this::getScopeOwnerSymbol)
+    private val iteratorToLoopHeader = mutableMapOf<IrVariable, ForLoopHeader>()
+    private val headerInfoBuilder = HeaderInfoBuilder(context, this::getScopeOwner)
+    private val headerProcessor = HeaderProcessor(context, headerInfoBuilder, this::getScopeOwner)
 
-    fun getScopeOwnerSymbol() = currentScope!!.scope.scopeOwnerSymbol
+    fun getScopeOwner() = currentScope!!.scope.irScopeOwner
 
     override fun visitVariable(declaration: IrVariable): IrStatement {
         val initializer = declaration.initializer
@@ -145,10 +144,10 @@
      * Returns null if the for-loop cannot be lowered.
      */
     private fun processHeader(variable: IrVariable): IrStatement? {
-        assert(variable.symbol !in iteratorToLoopHeader)
+        assert(variable !in iteratorToLoopHeader)
         val forLoopInfo = headerProcessor.processHeader(variable)
             ?: return null  // If the for-loop cannot be lowered.
-        iteratorToLoopHeader[variable.symbol] = forLoopInfo
+        iteratorToLoopHeader[variable] = forLoopInfo
 
         // Lower into a composite with additional declarations (e.g., induction variable)
         // used in the loop condition and body.
@@ -166,7 +165,7 @@
             return super.visitWhileLoop(loop)
         }
 
-        with(context.createIrBuilder(getScopeOwnerSymbol(), loop.startOffset, loop.endOffset)) {
+        with(context.createIrBuilder(getScopeOwner(), loop.startOffset, loop.endOffset)) {
             // Visit the loop body to process the "next" statement and lower nested loops.
             // Processing the "next" statement is necessary for building loops that need to
             // reference the loop variable in the loop condition.
@@ -199,7 +198,7 @@
         val iterator = expression.dispatchReceiver as IrGetValue
 
         // Return null if we didn't lower the corresponding header.
-        return iteratorToLoopHeader[iterator.symbol]
+        return iteratorToLoopHeader[iterator.target]
     }
 
     /**
@@ -224,7 +223,7 @@
         //   val i = initializeLoopVariable() // `inductionVariable` for progressions
         //                                    // `array[inductionVariable]` for arrays
         //   inductionVariable = inductionVariable + step
-        return with(context.createIrBuilder(getScopeOwnerSymbol(), initializer.startOffset, initializer.endOffset)) {
+        return with(context.createIrBuilder(getScopeOwner(), initializer.startOffset, initializer.endOffset)) {
             variable.initializer = forLoopInfo.initializeLoopVariable(symbols, this)
             val increment = forLoopInfo.incrementInductionVariable(this)
             IrCompositeImpl(
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderInfo.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderInfo.kt
index 762664a..3a9dca0 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderInfo.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderInfo.kt
@@ -9,11 +9,11 @@
 import org.jetbrains.kotlin.backend.common.ir.Symbols
 import org.jetbrains.kotlin.backend.common.lower.matchers.IrCallMatcher
 import org.jetbrains.kotlin.ir.IrElement
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.isSubtypeOfClass
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -175,9 +175,9 @@
     fun match(expression: E): Boolean
 
     /** Builds a [HeaderInfo] from the expression. */
-    fun build(expression: E, data: D, scopeOwner: IrSymbol): HeaderInfo?
+    fun build(expression: E, data: D, scopeOwner: IrSymbolOwner): HeaderInfo?
 
-    fun handle(expression: E, data: D, scopeOwner: IrSymbol) = if (match(expression)) {
+    fun handle(expression: E, data: D, scopeOwner: IrSymbolOwner) = if (match(expression)) {
         build(expression, data, scopeOwner)
     } else {
         null
@@ -185,8 +185,8 @@
 }
 
 internal interface ExpressionHandler : HeaderInfoHandler<IrExpression, Nothing?> {
-    fun build(expression: IrExpression, scopeOwner: IrSymbol): HeaderInfo?
-    override fun build(expression: IrExpression, data: Nothing?, scopeOwner: IrSymbol) = build(expression, scopeOwner)
+    fun build(expression: IrExpression, scopeOwner: IrSymbolOwner): HeaderInfo?
+    override fun build(expression: IrExpression, data: Nothing?, scopeOwner: IrSymbolOwner) = build(expression, scopeOwner)
 }
 
 /** Matches a call to build an iterable and builds a [HeaderInfo] from the call's context. */
@@ -198,7 +198,7 @@
 
 internal typealias ProgressionHandler = HeaderInfoFromCallHandler<ProgressionType>
 
-internal class HeaderInfoBuilder(context: CommonBackendContext, private val scopeOwnerSymbol: () -> IrSymbol) :
+internal class HeaderInfoBuilder(context: CommonBackendContext, private val scopeOwner: () -> IrSymbolOwner) :
     IrElementVisitor<HeaderInfo?, Nothing?> {
 
     private val symbols = context.ir.symbols
@@ -233,21 +233,21 @@
     /** Builds a [HeaderInfo] for iterable expressions that are calls (e.g., `.reversed()`, `.indices`. */
     override fun visitCall(expression: IrCall, data: Nothing?): HeaderInfo? {
         // Return the HeaderInfo from the first successful match. First, try to match a `reversed()` call.
-        val reversedHeaderInfo = reversedHandler.handle(expression, null, scopeOwnerSymbol())
+        val reversedHeaderInfo = reversedHandler.handle(expression, null, scopeOwner())
         if (reversedHeaderInfo != null)
             return reversedHeaderInfo
 
         // Try to match a call to build a progression (e.g., `.indices`, `downTo`).
         val progressionType = ProgressionType.fromIrType(expression.type, symbols)
         val progressionHeaderInfo =
-            progressionType?.run { progressionHandlers.firstNotNullResult { it.handle(expression, this, scopeOwnerSymbol()) } }
+            progressionType?.run { progressionHandlers.firstNotNullResult { it.handle(expression, this, scopeOwner()) } }
 
         return progressionHeaderInfo ?: super.visitCall(expression, data)
     }
 
     /** Builds a [HeaderInfo] for iterable expressions not handled in [visitCall]. */
     override fun visitExpression(expression: IrExpression, data: Nothing?): HeaderInfo? {
-        return expressionHandlers.firstNotNullResult { it.handle(expression, null, scopeOwnerSymbol()) }
+        return expressionHandlers.firstNotNullResult { it.handle(expression, null, scopeOwner()) }
             ?: super.visitExpression(expression, data)
     }
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt
index 70ba88a..3d0fbbf 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt
@@ -14,13 +14,13 @@
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrLoop
 import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrWhileLoopImpl
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.functions
 import org.jetbrains.kotlin.ir.util.getPackageFragment
@@ -66,8 +66,8 @@
                     it.valueParameters[0].type == step.type
         }
         irSetVar(
-            inductionVariable.symbol, irCallOp(
-                plusFun.symbol, plusFun.returnType,
+            inductionVariable, irCallOp(
+                plusFun, plusFun.returnType,
                 irGet(inductionVariable),
                 irGet(step)
             )
@@ -245,7 +245,7 @@
 internal class HeaderProcessor(
     private val context: CommonBackendContext,
     private val headerInfoBuilder: HeaderInfoBuilder,
-    private val scopeOwnerSymbol: () -> IrSymbol
+    private val scopeOwner: () -> IrSymbolOwner
 ) {
 
     private val symbols = context.ir.symbols
@@ -274,7 +274,7 @@
         val iterable = (variable.initializer as? IrCall)?.let {
             val extensionReceiver = it.extensionReceiver
             if (extensionReceiver != null) {
-                val function = it.symbol.owner
+                val function = it.target
                 if (it.valueArgumentsCount == 0
                     && function.isTopLevel
                     && function.getPackageFragment()?.fqName == FqName("kotlin.text")
@@ -292,7 +292,7 @@
         val headerInfo = iterable?.accept(headerInfoBuilder, null)
             ?: return null  // If the iterable is not supported.
 
-        val builder = context.createIrBuilder(scopeOwnerSymbol(), variable.startOffset, variable.endOffset)
+        val builder = context.createIrBuilder(scopeOwner(), variable.startOffset, variable.endOffset)
         with(builder) builder@{
             with(headerInfo) {
                 // For this loop:
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt
index 836e9a2..9b5cdee 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt
@@ -12,12 +12,11 @@
 import org.jetbrains.kotlin.backend.common.lower.matchers.createIrCallMatcher
 import org.jetbrains.kotlin.backend.common.lower.matchers.singleArgumentExtension
 import org.jetbrains.kotlin.ir.builders.*
-import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -35,7 +34,7 @@
         parameter(0) { it.type in progressionElementTypes }
     }
 
-    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbol) =
+    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbolOwner) =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             ProgressionHeaderInfo(
                 data,
@@ -57,7 +56,7 @@
         parameter(0) { it.type in progressionElementTypes }
     }
 
-    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbol): HeaderInfo? =
+    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbolOwner): HeaderInfo? =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             ProgressionHeaderInfo(
                 data,
@@ -79,7 +78,7 @@
         parameter(0) { it.type in progressionElementTypes }
     }
 
-    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbol): HeaderInfo? =
+    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbolOwner): HeaderInfo? =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             // `A until B` is essentially the same as `A .. (B-1)`. However, B could be MIN_VALUE and hence `(B-1)` could underflow.
             // If B is MIN_VALUE, then `A until B` is an empty range. We handle this special case be adding an additional "not empty"
@@ -222,7 +221,7 @@
 /** Builds a [HeaderInfo] for progressions built using the `indices` extension property. */
 internal abstract class IndicesHandler(protected val context: CommonBackendContext) : ProgressionHandler {
 
-    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbol): HeaderInfo? =
+    override fun build(expression: IrCall, data: ProgressionType, scopeOwner: IrSymbolOwner): HeaderInfo? =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             // `last = array.size - 1` (last is inclusive) for the loop `for (i in array.indices)`.
             val receiver = expression.extensionReceiver!!
@@ -268,7 +267,7 @@
     override val IrType.sizePropertyGetter
         get() = getClass()?.properties?.first { it.name.asString() == "length" }?.let {
             it.getter!!
-        } ?: context.ir.symbols.charSequence.getPropertyGetter("length")!!.owner
+        } ?: context.ir.symbols.charSequence.getPropertyGetter("length")!!
 }
 
 /** Builds a [HeaderInfo] for calls to reverse an iterable. */
@@ -290,7 +289,7 @@
     }
 
     // Reverse the HeaderInfo from the underlying progression or array (if any).
-    override fun build(expression: IrCall, data: Nothing?, scopeOwner: IrSymbol) =
+    override fun build(expression: IrCall, data: Nothing?, scopeOwner: IrSymbolOwner) =
         expression.extensionReceiver!!.accept(visitor, null)?.asReversed()
 }
 
@@ -301,7 +300,7 @@
 
     override fun match(expression: IrExpression) = ProgressionType.fromIrType(expression.type, symbols) != null
 
-    override fun build(expression: IrExpression, scopeOwner: IrSymbol): HeaderInfo? =
+    override fun build(expression: IrExpression, scopeOwner: IrSymbolOwner): HeaderInfo? =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             // Directly use the `first/last/step` properties of the progression.
             val progression = scope.createTemporaryVariable(expression, nameHint = "progression")
@@ -331,7 +330,7 @@
 }
 
 internal abstract class IndexedGetIterationHandler(protected val context: CommonBackendContext) : ExpressionHandler {
-    override fun build(expression: IrExpression, scopeOwner: IrSymbol): HeaderInfo? =
+    override fun build(expression: IrExpression, scopeOwner: IrSymbolOwner): HeaderInfo? =
         with(context.createIrBuilder(scopeOwner, expression.startOffset, expression.endOffset)) {
             // Consider the case like:
             //
@@ -391,9 +390,9 @@
     override val IrType.sizePropertyGetter
         get() = getClass()?.properties?.first { it.name.asString() == "length" }?.let {
             it.getter!!
-        } ?: context.ir.symbols.charSequence.getPropertyGetter("length")!!.owner
+        } ?: context.ir.symbols.charSequence.getPropertyGetter("length")!!
 
     override val IrType.getFunction
         get() = getClass()?.functions?.first { it.name.asString() == "get" }
-            ?: context.ir.symbols.charSequence.getSimpleFunction("get")!!.owner
+            ?: context.ir.symbols.charSequence.getSimpleFunction("get")!!
 }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/Utils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/Utils.kt
index 108102e..c1be0d9 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/Utils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/Utils.kt
@@ -22,7 +22,7 @@
         this
     } else {
         val function = type.getClass()!!.functions.first { it.name == numberCastFunctionName }
-        IrCallImpl(startOffset, endOffset, function.returnType, function.symbol)
+        IrCallImpl(startOffset, endOffset, function.returnType, function)
             .apply { dispatchReceiver = this@castIfNecessary }
     }
 }
@@ -35,7 +35,7 @@
         is Long -> IrConstImpl(startOffset, endOffset, type, IrConstKind.Long, -value)
         else -> {
             val unaryMinusFun = type.getClass()!!.functions.first { it.name == OperatorNameConventions.UNARY_MINUS }
-            IrCallImpl(startOffset, endOffset, type, unaryMinusFun.symbol, unaryMinusFun.descriptor).apply {
+            IrCallImpl(startOffset, endOffset, type, unaryMinusFun, unaryMinusFun.descriptor).apply {
                 dispatchReceiver = this@negate
             }
         }
@@ -51,7 +51,7 @@
         is Char -> IrConstImpl(startOffset, endOffset, type, IrConstKind.Char, thisValue - 1)
         else -> {
             val decFun = type.getClass()!!.functions.first { it.name == OperatorNameConventions.DEC }
-            IrCallImpl(startOffset, endOffset, type, decFun.symbol, decFun.descriptor).apply {
+            IrCallImpl(startOffset, endOffset, type, decFun, decFun.descriptor).apply {
                 dispatchReceiver = this@decrement
             }
         }
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/matchers/IrCallMatcher.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/matchers/IrCallMatcher.kt
index d2fc995..aa097ca 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/matchers/IrCallMatcher.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/matchers/IrCallMatcher.kt
@@ -20,7 +20,7 @@
 
     private val calleeRestriction: IrFunctionMatcher = createIrFunctionRestrictions(restrictions)
 
-    override fun invoke(call: IrCall) = calleeRestriction(call.symbol.owner)
+    override fun invoke(call: IrCall) = calleeRestriction(call.target)
 }
 
 internal class IrCallExtensionReceiverMatcher(
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrBackendUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrBackendUtils.kt
index 33eb31a..5dc821c 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrBackendUtils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrBackendUtils.kt
@@ -17,25 +17,24 @@
 package org.jetbrains.kotlin.ir.util
 
 import org.jetbrains.kotlin.backend.common.atMostOne
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrField
 import org.jetbrains.kotlin.ir.declarations.IrProperty
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.name.Name
 
-fun IrClassSymbol.getPropertyDeclaration(name: String) =
-    this.owner.declarations.filterIsInstance<IrProperty>()
+fun IrClass.getPropertyDeclaration(name: String) =
+    this.declarations.filterIsInstance<IrProperty>()
         .atMostOne { it.descriptor.name == Name.identifier(name) }
 
-fun IrClassSymbol.getSimpleFunction(name: String): IrSimpleFunctionSymbol? =
-        owner.findDeclaration<IrSimpleFunction> { it.name.asString() == name }?.symbol
+fun IrClass.getSimpleFunction(name: String): IrSimpleFunction? =
+        findDeclaration<IrSimpleFunction> { it.name.asString() == name }
 
-fun IrClassSymbol.getPropertyGetter(name: String): IrSimpleFunctionSymbol? =
-    this.getPropertyDeclaration(name)?.getter?.symbol ?: this.getSimpleFunction("<get-$name>")
+fun IrClass.getPropertyGetter(name: String): IrSimpleFunction? =
+    this.getPropertyDeclaration(name)?.getter ?: this.getSimpleFunction("<get-$name>")
 
-fun IrClassSymbol.getPropertySetter(name: String): IrSimpleFunctionSymbol? =
-    this.getPropertyDeclaration(name)?.setter?.symbol ?: this.getSimpleFunction("<set-$name>")
+fun IrClass.getPropertySetter(name: String): IrSimpleFunction? =
+    this.getPropertyDeclaration(name)?.setter ?: this.getSimpleFunction("<set-$name>")
 
-fun IrClassSymbol.getPropertyField(name: String): IrFieldSymbol? =
-    this.getPropertyDeclaration(name)?.backingField?.symbol
+fun IrClass.getPropertyField(name: String): IrField? =
+    this.getPropertyDeclaration(name)?.backingField
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt
index 4d343e6..91ec177 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/IrTypeUtils.kt
@@ -82,12 +82,12 @@
 }
 
 fun IrType.substitute(params: List<IrTypeParameter>, arguments: List<IrType>): IrType =
-    substitute(params.map { it.symbol }.zip(arguments).toMap())
+    substitute(params.zip(arguments).toMap())
 
-fun IrType.substitute(substitutionMap: Map<IrTypeParameterSymbol, IrType>): IrType {
+fun IrType.substitute(substitutionMap: Map<IrTypeParameter, IrType>): IrType {
     if (this !is IrSimpleType) return this
 
-    substitutionMap[classifier]?.let { return it }
+    substitutionMap[classifier.owner]?.let { return it }
 
     val newArguments = arguments.map {
         if (it is IrTypeProjection) {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
index 7b2f791..f2fb422 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
@@ -180,7 +180,7 @@
     }!!
 
     val charClassSymbol = getInternalClassWithoutPackage("kotlin.Char")
-    val charConstructor = charClassSymbol.constructors.single().owner
+    val charConstructor = charClassSymbol.constructors.single()
 
     val stringClassSymbol = getInternalClassWithoutPackage("kotlin.String")
     val stringConstructorSymbol = stringClassSymbol.constructors.single()
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
index b018332..910fa2d 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
@@ -128,7 +128,7 @@
     private val coroutinePackage = module.getPackage(COROUTINE_PACKAGE_FQNAME)
     private val coroutineIntrinsicsPackage = module.getPackage(COROUTINE_INTRINSICS_PACKAGE_FQNAME)
 
-    val enumEntryToGetInstanceFunction = mutableMapOf<IrEnumEntrySymbol, IrSimpleFunction>()
+    val enumEntryToGetInstanceFunction = mutableMapOf<IrEnumEntry, IrSimpleFunction>()
     val objectToGetInstanceFunction = mutableMapOf<IrClassSymbol, IrSimpleFunction>()
     val enumEntryExternalToInstanceField = mutableMapOf<IrEnumEntrySymbol, IrField>()
     val callableReferencesCache = mutableMapOf<CallableReferenceKey, IrSimpleFunction>()
@@ -254,14 +254,14 @@
     val suiteFun = getFunctions(FqName("kotlin.test.suite")).singleOrNull()?.let { symbolTable.referenceSimpleFunction(it) }
     val testFun = getFunctions(FqName("kotlin.test.test")).singleOrNull()?.let { symbolTable.referenceSimpleFunction(it) }
 
-    val coroutineImplLabelPropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("state")!!.owner }
-    val coroutineImplLabelPropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("state")!!.owner }
-    val coroutineImplResultSymbolGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("result")!!.owner }
-    val coroutineImplResultSymbolSetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("result")!!.owner }
-    val coroutineImplExceptionPropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("exception")!!.owner }
-    val coroutineImplExceptionPropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("exception")!!.owner }
-    val coroutineImplExceptionStatePropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("exceptionState")!!.owner }
-    val coroutineImplExceptionStatePropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("exceptionState")!!.owner }
+    val coroutineImplLabelPropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("state")!! }
+    val coroutineImplLabelPropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("state")!! }
+    val coroutineImplResultSymbolGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("result")!! }
+    val coroutineImplResultSymbolSetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("result")!! }
+    val coroutineImplExceptionPropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("exception")!! }
+    val coroutineImplExceptionPropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("exception")!! }
+    val coroutineImplExceptionStatePropertyGetter by lazy { ir.symbols.coroutineImpl.getPropertyGetter("exceptionState")!! }
+    val coroutineImplExceptionStatePropertySetter by lazy { ir.symbols.coroutineImpl.getPropertySetter("exceptionState")!! }
 
     val primitiveClassProperties by lazy {
         primitiveClassesObject.owner.declarations.filterIsInstance<IrProperty>()
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
index 3c7b228..3c2d8af 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt
@@ -390,7 +390,8 @@
 val jsPhases = namedIrModulePhase(
     name = "IrModuleLowering",
     description = "IR module lowering",
-    lower = validateIrBeforeLowering then
+    lower = desymbolizePhase then
+            validateIrBeforeLowering then
             testGenerationPhase then
             expectDeclarationsRemovingPhase then
             stripTypeAliasDeclarationsPhase then
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt
index b13b06d6..b9bf082 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt
@@ -26,7 +26,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrGetValue
 import org.jetbrains.kotlin.ir.expressions.IrSetVariable
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
@@ -72,7 +71,7 @@
 
     override fun defineSharedValue(originalDeclaration: IrVariable, sharedVariableDeclaration: IrVariable) = sharedVariableDeclaration
 
-    override fun getSharedValue(sharedVariableSymbol: IrVariableSymbol, originalGet: IrGetValue) = IrGetFieldImpl(
+    override fun getSharedValue(sharedVariable: IrVariable, originalGet: IrGetValue) = IrGetFieldImpl(
         originalGet.startOffset, originalGet.endOffset,
         closureBoxFieldDeclaration.symbol,
         originalGet.type,
@@ -80,13 +79,13 @@
             originalGet.startOffset,
             originalGet.endOffset,
             closureBoxType,
-            sharedVariableSymbol,
+            sharedVariable,
             originalGet.origin
         ),
         originalGet.origin
     )
 
-    override fun setSharedValue(sharedVariableSymbol: IrVariableSymbol, originalSet: IrSetVariable): IrExpression =
+    override fun setSharedValue(sharedVariable: IrVariable, originalSet: IrSetVariable): IrExpression =
         IrSetFieldImpl(
             originalSet.startOffset,
             originalSet.endOffset,
@@ -95,7 +94,7 @@
                 originalSet.startOffset,
                 originalSet.endOffset,
                 closureBoxType,
-                sharedVariableSymbol,
+                sharedVariable,
                 originalSet.origin
             ),
             originalSet.value,
@@ -181,10 +180,10 @@
 
         declaration.valueParameters += parameterDeclaration
 
-        val receiver = JsIrBuilder.buildGetValue(closureBoxClassDeclaration.thisReceiver!!.symbol)
-        val value = JsIrBuilder.buildGetValue(parameterDeclaration.symbol)
+        val receiver = JsIrBuilder.buildGetValue(closureBoxClassDeclaration.thisReceiver!!)
+        val value = JsIrBuilder.buildGetValue(parameterDeclaration)
 
-        val setField = JsIrBuilder.buildSetField(closureBoxFieldDeclaration.symbol, receiver, value, closureBoxFieldDeclaration.type)
+        val setField = JsIrBuilder.buildSetField(closureBoxFieldDeclaration, receiver, value, closureBoxFieldDeclaration.type)
 
         declaration.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(setField))
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt
index 17f1b57..30a6bbc 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt
@@ -15,7 +15,6 @@
 import org.jetbrains.kotlin.ir.declarations.impl.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.*
 import org.jetbrains.kotlin.ir.symbols.impl.*
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.name.Name
@@ -26,11 +25,11 @@
     object SYNTHESIZED_STATEMENT : IrStatementOriginImpl("SYNTHESIZED_STATEMENT")
     object SYNTHESIZED_DECLARATION : IrDeclarationOriginImpl("SYNTHESIZED_DECLARATION")
 
-    fun buildCall(target: IrFunctionSymbol, type: IrType? = null, typeArguments: List<IrType>? = null): IrCall =
+    fun buildCall(target: IrFunction, type: IrType? = null, typeArguments: List<IrType>? = null): IrCall =
         IrCallImpl(
             UNDEFINED_OFFSET,
             UNDEFINED_OFFSET,
-            type ?: target.owner.returnType,
+            type ?: target.returnType,
             target,
             target.descriptor,
             target.descriptor.typeParametersCount,
@@ -42,8 +41,8 @@
             }
         }
 
-    fun buildReturn(targetSymbol: IrFunctionSymbol, value: IrExpression, type: IrType) =
-        IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, targetSymbol, value)
+    fun buildReturn(target: IrFunction, value: IrExpression, type: IrType) =
+        IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, target, value)
 
     fun buildThrow(type: IrType, value: IrExpression) = IrThrowImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, value)
 
@@ -142,34 +141,34 @@
     fun buildAnonymousInitializer() =
         IrAnonymousInitializerImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, SYNTHESIZED_DECLARATION, IrAnonymousInitializerSymbolImpl(WrappedClassDescriptor()))
 
-    fun buildGetObjectValue(type: IrType, classSymbol: IrClassSymbol) =
-        IrGetObjectValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, classSymbol)
+    fun buildGetObjectValue(type: IrType, irClass: IrClass) =
+        IrGetObjectValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, irClass)
 
-    fun buildGetValue(symbol: IrValueSymbol) =
-        IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol.owner.type, symbol, SYNTHESIZED_STATEMENT)
+    fun buildGetValue(target: IrValueDeclaration) =
+        IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.type, target, SYNTHESIZED_STATEMENT)
 
-    fun buildSetVariable(symbol: IrVariableSymbol, value: IrExpression, type: IrType) =
-        IrSetVariableImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, symbol, value, SYNTHESIZED_STATEMENT)
+    fun buildSetVariable(target: IrVariable, value: IrExpression, type: IrType) =
+        IrSetVariableImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, target, value, SYNTHESIZED_STATEMENT)
 
-    fun buildGetField(symbol: IrFieldSymbol, receiver: IrExpression?, superQualifierSymbol: IrClassSymbol? = null, type: IrType? = null) =
+    fun buildGetField(target: IrField, receiver: IrExpression?, irSuperQualifier: IrClass? = null, type: IrType? = null) =
         IrGetFieldImpl(
             UNDEFINED_OFFSET,
             UNDEFINED_OFFSET,
-            symbol,
-            type ?: symbol.owner.type,
+            target,
+            type ?: target.type,
             receiver,
             SYNTHESIZED_STATEMENT,
-            superQualifierSymbol
+            irSuperQualifier
         )
 
     fun buildSetField(
-        symbol: IrFieldSymbol,
+        target: IrField,
         receiver: IrExpression?,
         value: IrExpression,
         type: IrType,
-        superQualifierSymbol: IrClassSymbol? = null
+        irSuperQualifier: IrClass? = null
     ) =
-        IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol, receiver, value, type, SYNTHESIZED_STATEMENT, superQualifierSymbol)
+        IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target, receiver, value, type, SYNTHESIZED_STATEMENT, irSuperQualifier)
 
     fun buildBlockBody(statements: List<IrStatement>) = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, statements)
 
@@ -180,8 +179,8 @@
     fun buildComposite(type: IrType, statements: List<IrStatement> = emptyList()) =
         IrCompositeImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT, statements)
 
-    fun buildFunctionReference(type: IrType, symbol: IrFunctionSymbol) =
-        IrFunctionReferenceImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, symbol, symbol.descriptor, 0, null)
+    fun buildFunctionReference(type: IrType, target: IrFunction) =
+        IrFunctionReferenceImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, target, target.descriptor, 0, null)
 
     fun buildVar(
         type: IrType,
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt
index 4dd202d..9df6c35 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt
@@ -35,7 +35,7 @@
                 }
 
             is IrGetObjectValue ->
-                this.symbol == irBuiltIns.unitClass
+                this.target == irBuiltIns.unitClass
 
             else -> false
         }
@@ -43,16 +43,16 @@
     override fun IrExpression.useAs(type: IrType): IrExpression {
 
         val actualType = when (this) {
-            is IrConstructorCall -> symbol.owner.returnType
+            is IrConstructorCall -> target.returnType
             is IrCall -> {
-                val function = this.symbol.owner
+                val function = this.target
                 if (function.let { it is IrSimpleFunction && it.isSuspend }) {
                     irBuiltIns.anyNType
                 } else {
                     function.realOverrideTarget.returnType
                 }
             }
-            is IrGetField -> this.symbol.owner.type
+            is IrGetField -> this.target.type
 
             is IrTypeOperatorCall -> when (this.operator) {
                 IrTypeOperator.IMPLICIT_INTEGER_COERCION ->
@@ -65,7 +65,7 @@
             }
 
             is IrGetValue -> {
-                val value = this.symbol.owner
+                val value = this.target
                 if (value is IrValueParameter && value.isDispatchReceiver) {
                     irBuiltIns.anyNType
                 } else {
@@ -132,11 +132,11 @@
             val nullCheck = buildIfElse(
                 type = resultType,
                 cond = buildCall(irBuiltIns.eqeqSymbol).apply {
-                    putValueArgument(0, buildGetValue(tmp.symbol))
+                    putValueArgument(0, buildGetValue(tmp))
                     putValueArgument(1, buildNull(irBuiltIns.nothingNType))
                 },
                 thenBranch = buildNull(irBuiltIns.nothingNType),
-                elseBranch = call(buildGetValue(tmp.symbol))
+                elseBranch = call(buildGetValue(tmp))
             )
             buildBlock(
                 type = resultType,
@@ -148,24 +148,21 @@
         }
     }
 
-    private val IrFunctionAccessExpression.target: IrFunction
+    private val IrFunctionAccessExpression.callTarget: IrFunction
         get() = when (this) {
-            is IrConstructorCall -> this.symbol.owner
-            is IrDelegatingConstructorCall -> this.symbol.owner
-            is IrCall -> this.callTarget
+            is IrConstructorCall -> this.target
+            is IrDelegatingConstructorCall -> this.target
+            is IrCall -> this.target.realOverrideTarget
             else -> TODO(this.render())
         }
 
-    private val IrCall.callTarget: IrFunction
-        get() = symbol.owner.realOverrideTarget
-
 
     override fun IrExpression.useAsDispatchReceiver(expression: IrFunctionAccessExpression): IrExpression {
-        return this.useAsArgument(expression.target.dispatchReceiverParameter!!)
+        return this.useAsArgument(expression.callTarget.dispatchReceiverParameter!!)
     }
 
     override fun IrExpression.useAsExtensionReceiver(expression: IrFunctionAccessExpression): IrExpression {
-        return this.useAsArgument(expression.target.extensionReceiverParameter!!)
+        return this.useAsArgument(expression.callTarget.extensionReceiverParameter!!)
     }
 
     override fun IrExpression.useAsValueArgument(
@@ -173,7 +170,7 @@
         parameter: IrValueParameter
     ): IrExpression {
 
-        return this.useAsArgument(expression.target.valueParameters[parameter.index])
+        return this.useAsArgument(expression.callTarget.valueParameters[parameter.index])
     }
 
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt
index 9fa8c92..56f7646 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt
@@ -25,7 +25,7 @@
 
 class JsBlockDecomposerLowering(val context: JsIrBackendContext) : AbstractBlockDecomposerLowering(context) {
     override fun unreachableExpression(): IrExpression =
-        JsIrBuilder.buildCall(context.intrinsics.unreachable.symbol, context.irBuiltIns.nothingType)
+        JsIrBuilder.buildCall(context.intrinsics.unreachable, context.irBuiltIns.nothingType)
 }
 
 abstract class AbstractBlockDecomposerLowering(context: CommonBackendContext) : DeclarationContainerLoweringPass {
@@ -58,7 +58,7 @@
 
     private fun IrExpressionBody.toBlockBody(containingFunction: IrFunction): IrBlockBody {
         expression.patchDeclarationParents(containingFunction)
-        val returnStatement = JsIrBuilder.buildReturn(containingFunction.symbol, expression, nothingType)
+        val returnStatement = JsIrBuilder.buildReturn(containingFunction, expression, nothingType)
         return IrBlockBodyImpl(expression.startOffset, expression.endOffset).apply {
             statements += returnStatement
         }
@@ -81,7 +81,7 @@
 
             val lastStatement = newBody.statements.last()
             if (newBody.statements.size > 1 || lastStatement !is IrReturn || lastStatement.value != expression) {
-                expression = JsIrBuilder.buildCall(initFunction.symbol, expression.type)
+                expression = JsIrBuilder.buildCall(initFunction, expression.type)
                 return listOf(initFunction, irField)
             }
         }
@@ -166,7 +166,7 @@
 
             val composite = expression.value as? IrComposite ?: return expression
             return materializeLastExpression(composite) {
-                IrReturnImpl(expression.startOffset, expression.endOffset, expression.type, expression.returnTargetSymbol, it)
+                IrReturnImpl(expression.startOffset, expression.endOffset, expression.type, expression.irReturnTarget, it)
             }
         }
 
@@ -209,12 +209,12 @@
                     IrSetFieldImpl(
                         startOffset,
                         endOffset,
-                        symbol,
-                        JsIrBuilder.buildGetValue(irVar.symbol),
+                        target,
+                        JsIrBuilder.buildGetValue(irVar),
                         setValue,
                         type,
                         origin,
-                        superQualifierSymbol
+                        irSuperQualifier
                     )
                 }
                 return result
@@ -223,7 +223,7 @@
             if (receiverResult != null) {
                 return materializeLastExpression(receiverResult) {
                     expression.run {
-                        IrSetFieldImpl(startOffset, endOffset, symbol, it, value, type, origin, superQualifierSymbol)
+                        IrSetFieldImpl(startOffset, endOffset, target, it, value, type, origin, irSuperQualifier)
                     }
                 }
             }
@@ -233,12 +233,12 @@
             val receiver = expression.receiver?.let {
                 val irVar = makeTempVar(it.type, it)
                 valueResult!!.statements.add(0, irVar)
-                JsIrBuilder.buildGetValue(irVar.symbol)
+                JsIrBuilder.buildGetValue(irVar)
             }
 
             return materializeLastExpression(valueResult!!) {
                 expression.run {
-                    IrSetFieldImpl(startOffset, endOffset, symbol, receiver, it, type, origin, superQualifierSymbol)
+                    IrSetFieldImpl(startOffset, endOffset, target, receiver, it, type, origin, irSuperQualifier)
                 }
             }
         }
@@ -249,7 +249,7 @@
             val composite = expression.value as? IrComposite ?: return expression
 
             return materializeLastExpression(composite) {
-                expression.run { IrSetVariableImpl(startOffset, endOffset, type, symbol, it, origin) }
+                expression.run { IrSetVariableImpl(startOffset, endOffset, type, target, it, origin) }
             }
         }
 
@@ -420,7 +420,7 @@
             val composite = expression.receiver as? IrComposite ?: return expression
 
             return materializeLastExpression(composite) {
-                expression.run { IrGetFieldImpl(startOffset, endOffset, symbol, type, it, origin, superQualifierSymbol) }
+                expression.run { IrGetFieldImpl(startOffset, endOffset, target, type, it, origin, irSuperQualifier) }
             }
         }
 
@@ -489,7 +489,7 @@
                         // TODO: do not wrap if value is pure (const, variable, etc)
                         val irVar = makeTempVar(value.type, value)
                         newStatements += irVar
-                        JsIrBuilder.buildGetValue(irVar.symbol)
+                        JsIrBuilder.buildGetValue(irVar)
                     }
                 }
 
@@ -632,7 +632,7 @@
             expression as? IrBlock ?: expression.let { IrBlockImpl(it.startOffset, it.endOffset, it.type, null, listOf(it)) }
 
         private fun wrap(expression: IrExpression, variable: IrVariable) =
-            wrap(JsIrBuilder.buildSetVariable(variable.symbol, expression, unitType))
+            wrap(JsIrBuilder.buildSetVariable(variable, expression, unitType))
 
         // try {
         //   try_block {}
@@ -663,7 +663,7 @@
             val newTry = aTry.run { IrTryImpl(startOffset, endOffset, unitType, newTryResult, newCatches, finallyExpression) }
             newTry.transformChildrenVoid(statementTransformer)
 
-            val newStatements = listOf(irVar, newTry, JsIrBuilder.buildGetValue(irVar.symbol))
+            val newStatements = listOf(irVar, newTry, JsIrBuilder.buildGetValue(irVar))
             return JsIrBuilder.buildComposite(aTry.type, newStatements)
         }
 
@@ -714,7 +714,7 @@
                     expression.run { IrWhenImpl(startOffset, endOffset, unitType, origin, newBranches) }
                         .transform(statementTransformer, null)  // deconstruct into `if-else` chain
 
-                return JsIrBuilder.buildComposite(expression.type, listOf(irVar, newWhen, JsIrBuilder.buildGetValue(irVar.symbol)))
+                return JsIrBuilder.buildComposite(expression.type, listOf(irVar, newWhen, JsIrBuilder.buildGetValue(irVar)))
             } else {
                 val newBranches = decomposedResults.map { (branch, condition, result) ->
                     when {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt
index dd0e9c3..5b18581 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt
@@ -18,7 +18,6 @@
 import org.jetbrains.kotlin.backend.common.lower.irBlockBody
 import org.jetbrains.kotlin.backend.common.lower.irNot
 import org.jetbrains.kotlin.descriptors.Modality
-import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.backend.js.utils.functionSignature
@@ -140,7 +139,7 @@
             extensionReceiverParameter = bridge.extensionReceiverParameter?.copyTo(this)
             valueParameters += bridge.valueParameters.map { p -> p.copyTo(this) }
             annotations += bridge.annotations
-            overriddenSymbols.addAll(delegateTo.overriddenSymbols)
+            overridden.addAll(delegateTo.overridden)
         }
 
         context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) {
@@ -190,7 +189,7 @@
         !function.parentAsClass.isInterface
 
     override fun getOverridden() =
-        function.overriddenSymbols.map { IrBasedFunctionHandle(it.owner) }
+        function.overridden.map { IrBasedFunctionHandle(it) }
 }
 
 // Wrapper around function that compares and hashCodes it based on signature
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt
index 82b6db6..df7e404 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt
@@ -22,7 +22,6 @@
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
 import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
 import org.jetbrains.kotlin.ir.types.IrSimpleType
@@ -64,7 +63,7 @@
     inner class CallableReferenceLowerTransformer : IrElementTransformerVoid() {
         override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
             expression.transformChildrenVoid(this)
-            val declaration = expression.symbol.owner
+            val declaration = expression.target
             if (declaration.origin == JsIrBackendContext.callableClosureOrigin) return expression
             val key = makeCallableKey(declaration, expression)
             val factory = callableToFactoryFunction.getOrPut(key) { lowerKFunctionReference(declaration, expression) }
@@ -73,7 +72,7 @@
 
         override fun visitPropertyReference(expression: IrPropertyReference): IrExpression {
             expression.transformChildrenVoid(this)
-            val declaration = expression.getter!!.owner
+            val declaration = expression.getter!!
             val key = makeCallableKey(declaration, expression)
             val factory = callableToFactoryFunction.getOrPut(key) { lowerKPropertyReference(declaration, expression) }
             return redirectToFunction(expression, factory)
@@ -81,7 +80,7 @@
 
         override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrExpression {
             expression.transformChildrenVoid(this)
-            val key = makeCallableKey(expression.getter.owner, expression)
+            val key = makeCallableKey(expression.getter, expression)
             val factory = callableToFactoryFunction.getOrPut(key) { lowerLocalKPropertyReference(expression) }
             return redirectToFunction(expression, factory)
         }
@@ -159,7 +158,7 @@
         val closureFunction = buildClosureFunction(declaration, factoryFunction, functionReference, functionReference.type.arity)
 
         val additionalDeclarations = generateFactoryBodyWithGuard(factoryFunction) {
-            val irClosureReference = JsIrBuilder.buildFunctionReference(functionReference.type, closureFunction.symbol)
+            val irClosureReference = JsIrBuilder.buildFunctionReference(functionReference.type, closureFunction)
 
             val irVar = JsIrBuilder.buildVar(irClosureReference.type, factoryFunction, initializer = irClosureReference)
 
@@ -168,7 +167,7 @@
                 JsIrBuilder.buildString(context.irBuiltIns.stringType, getReferenceName(declaration))
             }
 
-            Pair(listOf(closureFunction, irVar, irSetName), irVar.symbol)
+            Pair(listOf(closureFunction, irVar, irSetName), irVar)
         }
 
         newDeclarations += additionalDeclarations + factoryFunction
@@ -198,31 +197,31 @@
 
         val arity = propertyReference.type.arity
         val factoryName = createPropertyFactoryName(getterDeclaration.correspondingPropertySymbol!!.owner)
-        val factoryFunction = buildFactoryFunction(propertyReference.getter!!.owner, propertyReference, factoryName)
+        val factoryFunction = buildFactoryFunction(propertyReference.getter!!, propertyReference, factoryName)
 
-        val getterFunction = propertyReference.getter?.let { buildClosureFunction(it.owner, factoryFunction, propertyReference, arity) }!!
-        val setterFunction = propertyReference.setter?.let { buildClosureFunction(it.owner, factoryFunction, propertyReference, arity + 1) }
+        val getterFunction = propertyReference.getter?.let { buildClosureFunction(it, factoryFunction, propertyReference, arity) }!!
+        val setterFunction = propertyReference.setter?.let { buildClosureFunction(it, factoryFunction, propertyReference, arity + 1) }
 
         val additionalDeclarations = generateFactoryBodyWithGuard(factoryFunction) {
             val statements = mutableListOf<IrStatement>(getterFunction)
 
-            val getterFunctionTypeSymbol = context.ir.symbols.functionN(getterFunction.valueParameters.size + 1)
+            val getterFunctionClass = context.ir.symbols.functionN(getterFunction.valueParameters.size + 1)
 
-            val getterFunctionIrType = IrSimpleTypeImpl(getterFunctionTypeSymbol, false, emptyList(), emptyList())
-            val irGetReference = JsIrBuilder.buildFunctionReference(getterFunctionIrType, getterFunction.symbol)
+            val getterFunctionIrType = IrSimpleTypeImpl(getterFunctionClass.symbol, false, emptyList(), emptyList())
+            val irGetReference = JsIrBuilder.buildFunctionReference(getterFunctionIrType, getterFunction)
             val irVar = JsIrBuilder.buildVar(getterFunctionIrType, factoryFunction, initializer = irGetReference)
 
             statements += irVar
 
             statements += setDynamicProperty(irVar.symbol, Namer.KPROPERTY_GET) {
-                JsIrBuilder.buildGetValue(irVar.symbol)
+                JsIrBuilder.buildGetValue(irVar)
             }
 
             if (setterFunction != null) {
                 statements += setterFunction
-                val setterFunctionTypeSymbol = context.ir.symbols.functionN(setterFunction.valueParameters.size + 1)
-                val setterFunctionIrType = IrSimpleTypeImpl(setterFunctionTypeSymbol, false, emptyList(), emptyList())
-                val irSetReference = JsIrBuilder.buildFunctionReference(setterFunctionIrType, setterFunction.symbol)
+                val setterFunctionClass = context.ir.symbols.functionN(setterFunction.valueParameters.size + 1)
+                val setterFunctionIrType = IrSimpleTypeImpl(setterFunctionClass.symbol, false, emptyList(), emptyList())
+                val irSetReference = JsIrBuilder.buildFunctionReference(setterFunctionIrType, setterFunction)
                 statements += setDynamicProperty(irVar.symbol, Namer.KPROPERTY_SET) { irSetReference }
             }
 
@@ -234,7 +233,7 @@
                 )
             }
 
-            Pair(statements, irVar.symbol)
+            Pair(statements, irVar)
         }
 
         newDeclarations += additionalDeclarations + factoryFunction
@@ -258,31 +257,30 @@
         // }
 
         val arity = propertyReference.type.arity
-        val declaration = propertyReference.delegate.owner
+        val declaration = propertyReference.delegate
         val factoryName = createPropertyFactoryName(declaration)
-        val factoryFunction = buildFactoryFunction(propertyReference.getter.owner, propertyReference, factoryName)
+        val factoryFunction = buildFactoryFunction(propertyReference.getter, propertyReference, factoryName)
         val closureFunction = buildClosureFunction(context.irBuiltIns.throwIseSymbol.owner, factoryFunction, propertyReference, arity)
 
         val additionalDeclarations = generateFactoryBodyWithGuard(factoryFunction) {
             val statements = mutableListOf<IrStatement>(closureFunction)
 
-            val getterFunctionTypeSymbol = context.ir.symbols.functionN(closureFunction.valueParameters.size + 1)
-            val getterFunctionIrType = IrSimpleTypeImpl(getterFunctionTypeSymbol, false, emptyList(), emptyList())
-            val irGetReference = JsIrBuilder.buildFunctionReference(getterFunctionIrType, closureFunction.symbol)
+            val getterFunctionClass = context.ir.symbols.functionN(closureFunction.valueParameters.size + 1)
+            val getterFunctionIrType = IrSimpleTypeImpl(getterFunctionClass.symbol, false, emptyList(), emptyList())
+            val irGetReference = JsIrBuilder.buildFunctionReference(getterFunctionIrType, closureFunction)
             val irVar = JsIrBuilder.buildVar(getterFunctionIrType, factoryFunction, initializer = irGetReference)
-            val irVarSymbol = irVar.symbol
 
             statements += irVar
 
-            statements += setDynamicProperty(irVarSymbol, Namer.KPROPERTY_GET) {
-                JsIrBuilder.buildGetValue(irVarSymbol)
+            statements += setDynamicProperty(irVar, Namer.KPROPERTY_GET) {
+                JsIrBuilder.buildGetValue(irVar)
             }
 
-            statements += setDynamicProperty(irVarSymbol, Namer.KCALLABLE_NAME) {
+            statements += setDynamicProperty(irVar, Namer.KCALLABLE_NAME) {
                 JsIrBuilder.buildString(context.irBuiltIns.stringType, getReferenceName(declaration))
             }
 
-            Pair(statements, irVarSymbol)
+            Pair(statements, irVar)
         }
 
         newDeclarations += additionalDeclarations + factoryFunction
@@ -292,10 +290,10 @@
 
     private fun generateFactoryBodyWithGuard(
         factoryFunction: IrSimpleFunction,
-        builder: () -> Pair<List<IrStatement>, IrValueSymbol>
+        builder: () -> Pair<List<IrStatement>, IrValueDeclaration>
     ): List<IrDeclaration> {
 
-        val (bodyStatements, varSymbol) = builder()
+        val (bodyStatements, variable) = builder()
         val statements = mutableListOf<IrStatement>()
         val returnValue: IrExpression
         val returnStatements: List<IrDeclaration>
@@ -310,13 +308,13 @@
             val irNull = { JsIrBuilder.buildNull(context.irBuiltIns.nothingNType) }
             val cacheVar = JsIrBuilder.buildVar(type, factoryFunction.parent, cacheName, true, initializer = irNull())
 
-            val irCacheValue = { JsIrBuilder.buildGetValue(cacheVar.symbol) }
+            val irCacheValue = { JsIrBuilder.buildGetValue(cacheVar) }
             val irIfCondition = JsIrBuilder.buildCall(context.irBuiltIns.eqeqSymbol).apply {
                 putValueArgument(0, irCacheValue())
                 putValueArgument(1, irNull())
             }
             val irSetCache =
-                JsIrBuilder.buildSetVariable(cacheVar.symbol, JsIrBuilder.buildGetValue(varSymbol), context.irBuiltIns.unitType)
+                JsIrBuilder.buildSetVariable(cacheVar, JsIrBuilder.buildGetValue(variable), context.irBuiltIns.unitType)
             val thenStatements = mutableListOf<IrStatement>().apply {
                 addAll(bodyStatements)
                 add(irSetCache)
@@ -328,11 +326,11 @@
             returnStatements = listOf(cacheVar)
         } else {
             statements += bodyStatements
-            returnValue = JsIrBuilder.buildGetValue(varSymbol)
+            returnValue = JsIrBuilder.buildGetValue(variable)
             returnStatements = emptyList()
         }
 
-        statements += JsIrBuilder.buildReturn(factoryFunction.symbol, returnValue, context.irBuiltIns.nothingType)
+        statements += JsIrBuilder.buildReturn(factoryFunction, returnValue, context.irBuiltIns.nothingType)
 
         factoryFunction.body = JsIrBuilder.buildBlockBody(statements)
         return returnStatements
@@ -491,9 +489,8 @@
             )
 
         // the params which are passed to closure
-        val boundParamSymbols = factoryFunction.valueParameters.map { it.symbol }
+        val boundParamDeclarations = factoryFunction.valueParameters
         val unboundParamDeclarations = generateSignatureForClosure(declaration, factoryFunction, closureFunction, reference, arity)
-        val unboundParamSymbols = unboundParamDeclarations.map { it.symbol }
 
         closureFunction.valueParameters += unboundParamDeclarations
 
@@ -503,7 +500,7 @@
 
         val irCall =
             if (target is IrConstructorSymbol) IrConstructorCallImpl.fromSymbolOwner(returnType, target) else JsIrBuilder.buildCall(
-                callTarget.symbol,
+                callTarget,
                 type = returnType
             )
 
@@ -512,31 +509,31 @@
 
         if (callTarget.dispatchReceiverParameter != null) {
             val dispatchReceiverDeclaration =
-                if (reference.dispatchReceiver != null) boundParamSymbols[gp++] else unboundParamSymbols[cp++]
+                if (reference.dispatchReceiver != null) boundParamDeclarations[gp++] else unboundParamDeclarations[cp++]
             irCall.dispatchReceiver = JsIrBuilder.buildGetValue(dispatchReceiverDeclaration)
         }
 
         if (callTarget.extensionReceiverParameter != null) {
             val extensionReceiverDeclaration =
-                if (reference.extensionReceiver != null) boundParamSymbols[gp++] else unboundParamSymbols[cp++]
+                if (reference.extensionReceiver != null) boundParamDeclarations[gp++] else unboundParamDeclarations[cp++]
             irCall.extensionReceiver = JsIrBuilder.buildGetValue(extensionReceiverDeclaration)
         }
 
         var j = 0
 
-        for (i in gp until boundParamSymbols.size) {
-            irCall.putValueArgument(j++, JsIrBuilder.buildGetValue(boundParamSymbols[i]))
+        for (i in gp until boundParamDeclarations.size) {
+            irCall.putValueArgument(j++, JsIrBuilder.buildGetValue(boundParamDeclarations[i]))
         }
 
-        for (i in cp until unboundParamSymbols.size) {
-            val closureParam = unboundParamSymbols[i].owner
-            val value = JsIrBuilder.buildGetValue(unboundParamSymbols[i])
+        for (i in cp until unboundParamDeclarations.size) {
+            val closureParam = unboundParamDeclarations[i]
+            val value = JsIrBuilder.buildGetValue(unboundParamDeclarations[i])
             val parameter = callTarget.valueParameters[j]
             val argument =
                 if (parameter.varargElementType == closureParam.type) {
                     // fun foo(x: X, vararg y: Y): Z
                     // val r: (X, Y) -> Z = ::foo
-                    val tailValues = unboundParamSymbols.drop(i)
+                    val tailValues = unboundParamDeclarations.drop(i)
                     IrVarargImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, parameter.type, parameter.varargElementType!!, tailValues.map {
                         JsIrBuilder.buildGetValue(it)
                     })
@@ -545,14 +542,14 @@
             if (j == callTarget.valueParameters.size) break
         }
 
-        val irClosureReturn = JsIrBuilder.buildReturn(closureFunction.symbol, irCall, context.irBuiltIns.nothingType)
+        val irClosureReturn = JsIrBuilder.buildReturn(closureFunction, irCall, context.irBuiltIns.nothingType)
 
         closureFunction.body = JsIrBuilder.buildBlockBody(listOf(irClosureReturn))
 
         return closureFunction
     }
 
-    private inline fun setDynamicProperty(r: IrValueSymbol, property: String, value: () -> IrExpression): IrStatement {
+    private inline fun setDynamicProperty(r: IrValueDeclaration, property: String, value: () -> IrExpression): IrStatement {
         return IrDynamicOperatorExpressionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, IrDynamicOperator.EQ).apply {
             receiver = IrDynamicMemberExpressionImpl(startOffset, endOffset, context.dynamicType, property, JsIrBuilder.buildGetValue(r))
             arguments += value()
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt
index 8a75b14..f937d41 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt
@@ -78,7 +78,7 @@
     }
 
     private fun getPrimitiveClass(target: IrSimpleFunction, returnType: IrType) =
-        JsIrBuilder.buildCall(target.symbol, returnType).apply {
+        JsIrBuilder.buildCall(target, returnType).apply {
             dispatchReceiver = JsIrBuilder.buildGetObjectValue(primitiveClassesObject.owner.defaultType, primitiveClassesObject)
         }
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
index b3408b7..a39daf6 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ConstLowering.kt
@@ -32,7 +32,7 @@
         vararg args: C
     ): IrExpression {
         val constructor = irClass.constructors.single()
-        val argType = constructor.owner.valueParameters.first().type
+        val argType = constructor.valueParameters.first().type
         return IrConstructorCallImpl.fromSymbolOwner(irClass.owner.defaultType, constructor).apply {
             for (i in args.indices) {
                 putValueArgument(i, carrierFactory(UNDEFINED_OFFSET, UNDEFINED_OFFSET, argType, args[i]))
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
index c2ded07..8536d19 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt
@@ -45,7 +45,7 @@
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetEnumValue(expression: IrGetEnumValue): IrExpression {
-                val enumEntry = expression.symbol.owner
+                val enumEntry = expression.target
                 val klass = enumEntry.parent as IrClass
                 return if (klass.isExternal) lowerExternalEnumEntry(enumEntry, klass) else lowerEnumEntry(enumEntry, klass)
             }
@@ -54,7 +54,7 @@
 
     private fun lowerExternalEnumEntry(enumEntry: IrEnumEntry, klass: IrClass) =
         context.enumEntryExternalToInstanceField.getOrPut(enumEntry.symbol) { createFieldForEntry(enumEntry, klass) }.let {
-            JsIrBuilder.buildGetField(it.symbol, classAsReceiver(klass), null, klass.defaultType)
+            JsIrBuilder.buildGetField(it, classAsReceiver(klass), null, klass.defaultType)
         }
 
     private fun classAsReceiver(irClass: IrClass): IrExpression {
@@ -75,13 +75,13 @@
     }
 
     private fun lowerEnumEntry(enumEntry: IrEnumEntry, klass: IrClass) =
-        context.enumEntryToGetInstanceFunction.getOrPut(enumEntry.symbol) {
+        context.enumEntryToGetInstanceFunction.getOrPut(enumEntry) {
             JsIrBuilder.buildFunction(
                 createEntryAccessorName(klass.name.identifier, enumEntry),
                 returnType = enumEntry.getType(klass),
                 parent = klass
             )
-        }.run { JsIrBuilder.buildCall(symbol) }
+        }.run { JsIrBuilder.buildCall(this) }
 }
 
 class EnumClassLowering(val context: JsIrBackendContext) : DeclarationContainerLoweringPass {
@@ -222,14 +222,14 @@
         }
 
         override fun visitEnumConstructorCall(expression: IrEnumConstructorCall) =
-            builder.irDelegatingConstructorCall(expression.symbol.owner).apply {
+            builder.irDelegatingConstructorCall(expression.target).apply {
                 for (i in 0..1) {
                     putValueArgument(i, builder.irGet(constructor.valueParameters[i]))
                 }
             }
 
         override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
-            var delegatingConstructor = expression.symbol.owner
+            var delegatingConstructor = expression.target
             val constructorWasTransformed = delegatingConstructor.symbol in loweredEnumConstructors
 
             if (constructorWasTransformed)
@@ -261,7 +261,7 @@
 
         irClass.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetValue(expression: IrGetValue): IrExpression {
-                fromOldToNewParameter[expression.symbol]?.let {
+                fromOldToNewParameter[expression.target]?.let {
                     return builder.irGet(it)
                 }
 
@@ -289,7 +289,7 @@
                 builder.irCall(constructor)
 
         override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrExpression {
-            var constructor = expression.symbol.owner
+            var constructor = expression.target
             val constructorWasTransformed = constructor.symbol in loweredEnumConstructors
 
             // Enum entry class constructors are not transformed
@@ -457,7 +457,7 @@
         initEntryInstancesFun: IrSimpleFunction,
         entryInstances: List<IrField>
     ) = enumEntries.mapIndexed { index, enumEntry ->
-        context.enumEntryToGetInstanceFunction.getOrPut(enumEntry.symbol) {
+        context.enumEntryToGetInstanceFunction.getOrPut(enumEntry) {
             buildFunction(createEntryAccessorName(enumName, enumEntry), enumEntry.getType(irClass))
         }.apply {
             body = context.createIrBuilder(symbol).irBlockBody(this) {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsDefaultArgumentStubGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsDefaultArgumentStubGenerator.kt
index c998974..7d1ee24 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsDefaultArgumentStubGenerator.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsDefaultArgumentStubGenerator.kt
@@ -24,7 +24,6 @@
 import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
-import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
 
 class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) : DefaultArgumentStubGenerator(context, true, true) {
@@ -50,7 +49,7 @@
 
     private fun resolveInvoke(paramCount: Int): IrSimpleFunction {
         assert(paramCount > 0)
-        val functionKlass = context.ir.symbols.functionN(paramCount).owner
+        val functionKlass = context.ir.symbols.functionN(paramCount)
         return functionKlass.declarations.filterIsInstance<IrSimpleFunction>().first { it.name == Name.identifier("invoke") }
     }
 }
@@ -62,7 +61,7 @@
         irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitCall(expression: IrCall): IrExpression {
                 super.visitCall(expression)
-                if (expression.origin != DEFAULT_DISPATCH_CALL || expression.superQualifierSymbol == null) return expression
+                if (expression.origin != DEFAULT_DISPATCH_CALL || expression.irSuperQualifier == null) return expression
 
                 val binding = buildBoundSuperCall(expression)
 
@@ -75,7 +74,7 @@
 
     private fun buildBoundSuperCall(irCall: IrCall): IrExpression {
 
-        val originalFunction = context.ir.defaultParameterDeclarationsCache.entries.first { it.value == irCall.symbol.owner }.key
+        val originalFunction = context.ir.defaultParameterDeclarationsCache.entries.first { it.value == irCall.target }.key
 
         val reference = irCall.run {
             IrFunctionReferenceImpl(
@@ -97,7 +96,7 @@
                 context.intrinsics.jsBind.symbol,
                 context.intrinsics.jsBind.descriptor,
                 BIND_CALL,
-                superQualifierSymbol
+                irSuperQualifier
             )
         }.apply {
             putValueArgument(0, irCall.dispatchReceiver?.deepCopyWithSymbols())
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt
index 3287984..a926606 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt
@@ -63,7 +63,7 @@
                 if (aTry.catches.isEmpty()) return aTry.also { assert(it.finallyExpression != null) }
 
                 val pendingExceptionDeclaration = JsIrBuilder.buildVar(context.dynamicType, data, "\$p")
-                val pendingException = { JsIrBuilder.buildGetValue(pendingExceptionDeclaration.symbol) }
+                val pendingException = { JsIrBuilder.buildGetValue(pendingExceptionDeclaration) }
 
                 val branches = mutableListOf<IrBranch>()
                 var isCaughtDynamic = false
@@ -81,7 +81,7 @@
 
                     val catchBody = catch.result.transform(object : IrElementTransformer<IrValueSymbol> {
                         override fun visitGetValue(expression: IrGetValue, data: IrValueSymbol) =
-                            if (expression.symbol == data)
+                            if (expression.target == data)
                                 castedPendingException()
                             else
                                 expression
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt
index 3c6b1f2..c7551c7 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt
@@ -13,7 +13,6 @@
 import org.jetbrains.kotlin.backend.common.lower.irIfThen
 import org.jetbrains.kotlin.descriptors.ClassKind
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
-import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.builders.declarations.buildField
@@ -83,9 +82,9 @@
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
-                val obj: IrClass = expression.symbol.owner
+                val obj: IrClass = expression.target
                 if (obj.isEffectivelyExternal()) return expression
-                return JsIrBuilder.buildCall(getOrCreateGetInstanceFunction(objectToGetInstanceFunction, obj).symbol)
+                return JsIrBuilder.buildCall(getOrCreateGetInstanceFunction(objectToGetInstanceFunction, obj))
             }
         })
     }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt
index 6072e60..a1d6de8 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrimitiveCompanionLowering.kt
@@ -53,7 +53,7 @@
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
-                val irClass = expression.symbol.owner
+                val irClass = expression.target
                 val actualCompanion = getActualPrimitiveCompanion(irClass) ?: return expression
                 return IrGetObjectValueImpl(
                     expression.startOffset,
@@ -66,7 +66,7 @@
             override fun visitCall(expression: IrCall): IrExpression {
                 val newCall = super.visitCall(expression) as IrCall
 
-                val function = expression.symbol.owner as IrSimpleFunction
+                val function = expression.target as IrSimpleFunction
 
                 val actualFunction = getActualPrimitiveCompanionPropertyAccessor(function)
                     ?: return newCall
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrivateMembersLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrivateMembersLowering.kt
index 99bcc83..d2860ccc 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrivateMembersLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PrivateMembersLowering.kt
@@ -69,7 +69,7 @@
             override fun visitCall(expression: IrCall): IrExpression {
                 super.visitCall(expression)
 
-                return memberMap[expression.symbol]?.let {
+                return memberMap[expression.target]?.let {
                     transformPrivateToStaticCall(expression, it)
                 } ?: expression
             }
@@ -77,7 +77,7 @@
             override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
                 super.visitFunctionReference(expression)
 
-                return memberMap[expression.symbol]?.let {
+                return memberMap[expression.target]?.let {
                     transformPrivateToStaticReference(expression) {
                         IrFunctionReferenceImpl(
                             expression.startOffset, expression.endOffset,
@@ -98,7 +98,7 @@
                         IrPropertyReferenceImpl(
                             expression.startOffset, expression.endOffset,
                             expression.type,
-                            expression.symbol, // TODO remap property symbol based on remapped getter/setter?
+                            expression.target, // TODO remap property symbol based on remapped getter/setter?
                             expression.typeArgumentsCount,
                             expression.field,
                             memberMap[expression.getter]?.symbol ?: expression.getter,
@@ -116,7 +116,7 @@
                     staticTarget.symbol, staticTarget.descriptor,
                     expression.typeArgumentsCount,
                     expression.origin,
-                    expression.superQualifierSymbol
+                    expression.irSuperQualifier
                 )
 
                 newExpression.extensionReceiver = expression.extensionReceiver
@@ -213,7 +213,7 @@
         staticFunction.body = function.body?.deepCopyWithSymbols(staticFunction)
 
         staticFunction.transform(object : IrElementTransformerVoid() {
-            override fun visitGetValue(expression: IrGetValue) = parameterMapping[expression.symbol.owner]?.let {
+            override fun visitGetValue(expression: IrGetValue) = parameterMapping[expression.target]?.let {
                 expression.run { IrGetValueImpl(startOffset, endOffset, type, it.symbol, origin) }
             } ?: expression
         }, null)
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt
index 81f5660..0147562 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt
@@ -83,19 +83,19 @@
     private fun generateFactoryBody(constructor: IrConstructor, irClass: IrClass, stub: IrSimpleFunction, delegate: IrSimpleFunction) {
         val type = irClass.defaultType
         val createFunctionIntrinsic = context.intrinsics.jsObjectCreate
-        val irCreateCall = JsIrBuilder.buildCall(createFunctionIntrinsic.symbol, type, listOf(type))
-        val irDelegateCall = JsIrBuilder.buildCall(delegate.symbol, type).also { call ->
+        val irCreateCall = JsIrBuilder.buildCall(createFunctionIntrinsic, type, listOf(type))
+        val irDelegateCall = JsIrBuilder.buildCall(delegate, type).also { call ->
             for (i in 0 until stub.typeParameters.size) {
                 call.putTypeArgument(i, stub.typeParameters[i].toIrType())
             }
 
             for (i in 0 until stub.valueParameters.size) {
-                call.putValueArgument(i, JsIrBuilder.buildGetValue(stub.valueParameters[i].symbol))
+                call.putValueArgument(i, JsIrBuilder.buildGetValue(stub.valueParameters[i]))
             }
 
             call.putValueArgument(constructor.valueParameters.size, irCreateCall)
         }
-        val irReturn = JsIrBuilder.buildReturn(stub.symbol, irDelegateCall, context.irBuiltIns.nothingType)
+        val irReturn = JsIrBuilder.buildReturn(stub, irDelegateCall, context.irBuiltIns.nothingType)
 
 
         stub.body = JsIrBuilder.buildBlockBody(listOf(irReturn))
@@ -104,7 +104,7 @@
     private fun generateInitBody(constructor: IrConstructor, irClass: IrClass, delegate: IrSimpleFunction) {
         val thisParam = delegate.valueParameters.last()
         val oldThisReceiver = irClass.thisReceiver!!
-        val retStmt = JsIrBuilder.buildReturn(delegate.symbol, JsIrBuilder.buildGetValue(thisParam.symbol), context.irBuiltIns.nothingType)
+        val retStmt = JsIrBuilder.buildReturn(delegate, JsIrBuilder.buildGetValue(thisParam), context.irBuiltIns.nothingType)
         val statements = (constructor.body!!.deepCopyWithSymbols(delegate) as IrStatementContainer).statements
 
         val oldValueParameters = constructor.valueParameters + oldThisReceiver
@@ -131,7 +131,7 @@
             IrGetValueImpl(expression.startOffset, expression.endOffset, newThisSymbol.owner.type, newThisSymbol)
         )
 
-        override fun visitGetValue(expression: IrGetValue) = symbolMapping[expression.symbol.owner]?.let {
+        override fun visitGetValue(expression: IrGetValue) = symbolMapping[expression.target]?.let {
             expression.run { IrGetValueImpl(startOffset, endOffset, type, it.symbol, origin) }
         } ?: expression
     }
@@ -202,7 +202,7 @@
     override fun visitConstructorCall(expression: IrConstructorCall, data: IrFunction?): IrElement {
         super.visitConstructorCall(expression, data)
 
-        val target = expression.symbol.owner
+        val target = expression.target
         return if (target.isSecondaryConstructorCall) {
             val ctor = oldCtorToNewMap.getOrPut(target) {
                 buildConstructorStubDeclarations(target, target.parentAsClass)
@@ -214,7 +214,7 @@
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: IrFunction?): IrElement {
         super.visitDelegatingConstructorCall(expression, data)
 
-        val target = expression.symbol.owner
+        val target = expression.target
 
         return if (target.isSecondaryConstructorCall) {
             val klass = target.parentAsClass
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt
index 83eac2e..1016318 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt
@@ -15,7 +15,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrBlockBody
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
 import org.jetbrains.kotlin.ir.util.defaultType
 import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
@@ -42,7 +41,7 @@
 
     private data class FunctionWithBody(val function: IrSimpleFunction, val body: IrBlockBody)
 
-    private fun IrSimpleFunctionSymbol.createInvocation(
+    private fun IrSimpleFunction.createInvocation(
         name: String,
         parentBody: IrBlockBody,
         ignored: Boolean = false
@@ -62,8 +61,8 @@
             putValueArgument(0, JsIrBuilder.buildString(context.irBuiltIns.stringType, name))
             putValueArgument(1, JsIrBuilder.buildBoolean(context.irBuiltIns.booleanType, ignored))
 
-            val refType = IrSimpleTypeImpl(context.ir.symbols.functionN(0), false, emptyList(), emptyList())
-            putValueArgument(2, JsIrBuilder.buildFunctionReference(refType, function.symbol))
+            val refType = IrSimpleTypeImpl(context.ir.symbols.functionN(0).symbol, false, emptyList(), emptyList())
+            putValueArgument(2, JsIrBuilder.buildFunctionReference(refType, function))
         }
 
         return FunctionWithBody(function, body)
@@ -102,15 +101,15 @@
         body.statements += classVal
 
         body.statements += beforeFuns.map {
-            JsIrBuilder.buildCall(it.symbol).apply {
-                dispatchReceiver = JsIrBuilder.buildGetValue(classVal.symbol)
+            JsIrBuilder.buildCall(it).apply {
+                dispatchReceiver = JsIrBuilder.buildGetValue(classVal)
             }
         }
 
         val returnStatement = JsIrBuilder.buildReturn(
-            fn.symbol,
-            JsIrBuilder.buildCall(testFun.symbol).apply {
-                dispatchReceiver = JsIrBuilder.buildGetValue(classVal.symbol)
+            fn,
+            JsIrBuilder.buildCall(testFun).apply {
+                dispatchReceiver = JsIrBuilder.buildGetValue(classVal)
             },
             context.irBuiltIns.unitType
         )
@@ -122,8 +121,8 @@
                 tryResult = returnStatement
                 finallyExpression = JsIrBuilder.buildComposite(context.irBuiltIns.unitType).apply {
                     statements += afterFuns.map {
-                        JsIrBuilder.buildCall(it.symbol).apply {
-                            dispatchReceiver = JsIrBuilder.buildGetValue(classVal.symbol)
+                        JsIrBuilder.buildCall(it).apply {
+                            dispatchReceiver = JsIrBuilder.buildGetValue(classVal)
                         }
                     }
                 }
@@ -133,10 +132,10 @@
 
     private fun IrClass.instance(): IrExpression {
         return if (kind == ClassKind.OBJECT) {
-            JsIrBuilder.buildGetObjectValue(defaultType, symbol)
+            JsIrBuilder.buildGetObjectValue(defaultType, this)
         } else {
             declarations.asSequence().filterIsInstance<IrConstructor>().single { it.isPrimary }.let { constructor ->
-                IrConstructorCallImpl.fromSymbolOwner(defaultType, constructor.symbol).also {
+                IrConstructorCallImpl.fromSymbolOwner(defaultType, constructor).also {
                     if (isInner) {
                         it.dispatchReceiver = (parent as IrClass).instance()
                     }
@@ -158,5 +157,5 @@
         get() = hasAnnotation("kotlin.test.AfterTest")
 
     private fun IrAnnotationContainer.hasAnnotation(fqName: String) =
-        annotations.any { it.symbol.owner.fqNameWhenAvailable?.parent()?.asString() == fqName }
+        annotations.any { it.target.fqNameWhenAvailable?.parent()?.asString() == fqName }
 }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ThrowableLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ThrowableLowering.kt
index 1b3ac75..4672c58 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ThrowableLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ThrowableLowering.kt
@@ -6,23 +6,16 @@
 package org.jetbrains.kotlin.ir.backend.js.lower
 
 import org.jetbrains.kotlin.backend.common.FileLoweringPass
-import org.jetbrains.kotlin.backend.common.lower.callsSuper
-import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
-import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.declarations.IrClass
-import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
 import org.jetbrains.kotlin.ir.declarations.IrFile
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
 import org.jetbrains.kotlin.ir.types.isNullableString
-import org.jetbrains.kotlin.ir.types.isString
 import org.jetbrains.kotlin.ir.types.makeNotNull
-import org.jetbrains.kotlin.ir.util.defaultType
 import org.jetbrains.kotlin.ir.util.isThrowable
-import org.jetbrains.kotlin.ir.util.isThrowableTypeOrSubtype
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 
 
@@ -53,7 +46,7 @@
             )
             else -> {
                 val arg = getValueArgument(0)!!
-                val parameter = symbol.owner.valueParameters[0]
+                val parameter = target.valueParameters[0]
                 when {
                     parameter.type.isNullableString() -> ThrowableArguments(message = arg, cause = nullValue())
                     else -> {
@@ -69,7 +62,7 @@
 
         override fun visitConstructorCall(expression: IrConstructorCall, data: IrDeclarationParent): IrExpression {
             expression.transformChildren(this, data)
-            if (expression.symbol !in throwableConstructors) return expression
+            if (expression.target !in throwableConstructors) return expression
 
             val (messageArg, causeArg) = expression.extractThrowableArguments()
 
@@ -83,7 +76,7 @@
 
         override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: IrDeclarationParent): IrExpression {
             expression.transformChildren(this, data)
-            if (expression.symbol !in throwableConstructors) return expression
+            if (expression.target !in throwableConstructors) return expression
 
             val (messageArg, causeArg) = expression.extractThrowableArguments()
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt
index 2532087..88a9e1d 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TypeOperatorLowering.kt
@@ -27,7 +27,7 @@
 
 class TypeOperatorLowering(val context: JsIrBackendContext) : FileLoweringPass {
     private val unit = context.irBuiltIns.unitType
-    private val unitValue get() = JsIrBuilder.buildGetObjectValue(unit, unit.classifierOrFail as IrClassSymbol)
+    private val unitValue get() = JsIrBuilder.buildGetObjectValue(unit, unit.classifierOrFail as IrClass)
 
     private val lit24 get() = JsIrBuilder.buildInt(context.irBuiltIns.intType, 24)
     private val lit16 get() = JsIrBuilder.buildInt(context.irBuiltIns.intType, 16)
@@ -184,7 +184,7 @@
             ): () -> IrExpressionWithCopy {
                 val varDeclaration = JsIrBuilder.buildVar(value.type, declaration, initializer = value)
                 newStatements += varDeclaration
-                return { JsIrBuilder.buildGetValue(varDeclaration.symbol) }
+                return { JsIrBuilder.buildGetValue(varDeclaration) }
             }
 
             private fun generateTypeCheck(argument: () -> IrExpressionWithCopy, toType: IrType): IrExpression {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt
index 36cda0b..339ba4d 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/VarargLowering.kt
@@ -9,7 +9,6 @@
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.declarations.IrFile
-import org.jetbrains.kotlin.ir.declarations.name
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
@@ -189,7 +188,7 @@
 
         for (i in 0 until size) {
             val argument = expression.getValueArgument(i)
-            val parameter = expression.symbol.owner.valueParameters[i]
+            val parameter = expression.target.valueParameters[i]
             val varargElementType = parameter.varargElementType
             if (argument == null && varargElementType != null) {
                 val arrayInfo = InlineClassArrayInfo(varargElementType, parameter.type)
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt
index 1d6da11..35ef1db 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt
@@ -19,7 +19,7 @@
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression =
         if (call is IrConstructorCall) {
             // Do not transform Delegation calls
-            when (call.symbol) {
+            when (call.target) {
                 intrinsics.stringConstructorSymbol -> JsIrBuilder.buildString(context.irBuiltIns.stringType, "")
                 intrinsics.anyConstructorSymbol -> irConstructorCall(call, intrinsics.jsObjectConstructorSymbol)
                 else -> call
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLoweringUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLoweringUtils.kt
index 9391699..c7fb4e9 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLoweringUtils.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLoweringUtils.kt
@@ -8,31 +8,30 @@
 import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.irCall
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.types.SimpleType
 
-typealias SymbolToTransformer = MutableMap<IrFunctionSymbol, (IrFunctionAccessExpression) -> IrExpression>
+typealias FunctionToTransformer = MutableMap<IrFunction, (IrFunctionAccessExpression) -> IrExpression>
 
-internal fun SymbolToTransformer.add(from: Map<SimpleType, IrFunctionSymbol>, to: IrFunctionSymbol) {
+internal fun FunctionToTransformer.add(from: Map<SimpleType, IrFunction>, to: IrFunction) {
     from.forEach { _, func ->
         add(func, to)
     }
 }
 
-internal fun SymbolToTransformer.add(from: Map<SimpleType, IrFunctionSymbol>, to: (IrFunctionAccessExpression) -> IrExpression) {
+internal fun FunctionToTransformer.add(from: Map<SimpleType, IrFunction>, to: (IrFunctionAccessExpression) -> IrExpression) {
     from.forEach { _, func ->
         add(func, to)
     }
 }
 
-internal fun SymbolToTransformer.add(from: IrFunctionSymbol, to: (IrFunctionAccessExpression) -> IrExpression) {
+internal fun FunctionToTransformer.add(from: IrFunction, to: (IrFunctionAccessExpression) -> IrExpression) {
     put(from, to)
 }
 
-internal fun SymbolToTransformer.add(from: IrFunctionSymbol, to: IrFunctionSymbol, dispatchReceiverAsFirstArgument: Boolean = false) {
+internal fun FunctionToTransformer.add(from: IrFunction, to: IrFunction, dispatchReceiverAsFirstArgument: Boolean = false) {
     put(from) { call -> irCall(call, to, dispatchReceiverAsFirstArgument) }
 }
 
@@ -46,12 +45,8 @@
 
 internal typealias MemberToTransformer = HashMap<SimpleMemberKey, (IrFunctionAccessExpression) -> IrExpression>
 
-internal fun MemberToTransformer.add(type: IrType, name: Name, v: IrFunctionSymbol) {
-    add(type, name) { irCall(it, v, receiversAsArguments = true) }
-}
-
 internal fun MemberToTransformer.add(type: IrType, name: Name, v: IrFunction) {
-    add(type, name, v.symbol)
+    add(type, name) { irCall(it, v, receiversAsArguments = true) }
 }
 
 internal fun MemberToTransformer.add(type: IrType, name: Name, v: (IrFunctionAccessExpression) -> IrExpression) {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt
index daba1d1..970bb25 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt
@@ -27,7 +27,7 @@
         if (!enum.isEnumClass) return call
         val staticMethod = enum.findDeclaration(staticMethodPredicate)
         if (staticMethod == null || !staticMethod.isStaticMethodOfClass)
-            throw IllegalStateException("Enum class should have static method for ${call.symbol.owner.name}")
+            throw IllegalStateException("Enum class should have static method for ${call.target.name}")
 
         return irCall(call, staticMethod.symbol)
     }
@@ -42,7 +42,7 @@
         it.name == Name.identifier("values") && it.valueParameters.count() == 0
     }
 
-    override fun transformFunctionAccess(call: IrFunctionAccessExpression) = when (call.symbol) {
+    override fun transformFunctionAccess(call: IrFunctionAccessExpression) = when (call.target) {
         context.intrinsics.enumValueOfIntrinsic -> transformEnumValueOfIntrinsic(call)
         context.intrinsics.enumValuesIntrinsic -> transformEnumValuesIntrinsic(call)
         else -> call
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt
index 4f5fcba..6330d77 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EqualityAndComparisonCallsTransformer.kt
@@ -23,10 +23,10 @@
     private val intrinsics = context.intrinsics
     private val irBuiltIns = context.irBuiltIns
 
-    private val symbolToTransformer: SymbolToTransformer = mutableMapOf()
+    private val functionToTransformer: FunctionToTransformer = mutableMapOf()
 
     init {
-        symbolToTransformer.run {
+        functionToTransformer.run {
             add(irBuiltIns.eqeqeqSymbol, intrinsics.jsEqeqeq)
             add(irBuiltIns.eqeqSymbol, ::transformEqeqOperator)
             // ieee754equals can only be applied in between statically known Floats, Doubles, null or undefined
@@ -59,12 +59,12 @@
     }
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression {
-        val symbol = call.symbol
-        symbolToTransformer[symbol]?.let {
+        val target = call.target
+        functionToTransformer[target]?.let {
             return it(call)
         }
 
-        return when (symbol.owner.name) {
+        return when (target.name) {
             Name.identifier("compareTo") -> transformCompareToMethodCall(call)
             Name.identifier("equals") -> transformEqualsMethodCall(call as IrCall)
             else -> call
@@ -113,14 +113,14 @@
         (0 until valueArgumentsCount).all { getValueArgument(it)!!.type.isNullable() }
 
     private fun transformCompareToMethodCall(call: IrFunctionAccessExpression): IrExpression {
-        val function = call.symbol.owner as IrSimpleFunction
+        val function = call.target as IrSimpleFunction
         if (function.parent !is IrClass) return call
 
         fun IrSimpleFunction.isFakeOverriddenFromComparable(): Boolean = when {
             origin != IrDeclarationOrigin.FAKE_OVERRIDE ->
                 !isStaticMethodOfClass && parentAsClass.thisReceiver!!.type.isComparable()
 
-            else -> overriddenSymbols.all { it.owner.isFakeOverriddenFromComparable() }
+            else -> overridden.all { it.isFakeOverriddenFromComparable() }
         }
 
         return when {
@@ -137,7 +137,7 @@
 
 
     private fun transformEqualsMethodCall(call: IrCall): IrExpression {
-        val function = call.symbol.owner
+        val function = call.target
         return when {
             // Nothing special
             !function.isEqualsInheritedFromAny() -> call
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt
index 4c5a7a9..0a8b9c9 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt
@@ -27,5 +27,5 @@
     )
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression) =
-        helperMapping[call.symbol]?.let { irCall(call, it) } ?: call
+        helperMapping[call.target]?.let { irCall(call, it) } ?: call
 }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt
index 240a84b..c059925 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/JsonIntrinsics.kt
@@ -32,7 +32,7 @@
             }
         }
 
-        when (call.symbol.owner.fqNameWhenAvailable) {
+        when (call.target.fqNameWhenAvailable) {
             FqName("kotlin.js.Json.get") ->
                 return generateMemberAccess()
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt
index 2f5a62a..35504bb 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/MethodsOfAnyCallsTransformer.kt
@@ -39,7 +39,7 @@
             }
 
             put(Name.identifier("hashCode")) { call ->
-                if (call.symbol.owner.isFakeOverriddenFromAny()) {
+                if (call.target.isFakeOverriddenFromAny()) {
                     if ((call as IrCall).isSuperToAny()) {
                         irCall(call, intrinsics.jsGetObjectHashCode, receiversAsArguments = true)
                     } else {
@@ -54,8 +54,8 @@
 
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression {
-        val symbol = call.symbol
-        nameToTransformer[symbol.owner.name]?.let {
+        val target = call.target
+        nameToTransformer[target.name]?.let {
             return it(call)
         }
 
@@ -63,7 +63,7 @@
     }
 
     private fun shouldReplaceToStringWithRuntimeCall(call: IrFunctionAccessExpression): Boolean {
-        val function = call.symbol.owner
+        val function = call.target
         if (function.valueParameters.size != 0 && function.name.asString() != "toString" )
             return false
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt
index a286e73..91927168 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberConversionCallsTransformer.kt
@@ -8,7 +8,6 @@
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.backend.js.utils.ConversionNames
-import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
 
@@ -76,7 +75,7 @@
     }
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression {
-        val function = call.symbol.owner
+        val function = call.target
         function.dispatchReceiverParameter?.also {
             val key = SimpleMemberKey(it.type, function.name)
             memberToTransformer[key]?.also {
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt
index 2690a9c..9068319 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt
@@ -8,6 +8,7 @@
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
 import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -73,7 +74,7 @@
     }
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression {
-        val function = call.symbol.owner
+        val function = call.target
         function.dispatchReceiverParameter?.also {
             val key = SimpleMemberKey(it.type, function.name)
             memberToTransformer[key]?.also {
@@ -85,7 +86,7 @@
 
     private fun transformRangeTo(call: IrFunctionAccessExpression): IrExpression {
         if (call.valueArgumentsCount != 1) return call
-        return with(call.symbol.owner.valueParameters[0].type) {
+        return with(call.target.valueParameters[0].type) {
             when {
                 isByte() || isShort() || isInt() ->
                     irCall(call, intrinsics.jsNumberRangeToNumber, receiversAsArguments = true)
@@ -108,7 +109,7 @@
     }
 
     class BinaryOp(call: IrFunctionAccessExpression) {
-        val function = call.symbol.owner
+        val function = call.target
         val name = function.name
         val lhs = function.dispatchReceiverParameter!!.type
         val rhs = function.valueParameters[0].type
@@ -224,8 +225,8 @@
         }
     }
 
-    fun IrFunctionSymbol.call(vararg arguments: IrExpression) =
-        JsIrBuilder.buildCall(this, owner.returnType).apply {
+    fun IrFunction.call(vararg arguments: IrExpression) =
+        JsIrBuilder.buildCall(this, returnType).apply {
             for ((idx, arg) in arguments.withIndex()) {
                 putValueArgument(idx, arg)
             }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt
index 35b9fd1..6564b09 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/PrimitiveContainerMemberCallTransformer.kt
@@ -7,23 +7,20 @@
 
 import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
 import org.jetbrains.kotlin.ir.declarations.IrConstructor
-import org.jetbrains.kotlin.ir.expressions.IrCall
-import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
 import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.util.getSimpleFunction
 import org.jetbrains.kotlin.ir.util.getPropertyGetter
 
 class PrimitiveContainerMemberCallTransformer(private val context: JsIrBackendContext) : CallsTransformer {
     private val intrinsics = context.intrinsics
 
-    private val symbolToTransformer: SymbolToTransformer = mutableMapOf()
+    private val functionToTransformer: FunctionToTransformer = mutableMapOf()
 
     init {
-        symbolToTransformer.run {
+        functionToTransformer.run {
             // Arrays
             add(context.intrinsics.array.sizeProperty, context.intrinsics.jsArrayLength, true)
             add(context.intrinsics.array.getFunction, context.intrinsics.jsArrayGet, true)
@@ -60,8 +57,8 @@
     }
 
     override fun transformFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
-        val symbol = expression.symbol
-        symbolToTransformer[symbol]?.let {
+        val symbol = expression.target
+        functionToTransformer[symbol]?.let {
             return it(expression)
         }
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt
index e85bf48..cc8673d 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ReflectionCallsTransformer.kt
@@ -34,7 +34,7 @@
             addWithPredicate(
                 Name.special(Namer.KCALLABLE_GET_NAME),
                 { call ->
-                    call.symbol.owner.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kCallableClass) } ?: false
+                    call.target.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kCallableClass) } ?: false
                 },
                 { call ->
                     IrDynamicMemberExpressionImpl(
@@ -49,7 +49,7 @@
             addWithPredicate(
                 Name.identifier(Namer.KPROPERTY_GET),
                 { call ->
-                    call.symbol.owner.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kPropertyClass) } ?: false
+                    call.target.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kPropertyClass) } ?: false
                 },
                 { call -> buildDynamicCall(Namer.KPROPERTY_GET, call) }
             )
@@ -57,7 +57,7 @@
             addWithPredicate(
                 Name.identifier(Namer.KPROPERTY_SET),
                 { call ->
-                    call.symbol.owner.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kPropertyClass) } ?: false
+                    call.target.dispatchReceiverParameter?.run { type.isSubtypeOfClass(context.irBuiltIns.kPropertyClass) } ?: false
                 },
                 { call -> buildDynamicCall(Namer.KPROPERTY_SET, call) }
             )
@@ -65,8 +65,8 @@
     }
 
     override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression {
-        val symbol = call.symbol
-        nameToTransformer[symbol.owner.name]?.let {
+        val symbol = call.target
+        nameToTransformer[symbol.name]?.let {
             return it(call)
         }
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/JsSuspendFunctionsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/JsSuspendFunctionsLowering.kt
index 69a210d..9d43965 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/JsSuspendFunctionsLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/JsSuspendFunctionsLowering.kt
@@ -15,9 +15,7 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.util.explicitParameters
 import org.jetbrains.kotlin.ir.util.patchDeclarationParents
 import org.jetbrains.kotlin.ir.visitors.*
@@ -65,8 +63,8 @@
             stateMachineFunction,
             "suspendResult",
             true,
-            initializer = JsIrBuilder.buildCall(coroutineImplResultSymbolGetter.symbol).apply {
-                dispatchReceiver = JsIrBuilder.buildGetValue(stateMachineFunction.dispatchReceiverParameter!!.symbol)
+            initializer = JsIrBuilder.buildCall(coroutineImplResultSymbolGetter).apply {
+                dispatchReceiver = JsIrBuilder.buildGetValue(stateMachineFunction.dispatchReceiverParameter!!)
             }
         )
 
@@ -88,7 +86,7 @@
         }
 
         val suspendableNodes = collectSuspendableNodes(body)
-        val thisReceiver = (stateMachineFunction.dispatchReceiverParameter as IrValueParameter).symbol
+        val thisReceiver = stateMachineFunction.dispatchReceiverParameter as IrValueParameter
 
         val stateMachineBuilder = StateMachineBuilder(
             suspendableNodes,
@@ -126,36 +124,35 @@
             override fun visitReturn(expression: IrReturn): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                return if (expression.returnTargetSymbol != simplifiedFunction.symbol)
+                return if (expression.irReturnTarget != simplifiedFunction.symbol)
                     expression
                 else
-                    JsIrBuilder.buildReturn(stateMachineFunction.symbol, expression.value, expression.type)
+                    JsIrBuilder.buildReturn(stateMachineFunction, expression.value, expression.type)
             }
         })
 
         val liveLocals = computeLivenessAtSuspensionPoints(functionBody).values.flatten().toSet()
 
-        val localToPropertyMap = mutableMapOf<IrValueSymbol, IrFieldSymbol>()
+        val localToPropertyMap = mutableMapOf<IrValueDeclaration, IrField>()
         var localCounter = 0
         // TODO: optimize by using the same property for different locals.
         liveLocals.forEach {
             if (it != suspendState && it != suspendResult) {
-                localToPropertyMap.getOrPut(it.symbol) {
+                localToPropertyMap.getOrPut(it) {
                     coroutineClass.addField(Name.identifier("${it.name}${localCounter++}"), it.type, (it as? IrVariable)?.isVar ?: false)
-                        .symbol
                 }
             }
         }
         simplifiedFunction.explicitParameters.forEach {
-            localToPropertyMap.getOrPut(it.symbol) {
-                argumentToPropertiesMap.getValue(it).symbol
+            localToPropertyMap.getOrPut(it) {
+                argumentToPropertiesMap.getValue(it)
             }
         }
 
         stateMachineFunction.transform(LiveLocalsTransformer(localToPropertyMap, { JsIrBuilder.buildGetValue(thisReceiver) }, unit), null)
     }
 
-    private fun assignStateIds(entryState: SuspendState, thisReceiver: IrValueParameterSymbol, switch: IrWhen, rootLoop: IrLoop) {
+    private fun assignStateIds(entryState: SuspendState, thisReceiver: IrValueParameter, switch: IrWhen, rootLoop: IrLoop) {
         val visited = mutableSetOf<SuspendState>()
 
         val sortedStates = DFS.topologicalOrder(listOf(entryState), { it.successors }, { visited.add(it) })
@@ -165,7 +162,7 @@
 
         for (state in sortedStates) {
             val condition = JsIrBuilder.buildCall(eqeqeqInt).apply {
-                putValueArgument(0, JsIrBuilder.buildCall(coroutineImplLabelPropertyGetter.symbol).also {
+                putValueArgument(0, JsIrBuilder.buildCall(coroutineImplLabelPropertyGetter).also {
                     it.dispatchReceiver = JsIrBuilder.buildGetValue(thisReceiver)
                 })
                 putValueArgument(1, JsIrBuilder.buildInt(context.irBuiltIns.intType, state.id))
@@ -204,10 +201,10 @@
     override fun initializeStateMachine(coroutineConstructors: List<IrConstructor>, coroutineClassThis: IrValueDeclaration) {
         for (it in coroutineConstructors) {
             (it.body as? IrBlockBody)?.run {
-                val receiver = JsIrBuilder.buildGetValue(coroutineClassThis.symbol)
+                val receiver = JsIrBuilder.buildGetValue(coroutineClassThis)
                 assert(exceptionTrapId >= 0)
                 val id = JsIrBuilder.buildInt(context.irBuiltIns.intType, exceptionTrapId)
-                statements += JsIrBuilder.buildCall(coroutineImplExceptionStatePropertySetter.symbol).also { call ->
+                statements += JsIrBuilder.buildCall(coroutineImplExceptionStatePropertySetter).also { call ->
                     call.dispatchReceiver = receiver
                     call.putValueArgument(0, id)
                 }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
index a0b5366..bac4e2a 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt
@@ -16,13 +16,12 @@
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
+import org.jetbrains.kotlin.ir.declarations.IrValueParameter
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
 import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
 import org.jetbrains.kotlin.ir.visitors.*
@@ -63,8 +62,8 @@
     private val exStateSymbolGetter: IrSimpleFunction,
     private val exStateSymbolSetter: IrSimpleFunction,
     private val stateSymbolSetter: IrSimpleFunction,
-    private val thisSymbol: IrValueParameterSymbol,
-    private val suspendResult: IrVariableSymbol
+    private val thisValueParameter: IrValueParameter,
+    private val suspendResult: IrVariable
 ) : IrElementVisitorVoid {
 
     private val loopMap = mutableMapOf<IrLoop, LoopBounds>()
@@ -73,7 +72,7 @@
     private val booleanNotSymbol = context.irBuiltIns.booleanNotSymbol
     private val eqeqeqSymbol = context.irBuiltIns.eqeqeqSymbol
 
-    private val thisReceiver get() = JsIrBuilder.buildGetValue(thisSymbol)
+    private val thisReceiver get() = JsIrBuilder.buildGetValue(thisValueParameter)
 
     private var hasExceptions = false
 
@@ -93,7 +92,6 @@
     private fun buildGlobalCatch(): IrCatch {
 
         val catchVariable = globalExceptionVar
-        val globalExceptionSymbol = globalExceptionVar.symbol
         val block = JsIrBuilder.buildBlock(unit)
         if (hasExceptions) {
             val thenBlock = JsIrBuilder.buildBlock(unit)
@@ -105,22 +103,22 @@
             block.statements += JsIrBuilder.buildIfElse(unit, check, thenBlock, elseBlock)
             thenBlock.statements += JsIrBuilder.buildThrow(
                 nothing,
-                JsIrBuilder.buildGetValue(globalExceptionSymbol)
+                JsIrBuilder.buildGetValue(catchVariable)
             )
 
             // TODO: exception table
-            elseBlock.statements += JsIrBuilder.buildCall(stateSymbolSetter.symbol, unit).apply {
+            elseBlock.statements += JsIrBuilder.buildCall(stateSymbolSetter, unit).apply {
                 dispatchReceiver = thisReceiver
                 putValueArgument(0, exceptionState())
             }
-            elseBlock.statements += JsIrBuilder.buildCall(exceptionSymbolSetter.symbol, unit).apply {
+            elseBlock.statements += JsIrBuilder.buildCall(exceptionSymbolSetter, unit).apply {
                 dispatchReceiver = thisReceiver
-                putValueArgument(0, JsIrBuilder.buildGetValue(globalExceptionSymbol))
+                putValueArgument(0, JsIrBuilder.buildGetValue(catchVariable))
             }
         } else {
             block.statements += JsIrBuilder.buildThrow(
                 nothing,
-                JsIrBuilder.buildGetValue(globalExceptionSymbol)
+                JsIrBuilder.buildGetValue(catchVariable)
             )
         }
 
@@ -130,7 +128,7 @@
     private var currentState = entryState
     private var currentBlock = entryState.entryBlock
 
-    private val returnableBlockMap = mutableMapOf<IrReturnableBlockSymbol, Pair<SuspendState, IrVariableSymbol?>>()
+    private val returnableBlockMap = mutableMapOf<IrReturnableBlockSymbol, Pair<SuspendState, IrVariable?>>()
 
     private val catchBlockStack = mutableListOf(rootExceptionTrap)
 
@@ -175,7 +173,7 @@
     private fun doDispatchImpl(target: SuspendState, block: IrContainerExpression, andContinue: Boolean) {
         val irDispatch = IrDispatchPoint(target)
         currentState.successors.add(target)
-        block.addStatement(JsIrBuilder.buildCall(stateSymbolSetter.symbol, unit).apply {
+        block.addStatement(JsIrBuilder.buildCall(stateSymbolSetter, unit).apply {
             dispatchReceiver = thisReceiver
             putValueArgument(0, irDispatch)
         })
@@ -255,9 +253,7 @@
 
         val exitState = SuspendState(unit)
         val resultVariable = if (hasResultingValue(expression)) {
-            val irVar = tempVar(expression.type, "RETURNABLE_BLOCK")
-            addStatement(irVar)
-            irVar.symbol
+            tempVar(expression.type, "RETURNABLE_BLOCK").also { addStatement(it) }
         } else null
 
         returnableBlockMap[expression.symbol] = Pair(exitState, resultVariable)
@@ -292,7 +288,7 @@
             currentState.successors += continueState
 
             transformLastExpression {
-                JsIrBuilder.buildCall(stateSymbolSetter.symbol, unit).apply {
+                JsIrBuilder.buildCall(stateSymbolSetter, unit).apply {
                     dispatchReceiver = thisReceiver
                     putValueArgument(0, dispatch)
                 }
@@ -325,7 +321,7 @@
         doDispatch(headState)
     }
 
-    private fun wrap(expression: IrExpression, variable: IrVariableSymbol) =
+    private fun wrap(expression: IrExpression, variable: IrVariable) =
         JsIrBuilder.buildSetVariable(variable, expression, unit)
 
     override fun visitWhen(expression: IrWhen) {
@@ -334,16 +330,16 @@
 
         val exitState = SuspendState(expression.type)
 
-        val varSymbol: IrVariableSymbol?
+        val variable: IrVariable?
         val branches: List<IrBranch>
 
         if (hasResultingValue(expression)) {
             val irVar = tempVar(expression.type, "WHEN_RESULT")
-            varSymbol = irVar.symbol
+            variable = irVar
             addStatement(irVar)
 
             branches = expression.branches.map {
-                val wrapped = wrap(it.result, varSymbol)
+                val wrapped = wrap(it.result, variable)
                 if (it.result in suspendableNodes) {
                     suspendableNodes += wrapped
                 }
@@ -353,7 +349,7 @@
                 }
             }
         } else {
-            varSymbol = null
+            variable = null
             branches = expression.branches
         }
 
@@ -390,8 +386,8 @@
         maybeDoDispatch(exitState)
         updateState(exitState)
 
-        if (varSymbol != null) {
-            addStatement(JsIrBuilder.buildGetValue(varSymbol))
+        if (variable != null) {
+            addStatement(JsIrBuilder.buildGetValue(variable))
         }
     }
 
@@ -439,7 +435,7 @@
                 transformLastExpression {
                     irVar.apply { initializer = it }
                 }
-                JsIrBuilder.buildGetValue(irVar.symbol)
+                JsIrBuilder.buildGetValue(irVar)
             } else {
                 arg?.deepCopyWithSymbols(function.owner)
             }
@@ -487,12 +483,12 @@
             IrSetFieldImpl(
                 startOffset,
                 endOffset,
-                symbol,
+                target,
                 receiver,
                 value,
                 unit,
                 origin,
-                superQualifierSymbol
+                irSuperQualifier
             )
         })
     }
@@ -520,10 +516,10 @@
 
     override fun visitReturn(expression: IrReturn) {
         expression.acceptChildrenVoid(this)
-        if (expression.returnTargetSymbol is IrReturnableBlockSymbol) {
-            val (exitState, varSymbol) = returnableBlockMap[expression.returnTargetSymbol]!!
-            if (varSymbol != null) {
-                transformLastExpression { JsIrBuilder.buildSetVariable(varSymbol, it, it.type) }
+        if (expression.irReturnTarget is IrReturnableBlockSymbol) {
+            val (exitState, irVar) = returnableBlockMap[expression.irReturnTarget]!!
+            if (irVar != null) {
+                transformLastExpression { JsIrBuilder.buildSetVariable(irVar, it, it.type) }
             }
             maybeDoDispatch(exitState)
         } else {
@@ -555,17 +551,17 @@
 
         val exitState = SuspendState(unit)
 
-        val varSymbol = if (hasResultingValue(aTry)) tempVar(aTry.type, "TRY_RESULT") else null
+        val variable = if (hasResultingValue(aTry)) tempVar(aTry.type, "TRY_RESULT") else null
 
-        if (varSymbol != null) {
-            addStatement(varSymbol)
+        if (variable != null) {
+            addStatement(variable)
         }
 
         // TODO: refact it with exception table, see coroutinesInternal.kt
         setupExceptionState(tryState.catchState)
 
-        val tryResult = if (varSymbol != null) {
-            JsIrBuilder.buildSetVariable(varSymbol.symbol, aTry.tryResult, unit).also {
+        val tryResult = if (variable != null) {
+            JsIrBuilder.buildSetVariable(variable, aTry.tryResult, unit).also {
                 if (it.value in suspendableNodes) suspendableNodes += it
             }
         } else aTry.tryResult
@@ -591,8 +587,8 @@
             val irVar = catch.catchParameter.also {
                 it.initializer = initializer
             }
-            val catchResult = if (varSymbol != null) {
-                JsIrBuilder.buildSetVariable(varSymbol.symbol, catch.result, unit).also {
+            val catchResult = if (variable != null) {
+                JsIrBuilder.buildSetVariable(variable, catch.result, unit).also {
                     if (it.value in suspendableNodes) suspendableNodes += it
                 }
             } else catch.result
@@ -633,22 +629,22 @@
 
         updateState(exitState)
 
-        if (varSymbol != null) {
-            addStatement(JsIrBuilder.buildGetValue(varSymbol.symbol))
+        if (variable != null) {
+            addStatement(JsIrBuilder.buildGetValue(variable))
         }
     }
 
     private fun setupExceptionState(target: SuspendState) {
         addStatement(
-            JsIrBuilder.buildCall(exStateSymbolSetter.symbol, unit).apply {
+            JsIrBuilder.buildCall(exStateSymbolSetter, unit).apply {
                 dispatchReceiver = thisReceiver
                 putValueArgument(0, IrDispatchPoint(target))
             }
         )
     }
 
-    private fun exceptionState() = JsIrBuilder.buildCall(exStateSymbolGetter.symbol).also { it.dispatchReceiver = thisReceiver }
-    private fun pendingException() = JsIrBuilder.buildCall(exceptionSymbolGetter.symbol).also { it.dispatchReceiver = thisReceiver }
+    private fun exceptionState() = JsIrBuilder.buildCall(exStateSymbolGetter).also { it.dispatchReceiver = thisReceiver }
+    private fun pendingException() = JsIrBuilder.buildCall(exceptionSymbolGetter).also { it.dispatchReceiver = thisReceiver }
 
     private fun buildTryState() = TryState(currentState, SuspendState(unit))
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendLoweringUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendLoweringUtils.kt
index c4e46dd..c5dd810 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendLoweringUtils.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendLoweringUtils.kt
@@ -6,18 +6,15 @@
 package org.jetbrains.kotlin.ir.backend.js.lower.coroutines
 
 import org.jetbrains.kotlin.backend.common.ir.isSuspend
-import org.jetbrains.kotlin.backend.common.pop
-import org.jetbrains.kotlin.backend.common.push
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.IrStatement
 import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
+import org.jetbrains.kotlin.ir.declarations.IrField
+import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
-import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.*
 
@@ -64,7 +61,7 @@
     override fun visitReturn(expression: IrReturn) {
         super.visitReturn(expression)
 
-        if (expression.returnTargetSymbol is IrReturnableBlockSymbol && isSuspendableNode(expression.returnTargetSymbol.owner)) {
+        if (expression.irReturnTarget is IrReturnableBlock && isSuspendableNode(expression.irReturnTarget)) {
             markNode(expression)
         }
     }
@@ -82,19 +79,19 @@
 }
 
 class LiveLocalsTransformer(
-    private val localMap: Map<IrValueSymbol, IrFieldSymbol>,
+    private val localMap: Map<IrValueDeclaration, IrField>,
     private val receiver: () -> IrExpression,
     private val unitType: IrType
 ) :
     IrElementTransformerVoid() {
     override fun visitGetValue(expression: IrGetValue): IrExpression {
-        val field = localMap[expression.symbol] ?: return expression
+        val field = localMap[expression.target] ?: return expression
         return expression.run { IrGetFieldImpl(startOffset, endOffset, field, type, receiver(), origin) }
     }
 
     override fun visitSetVariable(expression: IrSetVariable): IrExpression {
         expression.transformChildrenVoid(this)
-        val field = localMap[expression.symbol] ?: return expression
+        val field = localMap[expression.target] ?: return expression
         return expression.run { IrSetFieldImpl(startOffset, endOffset, field, receiver(), value, unitType, origin) }
     }
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
index 44cee71..97f09cb 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
@@ -10,12 +10,10 @@
 import org.jetbrains.kotlin.ir.backend.js.utils.*
 import org.jetbrains.kotlin.ir.declarations.IrClass
 import org.jetbrains.kotlin.ir.declarations.IrConstructor
-import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.types.isUnit
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.js.backend.ast.*
-import org.jetbrains.kotlin.util.OperatorNameConventions
 
 @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
 class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsExpression, JsGenerationContext> {
@@ -29,7 +27,7 @@
         body.expression.accept(this, context)
 
     override fun visitFunctionReference(expression: IrFunctionReference, context: JsGenerationContext): JsExpression {
-        val irFunction = expression.symbol.owner
+        val irFunction = expression.target
         return irFunction.accept(IrFunctionToJsTransformer(), context).apply { name = null }
     }
 
@@ -63,9 +61,7 @@
     }
 
     override fun visitGetField(expression: IrGetField, context: JsGenerationContext): JsExpression {
-        val symbol = expression.symbol
-        val field = symbol.owner
-
+        val field = expression.target
         val fieldParent = field.parent
 
         if (fieldParent is IrClass && field.isEffectivelyExternal()) {
@@ -85,37 +81,37 @@
     }
 
     override fun visitGetValue(expression: IrGetValue, context: JsGenerationContext): JsExpression =
-        context.getNameForValueDeclaration(expression.symbol.owner).makeRef()
+        context.getNameForValueDeclaration(expression.target).makeRef()
 
     override fun visitGetObjectValue(expression: IrGetObjectValue, context: JsGenerationContext): JsExpression {
-        val obj = expression.symbol.owner
+        val obj = expression.target
         assert(obj.kind == ClassKind.OBJECT)
         assert(obj.isEffectivelyExternal()) { "Non external IrGetObjectValue must be lowered" }
         return context.getRefForExternalClass(obj)
     }
 
     override fun visitSetField(expression: IrSetField, context: JsGenerationContext): JsExpression {
-        val fieldName = context.getNameForField(expression.symbol.owner)
+        val fieldName = context.getNameForField(expression.target)
         val dest = JsNameRef(fieldName, expression.receiver?.accept(this, context))
         val source = expression.value.accept(this, context)
         return jsAssignment(dest, source)
     }
 
     override fun visitSetVariable(expression: IrSetVariable, context: JsGenerationContext): JsExpression {
-        val ref = JsNameRef(context.getNameForValueDeclaration(expression.symbol.owner))
+        val ref = JsNameRef(context.getNameForValueDeclaration(expression.target))
         val value = expression.value.accept(this, context)
         return JsBinaryOperation(JsBinaryOperator.ASG, ref, value)
     }
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, context: JsGenerationContext): JsExpression {
-        val classNameRef = context.getNameForConstructor(expression.symbol.owner).makeRef()
+        val classNameRef = context.getNameForConstructor(expression.target).makeRef()
         val callFuncRef = JsNameRef(Namer.CALL_FUNCTION, classNameRef)
         val fromPrimary = context.currentFunction is IrConstructor
         val thisRef =
             if (fromPrimary) JsThisRef() else context.getNameForValueDeclaration(context.currentFunction!!.valueParameters.last()).makeRef()
         val arguments = translateCallArguments(expression, context, this)
 
-        val constructor = expression.symbol.owner
+        val constructor = expression.target
         if (constructor.parentAsClass.isInline) {
             assert(constructor.isPrimary) {
                 "Delegation to secondary inline constructors must be lowered into simple function calls"
@@ -127,7 +123,7 @@
     }
 
     override fun visitConstructorCall(expression: IrConstructorCall, context: JsGenerationContext): JsExpression {
-        val function = expression.symbol.owner
+        val function = expression.target
         val arguments = translateCallArguments(expression, context, this)
         val klass = function.parentAsClass
         return if (klass.isInline) {
@@ -149,7 +145,7 @@
     }
 
     override fun visitCall(expression: IrCall, context: JsGenerationContext): JsExpression {
-        if (context.checkIfJsCode(expression.symbol)) {
+        if (context.checkIfJsCode(expression.target)) {
             val statements = translateJsCodeIntoStatementList(expression.getValueArgument(0) ?: error("JsCode is expected"))
             if (statements.isEmpty()) return JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(3)) // TODO: report warning or even error
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt
index a12b55b..242f787 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsStatementTransformer.kt
@@ -65,14 +65,14 @@
     }
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, context: JsGenerationContext): JsStatement {
-        if (expression.symbol.owner.constructedClassType.isAny()) {
+        if (expression.target.constructedClassType.isAny()) {
             return JsEmpty
         }
         return expression.accept(IrElementToJsExpressionTransformer(), context).makeStmt()
     }
 
     override fun visitCall(expression: IrCall, data: JsGenerationContext): JsStatement {
-        if (data.checkIfJsCode(expression.symbol)) {
+        if (data.checkIfJsCode(expression.target)) {
             val statements = translateJsCodeIntoStatementList(expression.getValueArgument(0) ?: error("JsCode is expected"))
             return when (statements.size) {
                 0 -> JsEmpty
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt
index 4377e4a9..fe853d7 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt
@@ -174,11 +174,11 @@
             add(intrinsics.jsBind) { call, context: JsGenerationContext ->
                 val receiver = call.getValueArgument(0)!!
                 val reference = call.getValueArgument(1) as IrFunctionReference
-                val superClass = call.superQualifierSymbol!!
+                val superClass = call.irSuperQualifier!!
 
                 val jsReceiver = receiver.accept(IrElementToJsExpressionTransformer(), context)
-                val functionName = context.getNameForMemberFunction(reference.symbol.owner as IrSimpleFunction)
-                val superName = context.getNameForClass(superClass.owner).makeRef()
+                val functionName = context.getNameForMemberFunction(reference.target as IrSimpleFunction)
+                val superName = context.getNameForClass(superClass).makeRef()
                 val qPrototype = JsNameRef(functionName, prototypeOf(superName))
                 val bindRef = JsNameRef(Namer.BIND_FUNCTION, qPrototype)
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt
index 9dcf225..b124a82 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt
@@ -62,7 +62,7 @@
 }
 
 private fun isNativeInvoke(call: IrCall): Boolean {
-    val simpleFunction = call.symbol.owner as? IrSimpleFunction ?: return false
+    val simpleFunction = call.target as? IrSimpleFunction ?: return false
     val receiverType = simpleFunction.dispatchReceiverParameter?.type ?: return false
 
     if (simpleFunction.isSuspend) return false
@@ -75,7 +75,7 @@
     context: JsGenerationContext,
     transformer: IrElementToJsExpressionTransformer
 ): JsExpression {
-    val function = expression.symbol.owner.realOverrideTarget
+    val function = expression.target.realOverrideTarget
     require(function is IrSimpleFunction) { "Only IrSimpleFunction could be called via IrCall" } // TODO: fix it in IrCall
 
     val symbol = function.symbol
@@ -106,12 +106,12 @@
         return JsInvocation(jsDispatchReceiver!!, arguments)
     }
 
-    expression.superQualifierSymbol?.let { superQualifier ->
-        val (target, klass) = if (superQualifier.owner.isInterface) {
+    expression.irSuperQualifier?.let { superQualifier ->
+        val (target, klass) = if (superQualifier.isInterface) {
             val impl = function.resolveFakeOverride()!!
             Pair(impl, impl.parentAsClass)
         } else {
-            Pair(function, superQualifier.owner)
+            Pair(function, superQualifier)
         }
 
         val qualifierName = context.getNameForClass(klass).makeRef()
@@ -206,7 +206,7 @@
         val argument = expression.getValueArgument(index)
         val result = argument?.accept(transformer, context)
         if (result == null) {
-            assert(expression is IrFunctionAccessExpression && expression.symbol.owner.isExternalOrInheritedFromExternal())
+            assert(expression is IrFunctionAccessExpression && expression.target.isExternalOrInheritedFromExternal())
             JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1))
         } else
             result
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt
index 0ad389f..df355ab 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsGenerationContext.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.js.backend.ast.JsName
 import org.jetbrains.kotlin.js.backend.ast.JsNameRef
 import org.jetbrains.kotlin.js.backend.ast.JsScope
@@ -43,9 +42,9 @@
         }
 
     private fun isCoroutineDoResume(): Boolean {
-        val overriddenSymbols = (currentFunction as? IrSimpleFunction)?.overriddenSymbols ?: return false
-        return staticContext.doResumeFunctionSymbol in overriddenSymbols
+        val overriddenSymbols = (currentFunction as? IrSimpleFunction)?.overridden ?: return false
+        return staticContext.doResumeFunction in overriddenSymbols
     }
 
-    fun checkIfJsCode(symbol: IrFunctionSymbol): Boolean = symbol == staticContext.backendContext.intrinsics.jsCode
+    fun checkIfJsCode(target: IrFunction): Boolean = target == staticContext.backendContext.intrinsics.jsCode
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsStaticContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsStaticContext.kt
index cf4dd75..be2014b 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsStaticContext.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/JsStaticContext.kt
@@ -20,9 +20,9 @@
 
     val intrinsics = JsIntrinsicTransformers(backendContext)
     val classModels = mutableMapOf<IrClassSymbol, JsIrClassModel>()
-    val coroutineImplDeclaration = backendContext.ir.symbols.coroutineImpl.owner
-    val doResumeFunctionSymbol = coroutineImplDeclaration.declarations
-        .filterIsInstance<IrSimpleFunction>().single { it.name.asString() == "doResume" }.symbol
+    val coroutineImplDeclaration = backendContext.ir.symbols.coroutineImpl
+    val doResumeFunction = coroutineImplDeclaration.declarations
+        .filterIsInstance<IrSimpleFunction>().single { it.name.asString() == "doResume" }
 
     val initializerBlock = JsGlobalBlock()
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
index 495076f..f41ead4 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt
@@ -26,10 +26,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.expressions.IrExpression
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol
-import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
 import org.jetbrains.kotlin.ir.util.SymbolTable
@@ -70,11 +66,11 @@
         localClassInfo[container.attributeOwnerId] = value
     }
 
-    internal val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedPropertySymbol>>()
+    internal val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedProperty>>()
 
     internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
     internal val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
-    internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
+    internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunction, IrFunction>()
 
     override var inVerbosePhase: Boolean = false
 
@@ -88,26 +84,26 @@
     val suspendFunctionViews = mutableMapOf<IrFunction, IrFunction>()
     val fakeContinuation: IrExpression = createFakeContinuation(this)
 
-    val staticDefaultStubs = mutableMapOf<IrFunctionSymbol, IrFunction>()
+    val staticDefaultStubs = mutableMapOf<IrFunction, IrFunction>()
 
-    internal fun getTopLevelClass(fqName: FqName): IrClassSymbol {
+    internal fun getTopLevelClass(fqName: FqName): IrClass {
         val descriptor = state.module.getPackage(fqName.parent()).memberScope.getContributedClassifier(
             fqName.shortName(), NoLookupLocation.FROM_BACKEND
         ) as ClassDescriptor? ?: error("Class is not found: $fqName")
         return referenceClass(descriptor)
     }
 
-    internal fun referenceClass(descriptor: ClassDescriptor): IrClassSymbol =
-        symbolTable.referenceClass(descriptor)
+    internal fun referenceClass(descriptor: ClassDescriptor): IrClass =
+        symbolTable.referenceClass(descriptor).owner
 
-    internal fun referenceTypeParameter(descriptor: TypeParameterDescriptor): IrTypeParameterSymbol =
-        symbolTable.referenceTypeParameter(descriptor)
+    internal fun referenceTypeParameter(descriptor: TypeParameterDescriptor): IrTypeParameter =
+        symbolTable.referenceTypeParameter(descriptor).owner
 
-    internal fun referenceFunction(descriptor: FunctionDescriptor): IrFunctionSymbol =
+    internal fun referenceFunction(descriptor: FunctionDescriptor): IrFunction =
         if (descriptor is ClassConstructorDescriptor)
-            symbolTable.referenceConstructor(descriptor)
+            symbolTable.referenceConstructor(descriptor).owner
         else
-            symbolTable.referenceSimpleFunction(descriptor)
+            symbolTable.referenceSimpleFunction(descriptor).owner
 
     override fun log(message: () -> String) {
         /*TODO*/
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
index 0100f50..3fd2f3f 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt
@@ -67,10 +67,10 @@
             state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, firMode
         )
         state.irBasedMapAsmMethod = { descriptor ->
-            context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
+            context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor))
         }
         state.mapInlineClass = { descriptor ->
-            context.typeMapper.mapType(context.referenceClass(descriptor).owner.defaultType)
+            context.typeMapper.mapType(context.referenceClass(descriptor).defaultType)
         }
         //TODO
         ExternalDependenciesGenerator(
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt
index 75b24db..e36f8c0 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt
@@ -230,7 +230,8 @@
 val jvmPhases = namedIrModulePhase(
     name = "IrLowering",
     description = "IR lowering",
-    lower = expectDeclarationsRemovingPhase then
+    lower = desymbolizePhase then
+            expectDeclarationsRemovingPhase then
             fileClassPhase then
             performByIrFile(lower = jvmFilePhases) then
             generateMultifileFacadesPhase
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
index e419c0c..0811c3d 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt
@@ -14,11 +14,8 @@
 import org.jetbrains.kotlin.descriptors.Visibilities
 import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
 import org.jetbrains.kotlin.ir.builders.declarations.*
-import org.jetbrains.kotlin.ir.declarations.IrClass
-import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
-import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
+import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
-import org.jetbrains.kotlin.ir.symbols.*
 import org.jetbrains.kotlin.ir.symbols.impl.IrExternalPackageFragmentSymbolImpl
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
@@ -47,33 +44,33 @@
 
     private val irBuiltIns = context.irBuiltIns
 
-    private val nullPointerExceptionClass: IrClassSymbol =
+    private val nullPointerExceptionClass: IrClass =
         createClass(FqName("java.lang.NullPointerException")) { klass ->
             klass.addConstructor().apply {
                 addValueParameter("message", irBuiltIns.stringType)
             }
         }
 
-    override val ThrowNullPointerException: IrFunctionSymbol =
+    override val ThrowNullPointerException: IrFunction =
         nullPointerExceptionClass.constructors.single()
 
-    override val ThrowNoWhenBranchMatchedException: IrSimpleFunctionSymbol
+    override val ThrowNoWhenBranchMatchedException: IrFunction
         get() = error("Unused in JVM IR")
 
-    private val typeCastExceptionClass: IrClassSymbol =
+    private val typeCastExceptionClass: IrClass =
         createClass(FqName("kotlin.TypeCastException")) { klass ->
             klass.addConstructor().apply {
                 addValueParameter("message", irBuiltIns.stringType)
             }
         }
 
-    override val ThrowTypeCastException: IrFunctionSymbol =
+    override val ThrowTypeCastException: IrFunction =
         typeCastExceptionClass.constructors.single()
 
     private fun createPackage(fqName: FqName): IrPackageFragment =
         IrExternalPackageFragmentImpl(IrExternalPackageFragmentSymbolImpl(EmptyPackageFragmentDescriptor(context.state.module, fqName)))
 
-    private fun createClass(fqName: FqName, classKind: ClassKind = ClassKind.CLASS, block: (IrClass) -> Unit = {}): IrClassSymbol =
+    private fun createClass(fqName: FqName, classKind: ClassKind = ClassKind.CLASS, block: (IrClass) -> Unit = {}): IrClass =
         buildClass {
             name = fqName.shortName()
             kind = classKind
@@ -88,9 +85,9 @@
             }
             createImplicitParameterDeclarationWithWrappedDescriptor()
             block(this)
-        }.symbol
+        }
 
-    private val intrinsicsClass: IrClassSymbol = createClass(
+    private val intrinsicsClass: IrClass = createClass(
         JvmClassName.byInternalName(IrIntrinsicMethods.INTRINSICS_CLASS_NAME).fqNameForTopLevelClassMaybeWithDollars
     ) { klass ->
         klass.addFunction("throwUninitializedPropertyAccessException", irBuiltIns.unitType, isStatic = true).apply {
@@ -106,63 +103,63 @@
         }
     }
 
-    val checkExpressionValueIsNotNull: IrSimpleFunctionSymbol =
-        intrinsicsClass.functions.single { it.owner.name.asString() == "checkExpressionValueIsNotNull" }
+    val checkExpressionValueIsNotNull: IrSimpleFunction =
+        intrinsicsClass.functions.single { it.name.asString() == "checkExpressionValueIsNotNull" }
 
-    val checkNotNullExpressionValue: IrSimpleFunctionSymbol =
-        intrinsicsClass.functions.single { it.owner.name.asString() == "checkNotNullExpressionValue" }
+    val checkNotNullExpressionValue: IrSimpleFunction =
+        intrinsicsClass.functions.single { it.name.asString() == "checkNotNullExpressionValue" }
 
-    override val ThrowUninitializedPropertyAccessException: IrSimpleFunctionSymbol =
-        intrinsicsClass.functions.single { it.owner.name.asString() == "throwUninitializedPropertyAccessException" }
+    override val ThrowUninitializedPropertyAccessException: IrSimpleFunction =
+        intrinsicsClass.functions.single { it.name.asString() == "throwUninitializedPropertyAccessException" }
 
-    override val stringBuilder: IrClassSymbol
+    override val stringBuilder: IrClass
         get() = context.getTopLevelClass(FqName("java.lang.StringBuilder"))
 
-    override val defaultConstructorMarker: IrClassSymbol =
+    override val defaultConstructorMarker: IrClass =
         createClass(FqName("kotlin.jvm.internal.DefaultConstructorMarker"))
 
-    override val copyRangeTo: Map<ClassDescriptor, IrSimpleFunctionSymbol>
+    override val copyRangeTo: Map<ClassDescriptor, IrSimpleFunction>
         get() = error("Unused in JVM IR")
 
-    override val coroutineImpl: IrClassSymbol
+    override val coroutineImpl: IrClass
         get() = TODO("not implemented")
 
-    override val coroutineSuspendedGetter: IrSimpleFunctionSymbol
+    override val coroutineSuspendedGetter: IrSimpleFunction
         get() = TODO("not implemented")
 
-    override val getContinuation: IrSimpleFunctionSymbol
+    override val getContinuation: IrSimpleFunction
         get() = TODO("not implemented")
 
-    override val coroutineContextGetter: IrSimpleFunctionSymbol
+    override val coroutineContextGetter: IrSimpleFunction
         get() = TODO("not implemented")
 
-    override val suspendCoroutineUninterceptedOrReturn: IrSimpleFunctionSymbol
+    override val suspendCoroutineUninterceptedOrReturn: IrSimpleFunction
         get() = TODO("not implemented")
 
-    override val coroutineGetContext: IrSimpleFunctionSymbol
+    override val coroutineGetContext: IrSimpleFunction
         get() = TODO("not implemented")
 
-    override val returnIfSuspended: IrSimpleFunctionSymbol
+    override val returnIfSuspended: IrSimpleFunction
         get() = TODO("not implemented")
 
-    val javaLangClass: IrClassSymbol =
+    val javaLangClass: IrClass =
         if (firMode) createClass(FqName("java.lang.Class")) else context.getTopLevelClass(FqName("java.lang.Class"))
 
-    private val javaLangAssertionError: IrClassSymbol =
+    private val javaLangAssertionError: IrClass =
         if (firMode) createClass(FqName("java.lang.AssertionError")) else context.getTopLevelClass(FqName("java.lang.AssertionError"))
 
-    val assertionErrorConstructor by lazy<IrConstructorSymbol> {
+    val assertionErrorConstructor by lazy<IrConstructor> {
         javaLangAssertionError.constructors.single {
-            it.owner.valueParameters.size == 1 && it.owner.valueParameters[0].type.isNullableAny()
+            it.valueParameters.size == 1 && it.valueParameters[0].type.isNullableAny()
         }
     }
 
-    val continuationClass: IrClassSymbol =
+    val continuationClass: IrClass =
         createClass(DescriptorUtils.CONTINUATION_INTERFACE_FQ_NAME_RELEASE, ClassKind.INTERFACE) { klass ->
             klass.addTypeParameter("T", irBuiltIns.anyNType, Variance.IN_VARIANCE)
         }
 
-    val lambdaClass: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Lambda")) { klass ->
+    val lambdaClass: IrClass = createClass(FqName("kotlin.jvm.internal.Lambda")) { klass ->
         klass.addConstructor().apply {
             addValueParameter("arity", irBuiltIns.intType)
         }
@@ -174,7 +171,7 @@
         klass.addFunction("getOwner", irBuiltIns.kDeclarationContainerClass.typeWith(), Modality.OPEN)
     }
 
-    val functionReference: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.FunctionReference")) { klass ->
+    val functionReference: IrClass = createClass(FqName("kotlin.jvm.internal.FunctionReference")) { klass ->
         klass.addConstructor().apply {
             addValueParameter("arity", irBuiltIns.intType)
         }
@@ -189,12 +186,12 @@
         generateCallableReferenceMethods(klass)
     }
 
-    val functionReferenceReceiverField: IrFieldSymbol = functionReference.fieldByName("receiver")
-    val functionReferenceGetSignature: IrSimpleFunctionSymbol = functionReference.functionByName("getSignature")
-    val functionReferenceGetName: IrSimpleFunctionSymbol = functionReference.functionByName("getName")
-    val functionReferenceGetOwner: IrSimpleFunctionSymbol = functionReference.functionByName("getOwner")
+    val functionReferenceReceiverField: IrField = functionReference.fieldByName("receiver")
+    val functionReferenceGetSignature: IrSimpleFunction = functionReference.functionByName("getSignature")
+    val functionReferenceGetName: IrSimpleFunction = functionReference.functionByName("getName")
+    val functionReferenceGetOwner: IrSimpleFunction = functionReference.functionByName("getOwner")
 
-    fun getFunction(parameterCount: Int): IrClassSymbol =
+    fun getFunction(parameterCount: Int): IrClass =
         symbolTable.referenceClass(builtIns.getFunction(parameterCount))
 
     private val jvmFunctionClasses = storageManager.createMemoizedFunction { n: Int ->
@@ -212,10 +209,10 @@
         }
     }
 
-    fun getJvmFunctionClass(parameterCount: Int): IrClassSymbol =
+    fun getJvmFunctionClass(parameterCount: Int): IrClass =
         jvmFunctionClasses(parameterCount)
 
-    val functionN: IrClassSymbol = createClass(FqName("kotlin.jvm.functions.FunctionN"), ClassKind.INTERFACE) { klass ->
+    val functionN: IrClass = createClass(FqName("kotlin.jvm.functions.FunctionN"), ClassKind.INTERFACE) { klass ->
         val returnType = klass.addTypeParameter("R", irBuiltIns.anyNType, Variance.OUT_VARIANCE)
 
         klass.addFunction("invoke", returnType.defaultType, Modality.ABSTRACT).apply {
@@ -291,10 +288,10 @@
         }
     }
 
-    fun getPropertyReferenceClass(mutable: Boolean, parameterCount: Int, impl: Boolean): IrClassSymbol =
+    fun getPropertyReferenceClass(mutable: Boolean, parameterCount: Int, impl: Boolean): IrClass =
         propertyReferenceClasses(PropertyReferenceKey(mutable, parameterCount, impl))
 
-    val reflection: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Reflection")) { klass ->
+    val reflection: IrClass = createClass(FqName("kotlin.jvm.internal.Reflection")) { klass ->
         // We use raw types for java.lang.Class and kotlin.reflect.KClass here for simplicity and because this is what's used
         // at declaration site at kotlin.jvm.internal.Reflection.
         val rawJavaLangClass = javaLangClass.typeWith()
@@ -323,14 +320,14 @@
         }
     }
 
-    val getOrCreateKotlinPackage: IrSimpleFunctionSymbol =
+    val getOrCreateKotlinPackage: IrSimpleFunction =
         reflection.functionByName("getOrCreateKotlinPackage")
 
-    val desiredAssertionStatus: IrSimpleFunctionSymbol by lazy {
+    val desiredAssertionStatus: IrSimpleFunction by lazy {
         javaLangClass.functionByName("desiredAssertionStatus")
     }
 
-    val unsafeCoerceIntrinsic: IrSimpleFunctionSymbol =
+    val unsafeCoerceIntrinsic: IrSimpleFunction =
         buildFun {
             name = Name.special("<unsafe-coerce>")
             origin = IrDeclarationOrigin.IR_BUILTINS_STUB
@@ -340,9 +337,9 @@
             val dst = addTypeParameter("R", irBuiltIns.anyNType)
             addValueParameter("v", src.defaultType)
             returnType = dst.defaultType
-        }.symbol
+        }
 
-    private val collectionToArrayClass: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.CollectionToArray")) { klass ->
+    private val collectionToArrayClass: IrClass = createClass(FqName("kotlin.jvm.internal.CollectionToArray")) { klass ->
         klass.origin = JvmLoweredDeclarationOrigin.TO_ARRAY
 
         val arrayType = irBuiltIns.arrayClass.typeWith(irBuiltIns.anyNType)
@@ -357,13 +354,13 @@
         }
     }
 
-    val nonGenericToArray: IrSimpleFunctionSymbol =
-        collectionToArrayClass.functions.single { it.owner.name.asString() == "toArray" && it.owner.valueParameters.size == 1 }
+    val nonGenericToArray: IrSimpleFunction =
+        collectionToArrayClass.functions.single { it.name.asString() == "toArray" && it.valueParameters.size == 1 }
 
-    val genericToArray: IrSimpleFunctionSymbol =
-        collectionToArrayClass.functions.single { it.owner.name.asString() == "toArray" && it.owner.valueParameters.size == 2 }
+    val genericToArray: IrSimpleFunction =
+        collectionToArrayClass.functions.single { it.name.asString() == "toArray" && it.valueParameters.size == 2 }
 
-    val kClassJava: IrPropertySymbol =
+    val kClassJava: IrProperty =
         buildProperty {
             name = Name.identifier("java")
         }.apply {
@@ -372,9 +369,9 @@
                 addExtensionReceiver(irBuiltIns.kClassClass.typeWith())
                 returnType = javaLangClass.typeWith()
             }
-        }.symbol
+        }
 
-    val spreadBuilder: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.SpreadBuilder")) { klass ->
+    val spreadBuilder: IrClass = createClass(FqName("kotlin.jvm.internal.SpreadBuilder")) { klass ->
         klass.addConstructor().apply {
             addValueParameter("size", irBuiltIns.intType)
         }
@@ -394,7 +391,7 @@
         }
     }
 
-    val primitiveSpreadBuilders: Map<IrType, IrClassSymbol> = irBuiltIns.primitiveIrTypes.associateWith { irType ->
+    val primitiveSpreadBuilders: Map<IrType, IrClass> = irBuiltIns.primitiveIrTypes.associateWith { irType ->
         val name = irType.classOrNull!!.owner.name
         createClass(FqName("kotlin.jvm.internal.${name}SpreadBuilder")) { klass ->
             klass.addConstructor().apply {
@@ -416,7 +413,7 @@
         }
     }
 
-    private val systemClass: IrClassSymbol = createClass(FqName("java.lang.System")) { klass ->
+    private val systemClass: IrClass = createClass(FqName("java.lang.System")) { klass ->
         klass.addFunction("arraycopy", irBuiltIns.unitType, isStatic = true).apply {
             addValueParameter("src", irBuiltIns.anyNType)
             addValueParameter("srcPos", irBuiltIns.intType)
@@ -426,10 +423,10 @@
         }
     }
 
-    val systemArraycopy: IrSimpleFunctionSymbol = systemClass.functionByName("arraycopy")
+    val systemArraycopy: IrSimpleFunction = systemClass.functionByName("arraycopy")
 }
 
-private fun IrClassSymbol.functionByName(name: String): IrSimpleFunctionSymbol =
-    functions.single { it.owner.name.asString() == name }
-private fun IrClassSymbol.fieldByName(name: String): IrFieldSymbol =
-    fields.single { it.owner.name.asString() == name }
+private fun IrClass.functionByName(name: String): IrSimpleFunction =
+    functions.single { it.name.asString() == name }
+private fun IrClass.fieldByName(name: String): IrField =
+    fields.single { it.name.asString() == name }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt
index ad21874..4d5f6ec 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt
@@ -172,7 +172,7 @@
 
     private fun genAnnotationArguments(annotation: IrConstructorCall, annotationVisitor: AnnotationVisitor) {
         val annotationClass = annotation.annotationClass
-        for (param in annotation.symbol.owner.valueParameters) {
+        for (param in annotation.target.valueParameters) {
             val value = annotation.getValueArgument(param.index)
             if (value == null) {
                 if (param.defaultValue != null) continue // Default value will be supplied by JVM at runtime.
@@ -200,7 +200,7 @@
         when (value) {
             is IrConst<*> -> annotationVisitor.visit(name, value.value)
             is IrConstructorCall -> {
-                val callee = value.symbol.owner
+                val callee = value.target
                 when {
                     callee.parentAsClass.isAnnotationClass -> {
                         val internalAnnName = typeMapper.mapType(callee.returnType).descriptor
@@ -212,8 +212,8 @@
                 }
             }
             is IrGetEnumValue -> {
-                val enumClassInternalName = typeMapper.mapClass(value.symbol.owner.parentAsClass).descriptor
-                val enumEntryName = value.symbol.owner.name
+                val enumClassInternalName = typeMapper.mapClass(value.target.parentAsClass).descriptor
+                val enumEntryName = value.target.name
                 annotationVisitor.visitEnum(name, enumClassInternalName, enumEntryName.asString())
             }
             is IrVararg -> { // array constructor
@@ -270,7 +270,7 @@
         fun IrConstructorCall.applicableTargetSet() =
             annotationClass.applicableTargetSet() ?: KotlinTarget.DEFAULT_TARGET_SET
 
-        val IrConstructorCall.annotationClass get() = symbol.owner.parentAsClass
+        val IrConstructorCall.annotationClass get() = target.parentAsClass
     }
 }
 
@@ -288,13 +288,13 @@
     val retentionArgument =
         getAnnotation(KotlinBuiltIns.FQ_NAMES.retention)?.getValueArgument(RETENTION_PARAMETER_NAME)
                 as? IrGetEnumValue?: return null
-    val retentionArgumentValue = retentionArgument.symbol.owner
+    val retentionArgumentValue = retentionArgument.target
     return KotlinRetention.valueOf(retentionArgumentValue.name.asString())
 }
 
 // To be generalized to IrMemberAccessExpression as soon as properties get symbols.
 private fun IrConstructorCall.getValueArgument(name: Name): IrExpression? {
-    val index = symbol.owner.valueParameters.find { it.name == name }?.index ?: return null
+    val index = target.valueParameters.find { it.name == name }?.index ?: return null
     return getValueArgument(index)
 }
 
@@ -311,6 +311,6 @@
     val valueArgument = targetEntry.getValueArgument(TARGET_ALLOWED_TARGETS)
             as? IrVararg ?: return null
     return valueArgument.elements.filterIsInstance<IrGetEnumValue>().mapNotNull {
-        KotlinTarget.valueOrNull(it.symbol.owner.name.asString())
+        KotlinTarget.valueOrNull(it.target.name.asString())
     }.toSet()
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt
index 6f4895b..9468663 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt
@@ -338,7 +338,7 @@
             // TODO: Since the class could have been reparented in lowerings, this could
             // be a class instead of the actual function that the class is nested inside
             // in the source.
-            val containingDeclaration = irClass.symbol.owner.parent
+            val containingDeclaration = irClass.parent
             if (containingDeclaration is IrFunction) {
                 val method = methodSignatureMapper.mapAsmMethod(containingDeclaration)
                 visitor.visitOuterClass(outerClassName, method.name, method.descriptor)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt
index 39a94bd..33e1eb6 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt
@@ -146,8 +146,8 @@
         it.body = body?.deepCopyWithSymbols(this)
         it.body?.transformChildrenVoid(object : IrElementTransformerVoid() {
             override fun visitGetValue(expression: IrGetValue): IrGetValue =
-                valueParametersMapping[expression.symbol.owner]?.let { newParam ->
-                    expression.run { IrGetValueImpl(startOffset, endOffset, type, newParam.symbol, origin) }
+                valueParametersMapping[expression.target]?.let { newParam ->
+                    expression.run { IrGetValueImpl(startOffset, endOffset, type, newParam, origin) }
                 } ?: expression
 
             override fun visitCall(expression: IrCall): IrExpression {
@@ -164,9 +164,9 @@
     callerIsInlineLambda: Boolean
 ): IrCall {
     if (!isSuspend) return this
-    val view = (symbol.owner as IrSimpleFunction).getOrCreateSuspendFunctionViewIfNeeded(context)
-    if (view == symbol.owner) return this
-    return IrCallImpl(startOffset, endOffset, view.returnType, view.symbol).also {
+    val view = (target as IrSimpleFunction).getOrCreateSuspendFunctionViewIfNeeded(context)
+    if (view == target) return this
+    return IrCallImpl(startOffset, endOffset, view.returnType, view).also {
         it.copyTypeArgumentsFrom(this)
         it.dispatchReceiver = dispatchReceiver
         it.extensionReceiver = extensionReceiver
@@ -176,9 +176,9 @@
         val continuationParameter =
             when {
                 caller.isInvokeSuspendOfLambda(context) || caller.isInvokeSuspendOfContinuation(context) ->
-                    IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, caller.dispatchReceiverParameter!!.symbol)
+                    IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, caller.dispatchReceiverParameter!!)
                 callerIsInlineLambda -> context.fakeContinuation
-                else -> IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, caller.valueParameters.last().symbol)
+                else -> IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, caller.valueParameters.last())
             }
         it.putValueArgument(valueArgumentsCount, continuationParameter)
     }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
index acddc15..0484052 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt
@@ -34,7 +34,6 @@
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
@@ -213,7 +212,7 @@
     private fun generateNonNullAssertion(param: IrValueParameter) {
         val asmType = param.type.asmType
         if (!param.type.unboxInlineClass().isNullable() && !isPrimitive(asmType)) {
-            mv.load(findLocalIndex(param.symbol), asmType)
+            mv.load(findLocalIndex(param), asmType)
             mv.aconst(param.name.asString())
             val methodName =
                 if (state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4) "checkNotNullParameter"
@@ -255,7 +254,7 @@
         val type = typeMapper.mapType(param)
         // NOTE: we expect all value parameters to be present in the frame.
         mv.visitLocalVariable(
-            name, type.descriptor, null, startLabel, endLabel, findLocalIndex(param.symbol)
+            name, type.descriptor, null, startLabel, endLabel, findLocalIndex(param)
         )
     }
 
@@ -286,7 +285,7 @@
         }
 
         info.variables.reversed().forEach {
-            frameMap.leave(it.declaration.symbol)
+            frameMap.leave(it.declaration)
         }
     }
 
@@ -307,17 +306,17 @@
     }
 
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: BlockInfo): PromisedValue {
-        classCodegen.context.irIntrinsics.getIntrinsic(expression.symbol)
+        classCodegen.context.irIntrinsics.getIntrinsic(expression.target)
             ?.invoke(expression, this, data)?.let { return it.coerce(expression.type) }
 
         val callable = methodSignatureMapper.mapToCallableMethod(expression)
-        val callee = expression.symbol.owner
+        val callee = expression.target
         val callGenerator = getOrCreateCallGenerator(expression, data, callable.signature)
         val asmType = if (expression is IrConstructorCall) typeMapper.mapTypeAsDeclaration(expression.type) else expression.asmType
 
         when {
             expression is IrConstructorCall -> {
-                closureReifiedMarkers[expression.symbol.owner.parentAsClass]?.let {
+                closureReifiedMarkers[expression.target.parentAsClass]?.let {
                     if (it.wereUsedReifiedParameters()) {
                         putNeedClassReificationMarker(v)
                         propagateChildReifiedTypeParametersUsages(it)
@@ -335,7 +334,7 @@
 
                 for (argumentIndex in 0 until expression.typeArgumentsCount) {
                     val classifier = expression.getTypeArgument(argumentIndex)?.classifierOrNull
-                    if (classifier is IrTypeParameterSymbol && classifier.owner.isReified) {
+                    if (classifier is IrTypeParameter && classifier.isReified) {
                         consumeReifiedOperationMarker(classifier)
                     }
                 }
@@ -358,7 +357,7 @@
         }
 
         callGenerator.beforeValueParametersStart()
-        expression.symbol.owner.valueParameters.forEachIndexed { i, irParameter ->
+        expression.target.valueParameters.forEachIndexed { i, irParameter ->
             val arg = expression.getValueArgument(i)
             val parameterType = callable.valueParameterTypes[i]
             require(arg != null) { "Null argument in ExpressionCodegen for parameter ${irParameter.render()}" }
@@ -400,7 +399,7 @@
 
     override fun visitVariable(declaration: IrVariable, data: BlockInfo): PromisedValue {
         val varType = typeMapper.mapType(declaration)
-        val index = frameMap.enter(declaration.symbol, varType)
+        val index = frameMap.enter(declaration, varType)
 
         declaration.markLineNumber(startOffset = true)
 
@@ -417,15 +416,15 @@
     override fun visitGetValue(expression: IrGetValue, data: BlockInfo): PromisedValue {
         // Do not generate line number information for loads from compiler-generated
         // temporary variables. They do not correspond to variable loads in user code.
-        if (expression.symbol.owner.origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE)
+        if (expression.target.origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE)
             expression.markLineNumber(startOffset = true)
-        val type = frameMap.typeOf(expression.symbol)
-        mv.load(findLocalIndex(expression.symbol), type)
+        val type = frameMap.typeOf(expression.target)
+        mv.load(findLocalIndex(expression.target), type)
         return MaterialValue(this, type, expression.type)
     }
 
     override fun visitFieldAccess(expression: IrFieldAccessExpression, data: BlockInfo): PromisedValue {
-        val callee = expression.symbol.owner
+        val callee = expression.target
         callee.constantValue()?.let {
             // Handling const reads before codegen is important for constant folding.
             assert(expression is IrSetField) { "read of const val ${callee.name} not inlined by ConstLowering" }
@@ -466,7 +465,7 @@
         // i.e., not in an initializer block or constructor body.
         val isFieldInitializer = expression.origin == null
         val skip = (inPrimaryConstructor || inClassInit) && isFieldInitializer && expressionValue is IrConst<*> &&
-                isDefaultValueForType(expression.symbol.owner.type.asmType, expressionValue.value)
+                isDefaultValueForType(expression.target.type.asmType, expressionValue.value)
         return if (skip) defaultValue(expression.type) else super.visitSetField(expression, data)
     }
 
@@ -485,19 +484,19 @@
             else -> !isPrimitive(type) && value == null
         }
 
-    private fun findLocalIndex(irSymbol: IrSymbol): Int {
-        val index = frameMap.getIndex(irSymbol)
+    private fun findLocalIndex(declaration: IrSymbolOwner): Int {
+        val index = frameMap.getIndex(declaration)
         if (index >= 0)
             return index
-        val dump = if (irSymbol.isBound) irSymbol.owner.dump() else irSymbol.descriptor.toString()
+        val dump = if (declaration.symbol.isBound) declaration.dump() else declaration.symbol.descriptor.toString()
         throw AssertionError("Non-mapped local declaration: $dump\n in ${irFunction.dump()}")
     }
 
     override fun visitSetVariable(expression: IrSetVariable, data: BlockInfo): PromisedValue {
         expression.markLineNumber(startOffset = true)
         expression.value.markLineNumber(startOffset = true)
-        expression.value.accept(this, data).coerce(expression.symbol.owner.type).materialize()
-        mv.store(findLocalIndex(expression.symbol), expression.symbol.owner.asmType)
+        expression.value.accept(this, data).coerce(expression.target.type).materialize()
+        mv.store(findLocalIndex(expression.target), expression.target.asmType)
         return defaultValue(expression.type)
     }
 
@@ -536,10 +535,10 @@
     }
 
     override fun visitReturn(expression: IrReturn, data: BlockInfo): PromisedValue {
-        val returnTarget = expression.returnTargetSymbol.owner
+        val returnTarget = expression.irReturnTarget
         val owner =
             (returnTarget as? IrFunction
-                ?: (returnTarget as? IrReturnableBlock)?.inlineFunctionSymbol?.owner
+                ?: (returnTarget as? IrReturnableBlock)?.inlineFunction
                 ?: error("Unsupported IrReturnTarget: $returnTarget")).getOrCreateSuspendFunctionViewIfNeeded(context)
         //TODO: should be owner != irFunction
         val isNonLocalReturn =
@@ -946,13 +945,13 @@
     private fun getOrCreateCallGenerator(
         element: IrFunctionAccessExpression, data: BlockInfo, signature: JvmMethodSignature
     ): IrCallGenerator {
-        if (!element.symbol.owner.isInlineFunctionCall(context) ||
+        if (!element.target.isInlineFunctionCall(context) ||
             classCodegen.irClass.fileParent.fileEntry is MultifileFacadeFileEntry
         ) {
             return IrCallGenerator.DefaultCallGenerator
         }
 
-        val callee = element.symbol.owner
+        val callee = element.target
         val typeArgumentContainer = if (callee is IrConstructor) callee.parentAsClass else callee
         val typeArguments =
             if (element.typeArgumentsCount == 0) {
@@ -998,9 +997,9 @@
     }
 
     override fun consumeReifiedOperationMarker(typeParameter: TypeParameterMarker) {
-        require(typeParameter is IrTypeParameterSymbol)
-        if (typeParameter.owner.parent != irFunction) {
-            classCodegen.reifiedTypeParametersUsages.addUsedReifiedParameter(typeParameter.owner.name.asString())
+        require(typeParameter is IrTypeParameter)
+        if (typeParameter.parent != irFunction) {
+            classCodegen.reifiedTypeParametersUsages.addUsedReifiedParameter(typeParameter.name.asString())
         }
     }
 
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt
index d3a47c5..122db46 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt
@@ -78,8 +78,8 @@
         } else {
             val frameMap = createFrameMapWithReceivers(signature)
             val irClass = context.suspendFunctionContinuations[irFunction]
-            val element = (irFunction.symbol.descriptor.psiElement
-                ?: context.suspendLambdaToOriginalFunctionMap[irFunction.parent]?.symbol?.descriptor?.psiElement) as? KtElement
+            val element = (irFunction.descriptor.psiElement
+                ?: context.suspendLambdaToOriginalFunctionMap[irFunction.parent]?.descriptor?.psiElement) as? KtElement
             val continuationClassBuilder = context.continuationClassBuilders[irClass]
             methodVisitor = when {
                 irFunction.isSuspend &&
@@ -179,7 +179,7 @@
             ?.backingField
             ?.initializer.safeAs<IrExpressionBody>()
             ?.expression?.safeAs<IrGetValue>()
-            ?.symbol?.owner?.safeAs<IrValueParameter>()
+            ?.target?.safeAs<IrValueParameter>()
             ?.defaultValue?.safeAs<IrExpressionBody>()
             ?.expression
     }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt
index e07aa6e..5d3e9bf3 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt
@@ -112,7 +112,7 @@
         // TODO port inlining cycle detection to IrFunctionAccessExpression & pass it
         state.globalInlineContext.enterIntoInlining(null)
         try {
-            performInline(expression.symbol.owner.typeParameters.map { it.symbol }, false, codegen.typeMapper.typeSystem, codegen)
+            performInline(expression.target.typeParameters, false, codegen.typeMapper.typeSystem, codegen)
         } finally {
             state.globalInlineContext.exitFromInliningOf(null)
         }
@@ -124,7 +124,7 @@
         parameter: IrValueParameter,
         boundReceiver: IrVariable?
     ): LambdaInfo {
-        val referencedFunction = irReference.symbol.owner
+        val referencedFunction = irReference.target
         return IrExpressionLambdaImpl(
             irReference, referencedFunction, codegen.typeMapper, codegen.methodSignatureMapper, codegen.context, parameter.isCrossinline,
             boundReceiver != null, parameter.type.isExtensionFunctionType
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt
index 0312b3c..ddd85f2 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt
@@ -102,7 +102,7 @@
     }
 
     private fun getFunctionToInline(call: IrCall, jvmSignature: JvmMethodSignature, callDefault: Boolean): IrFunction {
-        val callee = call.symbol.owner
+        val callee = call.target
         val parent = callee.parentAsClass
         if (callDefault) {
             /*TODO: get rid of hack*/
@@ -115,8 +115,8 @@
         }
 
         if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) {
-            return (codegen.context.multifileFacadeMemberToPartMember[callee.symbol]
-                ?: error("Function from a multi-file facade without the link to the function in the part: ${callee.render()}")).owner
+            return (codegen.context.multifileFacadeMemberToPartMember[callee]
+                ?: error("Function from a multi-file facade without the link to the function in the part: ${callee.render()}"))
         }
 
         return callee
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt
index bdc69c3..666bbf5 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt
@@ -19,7 +19,6 @@
 import org.jetbrains.kotlin.ir.declarations.IrClass
 import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
 import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
-import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
 import org.jetbrains.kotlin.ir.util.defaultType
@@ -39,9 +38,9 @@
     override fun mapClass(classifier: ClassifierDescriptor): Type =
         when (classifier) {
             is ClassDescriptor ->
-                mapClass(context.referenceClass(classifier).owner)
+                mapClass(context.referenceClass(classifier))
             is TypeParameterDescriptor ->
-                mapType(context.referenceTypeParameter(classifier).owner.defaultType)
+                mapType(context.referenceTypeParameter(classifier).defaultType)
             else ->
                 error("Unknown descriptor: $classifier")
         }
@@ -54,7 +53,7 @@
         if (sw.skipGenericSignature()) return
         with(KotlinTypeMapper) {
             for (typeParameter in irParameters) {
-                typeSystem.writeFormalTypeParameter(typeParameter.symbol, sw) { type, mode ->
+                typeSystem.writeFormalTypeParameter(typeParameter, sw) { type, mode ->
                     mapType(type as IrType, mode, sw)
                 }
             }
@@ -243,7 +242,7 @@
     private fun writeGenericArguments(
         sw: JvmSignatureWriter,
         arguments: List<IrTypeArgument>,
-        parameters: List<IrTypeParameterSymbol>,
+        parameters: List<IrTypeParameter>,
         mode: TypeMappingMode
     ) = with(KotlinTypeMapper) {
         typeSystem.writeGenericArguments(sw, arguments, parameters, mode) { type, sw, mode ->
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt
index 6dcb259..39d38d5 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt
@@ -292,7 +292,7 @@
         }
 
     fun mapToCallableMethod(expression: IrFunctionAccessExpression): IrCallableMethod {
-        val callee = expression.symbol.owner.getOrCreateSuspendFunctionViewIfNeeded(context)
+        val callee = expression.target.getOrCreateSuspendFunctionViewIfNeeded(context)
         val calleeParent = callee.parent
         if (calleeParent !is IrClass) {
             // Non-class parent is only possible for intrinsics created in IrBuiltIns, such as dataClassArrayMemberHashCode. In that case,
@@ -331,7 +331,7 @@
     private fun mapOverriddenSpecialBuiltinIfNeeded(callee: IrFunction, superCall: Boolean): JvmMethodSignature? {
         val overriddenSpecialBuiltinFunction = callee.descriptor.original.getOverriddenBuiltinReflectingJvmDescriptor()
         if (overriddenSpecialBuiltinFunction != null && !superCall) {
-            return mapSignatureSkipGeneric(context.referenceFunction(overriddenSpecialBuiltinFunction.original).owner)
+            return mapSignatureSkipGeneric(context.referenceFunction(overriddenSpecialBuiltinFunction.original))
         }
 
         return null
@@ -342,7 +342,7 @@
         var current = function
         while (current.isFakeOverride) {
             // TODO: probably isJvmInterface instead of isInterface, here and in KotlinTypeMapper
-            val classCallable = current.overriddenSymbols.firstOrNull { !it.owner.parentAsClass.isInterface }?.owner
+            val classCallable = current.overridden.firstOrNull { !it.parentAsClass.isInterface }
             if (classCallable != null) {
                 current = classCallable
                 continue
@@ -351,7 +351,7 @@
                 return current
             }
 
-            current = current.overriddenSymbols.firstOrNull()?.owner
+            current = current.overridden.firstOrNull()
                 ?: error("Fake override should have at least one overridden descriptor: ${current.render()}")
         }
         return current
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/SwitchGenerator.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/SwitchGenerator.kt
index 849c529..10e6321 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/SwitchGenerator.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/SwitchGenerator.kt
@@ -80,12 +80,12 @@
 
     private fun areConstComparisons(conditions: List<IrCall>): Boolean {
         // All branches must be CALL 'EQEQ(Any?, Any?)': Boolean
-        if (conditions.any { it.symbol != codegen.classCodegen.context.irBuiltIns.eqeqSymbol })
+        if (conditions.any { it.target != codegen.classCodegen.context.irBuiltIns.eqeqSymbol.owner })
             return false
 
         // All LHS refer to the same tmp variable.
         val lhs = conditions.map { it.getValueArgument(0) as? IrGetValue }
-        if (lhs.any { it == null || it.symbol != lhs[0]!!.symbol })
+        if (lhs.any { it == null || it.target != lhs[0]!!.target })
             return false
 
         // All RHS are constants
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt
index 9c72f2e..92d8a4d 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt
@@ -26,8 +26,6 @@
 import org.jetbrains.kotlin.descriptors.Visibilities
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.IrGetEnumValue
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrSimpleType
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.util.*
@@ -48,31 +46,31 @@
 import org.jetbrains.org.objectweb.asm.Opcodes
 import org.jetbrains.org.objectweb.asm.Type
 
-class IrFrameMap : FrameMapBase<IrSymbol>() {
-    private val typeMap = mutableMapOf<IrSymbol, Type>()
+class IrFrameMap : FrameMapBase<IrSymbolOwner>() {
+    private val typeMap = mutableMapOf<IrSymbolOwner, Type>()
 
-    override fun enter(descriptor: IrSymbol, type: Type): Int {
+    override fun enter(descriptor: IrSymbolOwner, type: Type): Int {
         typeMap[descriptor] = type
         return super.enter(descriptor, type)
     }
 
-    override fun leave(descriptor: IrSymbol): Int {
+    override fun leave(descriptor: IrSymbolOwner): Int {
         typeMap.remove(descriptor)
         return super.leave(descriptor)
     }
 
-    fun typeOf(descriptor: IrSymbol): Type = typeMap.getValue(descriptor)
+    fun typeOf(descriptor: IrSymbolOwner): Type = typeMap.getValue(descriptor)
 }
 
 internal val IrFunction.isStatic
     get() = (this.dispatchReceiverParameter == null && this !is IrConstructor)
 
 fun IrFrameMap.enter(irDeclaration: IrSymbolOwner, type: Type): Int {
-    return enter(irDeclaration.symbol, type)
+    return enter(irDeclaration, type)
 }
 
 fun IrFrameMap.leave(irDeclaration: IrSymbolOwner): Int {
-    return leave(irDeclaration.symbol)
+    return leave(irDeclaration)
 }
 
 val IrClass.isJvmInterface get() = isAnnotationClass || isInterface
@@ -375,7 +373,7 @@
     val kotlinMarkerInterfaces = LinkedHashSet<String>()
 
     for (superType in irClass.superTypes) {
-        val superClass = superType.safeAs<IrSimpleType>()?.classifier?.safeAs<IrClassSymbol>()?.owner ?: continue
+        val superClass = superType.safeAs<IrSimpleType>()?.classifier?.safeAs<IrClass>() ?: continue
         if (superClass.isJvmInterface) {
             val kotlinInterfaceName = superClass.fqNameWhenAvailable!!
 
@@ -548,7 +546,7 @@
 val IrAnnotationContainer.deprecationFlags: Int
     get() {
         val annotation = annotations.findAnnotation(FQ_NAMES.deprecated) ?: return 0
-        val isHidden = (annotation.getValueArgument(2) as? IrGetEnumValue)?.symbol?.owner
+        val isHidden = (annotation.getValueArgument(2) as? IrGetEnumValue)?.target
             ?.name?.asString() == DeprecationLevel.HIDDEN.name
         return Opcodes.ACC_DEPRECATED or if (isHidden) Opcodes.ACC_SYNTHETIC else 0
     }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt
index 3f499ea..5f81b0e 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt
@@ -25,8 +25,6 @@
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrExternalPackageFragmentSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
@@ -162,8 +160,8 @@
         else
             objectRefProvider
 
-    private fun getElementFieldSymbol(valueType: IrType): IrFieldSymbol {
-        return getProvider(valueType).elementField.symbol
+    private fun getElementField(valueType: IrType): IrField {
+        return getProvider(valueType).elementField
     }
 
     override fun declareSharedVariable(originalDeclaration: IrVariable): IrVariable {
@@ -174,7 +172,7 @@
 
         val refConstructorCall = IrConstructorCallImpl.fromSymbolOwner(
             refType,
-            refConstructor.symbol,
+            refConstructor,
             SHARED_VARIABLE_CONSTRUCTOR_CALL_ORIGIN
         ).apply {
             List(refConstructor.parentAsClass.typeParameters.size) { i ->
@@ -207,8 +205,8 @@
 
         val sharedVariableInitialization = IrSetFieldImpl(
             initializer.startOffset, initializer.endOffset,
-            getElementFieldSymbol(valueType),
-            IrGetValueImpl(initializer.startOffset, initializer.endOffset, sharedVariableDeclaration.symbol),
+            getElementField(valueType),
+            IrGetValueImpl(initializer.startOffset, initializer.endOffset, sharedVariableDeclaration),
             initializer,
             valueType
         )
@@ -219,7 +217,7 @@
         )
     }
 
-    override fun getSharedValue(sharedVariableSymbol: IrVariableSymbol, originalGet: IrGetValue): IrExpression =
+    override fun getSharedValue(sharedVariable: IrVariable, originalGet: IrGetValue): IrExpression =
         IrTypeOperatorCallImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
             originalGet.type,
@@ -227,18 +225,18 @@
             originalGet.type,
             IrGetFieldImpl(
                 originalGet.startOffset, originalGet.endOffset,
-                getElementFieldSymbol(originalGet.symbol.owner.type),
+                getElementField(originalGet.target.type),
                 originalGet.type,
-                IrGetValueImpl(originalGet.startOffset, originalGet.endOffset, sharedVariableSymbol),
+                IrGetValueImpl(originalGet.startOffset, originalGet.endOffset, sharedVariable),
                 originalGet.origin
             )
         )
 
-    override fun setSharedValue(sharedVariableSymbol: IrVariableSymbol, originalSet: IrSetVariable): IrExpression =
+    override fun setSharedValue(sharedVariable: IrVariable, originalSet: IrSetVariable): IrExpression =
         IrSetFieldImpl(
             originalSet.startOffset, originalSet.endOffset,
-            getElementFieldSymbol(originalSet.symbol.owner.type),
-            IrGetValueImpl(originalSet.startOffset, originalSet.endOffset, sharedVariableSymbol),
+            getElementField(originalSet.target.type),
+            IrGetValueImpl(originalSet.startOffset, originalSet.endOffset, sharedVariable),
             originalSet.value,
             originalSet.type,
             originalSet.origin
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt
index 3ea8e81..f070705 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/ArrayIterator.kt
@@ -29,7 +29,7 @@
         signature: JvmMethodSignature,
         context: JvmBackendContext
     ): IrIntrinsicFunction {
-        val owner = context.typeMapper.mapClass(expression.symbol.owner.parentAsClass)
+        val owner = context.typeMapper.mapClass(expression.target.parentAsClass)
         return IrIntrinsicFunction.create(expression, signature, context, owner) {
             val methodSignature = "(${owner.descriptor})${signature.returnType.descriptor}"
             val intrinsicOwner =
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt
index f3a7cb0..168abb3 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/BinaryOp.kt
@@ -38,7 +38,7 @@
     ): IrIntrinsicFunction {
         val returnType = signature.returnType
         val intermediateResultType = numberFunctionOperandType(returnType)
-        val argTypes = if (!expression.symbol.owner.parentAsClass.defaultType.isChar()) {
+        val argTypes = if (!expression.target.parentAsClass.defaultType.isChar()) {
             listOf(intermediateResultType, if (shift()) Type.INT_TYPE else intermediateResultType)
         } else {
             listOf(Type.CHAR_TYPE, signature.valueParameters[0].asmType)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt
index 6321074..a3dea80 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IntrinsicMethod.kt
@@ -25,7 +25,7 @@
 
     open fun invoke(expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, data: BlockInfo): PromisedValue? =
         with(codegen) {
-            val descriptor = methodSignatureMapper.mapSignatureSkipGeneric(expression.symbol.owner)
+            val descriptor = methodSignatureMapper.mapSignatureSkipGeneric(expression.target)
             val stackValue = toCallable(expression, descriptor, context).invoke(mv, codegen, data)
             return object : PromisedValue(this, stackValue.type, expression.type) {
                 override fun materialize() = stackValue.put(mv)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt
index 6648cad..2f5c86d 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicFunction.kt
@@ -74,7 +74,7 @@
         var offset = 0
         expression.dispatchReceiver?.let { genArg(it, codegen, offset++, data) }
         expression.extensionReceiver?.let { genArg(it, codegen, offset++, data) }
-        for ((i, valueParameter) in expression.symbol.owner.valueParameters.withIndex()) {
+        for ((i, valueParameter) in expression.target.valueParameters.withIndex()) {
             val argument = expression.getValueArgument(i)
             when {
                 argument != null ->
@@ -82,7 +82,7 @@
                 valueParameter.isVararg -> {
                     // TODO: is there an easier way to get the substituted type of an empty vararg argument?
                     val arrayType = codegen.typeMapper.mapType(
-                        valueParameter.type.substitute(expression.symbol.owner.typeParameters, expression.typeArguments)
+                        valueParameter.type.substitute(expression.target.typeParameters, expression.typeArguments)
                     )
                     StackValue.operation(arrayType) {
                         it.aconst(0)
@@ -140,11 +140,10 @@
 }
 
 fun IrFunctionAccessExpression.argTypes(context: JvmBackendContext): ArrayList<Type> {
-    val callee = symbol.owner
-    val signature = context.methodSignatureMapper.mapSignatureSkipGeneric(callee)
+    val signature = context.methodSignatureMapper.mapSignatureSkipGeneric(target)
     return arrayListOf<Type>().apply {
         if (dispatchReceiver != null) {
-            add(context.typeMapper.mapClass(callee.parentAsClass))
+            add(context.typeMapper.mapClass(target.parentAsClass))
         }
         addAll(signature.asmMethod.argumentTypes)
     }
@@ -152,5 +151,5 @@
 
 fun IrFunctionAccessExpression.receiverAndArgs(): List<IrExpression> {
     return (arrayListOf(this.dispatchReceiver, this.extensionReceiver) +
-            symbol.owner.valueParameters.mapIndexed { i, _ -> getValueArgument(i) }).filterNotNull()
+            target.valueParameters.mapIndexed { i, _ -> getValueArgument(i) }).filterNotNull()
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
index 52df309..f2debf1 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
@@ -21,10 +21,6 @@
 import org.jetbrains.kotlin.builtins.PrimitiveType
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.types.classOrNull
 import org.jetbrains.kotlin.ir.types.classifierOrNull
 import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
@@ -138,7 +134,7 @@
     private val PrimitiveType.symbol
         get() = irBuiltIns.primitiveTypeToIrType[this]!!.classOrNull!!
 
-    fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? = intrinsicsMap[symbol.toKey()]
+    fun getIntrinsic(target: IrFunction): IntrinsicMethod? = intrinsicsMap[target.toKey()]
 
     private fun unaryFunForPrimitives(name: String, intrinsic: IntrinsicMethod): List<Pair<Key, IntrinsicMethod>> =
         PrimitiveType.values().map { type ->
@@ -154,12 +150,12 @@
     private fun binaryFunForPrimitives(
         name: String,
         intrinsic: IntrinsicMethod,
-        parameter: IrClassifierSymbol
+        parameter: IrClassifier
     ): List<Pair<Key, IntrinsicMethod>> =
         PrimitiveType.values().map { type ->
             createKeyMapping(
                 intrinsic,
-                type.symbol,
+                type.symbol.owner,
                 name,
                 parameter
             )
@@ -175,12 +171,12 @@
     private fun arrayMethods(): List<Pair<Key, IntrinsicMethod>> =
         symbols.primitiveArrays.flatMap { (key, value) ->
             arrayMethods(
-                key.symbol,
+                key.symbol.owner,
                 value
             )
         } + arrayMethods(symbols.array.owner.typeParameters.single().symbol, symbols.array)
 
-    private fun arrayMethods(elementClass: IrClassifierSymbol, arrayClass: IrClassSymbol) =
+    private fun arrayMethods(elementClass: IrClassifier, arrayClass: IrClass) =
         listOf(
             createKeyMapping(ArraySize, arrayClass, "<get-size>"),
             createKeyMapping(NewArray, arrayClass, "<init>", irBuiltIns.intClass),
@@ -200,8 +196,8 @@
         private val DEC = Increment(-1)
         private val EQUALS = Equals(KtTokens.EQEQ)
 
-        private fun IrFunctionSymbol.toKey(): Key? {
-            val parent = owner.parent
+        private fun IrFunction.toKey(): Key? {
+            val parent = this.parent
             val ownerFqName = when {
                 parent is IrClass && parent.origin == IrDeclarationOrigin.FILE_CLASS ->
                     (parent.parent as IrPackageFragment).fqName
@@ -211,17 +207,17 @@
             }
             return Key(
                 ownerFqName,
-                getParameterFqName(owner.extensionReceiverParameter),
-                owner.name.asString(),
-                owner.valueParameters.map(::getParameterFqName)
+                getParameterFqName(extensionReceiverParameter),
+                name.asString(),
+                valueParameters.map(::getParameterFqName)
             )
         }
 
         private fun getParameterFqName(parameter: IrValueParameter?): FqName? =
             getParameterFqName(parameter?.type?.classifierOrNull)
 
-        private fun getParameterFqName(parameter: IrClassifierSymbol?): FqName? =
-            parameter?.owner?.let {
+        private fun getParameterFqName(parameter: IrClassifier?): FqName? =
+            parameter?.let {
                 when (it) {
                     is IrClass -> it.fqNameWhenAvailable
                     is IrTypeParameter -> FqName(it.name.asString())
@@ -231,26 +227,26 @@
 
         private fun createKeyMapping(
             intrinsic: IntrinsicMethod,
-            klass: IrClassSymbol,
+            klass: IrClass,
             name: String,
-            vararg args: IrClassifierSymbol
+            vararg args: IrClassifier
         ): Pair<Key, IntrinsicMethod> =
-            Key(klass.owner.fqNameWhenAvailable!!, null, name, args.map {
+            Key(klass.fqNameWhenAvailable!!, null, name, args.map {
                 getParameterFqName(it)
             }) to intrinsic
 
-        private fun numberConversionMethods(numberClass: IrClassSymbol) =
+        private fun numberConversionMethods(numberClass: IrClass) =
             OperatorConventions.NUMBER_CONVERSIONS.map { method ->
                 createKeyMapping(NumberCast, numberClass, method.asString())
             }
 
 
         private fun primitiveComparisonIntrinsics(
-            typeToIrFun: Map<SimpleType, IrSimpleFunctionSymbol>,
+            typeToIrFun: Map<SimpleType, IrSimpleFunction>,
             operator: KtSingleValueToken
         ): List<Pair<Key, PrimitiveComparison>> =
-            typeToIrFun.map { (type, irFunSymbol) ->
-                irFunSymbol.toKey()!! to PrimitiveComparison(type, operator)
+            typeToIrFun.map { (type, irFun) ->
+                irFun.toKey()!! to PrimitiveComparison(type, operator)
             }
     }
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrArrayBuilder.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrArrayBuilder.kt
index 9d46bae..c82d777 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrArrayBuilder.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrArrayBuilder.kt
@@ -65,7 +65,7 @@
         val arrayConstructor = if (unwrappedArrayType.isBoxedArray)
             builder.irSymbols.arrayOfNulls
         else
-            unwrappedArrayType.classOrNull!!.constructors.single { it.owner.valueParameters.size == 1 }
+            unwrappedArrayType.classOrNull!!.constructors.single { it.valueParameters.size == 1 }
 
         return builder.irCall(arrayConstructor, unwrappedArrayType).apply {
             if (typeArgumentsCount != 0)
@@ -80,7 +80,7 @@
             val result = irTemporary(newArray(elements.size))
 
             val set = unwrappedArrayType.classOrNull!!.functions.single {
-                it.owner.name.asString() == "set"
+                it.name.asString() == "set"
             }
 
             for ((index, element) in elements.withIndex()) {
@@ -97,11 +97,11 @@
     // Copy a single spread expression, unless it refers to a newly constructed array.
     private fun copyArray(spread: IrExpression): IrExpression {
         if (spread is IrConstructorCall ||
-            (spread is IrFunctionAccessExpression && spread.symbol == builder.irSymbols.arrayOfNulls))
+            (spread is IrFunctionAccessExpression && spread.target == builder.irSymbols.arrayOfNulls))
             return spread
 
         return builder.irBlock {
-            val spreadVar = if (spread is IrGetValue) spread.symbol.owner else irTemporary(spread)
+            val spreadVar = if (spread is IrGetValue) spread.target else irTemporary(spread)
             val size = unwrappedArrayType.classOrNull!!.getPropertyGetter("size")!!
             fun getSize() = irCall(size).apply { dispatchReceiver = irGet(spreadVar) }
             val result = irTemporary(newArray(getSize()))
@@ -123,9 +123,9 @@
         else
             builder.irSymbols.primitiveSpreadBuilders.getValue(elementType)
 
-        val addElement = spreadBuilder.functions.single { it.owner.name.asString() == "add" }
-        val addSpread = spreadBuilder.functions.single { it.owner.name.asString() == "addSpread" }
-        val toArray = spreadBuilder.functions.single { it.owner.name.asString() == "toArray" }
+        val addElement = spreadBuilder.functions.single { it.name.asString() == "add" }
+        val addSpread = spreadBuilder.functions.single { it.name.asString() == "addSpread" }
+        val toArray = spreadBuilder.functions.single { it.name.asString() == "toArray" }
 
         return builder.irBlock {
             val spreadBuilderVar = irTemporary(irCallConstructor(spreadBuilder.constructors.single(), listOf()).apply {
@@ -142,7 +142,7 @@
             val toArrayCall = irCall(toArray).apply {
                 dispatchReceiver = irGet(spreadBuilderVar)
                 if (unwrappedArrayType.isBoxedArray) {
-                    val size = spreadBuilder.functions.single { it.owner.name.asString() == "size" }
+                    val size = spreadBuilder.functions.single { it.name.asString() == "size" }
                     putValueArgument(0, irCall(builder.irSymbols.arrayOfNulls, arrayType).apply {
                         putTypeArgument(0, elementType)
                         putValueArgument(0, irCall(size).apply {
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt
index c60a9c8b..35a5eb9 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt
@@ -16,7 +16,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
@@ -102,12 +101,12 @@
 // An IR builder with a reference to the JvmBackendContext
 class JvmIrBuilder(
     val backendContext: JvmBackendContext,
-    val symbol: IrSymbol,
+    val owner: IrSymbolOwner,
     startOffset: Int = UNDEFINED_OFFSET,
     endOffset: Int = UNDEFINED_OFFSET
 ) : IrBuilderWithScope(
     IrLoweringContext(backendContext),
-    Scope(symbol),
+    Scope(owner),
     startOffset,
     endOffset
 ) {
@@ -116,7 +115,7 @@
 }
 
 fun JvmBackendContext.createJvmIrBuilder(
-    symbol: IrSymbol,
+    owner: IrSymbolOwner,
     startOffset: Int = UNDEFINED_OFFSET,
     endOffset: Int = UNDEFINED_OFFSET
-) = JvmIrBuilder(this, symbol, startOffset, endOffset)
+) = JvmIrBuilder(this, owner, startOffset, endOffset)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt
index f2fb98d..740d728 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt
@@ -31,7 +31,6 @@
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
 import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
@@ -85,15 +84,15 @@
 
                 if (!expression.isSuspend)
                     return expression
-                val constructor = suspendLambdas.singleOrNull { it.function == expression.symbol.owner }?.constructor
+                val constructor = suspendLambdas.singleOrNull { it.function == expression.target }?.constructor
                     ?: return expression
                 val expressionArguments = expression.getArguments().map { it.second }
                 assert(constructor.valueParameters.size == expressionArguments.size) {
                     "Inconsistency between callable reference to suspend lambda and the corresponding continuation"
                 }
-                val irBuilder = context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset)
+                val irBuilder = context.createIrBuilder(expression.target, expression.startOffset, expression.endOffset)
                 irBuilder.run {
-                    return irCall(constructor.symbol).apply {
+                    return irCall(constructor).apply {
                         expressionArguments.forEachIndexed { index, argument ->
                             putValueArgument(index, argument)
                         }
@@ -104,13 +103,12 @@
     }
 
     private fun generateContinuationClassForLambda(info: SuspendLambdaInfo) {
-        val suspendLambda = suspendLambda.owner
         suspendLambda.createContinuationClassFor(info.function).apply {
             copyAttributes(info.reference)
             val functionNClass = context.ir.symbols.getJvmFunctionClass(info.arity + 1)
             superTypes.add(
                 IrSimpleTypeImpl(
-                    functionNClass,
+                    functionNClass.symbol,
                     hasQuestionMark = false,
                     arguments = (info.function.explicitParameters.subList(0, info.arity).map { it.type }
                             + info.function.continuationType() + info.function.returnType)
@@ -130,7 +128,7 @@
             val constructor = addPrimaryConstructorForLambda(info.arity, info.function, parametersFields)
             val secondaryConstructor = addSecondaryConstructorForLambda(constructor)
             val invokeToOverride = functionNClass.functions.single {
-                it.owner.valueParameters.size == info.arity + 1 && it.owner.name.asString() == "invoke"
+                it.valueParameters.size == info.arity + 1 && it.name.asString() == "invoke"
             }
             val invokeSuspend = addInvokeSuspendForLambda(info.function, parametersFields, receiverField)
             if (info.arity <= 1) {
@@ -152,38 +150,38 @@
         receiverField: IrField?
     ): IrFunction {
         val superMethod = suspendLambda.functions.single {
-            it.owner.name.asString() == INVOKE_SUSPEND_METHOD_NAME && it.owner.valueParameters.size == 1 &&
-                    it.owner.valueParameters[0].type.isKotlinResult()
-        }.owner
+            it.name.asString() == INVOKE_SUSPEND_METHOD_NAME && it.valueParameters.size == 1 &&
+                    it.valueParameters[0].type.isKotlinResult()
+        }
         return addFunctionOverride(superMethod)
             .also { function ->
                 function.copyTypeParametersFrom(irFunction)
                 function.body = irFunction.body?.deepCopyWithSymbols(function)
                 function.body?.transformChildrenVoid(object : IrElementTransformerVoid() {
                     override fun visitGetValue(expression: IrGetValue): IrExpression {
-                        if (expression.symbol.owner == irFunction.extensionReceiverParameter) {
+                        if (expression.target == irFunction.extensionReceiverParameter) {
                             assert(receiverField != null)
                             return IrGetFieldImpl(
                                 expression.startOffset,
                                 expression.endOffset,
-                                receiverField!!.symbol,
+                                receiverField!!,
                                 receiverField.type
                             ).also {
                                 it.receiver =
-                                    IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, function.dispatchReceiverParameter!!.symbol)
+                                    IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, function.dispatchReceiverParameter!!)
                             }
-                        } else if (expression.symbol.owner == irFunction.dispatchReceiverParameter) {
-                            return IrGetValueImpl(expression.startOffset, expression.endOffset, function.dispatchReceiverParameter!!.symbol)
+                        } else if (expression.target == irFunction.dispatchReceiverParameter) {
+                            return IrGetValueImpl(expression.startOffset, expression.endOffset, function.dispatchReceiverParameter!!)
                         }
-                        val field = fields.find { it.name == expression.symbol.owner.name } ?: return expression
-                        return IrGetFieldImpl(expression.startOffset, expression.endOffset, field.symbol, field.type).also {
-                            it.receiver = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, function.dispatchReceiverParameter!!.symbol)
+                        val field = fields.find { it.name == expression.target.name } ?: return expression
+                        return IrGetFieldImpl(expression.startOffset, expression.endOffset, field, field.type).also {
+                            it.receiver = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, function.dispatchReceiverParameter!!)
                         }
                     }
 
                     override fun visitReturn(expression: IrReturn): IrExpression {
                         val ret = super.visitReturn(expression) as IrReturn
-                        return IrReturnImpl(ret.startOffset, ret.endOffset, context.irBuiltIns.anyType, function.symbol, ret.value)
+                        return IrReturnImpl(ret.startOffset, ret.endOffset, context.irBuiltIns.anyType, function, ret.value)
                     }
                 })
                 (irFunction.parent as IrDeclarationContainer).declarations.remove(irFunction)
@@ -195,19 +193,19 @@
         modality: Modality = Modality.FINAL
     ): IrSimpleFunction =
         addFunction(function.name.asString(), function.returnType, modality).apply {
-            overriddenSymbols.add(function.symbol)
+            overridden.add(function)
             function.valueParameters.mapTo(valueParameters) { it.copyTo(this) }
         }
 
     private fun IrClass.addInvoke(
         create: IrFunction,
         invokeSuspend: IrFunction,
-        invokeToOverride: IrSimpleFunctionSymbol
+        invokeToOverride: IrSimpleFunction
     ) {
         val unitClass = context.irBuiltIns.unitClass
         val unitField = context.declarationFactory.getFieldForObjectInstance(unitClass.owner)
-        addFunctionOverride(invokeToOverride.owner).also { function ->
-            function.body = context.createIrBuilder(function.symbol).irBlockBody {
+        addFunctionOverride(invokeToOverride).also { function ->
+            function.body = context.createIrBuilder(function).irBlockBody {
                 +irReturn(irCall(invokeSuspend).also { invokeSuspendCall ->
                     invokeSuspendCall.dispatchReceiver = irCall(create).also {
                         it.dispatchReceiver = irGet(function.dispatchReceiverParameter!!)
@@ -234,7 +232,7 @@
                     if (arity == 1) it.valueParameters.first().type.isNullableAny() else true
         }
         return addFunctionOverride(create).also { function ->
-            function.body = context.createIrBuilder(function.symbol).irBlockBody {
+            function.body = context.createIrBuilder(function).irBlockBody {
                 val constructorCall = irCall(constructor).also {
                     for ((i, field) in parametersFields.withIndex()) {
                         it.putValueArgument(i, irGetField(irGet(function.dispatchReceiverParameter!!), field))
@@ -277,15 +275,15 @@
             returnType = defaultType
         }.also { constructor ->
             irFunction.valueParameters.mapTo(constructor.valueParameters) { it.copyTo(constructor) }
-            val completionParameterSymbol = constructor.addCompletionValueParameter()
+            val completionParameter = constructor.addCompletionValueParameter()
 
-            val superClassConstructor = suspendLambda.owner.constructors.single {
+            val superClassConstructor = suspendLambda.constructors.single {
                 it.valueParameters.size == 2 && it.valueParameters[0].type.isInt() && it.valueParameters[1].type.isNullableContinuation()
             }
-            constructor.body = context.createIrBuilder(constructor.symbol).irBlockBody {
+            constructor.body = context.createIrBuilder(constructor).irBlockBody {
                 +irDelegatingConstructorCall(superClassConstructor).also {
                     it.putValueArgument(0, irInt(arity + 1))
-                    it.putValueArgument(1, irGet(completionParameterSymbol))
+                    it.putValueArgument(1, irGet(completionParameter))
                 }
 
                 for ((index, param) in constructor.valueParameters.dropLast(1).withIndex()) {
@@ -301,7 +299,7 @@
         }.also { constructor ->
             constructor.valueParameters.addAll(primary.valueParameters.dropLast(1).map { it.copyTo(constructor) })
 
-            constructor.body = context.createIrBuilder(constructor.symbol).irBlockBody {
+            constructor.body = context.createIrBuilder(constructor).irBlockBody {
                 +irDelegatingConstructorCall(primary).also {
                     for ((index, param) in constructor.valueParameters.withIndex()) {
                         it.putValueArgument(index, irGet(param))
@@ -318,7 +316,7 @@
         continuation.createType(true, listOf(makeTypeProjection(returnType, Variance.INVARIANT)))
 
     private fun generateContinuationClassForNamedFunction(irFunction: IrFunction) {
-        continuationImpl.owner.createContinuationClassFor(irFunction).apply {
+        continuationImpl.createContinuationClassFor(irFunction).apply {
             val resultField = addField(
                 context.state.languageVersionSettings.dataFieldName(),
                 context.irBuiltIns.anyType,
@@ -338,15 +336,15 @@
         returnType = defaultType
     }.also { constructor ->
         val capturedThisParameter = capturedThisField?.let { constructor.addValueParameter(it.name.asString(), it.type) }
-        val completionParameterSymbol = constructor.addCompletionValueParameter()
+        val completionParameter = constructor.addCompletionValueParameter()
 
-        val superClassConstructor = continuationImpl.owner.constructors.single { it.valueParameters.size == 1 }
-        constructor.body = context.createIrBuilder(constructor.symbol).irBlockBody {
+        val superClassConstructor = continuationImpl.constructors.single { it.valueParameters.size == 1 }
+        constructor.body = context.createIrBuilder(constructor).irBlockBody {
             if (capturedThisField != null) {
                 +irSetField(irGet(thisReceiver!!), capturedThisField, irGet(capturedThisParameter!!))
             }
             +irDelegatingConstructorCall(superClassConstructor).also {
-                it.putValueArgument(0, irGet(completionParameterSymbol))
+                it.putValueArgument(0, irGet(completionParameter))
             }
         }
     }
@@ -357,9 +355,9 @@
         labelField: IrField,
         capturedThisField: IrField?
     ) {
-        val invokeSuspend = continuationImpl.owner.functions.single { it.name == Name.identifier(INVOKE_SUSPEND_METHOD_NAME) }
+        val invokeSuspend = continuationImpl.functions.single { it.name == Name.identifier(INVOKE_SUSPEND_METHOD_NAME) }
         addFunctionOverride(invokeSuspend).also { function ->
-            function.body = context.createIrBuilder(function.symbol).irBlockBody {
+            function.body = context.createIrBuilder(function).irBlockBody {
                 +irSetField(irGet(function.dispatchReceiverParameter!!), resultField, irGet(function.valueParameters[0]))
                 // There can be three kinds of suspend function call:
                 // 1) direct call from another suspend function/lambda
@@ -373,7 +371,7 @@
                 +irSetField(
                     irGet(function.dispatchReceiverParameter!!), labelField,
                     irCallOp(
-                        context.irBuiltIns.intClass.functions.single { it.owner.name == OperatorNameConventions.OR },
+                        context.irBuiltIns.intClass.functions.single { it.name == OperatorNameConventions.OR },
                         context.irBuiltIns.intType,
                         irGetField(irGet(function.dispatchReceiverParameter!!), labelField),
                         irInt(signBit)
@@ -427,7 +425,7 @@
             }
 
             override fun visitCall(expression: IrCall) {
-                val owner = expression.symbol.owner
+                val owner = expression.target
                 if (owner.isInline) {
                     for (i in 0 until expression.valueArgumentsCount) {
                         if (owner.valueParameters[i].isNoinline) continue
@@ -449,7 +447,7 @@
 
                 if (expression.isSuspend && expression !in inlineLambdas) {
                     suspendLambdas += SuspendLambdaInfo(
-                        expression.symbol.owner,
+                        expression.target,
                         (expression.type as IrSimpleType).arguments.size - 1,
                         expression
                     )
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt
index 88ceff8..ab0805e 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLowering.kt
@@ -141,7 +141,7 @@
 
         irClass.annotations.add(
             IrConstructorCallImpl.fromSymbolOwner(
-                UNDEFINED_OFFSET, UNDEFINED_OFFSET, documentedConstructor.returnType, documentedConstructor.symbol
+                UNDEFINED_OFFSET, UNDEFINED_OFFSET, documentedConstructor.returnType, documentedConstructor
             )
         )
     }
@@ -156,18 +156,18 @@
         if (irClass.hasAnnotation(FqName("java.lang.annotation.Retention"))) return
         val kotlinRetentionPolicyCall = irClass.getAnnotation(FqName("kotlin.annotation.Retention"))
         val kotlinRetentionPolicyName =
-            kotlinRetentionPolicyCall?.getValueArgument(0)?.safeAs<IrGetEnumValue>()?.symbol?.owner?.name?.asString()
+            kotlinRetentionPolicyCall?.getValueArgument(0)?.safeAs<IrGetEnumValue>()?.target?.name?.asString()
         val kotlinRetentionPolicy = kotlinRetentionPolicyName?.let { KotlinRetention.valueOf(it) }
         val javaRetentionPolicy = kotlinRetentionPolicy?.let { annotationRetentionMap[it] } ?: rpRuntime
 
         irClass.annotations.add(
             IrConstructorCallImpl.fromSymbolOwner(
-                UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionConstructor.returnType, retentionConstructor.symbol
+                UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionConstructor.returnType, retentionConstructor
             ).apply {
                 putValueArgument(
                     0,
                     IrGetEnumValueImpl(
-                        UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionPolicyEnum.defaultType, javaRetentionPolicy.symbol
+                        UNDEFINED_OFFSET, UNDEFINED_OFFSET, retentionPolicyEnum.defaultType, javaRetentionPolicy
                     )
                 )
             }
@@ -223,14 +223,14 @@
         for (target in javaTargets) {
             vararg.elements.add(
                 IrGetEnumValueImpl(
-                    UNDEFINED_OFFSET, UNDEFINED_OFFSET, elementTypeEnum.defaultType, target.symbol
+                    UNDEFINED_OFFSET, UNDEFINED_OFFSET, elementTypeEnum.defaultType, target
                 )
             )
         }
 
         irClass.annotations.add(
             IrConstructorCallImpl.fromSymbolOwner(
-                UNDEFINED_OFFSET, UNDEFINED_OFFSET, targetConstructor.returnType, targetConstructor.symbol
+                UNDEFINED_OFFSET, UNDEFINED_OFFSET, targetConstructor.returnType, targetConstructor
             ).apply {
                 putValueArgument(0, vararg)
             }
@@ -241,7 +241,7 @@
 
 // To be generalized to IrMemberAccessExpression as soon as properties get symbols.
 private fun IrConstructorCall.getValueArgument(name: Name): IrExpression? {
-    val index = symbol.owner.valueParameters.find { it.name == name }?.index ?: return null
+    val index = target.valueParameters.find { it.name == name }?.index ?: return null
     return getValueArgument(index)
 }
 
@@ -258,6 +258,6 @@
     val valueArgument = targetEntry.getValueArgument(TARGET_ALLOWED_TARGETS)
             as? IrVararg ?: return null
     return valueArgument.elements.filterIsInstance<IrGetEnumValue>().mapNotNull {
-        KotlinTarget.valueOrNull(it.symbol.owner.name.asString())
+        KotlinTarget.valueOrNull(it.target.name.asString())
     }.toSet()
 }
\ No newline at end of file
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AssertionLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AssertionLowering.kt
index f609cea..fc3a0e3 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AssertionLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AssertionLowering.kt
@@ -77,7 +77,7 @@
     }
 
     override fun visitCall(expression: IrCall, data: ClassInfo?): IrElement {
-        val function = expression.symbol.owner
+        val function = expression.target
         if (!function.isAssert)
             return super.visitCall(expression, data)
 
@@ -85,7 +85,7 @@
         if (mode == JVMAssertionsMode.ALWAYS_DISABLE)
             return IrCompositeImpl(expression.startOffset, expression.endOffset, context.irBuiltIns.unitType)
 
-        context.createIrBuilder(expression.symbol).run {
+        context.createIrBuilder(expression.target).run {
             at(expression)
             val assertCondition = expression.getValueArgument(0)!!
             val lambdaArgument = if (function.valueParameters.size == 2) expression.getValueArgument(1) else null
@@ -116,7 +116,7 @@
                         lambdaArgument != null -> {
                             val invoke =
                                 lambdaArgument.type.getClass()!!.functions.single { it.name == OperatorNameConventions.INVOKE }
-                            irCallOp(invoke.symbol, invoke.returnType, irGet(invokeVar!!))
+                            irCallOp(invoke, invoke.returnType, irGet(invokeVar!!))
                         }
                         else -> irString("Assertion failed")
                     }
@@ -140,7 +140,7 @@
             isStatic = true
         }.apply {
             parent = irClass
-            initializer = context.createIrBuilder(irClass.symbol).run {
+            initializer = context.createIrBuilder(irClass).run {
                 at(this@apply)
                 irExprBody(irNot(irCall(this@AssertionLowering.context.ir.symbols.desiredAssertionStatus).apply {
                     dispatchReceiver = getJavaClass(topLevelClass)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt
index 12d35af..523d128 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt
@@ -73,12 +73,12 @@
         if (irFunction.isMethodOfAny()) return
 
         if (irFunction.origin === IrDeclarationOrigin.FAKE_OVERRIDE &&
-            irFunction.overriddenSymbols.all {
-                !it.owner.comesFromJava() &&
-                        if ((it.owner.parent as? IrClass)?.isInterface == true)
-                            it.owner.hasJvmDefault() // TODO: Remove this after modality is corrected in InterfaceLowering.
+            irFunction.overridden.all {
+                !it.comesFromJava() &&
+                        if ((it.parent as? IrClass)?.isInterface == true)
+                            it.hasJvmDefault() // TODO: Remove this after modality is corrected in InterfaceLowering.
                         else
-                            it.owner.modality !== Modality.ABSTRACT
+                            it.modality !== Modality.ABSTRACT
             }
         ) {
             // All needed bridges will be generated where functions are implemented.
@@ -118,7 +118,7 @@
             }
         } else if (irFunction.origin == IrDeclarationOrigin.FAKE_OVERRIDE &&
             irFunction.modality == Modality.ABSTRACT &&
-            irFunction.overriddenSymbols.all { it.owner.getJvmName() != ourMethodName }
+            irFunction.overridden.all { it.getJvmName() != ourMethodName }
         ) {
             // Bridges for abstract fake overrides whose JVM names differ from overridden functions.
             val bridge = irFunction.orphanedCopy()
@@ -191,8 +191,8 @@
         // For lambda classes, we move override from the `invoke` function to its bridge. This will allow us to avoid boxing
         // the return type of `invoke` in codegen, in case lambda's return type is primitive.
         if (method.name == OperatorNameConventions.INVOKE && irClass.origin == JvmLoweredDeclarationOrigin.LAMBDA_IMPL) {
-            target.overriddenSymbols.remove(method.symbol)
-            bridge.overriddenSymbols.add(method.symbol)
+            target.overridden.remove(method)
+            bridge.overridden.add(method)
         }
 
         signaturesToSkip.add(signature)
@@ -281,9 +281,9 @@
                         IrCallImpl(
                             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
                             maybeOrphanedTarget.returnType,
-                            maybeOrphanedTarget.symbol, maybeOrphanedTarget.descriptor,
+                            maybeOrphanedTarget, maybeOrphanedTarget.descriptor,
                             origin = IrStatementOrigin.BRIDGE_DELEGATION,
-                            superQualifierSymbol = if (invokeStatically) maybeOrphanedTarget.parentAsClass.symbol else null
+                            irSuperQualifier = if (invokeStatically) maybeOrphanedTarget.parentAsClass else null
                         ).apply {
                             passTypeArgumentsFrom(this@createBridgeBody)
                             dispatchReceiver = irGet(dispatchReceiverParameter!!)
@@ -303,7 +303,7 @@
 
     /* A hacky way to make sure the code generator calls the right function, and not some standard interface it implements. */
     private fun IrSimpleFunction.orphanedCopy() =
-        if (overriddenSymbols.size == 0)
+        if (overridden.size == 0)
             this
         else
             WrappedSimpleFunctionDescriptor(descriptor.annotations).let { wrappedDescriptor ->
@@ -373,7 +373,7 @@
         override val isAbstract get() = irFunction.modality == Modality.ABSTRACT
         override val mayBeUsedAsSuperImplementation get() = !irFunction.parentAsClass.isInterface || irFunction.hasJvmDefault()
 
-        override fun getOverridden() = irFunction.overriddenSymbols.map { FunctionHandleForIrFunction(it.owner) }
+        override fun getOverridden() = irFunction.overridden.map { FunctionHandleForIrFunction(it) }
 
         override fun hashCode(): Int =
             irFunction.parent.safeAs<IrClass>()?.fqNameWhenAvailable.hashCode() + 31 * irFunction.getJvmSignature().hashCode()
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt
index 93528b0..2daecd8 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt
@@ -56,7 +56,7 @@
 
     // Mark function references appearing as inlined arguments to inline functions.
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
-        val function = expression.symbol.owner
+        val function = expression.target
         if (function.isInlineFunctionCall(context)) {
             for (parameter in function.valueParameters) {
                 if (!parameter.isInlineParameter())
@@ -120,7 +120,7 @@
     private inner class FunctionReferenceBuilder(val irFunctionReference: IrFunctionReference, val samSuperType: IrType? = null) {
         private val isLambda = irFunctionReference.origin.isLambda
 
-        private val callee = irFunctionReference.symbol.owner
+        private val callee = irFunctionReference.target
 
         // Only function references can bind a receiver and even then we can only bind either an extension or a dispatch receiver.
         // However, when we bind a value of an inline class type as a receiver, the receiver will turn into an argument of
@@ -137,9 +137,9 @@
         private val functionSuperClass =
             samSuperType?.classOrNull ?: context.ir.symbols.getJvmFunctionClass(argumentTypes.size)
         private val superMethod =
-            functionSuperClass.functions.single { it.owner.modality == Modality.ABSTRACT }
+            functionSuperClass.functions.single { it.modality == Modality.ABSTRACT }
         private val superType =
-            samSuperType ?: (if (isLambda) context.ir.symbols.lambdaClass else context.ir.symbols.functionReference).owner.typeWith()
+            samSuperType ?: (if (isLambda) context.ir.symbols.lambdaClass else context.ir.symbols.functionReference).typeWith()
 
         private val functionReferenceClass = buildClass {
             setSourceRange(irFunctionReference)
@@ -157,7 +157,7 @@
             copyAttributes(irFunctionReference)
         }
 
-        fun build(): IrExpression = context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run {
+        fun build(): IrExpression = context.createJvmIrBuilder(currentScope!!.scope.irScopeOwner).run {
             irBlock {
                 val constructor = createConstructor()
                 createInvokeMethod(
@@ -167,13 +167,13 @@
                 )
 
                 if (!isLambda && samSuperType == null) {
-                    createGetSignatureMethod(this@run.irSymbols.functionReferenceGetSignature.owner)
-                    createGetNameMethod(this@run.irSymbols.functionReferenceGetName.owner)
-                    createGetOwnerMethod(this@run.irSymbols.functionReferenceGetOwner.owner)
+                    createGetSignatureMethod(this@run.irSymbols.functionReferenceGetSignature)
+                    createGetNameMethod(this@run.irSymbols.functionReferenceGetName)
+                    createGetOwnerMethod(this@run.irSymbols.functionReferenceGetOwner)
                 }
 
                 +functionReferenceClass
-                +irCall(constructor.symbol).apply {
+                +irCall(constructor).apply {
                     if (valueArgumentsCount > 0) putValueArgument(0, boundReceiver!!.second)
                 }
             }
@@ -217,17 +217,17 @@
                                 putValueArgument(1, irGet(valueParameters.first()))
                         }
                     }
-                    +IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, context.irBuiltIns.unitType)
+                    +IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass, context.irBuiltIns.unitType)
                 }
             }
 
         private fun createInvokeMethod(receiverVar: IrValueDeclaration?): IrSimpleFunction =
             functionReferenceClass.addFunction {
-                name = superMethod.owner.name
+                name = superMethod.name
                 returnType = callee.returnType
                 isSuspend = callee.isSuspend
             }.apply {
-                overriddenSymbols += superMethod
+                overridden += superMethod
                 dispatchReceiverParameter = parentAsClass.thisReceiver!!.copyTo(this)
                 if (isLambda) createLambdaInvokeMethod() else createFunctionReferenceInvokeMethod(receiverVar)
             }
@@ -244,7 +244,7 @@
                 callee.body?.statements?.forEach { statement ->
                     +statement.transform(object : IrElementTransformerVoid() {
                         override fun visitGetValue(expression: IrGetValue): IrExpression {
-                            val replacement = valueParameterMap[expression.symbol.owner]
+                            val replacement = valueParameterMap[expression.target]
                                 ?: return super.visitGetValue(expression)
 
                             at(expression.startOffset, expression.endOffset)
@@ -252,7 +252,7 @@
                         }
 
                         override fun visitReturn(expression: IrReturn): IrExpression =
-                            if (expression.returnTargetSymbol != callee.symbol) {
+                            if (expression.irReturnTarget != callee) {
                                 super.visitReturn(expression)
                             } else {
                                 at(expression.startOffset, expression.endOffset)
@@ -281,7 +281,7 @@
                 var unboundIndex = 0
                 irExprBody(irCall(callee).apply {
                     for ((typeParameter, typeArgument) in typeArgumentsMap) {
-                        putTypeArgument(typeParameter.owner.index, typeArgument)
+                        putTypeArgument(typeParameter.index, typeArgument)
                     }
 
                     for (parameter in callee.explicitParameters) {
@@ -292,7 +292,7 @@
                                 // will put it into a field.
                                 if (samSuperType == null)
                                     irImplicitCast(
-                                        irGetField(irGet(dispatchReceiverParameter!!), irSymbols.functionReferenceReceiverField.owner),
+                                        irGetField(irGet(dispatchReceiverParameter!!), irSymbols.functionReferenceReceiverField),
                                         boundReceiver.second.type
                                     )
                                 else
@@ -339,7 +339,7 @@
                 visibility = superFunction.visibility
                 isSuspend = superFunction.isSuspend
             }.apply {
-                overriddenSymbols += superFunction.symbol
+                overridden += superFunction
                 dispatchReceiverParameter = functionReferenceClass.thisReceiver?.copyTo(this)
             }
 
@@ -351,8 +351,8 @@
             body = context.createIrBuilder(symbol, startOffset, endOffset).run {
                 // TODO do not use descriptors
                 val declaration = codegenContext.referenceFunction(
-                    DescriptorUtils.unwrapFakeOverride(irFunctionReference.symbol.descriptor).original
-                ).owner
+                    DescriptorUtils.unwrapFakeOverride(irFunctionReference.target.descriptor).original
+                )
                 val method = codegenContext.methodSignatureMapper.mapAsmMethod(declaration)
                 irExprBody(irString(method.name + method.descriptor))
             }
@@ -378,7 +378,7 @@
             )
 
         private fun IrBuilderWithScope.kClassToJavaClass(kClassReference: IrExpression, context: JvmBackendContext) =
-            irGet(context.ir.symbols.javaLangClass.typeWith(), null, context.ir.symbols.kClassJava.owner.getter!!.symbol).apply {
+            irGet(context.ir.symbols.javaLangClass.typeWith(), null, context.ir.symbols.kClassJava.getter!!).apply {
                 extensionReceiver = kClassReference
             }
 
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CheckLocalNamesWithOldBackend.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CheckLocalNamesWithOldBackend.kt
index a28d1d1..1684b699 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CheckLocalNamesWithOldBackend.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CheckLocalNamesWithOldBackend.kt
@@ -37,7 +37,7 @@
     override fun visitClass(declaration: IrClass) {
         val actualName = context.getLocalClassInfo(declaration)?.internalName
         if (actualName != null) {
-            val expectedName = context.state.bindingTrace.get(CodegenBinding.ASM_TYPE, declaration.symbol.descriptor)?.internalName
+            val expectedName = context.state.bindingTrace.get(CodegenBinding.ASM_TYPE, declaration.descriptor)?.internalName
             if (expectedName != null && expectedName != actualName) {
                 throw AssertionError(
                     "Incorrect name for the class.\n" +
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt
index 30757c4..068022d 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt
@@ -17,13 +17,8 @@
 import org.jetbrains.kotlin.ir.builders.irBlockBody
 import org.jetbrains.kotlin.ir.builders.irCall
 import org.jetbrains.kotlin.ir.builders.irString
-import org.jetbrains.kotlin.ir.declarations.IrClass
-import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
-import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
-import org.jetbrains.kotlin.ir.declarations.IrValueParameter
+import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
@@ -58,7 +53,7 @@
             if (existingMethod != null) {
                 // In the case that we find a defined method that matches the stub signature, we add the overridden symbols to that
                 // defined method, so that bridge lowering can still generate correct bridge for that method
-                existingMethod.overriddenSymbols.addAll(member.overriddenSymbols)
+                existingMethod.overridden.addAll(member.overridden)
             } else {
                 irClass.declarations.add(member)
             }
@@ -68,7 +63,7 @@
     private fun IrSimpleFunction.toSignature(): String = methodSignatureMapper.mapAsmMethod(this).toString()
 
     private fun createStubMethod(
-        function: IrSimpleFunction, irClass: IrClass, substitutionMap: Map<IrTypeParameterSymbol, IrType>
+        function: IrSimpleFunction, irClass: IrClass, substitutionMap: Map<IrTypeParameter, IrType>
     ): IrSimpleFunction {
         return buildFun {
             name = function.name
@@ -79,7 +74,7 @@
         }.apply {
             // Replace Function metadata with the data from class
             // Add the abstract function symbol to stub function for bridge lowering
-            overriddenSymbols.add(function.symbol)
+            overridden.add(function)
             parent = irClass
             dispatchReceiverParameter = function.dispatchReceiverParameter?.copyWithSubstitution(this, substitutionMap)
             extensionReceiverParameter = function.extensionReceiverParameter?.copyWithSubstitution(this, substitutionMap)
@@ -88,10 +83,10 @@
             }
             val exception = context.getTopLevelClass(FqName("java.lang.UnsupportedOperationException"))
             // Function body consist only of throwing UnsupportedOperationException statement
-            body = context.createIrBuilder(function.symbol).irBlockBody {
+            body = context.createIrBuilder(function).irBlockBody {
                 +irThrow(
                     irCall(
-                        exception.owner.constructors.single {
+                        exception.constructors.single {
                             it.valueParameters.size == 1 && it.valueParameters.single().type.isNullableString()
                         }
                     ).apply {
@@ -103,7 +98,7 @@
     }
 
     // Copy value parameter with type substitution
-    private fun IrValueParameter.copyWithSubstitution(target: IrSimpleFunction, substitutionMap: Map<IrTypeParameterSymbol, IrType>)
+    private fun IrValueParameter.copyWithSubstitution(target: IrSimpleFunction, substitutionMap: Map<IrTypeParameter, IrType>)
             : IrValueParameter {
         val descriptor = WrappedValueParameterDescriptor(this.descriptor.annotations)
         return IrValueParameterImpl(
@@ -125,11 +120,11 @@
     // Compute a substitution map for type parameters between source class (Mutable Collection classes) to
     // target class (class currently in lowering phase), this map is later used for substituting type parameters in generated functions
     private fun computeSubstitutionMap(readOnlyClass: IrClass, mutableClass: IrClass, targetClass: IrClass)
-            : Map<IrTypeParameterSymbol, IrType> {
+            : Map<IrTypeParameter, IrType> {
         // We find the most specific type for the immutable collection class from the inheritance chain of target class
         // Perform type substitution along searching, then use the type arguments obtained from the most specific type
         // for type substitution.
-        val readOnlyClassType = getAllSupertypes(targetClass).findMostSpecificTypeForClass(readOnlyClass.symbol)
+        val readOnlyClassType = getAllSupertypes(targetClass).findMostSpecificTypeForClass(readOnlyClass)
         val readOnlyClassTypeArguments = (readOnlyClassType as IrSimpleType).arguments.mapNotNull { (it as? IrTypeProjection)?.type }
 
         if (readOnlyClassTypeArguments.isEmpty() || readOnlyClassTypeArguments.size != mutableClass.typeParameters.size) {
@@ -139,17 +134,16 @@
                         "class ${targetClass.fqNameWhenAvailable}"
             )
         }
-        return mutableClass.typeParameters.map { it.symbol }.zip(readOnlyClassTypeArguments).toMap()
+        return mutableClass.typeParameters.zip(readOnlyClassTypeArguments).toMap()
     }
 
     private inner class StubsForCollectionClass(
-        val readOnlyClass: IrClassSymbol,
-        val mutableClass: IrClassSymbol
+        val readOnlyClass: IrClass,
+        val mutableClass: IrClass
     ) {
         val mutableOnlyMethods: Collection<IrSimpleFunction> by lazy {
-            val readOnlyMethodSignatures = readOnlyClass.functions.map { it.owner.toSignature() }.toHashSet()
+            val readOnlyMethodSignatures = readOnlyClass.functions.map { it.toSignature() }.toHashSet()
             mutableClass.functions
-                .map { it.owner }
                 .filter { it.toSignature() !in readOnlyMethodSignatures }
                 .toHashSet()
         }
@@ -179,14 +173,14 @@
     // Compute stubs that should be generated, compare based on signature
     private fun generateRelevantStubMethods(irClass: IrClass): Set<IrSimpleFunction> {
         val ourStubsForCollectionClasses = preComputedStubs.filter { (readOnlyClass, mutableClass) ->
-            irClass.superTypes.any { supertypeSymbol ->
-                val supertype = supertypeSymbol.classOrNull?.owner
+            irClass.superTypes.any { supertype ->
+                val supertypeCLass = supertype.classOrNull?.owner
                 // We need to generate stub methods for following 2 cases:
                 // current class's direct super type is a java class or kotlin interface, and is an subtype of an immutable collection
-                supertype != null
-                        && (supertype.comesFromJava() || supertype.isInterface)
-                        && supertypeSymbol.isSubtypeOfClass(readOnlyClass)
-                        && !irClass.symbol.isSubtypeOfClass(mutableClass)
+                supertypeCLass != null
+                        && (supertypeCLass.comesFromJava() || supertypeCLass.isInterface)
+                        && supertype.isSubtypeOfClass(readOnlyClass)
+                        && !irClass.isSubtypeOfClass(mutableClass)
             }
         }
 
@@ -199,7 +193,7 @@
         return ourStubsForCollectionClasses.filter { (readOnlyClass) ->
             readOnlyClass !in redundantClasses
         }.flatMap { (readOnlyClass, mutableClass, mutableOnlyMethods) ->
-            val substitutionMap = computeSubstitutionMap(readOnlyClass.owner, mutableClass.owner, irClass)
+            val substitutionMap = computeSubstitutionMap(readOnlyClass, mutableClass, irClass)
             mutableOnlyMethods.map { function ->
                 createStubMethod(function, irClass, substitutionMap)
             }
@@ -208,9 +202,9 @@
 
     fun IrClass.comesFromJava() = origin in ORIGINS_FROM_JAVA
 
-    private fun Collection<IrType>.findMostSpecificTypeForClass(classifier: IrClassSymbol): IrType {
-        val types = this.filter { it.classifierOrNull == classifier }
-        if (types.isEmpty()) error("No supertype of $classifier in $this")
+    private fun Collection<IrType>.findMostSpecificTypeForClass(clazz: IrClass): IrType {
+        val types = this.filter { it.classifierOrNull == clazz.symbol }
+        if (types.isEmpty()) error("No supertype of $clazz in $this")
         if (types.size == 1) return types.first()
         // Find the first type in the list such that it's a subtype of every other type in that list
         return types.first { type ->
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt
index 926af82..6451b54 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstLowering.kt
@@ -39,7 +39,7 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val function = (expression.symbol.owner as? IrSimpleFunction) ?: return super.visitCall(expression)
+        val function = (expression.target as? IrSimpleFunction) ?: return super.visitCall(expression)
         val property = function.correspondingPropertySymbol?.owner ?: return super.visitCall(expression)
         if (function != property.getter)
             return super.visitCall(expression)
@@ -47,5 +47,5 @@
     }
 
     override fun visitGetField(expression: IrGetField): IrExpression =
-        expression.symbol.owner.constantValue() ?: super.visitGetField(expression)
+        expression.target.constantValue() ?: super.visitGetField(expression)
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt
index ec21a6e..e5ba7de 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt
@@ -25,8 +25,6 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
@@ -60,8 +58,8 @@
     private inner class EnumClassTransformer(val irClass: IrClass) {
         private val enumEntryOrdinals = TObjectIntHashMap<IrEnumEntry>()
         private val enumEntryClassToEntry = HashMap<IrClass, IrEnumEntry>()
-        private val loweredEnumConstructors = HashMap<IrConstructorSymbol, IrConstructorImpl>()
-        private val loweredEnumConstructorParameters = HashMap<IrValueParameterSymbol, IrValueParameter>()
+        private val loweredEnumConstructors = HashMap<IrConstructor, IrConstructorImpl>()
+        private val loweredEnumConstructorParameters = HashMap<IrValueParameter, IrValueParameter>()
         private val enumEntriesByField = HashMap<IrField, IrEnumEntry>()
         private val enumEntryFields = ArrayList<IrField>()
 
@@ -125,13 +123,13 @@
                 valueParameters.add(1, ordinalParameter)
                 valueParameters.addAll(enumConstructor.valueParameters.map { param ->
                     param.copyTo(newConstructor, index = param.index + 2).also { newParam ->
-                        loweredEnumConstructorParameters[param.symbol] = newParam
+                        loweredEnumConstructorParameters[param] = newParam
                     }
                 })
 
                 body = enumConstructor.body?.patchDeclarationParents(this)
 
-                loweredEnumConstructors[enumConstructor.symbol] = this
+                loweredEnumConstructors[enumConstructor] = this
                 metadata = enumConstructor.metadata
             }
         }
@@ -247,9 +245,9 @@
         }
 
         private fun createSyntheticValuesFieldInitializerExpression(): IrExpression =
-            context.createJvmIrBuilder(irClass.symbol).irArray(context.irBuiltIns.arrayClass.typeWith(irClass.defaultType)) {
+            context.createJvmIrBuilder(irClass).irArray(context.irBuiltIns.arrayClass.typeWith(irClass.defaultType)) {
                 enumEntryFields.forEach { irField ->
-                    +IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irField.symbol, irField.type)
+                    +IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irField, irField.type)
                 }
             }
 
@@ -268,7 +266,7 @@
                     startOffset,
                     endOffset,
                     context.irBuiltIns.unitType,
-                    enumConstructorCall.symbol,
+                    enumConstructorCall.target,
                     enumConstructorCall.descriptor,
                     enumConstructorCall.typeArgumentsCount
                 )
@@ -276,7 +274,7 @@
                 assert(enumConstructorCall.typeArgumentsCount == 1) { "Enum<T> call expected:\n${result.dump()}" }
                 result.putTypeArgument(0, enumConstructorCall.getTypeArgument(0))
 
-                assert(result.symbol.owner.valueParameters.size == 2) {
+                assert(result.target.valueParameters.size == 2) {
                     "Enum(String, Int) constructor call expected:\n${result.dump()}"
                 }
 
@@ -288,8 +286,8 @@
                     throw AssertionError("No 'ordinal' parameter in enum constructor: ${irEnumConstructor.dump()}")
                 }
 
-                result.putValueArgument(0, IrGetValueImpl(startOffset, endOffset, nameParameter.symbol, origin))
-                result.putValueArgument(1, IrGetValueImpl(startOffset, endOffset, ordinalParameter.symbol, origin))
+                result.putValueArgument(0, IrGetValueImpl(startOffset, endOffset, nameParameter, origin))
+                result.putValueArgument(1, IrGetValueImpl(startOffset, endOffset, ordinalParameter, origin))
 
                 return result
             }
@@ -298,25 +296,25 @@
                 val startOffset = delegatingConstructorCall.startOffset
                 val endOffset = delegatingConstructorCall.endOffset
 
-                val loweredDelegatedConstructor = loweredEnumConstructors.getOrElse(delegatingConstructorCall.symbol) {
-                    throw AssertionError("Constructor called in enum entry initializer should've been lowered: ${delegatingConstructorCall.symbol}")
+                val loweredDelegatedConstructor = loweredEnumConstructors.getOrElse(delegatingConstructorCall.target) {
+                    throw AssertionError("Constructor called in enum entry initializer should've been lowered: ${delegatingConstructorCall.target}")
                 }
 
                 val result = IrDelegatingConstructorCallImpl(
                     startOffset,
                     endOffset,
                     context.irBuiltIns.unitType,
-                    loweredDelegatedConstructor.symbol,
+                    loweredDelegatedConstructor,
                     loweredDelegatedConstructor.descriptor,
                     loweredDelegatedConstructor.typeParameters.size
                 )
 
                 assert(loweredDelegatedConstructor.typeParameters.size == 0) { "Enum delegating call expected:\n${result.dump()}" }
 
-                result.putValueArgument(0, IrGetValueImpl(startOffset, endOffset, irEnumConstructor.valueParameters[0].symbol))
-                result.putValueArgument(1, IrGetValueImpl(startOffset, endOffset, irEnumConstructor.valueParameters[1].symbol))
+                result.putValueArgument(0, IrGetValueImpl(startOffset, endOffset, irEnumConstructor.valueParameters[0]))
+                result.putValueArgument(1, IrGetValueImpl(startOffset, endOffset, irEnumConstructor.valueParameters[1]))
 
-                delegatingConstructorCall.symbol.owner.valueParameters.forEach { valueParameter ->
+                delegatingConstructorCall.target.valueParameters.forEach { valueParameter ->
                     val i = valueParameter.index
                     result.putValueArgument(i + 2, delegatingConstructorCall.getValueArgument(i))
                 }
@@ -333,7 +331,7 @@
                 val startOffset = enumConstructorCall.startOffset
                 val endOffset = enumConstructorCall.endOffset
 
-                val loweredConstructor = loweredEnumConstructors.getOrElse(enumConstructorCall.symbol) {
+                val loweredConstructor = loweredEnumConstructors.getOrElse(enumConstructorCall.target) {
                     throw AssertionError("Constructor called in enum entry initializer should've been lowered:\n${enumConstructorCall.dump()}")
                 }
 
@@ -342,7 +340,7 @@
                 result.putValueArgument(0, IrConstImpl.string(startOffset, endOffset, context.irBuiltIns.stringType, name))
                 result.putValueArgument(1, IrConstImpl.int(startOffset, endOffset, context.irBuiltIns.intType, ordinal))
 
-                enumConstructorCall.symbol.owner.valueParameters.forEach { valueParameter ->
+                enumConstructorCall.target.valueParameters.forEach { valueParameter ->
                     val i = valueParameter.index
                     result.putValueArgument(i + 2, enumConstructorCall.getValueArgument(i))
                 }
@@ -367,7 +365,7 @@
                     startOffset,
                     endOffset,
                     context.irBuiltIns.unitType,
-                    loweredConstructor.symbol,
+                    loweredConstructor,
                     loweredConstructor.descriptor,
                     loweredConstructor.typeParameters.size
                 )
@@ -378,8 +376,8 @@
                 IrConstructorCallImpl.fromSymbolDescriptor(
                     startOffset,
                     endOffset,
-                    loweredConstructor.symbol.owner.parentAsClass.defaultType,
-                    loweredConstructor.symbol
+                    loweredConstructor.parentAsClass.defaultType,
+                    loweredConstructor
                 )
         }
 
@@ -439,7 +437,7 @@
             override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
                 expression.transformChildrenVoid(this)
 
-                if (expression.symbol.owner.parentAsClass.kind == ClassKind.ENUM_CLASS) {
+                if (expression.target.parentAsClass.kind == ClassKind.ENUM_CLASS) {
                     val callTransformer = enumConstructorCallTransformer ?: throw AssertionError(
                         "Enum constructor call outside of enum entry initialization or enum class constructor:\n" +
                                 irClass.dump()
@@ -452,9 +450,9 @@
             }
 
             override fun visitGetValue(expression: IrGetValue): IrExpression {
-                val loweredParameter = loweredEnumConstructorParameters[expression.symbol]
+                val loweredParameter = loweredEnumConstructorParameters[expression.target]
                 return if (loweredParameter != null) {
-                    IrGetValueImpl(expression.startOffset, expression.endOffset, loweredParameter.symbol, expression.origin)
+                    IrGetValueImpl(expression.startOffset, expression.endOffset, loweredParameter, expression.origin)
                 } else {
                     expression
                 }
@@ -492,7 +490,7 @@
                     )
                 irValueOfCall.putTypeArgument(0, irClass.defaultType)
                 irValueOfCall.putValueArgument(
-                    0, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valueOfFunction.valueParameters[0].symbol)
+                    0, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valueOfFunction.valueParameters[0])
                 )
 
                 return IrBlockBodyImpl(
@@ -502,7 +500,7 @@
                             UNDEFINED_OFFSET,
                             UNDEFINED_OFFSET,
                             returnType,
-                            valueOfFunction.symbol,
+                            valueOfFunction,
                             irValueOfCall
                         )
                     )
@@ -511,11 +509,11 @@
 
             private fun createEnumValuesBody(valuesField: IrField): IrBody {
                 val cloneFun = context.irBuiltIns.arrayClass.owner.functions.find { it.name.asString() == "clone" }!!
-                val returnType = valuesFunction.symbol.owner.returnType
+                val returnType = valuesFunction.returnType
                 val irCloneValues =
-                    IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, cloneFun.symbol, cloneFun.descriptor, 0).apply {
+                    IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, cloneFun, cloneFun.descriptor, 0).apply {
                         dispatchReceiver =
-                            IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valuesField.symbol, valuesField.symbol.owner.type)
+                            IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valuesField, valuesField.type)
                     }
 
                 return IrBlockBodyImpl(
@@ -525,7 +523,7 @@
                             UNDEFINED_OFFSET,
                             UNDEFINED_OFFSET,
                             returnType,
-                            valuesFunction.symbol,
+                            valuesFunction,
                             irCloneValues
                         )
                     )
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FoldConstantLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FoldConstantLowering.kt
index cdc6ac2..6d61dfb 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FoldConstantLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FoldConstantLowering.kt
@@ -110,7 +110,7 @@
     private fun tryFoldingUnaryOps(call: IrCall): IrExpression {
         val operand = call.dispatchReceiver as? IrConst<*> ?: return call
         val evaluated = evaluateUnary(
-            call.symbol.owner.name.toString(),
+            call.target.name.toString(),
             operand.kind.toString(),
             operand.value!!
         ) ?: return call
@@ -124,14 +124,14 @@
         val evaluated = try {
             fun String.toNonNullable() = if (this.endsWith('?')) this.dropLast(1) else this
             evaluateBinary(
-                call.symbol.owner.name.toString(),
+                call.target.name.toString(),
                 lhs.kind.toString(),
                 lhs.value!!,
                 // 1. Although some operators have nullable parameters, evaluators deals with non-nullable types only.
                 //    The passed parameters are guaranteed to be non-null, since they are from IrConst.
                 // 2. The operators are registered with prototype as if virtual member functions. They are identified by
                 //    actual_receiver_type.operator_name(parameter_type_in_prototype).
-                call.symbol.owner.valueParameters[0].type.toKotlinType().toString().toNonNullable(),
+                call.target.valueParameters[0].type.toKotlinType().toString().toNonNullable(),
                 rhs.value!!
             ) ?: return call
         } catch (e: Exception) {
@@ -144,7 +144,7 @@
 
     private fun tryFoldingBuiltinBinaryOps(call: IrCall): IrExpression {
         // Make sure that this is a IrBuiltIn
-        if (call.symbol.owner.fqNameWhenAvailable?.parent() != IrBuiltIns.KOTLIN_INTERNAL_IR_FQN)
+        if (call.target.fqNameWhenAvailable?.parent() != IrBuiltIns.KOTLIN_INTERNAL_IR_FQN)
             return call
 
         val lhs = call.getValueArgument(0) as? IrConst<*> ?: return call
@@ -152,7 +152,7 @@
 
         val evaluated = try {
             val evaluator =
-                BINARY_OP_TO_EVALUATOR[BinaryOp(lhs.kind.toString(), rhs.kind.toString(), call.symbol.owner.name.toString())] ?: return call
+                BINARY_OP_TO_EVALUATOR[BinaryOp(lhs.kind.toString(), rhs.kind.toString(), call.target.name.toString())] ?: return call
             evaluator(lhs.value!!, rhs.value!!)
         } catch (e: Exception) {
             return call
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt
index 41d07c4..4bfcbc8 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLowering.kt
@@ -48,11 +48,11 @@
     // Change calls to big arity invoke functions to vararg calls.
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
         if (expression.valueArgumentsCount < FunctionInvokeDescriptor.BIG_ARITY ||
-            !expression.symbol.owner.parentAsClass.defaultType.isFunctionOrKFunction() ||
-            expression.symbol.owner.name.asString() != "invoke")
+            !expression.target.parentAsClass.defaultType.isFunctionOrKFunction() ||
+            expression.target.name.asString() != "invoke")
             return super.visitFunctionAccess(expression)
 
-        return context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol).run {
+        return context.createJvmIrBuilder(currentScope!!.scope.irScopeOwner).run {
             at(expression)
             irCall(functionNInvokeFun).apply {
                 dispatchReceiver = expression.dispatchReceiver
@@ -90,8 +90,8 @@
         val invokeFunction = declaration.functions.single {
             it.name.asString() == "invoke" && it.valueParameters.size == superType.arguments.size - 1
         }
-        invokeFunction.overriddenSymbols.clear()
-        declaration.addBridge(invokeFunction, functionNInvokeFun.owner)
+        invokeFunction.overridden.clear()
+        declaration.addBridge(invokeFunction, functionNInvokeFun)
 
         return declaration
     }
@@ -104,7 +104,7 @@
             visibility = Visibilities.PUBLIC
             origin = IrDeclarationOrigin.BRIDGE
         }.apply {
-            overriddenSymbols += superFunction.symbol
+            overridden += superFunction
             dispatchReceiverParameter = thisReceiver!!.copyTo(this)
             valueParameters += superFunction.valueParameters.single().copyTo(this)
 
@@ -154,14 +154,14 @@
         }
 
     private val functionNInvokeFun =
-        context.ir.symbols.functionN.functions.single { it.owner.name.toString() == "invoke" }
+        context.ir.symbols.functionN.functions.single { it.name.toString() == "invoke" }
 
     private val arraySizePropertyGetter by lazy {
         context.irBuiltIns.arrayClass.owner.properties.single { it.name.toString() == "size" }.getter!!
     }
 
     private val arrayGetFun by lazy {
-        context.irBuiltIns.arrayClass.functions.single { it.owner.name.toString() == "get" }
+        context.irBuiltIns.arrayClass.functions.single { it.name.toString() == "get" }
     }
 
     private val FUNCTIONS_PACKAGE_FQ_NAME =
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt
index d9324d1..cf23c99 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt
@@ -39,8 +39,6 @@
 import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
 import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
 import org.jetbrains.kotlin.ir.util.dump
 import org.jetbrains.kotlin.ir.util.transformFlat
@@ -59,8 +57,8 @@
             context: JvmBackendContext,
             input: IrModuleFragment
         ): IrModuleFragment {
-            val movedFields = mutableMapOf<IrFieldSymbol, IrFieldSymbol>()
-            val functionDelegates = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
+            val movedFields = mutableMapOf<IrField, IrField>()
+            val functionDelegates = mutableMapOf<IrFunction, IrFunction>()
 
             input.files.addAll(generateMultifileFacades(input.descriptor, context, movedFields, functionDelegates))
 
@@ -99,8 +97,8 @@
 private fun generateMultifileFacades(
     module: ModuleDescriptor,
     context: JvmBackendContext,
-    movedFields: MutableMap<IrFieldSymbol, IrFieldSymbol>,
-    functionDelegates: MutableMap<IrFunctionSymbol, IrFunctionSymbol>
+    movedFields: MutableMap<IrField, IrField>,
+    functionDelegates: MutableMap<IrFunction, IrFunction>
 ): List<IrFile> =
     context.multifileFacadesToAdd.map { (jvmClassName, partClasses) ->
         val fileEntry = MultifileFacadeFileEntry(jvmClassName, partClasses.map(IrClass::fileParent))
@@ -123,7 +121,7 @@
                 if (member is IrFunction) {
                     val newMember = member.createMultifileDelegateIfNeeded(context, facadeClass)
                     if (newMember != null) {
-                        functionDelegates[member.symbol] = newMember.symbol
+                        functionDelegates[member] = newMember
                     }
                 }
             }
@@ -135,7 +133,7 @@
 private fun moveFieldsOfConstProperties(
     partClass: IrClass,
     facadeClass: IrClass,
-    movedFields: MutableMap<IrFieldSymbol, IrFieldSymbol>
+    movedFields: MutableMap<IrField, IrField>
 ) {
     partClass.declarations.transformFlat { member ->
         if (member is IrField && member.shouldMoveToFacade()) {
@@ -143,7 +141,7 @@
                 (it as IrFieldImpl).metadata = member.metadata
             }
             facadeClass.declarations.add(field)
-            movedFields[member.symbol] = field.symbol
+            movedFields[member] = field
             emptyList()
         } else null
     }
@@ -198,29 +196,29 @@
 }
 
 private class UpdateFieldCallSites(
-    private val movedFields: Map<IrFieldSymbol, IrFieldSymbol>
+    private val movedFields: Map<IrField, IrField>
 ) : FileLoweringPass, IrElementTransformerVoid() {
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(this)
     }
 
     override fun visitGetField(expression: IrGetField): IrExpression {
-        val newField = movedFields[expression.symbol] ?: return super.visitGetField(expression)
+        val newField = movedFields[expression.target] ?: return super.visitGetField(expression)
         return expression.run {
-            IrGetFieldImpl(startOffset, endOffset, newField, type, receiver, origin, superQualifierSymbol)
+            IrGetFieldImpl(startOffset, endOffset, newField, type, receiver, origin, irSuperQualifier)
         }
     }
 }
 
 private class UpdateFunctionCallSites(
-    private val functionDelegates: MutableMap<IrFunctionSymbol, IrFunctionSymbol>
+    private val functionDelegates: MutableMap<IrFunction, IrFunction>
 ) : FileLoweringPass, IrElementTransformerVoid() {
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid(this)
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val newFunction = functionDelegates[expression.symbol] ?: return super.visitCall(expression)
+        val newFunction = functionDelegates[expression.target] ?: return super.visitCall(expression)
         return expression.run {
             // TODO: deduplicate this with ReplaceKFunctionInvokeWithFunctionInvoke
             IrCallImpl(startOffset, endOffset, type, newFunction).apply {
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableRefereceToLambda.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableRefereceToLambda.kt
index a17fe24..3002644 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableRefereceToLambda.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InlineCallableRefereceToLambda.kt
@@ -11,7 +11,6 @@
 import org.jetbrains.kotlin.backend.common.ir.copyTo
 import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
 import org.jetbrains.kotlin.backend.common.ir.copyValueParametersToStatic
-import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter
 import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
 import org.jetbrains.kotlin.backend.common.lower.irBlock
 import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
@@ -19,6 +18,7 @@
 import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
 import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall
 import org.jetbrains.kotlin.backend.jvm.codegen.isInlineIrExpression
+import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter
 import org.jetbrains.kotlin.codegen.AsmUtil.BOUND_REFERENCE_RECEIVER
 import org.jetbrains.kotlin.descriptors.Visibilities
 import org.jetbrains.kotlin.ir.builders.*
@@ -55,7 +55,7 @@
         irFile.transformChildrenVoid(object : IrElementTransformerVoidWithContext() {
 
             override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
-                val callee = expression.symbol.owner
+                val callee = expression.target
                 if (callee.isInlineFunctionCall(context)) {
                     for (valueParameter in callee.valueParameters) {
                         if (valueParameter.isInlineParameter()) {
@@ -79,11 +79,11 @@
 
                 //Use getter if field is absent...
                 val field =
-                    expression.field?.owner ?: return functionReferenceToLambda(currentScope!!, expression, expression.getter!!.owner)
+                    expression.field ?: return functionReferenceToLambda(currentScope!!, expression, expression.getter!!)
 
                 //..else use field itself
                 val irBuilder =
-                    context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
+                    context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset)
                 val boundReceiver = expression.dispatchReceiver ?: expression.extensionReceiver
                 return irBuilder.irBlock(expression, IrStatementOrigin.LAMBDA) {
                     lateinit var variableForBoundReceiver: IrVariable
@@ -107,7 +107,7 @@
                                 else -> addValueParameter("receiver", field.parentAsClass.defaultType)
                             }
 
-                        val lambdaBodyBuilder = this@InlineCallableReferenceToLambdaPhase.context.createIrBuilder(this.symbol)
+                        val lambdaBodyBuilder = this@InlineCallableReferenceToLambdaPhase.context.createIrBuilder(this)
                         body = lambdaBodyBuilder.irBlockBody(startOffset, endOffset) {
                             +irReturn(irGetField(if (receiver != null) irGet(receiver) else null, field))
                         }
@@ -116,7 +116,7 @@
 
                     +IrFunctionReferenceImpl(
                         expression.startOffset, expression.endOffset, field.type,
-                        newLambda.symbol, newLambda.symbol.descriptor, 0,
+                        newLambda, newLambda.descriptor, 0,
                         IrStatementOrigin.LAMBDA
                     )
                 }
@@ -124,7 +124,7 @@
 
             override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
                 if (inlinableCR.contains(expression)) {
-                    val referencedFunction = expression.symbol.owner
+                    val referencedFunction = expression.target
                     return functionReferenceToLambda(currentScope!!, expression, referencedFunction)
                 }
 
@@ -139,7 +139,7 @@
         referencedFunction: IrFunction
     ): IrExpression {
         val irBuilder =
-            context.createIrBuilder(scope.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
+            context.createIrBuilder(scope.scope.irScopeOwner, expression.startOffset, expression.endOffset)
 
         val boundReceiver = expression.dispatchReceiver ?: expression.extensionReceiver
         return irBuilder.irBlock(expression, IrStatementOrigin.LAMBDA) {
@@ -173,13 +173,13 @@
                         )
                     }
                 }
-                val lambdaBodyBuilder = this@InlineCallableReferenceToLambdaPhase.context.createIrBuilder(this.symbol)
+                val lambdaBodyBuilder = this@InlineCallableReferenceToLambdaPhase.context.createIrBuilder(this)
                 body = lambdaBodyBuilder.irBlockBody(startOffset, endOffset) {
                     var shift = 0
                     val irCall =
                         if (expression is IrPropertyReference)
-                            irGet(referencedFunction.returnType, null, referencedFunction.symbol)
-                        else irCall(referencedFunction.symbol)
+                            irGet(referencedFunction.returnType, null, referencedFunction)
+                        else irCall(referencedFunction)
 
                     +irReturn(
                         irCall.also { call ->
@@ -207,7 +207,7 @@
 
             +IrFunctionReferenceImpl(
                 expression.startOffset, expression.endOffset, referencedFunction.returnType,
-                newLambda.symbol, newLambda.symbol.descriptor, referencedFunction.typeParameters.size,
+                newLambda, newLambda.descriptor, referencedFunction.typeParameters.size,
                 IrStatementOrigin.LAMBDA
             )
         }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt
index 4b79211..e44793e 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt
@@ -33,7 +33,6 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
 import org.jetbrains.kotlin.ir.util.*
@@ -48,12 +47,12 @@
 )
 
 private class InterfaceDelegationLowering(val context: JvmBackendContext) : IrElementVisitorVoid, FileLoweringPass {
-    val replacementMap = mutableMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
+    val replacementMap = mutableMapOf<IrSimpleFunction, IrSimpleFunction>()
 
     override fun lower(irFile: IrFile) {
         irFile.acceptChildrenVoid(this)
         // TODO: Replacer should be run on whole module, not on a single file.
-        irFile.acceptVoid(OverriddenSymbolsReplacer(replacementMap))
+        irFile.acceptVoid(OverriddenReplacer(replacementMap))
     }
 
     override fun visitElement(element: IrElement) {
@@ -81,9 +80,9 @@
             // In classes, only generate interface delegation for functions immediately inherited from am interface.
             // (Otherwise, delegation will be present in the parent class)
             if (!isDefaultImplsGeneration &&
-                function.overriddenSymbols.any {
-                    (!it.owner.parentAsClass.isInterface || it.owner.hasJvmDefault()) &&
-                            it.owner.modality != Modality.ABSTRACT
+                function.overridden.any {
+                    (!it.parentAsClass.isInterface || it.hasJvmDefault()) &&
+                            it.modality != Modality.ABSTRACT
                 }
             ) {
                 continue
@@ -100,7 +99,7 @@
             val delegation = generateDelegationToDefaultImpl(irClass, implementation, function, isDefaultImplsGeneration)
             if (!isDefaultImplsGeneration) {
                 toRemove.add(function)
-                replacementMap[function.symbol] = delegation.symbol
+                replacementMap[function] = delegation
             }
         }
         irClass.declarations.removeAll(toRemove)
@@ -134,7 +133,7 @@
                 ).apply {
                     descriptor.bind(this)
                     parent = irClass
-                    overriddenSymbols.addAll(inheritedFun.overriddenSymbols)
+                    overridden.addAll(inheritedFun.overridden)
                     copyParameterDeclarationsFrom(inheritedFun)
                     annotations.addAll(inheritedFun.annotations)
 
@@ -155,10 +154,10 @@
 
         irClass.declarations.add(irFunction)
 
-        context.createIrBuilder(irFunction.symbol, UNDEFINED_OFFSET, UNDEFINED_OFFSET).apply {
+        context.createIrBuilder(irFunction, UNDEFINED_OFFSET, UNDEFINED_OFFSET).apply {
             irFunction.body = irBlockBody {
                 +irReturn(
-                    irCall(defaultImplFun.symbol, irFunction.returnType).apply {
+                    irCall(defaultImplFun, irFunction.returnType).apply {
                         var offset = 0
                         passTypeArgumentsFrom(irFunction)
                         irFunction.dispatchReceiverParameter?.let { putValueArgument(offset++, irGet(it)) }
@@ -172,7 +171,7 @@
         return irFunction
     }
 
-    private class OverriddenSymbolsReplacer(val replacementMap: Map<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>) :
+    private class OverriddenReplacer(val replacementMap: Map<IrSimpleFunction, IrSimpleFunction>) :
         IrElementVisitorVoid {
 
         override fun visitElement(element: IrElement) {
@@ -180,7 +179,7 @@
         }
 
         override fun visitSimpleFunction(declaration: IrSimpleFunction) {
-            declaration.overriddenSymbols.replaceAll(UnaryOperator { symbol -> replacementMap[symbol] ?: symbol })
+            declaration.overridden.replaceAll(UnaryOperator { function -> replacementMap[function] ?: function })
             super.visitSimpleFunction(declaration)
         }
     }
@@ -202,10 +201,10 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        if (expression.superQualifierSymbol?.owner?.isInterface != true) {
+        if (expression.irSuperQualifier?.isInterface != true) {
             return super.visitCall(expression)
         }
-        val superCallee = (expression.symbol.owner as IrSimpleFunction).resolveFakeOverride()!!
+        val superCallee = (expression.target as IrSimpleFunction).resolveFakeOverride()!!
         if (superCallee.isDefinitelyNotDefaultImplsMethod()) return super.visitCall(expression)
 
         val redirectTarget = context.declarationFactory.getDefaultImplsFunction(superCallee)
@@ -228,7 +227,7 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val callee = expression.symbol.owner
+        val callee = expression.target
 
         if (callee.parent.safeAs<IrClass>()?.isInterface != true ||
             callee.origin != IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt
index 5462071..ce9ecc3 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt
@@ -20,8 +20,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
 import org.jetbrains.kotlin.ir.expressions.IrReturn
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol
 import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
 import org.jetbrains.kotlin.ir.util.irCall
 import org.jetbrains.kotlin.ir.util.isInterface
@@ -38,7 +36,7 @@
 private class InterfaceLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), ClassLoweringPass {
 
     val state = context.state
-    val removedFunctions = hashMapOf<IrFunctionSymbol, IrFunctionSymbol>()
+    val removedFunctions = hashMapOf<IrFunction, IrFunction>()
 
     override fun lower(irClass: IrClass) {
         if (!irClass.isInterface) return
@@ -53,7 +51,7 @@
             if (function.modality != Modality.ABSTRACT && function.origin != IrDeclarationOrigin.FAKE_OVERRIDE) {
                 val element = context.declarationFactory.getDefaultImplsFunction(function).also {
                     if (shouldRemoveFunction(function))
-                        removedFunctions[function.symbol] = it.symbol
+                        removedFunctions[function] = it
                 }
                 members.add(element)
                 element.body = function.body?.patchDeclarationParents(element)
@@ -73,14 +71,14 @@
         irClass.transformChildrenVoid(this)
 
         irClass.declarations.removeAll {
-            it is IrFunction && removedFunctions.containsKey(it.symbol)
+            it is IrFunction && removedFunctions.containsKey(it)
         }
 
         // Move metadata for local delegated properties from the interface to DefaultImpls, since this is where kotlin-reflect looks for it.
         val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId as IrClass]
         if (localDelegatedProperties != null) {
             context.localDelegatedProperties[defaultImplsIrClass.attributeOwnerId as IrClass] = localDelegatedProperties
-            context.localDelegatedProperties[irClass.attributeOwnerId as IrClass] = emptyList<IrLocalDelegatedPropertySymbol>()
+            context.localDelegatedProperties[irClass.attributeOwnerId as IrClass] = emptyList<IrLocalDelegatedProperty>()
         }
 
         // Move $$delegatedProperties array
@@ -103,28 +101,28 @@
         val startOffset = interfaceMethod.startOffset
         val endOffset = interfaceMethod.endOffset
 
-        return IrCallImpl(startOffset, endOffset, interfaceMethod.returnType, defaultImpls.symbol).apply {
+        return IrCallImpl(startOffset, endOffset, interfaceMethod.returnType, defaultImpls).apply {
             passTypeArgumentsFrom(interfaceMethod)
 
             var offset = 0
             interfaceMethod.dispatchReceiverParameter?.let {
-                putValueArgument(offset++, IrGetValueImpl(startOffset, endOffset, it.symbol))
+                putValueArgument(offset++, IrGetValueImpl(startOffset, endOffset, it))
             }
             interfaceMethod.extensionReceiverParameter?.let {
-                putValueArgument(offset++, IrGetValueImpl(startOffset, endOffset, it.symbol))
+                putValueArgument(offset++, IrGetValueImpl(startOffset, endOffset, it))
             }
             interfaceMethod.valueParameters.forEachIndexed { i, it ->
-                putValueArgument(i + offset, IrGetValueImpl(startOffset, endOffset, it.symbol))
+                putValueArgument(i + offset, IrGetValueImpl(startOffset, endOffset, it))
             }
         }
     }
 
     override fun visitReturn(expression: IrReturn): IrExpression {
-        val newFunction = removedFunctions[expression.returnTargetSymbol]?.owner
+        val newFunction = removedFunctions[expression.irReturnTarget]
         return super.visitReturn(
             if (newFunction != null) {
                 with(expression) {
-                    IrReturnImpl(startOffset, endOffset, type, newFunction.symbol, value)
+                    IrReturnImpl(startOffset, endOffset, type, newFunction, value)
                 }
             } else {
                 expression
@@ -133,7 +131,7 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val newFunction = removedFunctions[expression.symbol]?.owner
+        val newFunction = removedFunctions[expression.target]
         return super.visitCall(
             if (newFunction != null) {
                 irCall(expression, newFunction, receiversAsArguments = true)
@@ -144,7 +142,7 @@
     }
 
     override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
-        val newFunction = removedFunctions[expression.symbol]?.owner
+        val newFunction = removedFunctions[expression.target]
         return super.visitFunctionReference(
             if (newFunction != null) {
                 with(expression) {
@@ -152,7 +150,7 @@
                         startOffset,
                         endOffset,
                         type,
-                        newFunction.symbol,
+                        newFunction,
                         newFunction.descriptor,
                         typeArgumentsCount,
                         origin
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt
index f452ab4..e097cf5 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt
@@ -12,8 +12,6 @@
 import org.jetbrains.kotlin.ir.IrElement
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
-import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
 import org.jetbrains.kotlin.ir.util.isAnonymousObject
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 import org.jetbrains.kotlin.name.Name
@@ -44,7 +42,7 @@
 
     private inner class NameInventor : IrElementVisitor<Unit, Data> {
         private val anonymousClassesCount = mutableMapOf<String, Int>()
-        private val localFunctionNames = mutableMapOf<IrFunctionSymbol, String>()
+        private val localFunctionNames = mutableMapOf<IrFunction, String>()
 
         override fun visitClass(declaration: IrClass, data: Data) {
             if (!data.isLocal) {
@@ -104,7 +102,7 @@
                 declaration.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA -> {
                     inventName(null, data).also { name ->
                         // We save the name of the lambda to reuse it in the reference to it (produced by the closure conversion) later.
-                        localFunctionNames[(declaration as IrFunction).symbol] = name
+                        localFunctionNames[declaration as IrFunction] = name
                     }
                 }
                 declaration is IrFunction && declaration.parent !is IrClass -> {
@@ -129,7 +127,7 @@
         }
 
         override fun visitFunctionReference(expression: IrFunctionReference, data: Data) {
-            val internalName = localFunctionNames[expression.symbol] ?: inventName(null, data)
+            val internalName = localFunctionNames[expression.target] ?: inventName(null, data)
             context.putLocalClassInfo(expression, JvmBackendContext.LocalClassInfo(internalName))
 
             expression.acceptChildren(this, data)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt
index 0e0d74f..ff06443 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmBuiltinOptimizationLowering.kt
@@ -38,7 +38,7 @@
     companion object {
         fun isNegation(expression: IrExpression, context: JvmBackendContext): Boolean =
             expression is IrCall &&
-                    context.state.intrinsics.getIntrinsic(expression.symbol.descriptor) is Not
+                    context.state.intrinsics.getIntrinsic(expression.target.descriptor) is Not
     }
 
     private fun hasNoSideEffectsForNullCompare(expression: IrExpression): Boolean {
@@ -54,11 +54,11 @@
 
 
     private fun getOperandsIfCallToEqeqOrEquals(call: IrCall): Pair<IrExpression, IrExpression>? {
-        if (call.symbol == context.irBuiltIns.eqeqSymbol) {
+        if (call.target == context.irBuiltIns.eqeqSymbol.owner) {
             val left = call.getValueArgument(0)!!
             val right = call.getValueArgument(1)!!
             return left to right
-        } else if (call.symbol.owner.isObjectEquals) {
+        } else if (call.target.isObjectEquals) {
             val left = call.dispatchReceiver!!
             val right = call.getValueArgument(0)!!
             return left to right
@@ -134,7 +134,7 @@
                         expression.startOffset,
                         expression.endOffset,
                         context.irBuiltIns.booleanType,
-                        context.irBuiltIns.andandSymbol
+                        context.irBuiltIns.andandSymbol.owner
                     ).apply {
                         putValueArgument(0, expression.branches[0].condition)
                         putValueArgument(1, expression.branches[0].result)
@@ -155,7 +155,7 @@
                         expression.startOffset,
                         expression.endOffset,
                         context.irBuiltIns.booleanType,
-                        context.irBuiltIns.ororSymbol
+                        context.irBuiltIns.ororSymbol.owner
                     ).apply {
                         putValueArgument(0, expression.branches[0].condition)
                         putValueArgument(1, expression.branches[1].result)
@@ -248,7 +248,7 @@
                     if (first is IrVariable
                         && first.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
                         && second is IrGetValue
-                        && first.symbol == second.symbol) {
+                        && first == second.target) {
                         statements.clear()
                         first.initializer?.let { statements.add(it) }
                     }
@@ -270,7 +270,7 @@
             override fun visitGetValue(expression: IrGetValue): IrExpression {
                 // Replace IrGetValue of an immutable temporary variable with a constant
                 // initializer with the constant initializer.
-                val variable = expression.symbol.owner
+                val variable = expression.target
                 return if (isImmutableTemporaryVariableWithConstantValue(variable))
                     (variable as IrVariable).initializer!!
                 else
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt
index 957bf7d..3f80844 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt
@@ -42,7 +42,7 @@
             return
 
         irClass.addConstructor().apply {
-            val irBuilder = context.createIrBuilder(this.symbol, startOffset, endOffset)
+            val irBuilder = context.createIrBuilder(this, startOffset, endOffset)
             body = irBuilder.irBlockBody {
                 +irDelegatingConstructorCall(primaryConstructor).apply {
                     passTypeArgumentsFrom(irClass)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt
index 37052c3..9a75b80 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt
@@ -27,8 +27,6 @@
 import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrSetVariableImpl
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.classOrNull
 import org.jetbrains.kotlin.ir.types.isNullable
@@ -54,7 +52,7 @@
  */
 private class JvmInlineClassLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() {
     private val manager = MemoizedInlineClassReplacements()
-    private val valueMap = mutableMapOf<IrValueSymbol, IrValueDeclaration>()
+    private val valueMap = mutableMapOf<IrValueDeclaration, IrValueDeclaration>()
 
     override fun lower(irFile: IrFile) {
         irFile.transformChildrenVoid()
@@ -114,15 +112,15 @@
         worker.body = function.body?.transform(this, null)?.patchDeclarationParents(worker)
 
         // Don't create a wrapper for functions which are only used in an unboxed context
-        if (function.overriddenSymbols.isEmpty() || worker.dispatchReceiverParameter != null)
+        if (function.overridden.isEmpty() || worker.dispatchReceiverParameter != null)
             return listOf(worker)
 
         // Replace the function body with a wrapper
-        context.createIrBuilder(function.symbol).run {
+        context.createIrBuilder(function).run {
             val call = irCall(worker).apply {
                 passTypeArgumentsFrom(function)
                 for (parameter in function.explicitParameters) {
-                    val newParameter = replacement.valueParameterMap[parameter.symbol] ?: continue
+                    val newParameter = replacement.valueParameterMap[parameter] ?: continue
                     putArgument(newParameter, irGet(parameter))
                 }
             }
@@ -140,11 +138,11 @@
 
         valueMap.putAll(replacement.valueParameterMap)
         worker.valueParameters.forEach { it.transformChildrenVoid() }
-        worker.body = context.createIrBuilder(worker.symbol).irBlockBody(worker) {
+        worker.body = context.createIrBuilder(worker).irBlockBody(worker) {
             val thisVar = irTemporaryVarDeclaration(
                 worker.returnType, nameHint = "\$this", isMutable = false
             )
-            valueMap[constructor.constructedClass.thisReceiver!!.symbol] = thisVar
+            valueMap[constructor.constructedClass.thisReceiver!!] = thisVar
 
             constructor.body?.statements?.forEach { statement ->
                 +statement
@@ -160,7 +158,7 @@
                         // This is safe, since the delegating constructor call precedes all references to "this".
                         override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
                             expression.transformChildrenVoid()
-                            return irSetVar(thisVar.symbol, expression)
+                            return irSetVar(thisVar, expression)
                         }
 
                         // A constructor body has type unit and may contain explicit return statements.
@@ -177,7 +175,7 @@
                         //     }
                         override fun visitReturn(expression: IrReturn): IrExpression {
                             expression.transformChildrenVoid()
-                            if (expression.returnTargetSymbol != constructor.symbol)
+                            if (expression.irReturnTarget != constructor)
                                 return expression
 
                             return irReturn(irBlock(expression.startOffset, expression.endOffset) {
@@ -210,7 +208,7 @@
         copyTypeArgumentsFrom(original)
         for ((parameter, argument) in typedArgumentList(originalFunction, original)) {
             if (argument == null) continue
-            val newParameter = replacement.valueParameterMap[parameter.symbol] ?: continue
+            val newParameter = replacement.valueParameterMap[parameter] ?: continue
             putArgument(
                 replacement.function,
                 newParameter,
@@ -220,25 +218,25 @@
     }
 
     override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
-        val replacement = manager.getReplacementFunction(expression.symbol.owner)
+        val replacement = manager.getReplacementFunction(expression.target)
             ?: return super.visitFunctionReference(expression)
         val function = replacement.function
 
         return IrFunctionReferenceImpl(
             expression.startOffset, expression.endOffset, expression.type,
-            function.symbol, function.descriptor,
+            function, function.descriptor,
             function.typeParameters.size, function.valueParameters.size,
             expression.origin
         ).apply {
-            buildReplacement(expression.symbol.owner, expression, replacement)
+            buildReplacement(expression.target, expression, replacement)
         }.copyAttributes(expression)
     }
 
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
-        val function = expression.symbol.owner
+        val function = expression.target
         val replacement = manager.getReplacementFunction(function)
             ?: return super.visitFunctionAccess(expression)
-        return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
+        return context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset)
             .irCall(replacement.function).apply {
                 buildReplacement(function, expression, replacement)
             }
@@ -276,7 +274,7 @@
             val equalsMethod = if (rightIsUnboxed) {
                 manager.getSpecializedEqualsMethod(klass, context.irBuiltIns)
             } else {
-                val equals = klass.functions.single { it.name.asString() == "equals" && it.overriddenSymbols.isNotEmpty() }
+                val equals = klass.functions.single { it.name.asString() == "equals" && it.overridden.isNotEmpty() }
                 manager.getReplacementFunction(equals)!!.function
             }
 
@@ -290,8 +288,8 @@
         val rightNullCheck = rightIsUnboxed && right.type.isNullable() // equals-impl has a nullable second argument
         return if (leftNullCheck || rightNullCheck) {
             irBlock {
-                val leftVal = if (left is IrGetValue) left.symbol.owner else irTemporary(left)
-                val rightVal = if (right is IrGetValue) right.symbol.owner else irTemporary(right)
+                val leftVal = if (left is IrGetValue) left.target else irTemporary(left)
+                val rightVal = if (right is IrGetValue) right.target else irTemporary(right)
 
                 val equalsCall = equals(
                     if (leftNullCheck) irImplicitCast(irGet(leftVal), left.type.makeNotNull()) else irGet(leftVal),
@@ -319,14 +317,14 @@
         when {
             // Getting the underlying field of an inline class merely changes the IR type,
             // since the underlying representations are the same.
-            expression.symbol.owner.isInlineClassFieldGetter -> {
+            expression.target.isInlineClassFieldGetter -> {
                 val arg = expression.dispatchReceiver!!.transform(this, null)
-                coerceInlineClasses(arg, expression.symbol.owner.dispatchReceiverParameter!!.type, expression.type)
+                coerceInlineClasses(arg, expression.target.dispatchReceiverParameter!!.type, expression.type)
             }
             // Specialize calls to equals when the left argument is a value of inline class type.
             expression.isSpecializedInlineClassEqEq -> {
                 expression.transformChildrenVoid()
-                context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
+                context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset)
                     .specializeEqualsCall(expression.getValueArgument(0)!!, expression.getValueArgument(1)!!)
                     ?: expression
             }
@@ -338,7 +336,7 @@
         get() {
             // Note that reference equality (x === y) is not allowed on values of inline class type,
             // so it is enough to check for eqeq.
-            if (symbol != context.irBuiltIns.eqeqSymbol)
+            if (target != context.irBuiltIns.eqeqSymbol.owner)
                 return false
 
             val leftClass = getValueArgument(0)?.type?.classOrNull?.owner?.takeIf { it.isInline }
@@ -350,7 +348,7 @@
         }
 
     override fun visitGetField(expression: IrGetField): IrExpression {
-        val field = expression.symbol.owner
+        val field = expression.target
         val parent = field.parent
         if (parent is IrClass && parent.isInline && field.name == parent.inlineClassFieldName) {
             val receiver = expression.receiver!!.transform(this, null)
@@ -360,9 +358,9 @@
     }
 
     override fun visitReturn(expression: IrReturn): IrExpression {
-        expression.returnTargetSymbol.owner.safeAs<IrFunction>()?.let { target ->
+        expression.irReturnTarget.safeAs<IrFunction>()?.let { target ->
             manager.getReplacementFunction(target)?.let {
-                return context.createIrBuilder(it.function.symbol, expression.startOffset, expression.endOffset).irReturn(
+                return context.createIrBuilder(it.function, expression.startOffset, expression.endOffset).irReturn(
                     expression.value.transform(this, null)
                 )
             }
@@ -390,20 +388,20 @@
     }
 
     override fun visitGetValue(expression: IrGetValue): IrExpression {
-        valueMap[expression.symbol]?.let {
+        valueMap[expression.target]?.let {
             return IrGetValueImpl(
                 expression.startOffset, expression.endOffset,
-                it.type, it.symbol, expression.origin
+                it.type, it, expression.origin
             )
         }
         return super.visitGetValue(expression)
     }
 
     override fun visitSetVariable(expression: IrSetVariable): IrExpression {
-        valueMap[expression.symbol]?.let {
+        valueMap[expression.target]?.let {
             return IrSetVariableImpl(
                 expression.startOffset, expression.endOffset,
-                it.type, it.symbol as IrVariableSymbol, expression.origin
+                it.type, it as IrVariable, expression.origin
             ).apply {
                 value = expression.value.transform(this@JvmInlineClassLowering, null)
             }
@@ -420,7 +418,7 @@
             returnType = irConstructor.returnType
         }.apply {
             copyParameterDeclarationsFrom(irConstructor)
-            body = context.createIrBuilder(this.symbol).irBlockBody(this) {
+            body = context.createIrBuilder(this).irBlockBody(this) {
                 +irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
                 +irSetField(
                     irGet(irClass.thisReceiver!!),
@@ -433,7 +431,7 @@
         // Add a static bridge method to the primary constructor.
         // This is a placeholder for null-checks and default arguments.
         val function = manager.getReplacementFunction(irConstructor)!!.function
-        with(context.createIrBuilder(function.symbol)) {
+        with(context.createIrBuilder(function)) {
             val argument = function.valueParameters[0]
             function.body = irExprBody(
                 coerceInlineClasses(irGet(argument), argument.type, function.returnType)
@@ -444,9 +442,9 @@
 
     private fun buildBoxFunction(irClass: IrClass) {
         val function = manager.getBoxFunction(irClass)
-        with(context.createIrBuilder(function.symbol)) {
+        with(context.createIrBuilder(function)) {
             function.body = irExprBody(
-                irCall(irClass.primaryConstructor!!.symbol).apply {
+                irCall(irClass.primaryConstructor!!).apply {
                     passTypeArgumentsFrom(function)
                     putValueArgument(0, irGet(function.valueParameters[0]))
                 }
@@ -457,7 +455,7 @@
 
     private fun buildUnboxFunction(irClass: IrClass) {
         val function = manager.getUnboxFunction(irClass)
-        val builder = context.createIrBuilder(function.symbol)
+        val builder = context.createIrBuilder(function)
         val field = getInlineClassBackingField(irClass)
 
         function.body = builder.irBlockBody {
@@ -474,7 +472,7 @@
         val right = function.valueParameters[1]
         val type = left.type.unboxInlineClass()
 
-        function.body = context.createIrBuilder(irClass.symbol).run {
+        function.body = context.createIrBuilder(irClass).run {
             irExprBody(
                 irEquals(
                     coerceInlineClasses(irGet(left), left.type, type),
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt
index 3df3854..874b044 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLowering.kt
@@ -56,19 +56,19 @@
         val wrapperIrFunction = generateWrapperHeader(target, numDefaultParametersToExpect)
 
         val call = if (target is IrConstructor)
-            IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target.symbol, target.descriptor)
+            IrDelegatingConstructorCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.unitType, target, target.descriptor)
         else
-            IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol)
+            IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target)
         call.dispatchReceiver = wrapperIrFunction.dispatchReceiverParameter?.let { dispatchReceiver ->
             IrGetValueImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                dispatchReceiver.symbol
+                dispatchReceiver
             )
         }
         call.extensionReceiver = wrapperIrFunction.extensionReceiverParameter?.let { extensionReceiver ->
             IrGetValueImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                extensionReceiver.symbol
+                extensionReceiver
             )
         }
 
@@ -82,7 +82,7 @@
                         i,
                         IrGetValueImpl(
                             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                            wrapperIrFunction.valueParameters[parametersCopied++].symbol
+                            wrapperIrFunction.valueParameters[parametersCopied++]
                         )
                     )
                 } else {
@@ -93,7 +93,7 @@
                     i,
                     IrGetValueImpl(
                         UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                        wrapperIrFunction.valueParameters[parametersCopied++].symbol
+                        wrapperIrFunction.valueParameters[parametersCopied++]
                     )
                 )
             }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt
index 9c4ab89..d2ba1f7 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt
@@ -126,8 +126,7 @@
 
     private fun createProxyBody(target: IrFunction, proxy: IrFunction, companion: IrClass): IrBody {
         val companionInstanceField = context.declarationFactory.getFieldForObjectInstance(companion)
-        val companionInstanceFieldSymbol = companionInstanceField.symbol
-        val call = IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target.symbol)
+        val call = IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, target.returnType, target)
 
         call.passTypeArgumentsFrom(proxy)
 
@@ -135,7 +134,7 @@
             call.dispatchReceiver = IrGetFieldImpl(
                 UNDEFINED_OFFSET,
                 UNDEFINED_OFFSET,
-                companionInstanceFieldSymbol,
+                companionInstanceField,
                 companion.defaultType
             )
         }
@@ -143,7 +142,7 @@
             call.extensionReceiver = IrGetValueImpl(
                 UNDEFINED_OFFSET,
                 UNDEFINED_OFFSET,
-                extensionReceiver.symbol
+                extensionReceiver
             )
         }
         proxy.valueParameters.mapIndexed { i, valueParameter ->
@@ -152,7 +151,7 @@
                 IrGetValueImpl(
                     UNDEFINED_OFFSET,
                     UNDEFINED_OFFSET,
-                    valueParameter.symbol
+                    valueParameter
                 )
             )
         }
@@ -191,8 +190,8 @@
     val context: JvmBackendContext
 ) : IrElementTransformerVoid() {
     override fun visitCall(expression: IrCall): IrExpression {
-        if (expression.symbol.owner.isJvmStaticInSingleton() && expression.dispatchReceiver != null) {
-            return context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset).irBlock(expression) {
+        if (expression.target.isJvmStaticInSingleton() && expression.dispatchReceiver != null) {
+            return context.createIrBuilder(expression.target, expression.startOffset, expression.endOffset).irBlock(expression) {
                 // OldReceiver has to be evaluated for its side effects.
                 val oldReceiver = super.visitExpression(expression.dispatchReceiver!!)
                 // `coerceToUnit()` is private in InsertImplicitCasts, have to reproduce it here
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt
index 57eac2a..d1d49c1 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLowering.kt
@@ -23,7 +23,6 @@
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetEnumValueImpl
 import org.jetbrains.kotlin.ir.types.getClass
 import org.jetbrains.kotlin.ir.util.*
-import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.util.OperatorNameConventions
 
@@ -60,9 +59,9 @@
 //
 private class MappedEnumWhenLowering(context: CommonBackendContext) : EnumWhenLowering(context) {
     private val intArray = context.irBuiltIns.primitiveArrayForType.getValue(context.irBuiltIns.intType)
-    private val intArrayConstructor = intArray.constructors.single { it.owner.valueParameters.size == 1 }
-    private val intArrayGet = intArray.functions.single { it.owner.name == OperatorNameConventions.GET }
-    private val intArraySet = intArray.functions.single { it.owner.name == OperatorNameConventions.SET }
+    private val intArrayConstructor = intArray.constructors.single { it.valueParameters.size == 1 }
+    private val intArrayGet = intArray.functions.single { it.name == OperatorNameConventions.GET }
+    private val intArraySet = intArray.functions.single { it.name == OperatorNameConventions.SET }
     private val refArraySize = context.irBuiltIns.arrayClass.owner.properties.single { it.name.toString() == "size" }.getter!!
 
     // To avoid visibility-related issues, classes containing the mappings are direct children
@@ -110,13 +109,13 @@
 
         for ((enum, mappingAndField) in state!!.mappings) {
             val (mapping, field) = mappingAndField
-            val builder = context.createIrBuilder(state!!.mappingsClass.symbol)
+            val builder = context.createIrBuilder(state!!.mappingsClass)
             val enumValues = enum.functions.single { it.name.toString() == "values" }
             field.initializer = builder.irExprBody(builder.irBlock {
                 val enumSize = irCall(refArraySize).apply { dispatchReceiver = irCall(enumValues) }
                 val result = irTemporary(irCall(intArrayConstructor).apply { putValueArgument(0, enumSize) })
                 for ((entry, index) in mapping) {
-                    val runtimeEntry = IrGetEnumValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, enum.defaultType, entry.symbol)
+                    val runtimeEntry = IrGetEnumValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, enum.defaultType, entry)
                     +irCall(intArraySet).apply {
                         dispatchReceiver = irGet(result)
                         putValueArgument(0, super.mapRuntimeEnumEntry(builder, runtimeEntry)) // <entry>.ordinal()
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt
index 98b2751..a58adde 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt
@@ -23,7 +23,6 @@
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
 import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
@@ -42,7 +41,7 @@
 
 private class MoveOrCopyCompanionObjectFieldsLowering(val context: CommonBackendContext) : ClassLoweringPass {
     override fun lower(irClass: IrClass) {
-        val fieldReplacementMap = mutableMapOf<IrFieldSymbol, IrFieldSymbol>()
+        val fieldReplacementMap = mutableMapOf<IrField, IrField>()
         if (irClass.isObject && !irClass.isCompanion && irClass.visibility != Visibilities.LOCAL) {
             handleObject(irClass, fieldReplacementMap)
         } else {
@@ -53,7 +52,7 @@
         irClass.replaceFieldReferences(fieldReplacementMap)
     }
 
-    private fun handleObject(irObject: IrClass, fieldReplacementMap: MutableMap<IrFieldSymbol, IrFieldSymbol>) {
+    private fun handleObject(irObject: IrClass, fieldReplacementMap: MutableMap<IrField, IrField>) {
         irObject.declarations.replaceAll {
             when (it) {
                 is IrProperty -> {
@@ -67,7 +66,7 @@
         }
     }
 
-    private fun handleClass(irClass: IrClass, fieldReplacementMap: MutableMap<IrFieldSymbol, IrFieldSymbol>) {
+    private fun handleClass(irClass: IrClass, fieldReplacementMap: MutableMap<IrField, IrField>) {
         val companion = irClass.declarations.find {
             it is IrClass && it.isCompanion
         } as IrClass? ?: return
@@ -114,7 +113,7 @@
         irProperty: IrProperty,
         propertyParent: IrClass,
         fieldParent: IrClass,
-        fieldReplacementMap: MutableMap<IrFieldSymbol, IrFieldSymbol>? = null
+        fieldReplacementMap: MutableMap<IrField, IrField>? = null
     ): IrField? {
         if (irProperty.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return null
         val oldField = irProperty.backingField ?: return null
@@ -123,7 +122,7 @@
         fieldReplacementMap?.run {
             irProperty.backingField = newField
             newField.correspondingPropertySymbol = irProperty.symbol
-            put(oldField.symbol, newField.symbol)
+            put(oldField, newField)
         }
 
         return newField
@@ -133,7 +132,7 @@
         irProperty: IrProperty,
         propertyParent: IrClass,
         fieldParent: IrClass,
-        fieldReplacementMap: MutableMap<IrFieldSymbol, IrFieldSymbol>? = null
+        fieldReplacementMap: MutableMap<IrField, IrField>? = null
     ): IrField? = moveOrCopyPropertyFieldToStaticParent(irProperty, propertyParent, fieldParent, fieldReplacementMap)
 
     private fun copyPropertyFieldToStaticParent(
@@ -149,7 +148,7 @@
     ): IrAnonymousInitializer =
         with(oldInitializer) {
             IrAnonymousInitializerImpl(
-                startOffset, endOffset, origin, IrAnonymousInitializerSymbolImpl(newParent.symbol),
+                startOffset, endOffset, origin, IrAnonymousInitializerSymbolImpl(newParent),
                 isStatic = true
             ).apply {
                 parent = newParent
@@ -184,18 +183,18 @@
                 }
 
                 override fun visitGetValue(expression: IrGetValue): IrExpression {
-                    if (expression.symbol.owner == oldParent.thisReceiver) {
+                    if (expression.target == oldParent.thisReceiver) {
                         return IrGetFieldImpl(
                             expression.startOffset, expression.endOffset,
-                            objectInstanceField.symbol,
+                            objectInstanceField,
                             expression.type
                         )
                     }
-                    variableMap[expression.symbol.owner]?.let { newVariable ->
+                    variableMap[expression.target]?.let { newVariable ->
                         return IrGetValueImpl(
                             expression.startOffset, expression.endOffset,
                             expression.type,
-                            newVariable.symbol,
+                            newVariable,
                             expression.origin
                         )
                     }
@@ -231,33 +230,33 @@
     }
 }
 
-private fun IrElement.replaceFieldReferences(replacementMap: Map<IrFieldSymbol, IrFieldSymbol>) {
+private fun IrElement.replaceFieldReferences(replacementMap: Map<IrField, IrField>) {
     transformChildrenVoid(FieldReplacer(replacementMap))
 }
 
-private class FieldReplacer(val replacementMap: Map<IrFieldSymbol, IrFieldSymbol>) : IrElementTransformerVoid() {
+private class FieldReplacer(val replacementMap: Map<IrField, IrField>) : IrElementTransformerVoid() {
     override fun visitGetField(expression: IrGetField): IrExpression =
-        replacementMap[expression.symbol]?.let { newSymbol ->
+        replacementMap[expression.target]?.let { newSymbol ->
             IrGetFieldImpl(
                 expression.startOffset, expression.endOffset,
                 newSymbol,
                 expression.type,
                 /* receiver = */ null,
                 expression.origin,
-                expression.superQualifierSymbol
+                expression.irSuperQualifier
             )
         } ?: super.visitGetField(expression)
 
     override fun visitSetField(expression: IrSetField): IrExpression =
-        replacementMap[expression.symbol]?.let { _ ->
+        replacementMap[expression.target]?.let { _ ->
             IrSetFieldImpl(
                 expression.startOffset, expression.endOffset,
-                replacementMap.getValue(expression.symbol),
+                replacementMap.getValue(expression.target),
                 /* receiver = */ null,
                 visitExpression(expression.value),
                 expression.type,
                 expression.origin,
-                expression.superQualifierSymbol
+                expression.irSuperQualifier
             )
         } ?: super.visitSetField(expression)
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt
index 5ab87c4..f5d3d52 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt
@@ -71,7 +71,7 @@
             ).apply {
                 privateFieldDescriptor.bind(this)
                 parent = irClass
-                with(context.createIrBuilder(symbol)) {
+                with(context.createIrBuilder(this)) {
                     initializer = irExprBody(
                         irCall(constructor)
                     )
@@ -79,12 +79,12 @@
                 pendingTransformations.add { parentAsClass.declarations.add(this) }
             }
 
-            with(context.createIrBuilder(publicInstanceField.symbol)) {
+            with(context.createIrBuilder(publicInstanceField)) {
                 publicInstanceField.initializer = irExprBody(irGetField(null, privateField))
             }
         } else {
-            with(context.createIrBuilder(publicInstanceField.symbol)) {
-                publicInstanceField.initializer = irExprBody(irCall(constructor.symbol))
+            with(context.createIrBuilder(publicInstanceField)) {
+                publicInstanceField.initializer = irExprBody(irCall(constructor))
             }
         }
 
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesToFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesToFieldsLowering.kt
index 71ae531..40b5df9 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesToFieldsLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesToFieldsLowering.kt
@@ -46,7 +46,7 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val simpleFunction = (expression.symbol.owner as? IrSimpleFunction) ?: return super.visitCall(expression)
+        val simpleFunction = (expression.target as? IrSimpleFunction) ?: return super.visitCall(expression)
         val property = simpleFunction.correspondingPropertySymbol?.owner ?: return super.visitCall(expression)
 
         if (shouldSubstituteAccessorWithField(property, simpleFunction)) {
@@ -79,12 +79,12 @@
         val setExpr = IrSetFieldImpl(
             expression.startOffset,
             expression.endOffset,
-            backingField.symbol,
+            backingField,
             receiver,
             expression.getValueArgument(expression.valueArgumentsCount - 1)!!.transform(this, null),
             expression.type,
             expression.origin,
-            expression.superQualifierSymbol
+            expression.irSuperQualifier
         )
         return buildSubstitution(backingField.isStatic, setExpr, receiver)
     }
@@ -95,11 +95,11 @@
         val getExpr = IrGetFieldImpl(
             expression.startOffset,
             expression.endOffset,
-            backingField.symbol,
+            backingField,
             expression.type,
             receiver,
             expression.origin,
-            expression.superQualifierSymbol
+            expression.irSuperQualifier
         )
         return buildSubstitution(backingField.isStatic, getExpr, receiver)
     }
@@ -107,7 +107,7 @@
     private fun buildSubstitution(needBlock: Boolean, setOrGetExpr: IrFieldAccessExpression, receiver: IrExpression?): IrExpression {
         if (receiver != null && needBlock) {
             // Evaluate `dispatchReceiver` for the sake of its side effects, then return `setOrGetExpr`.
-            return context.createIrBuilder(setOrGetExpr.symbol, setOrGetExpr.startOffset, setOrGetExpr.endOffset).irBlock(setOrGetExpr) {
+            return context.createIrBuilder(setOrGetExpr.target, setOrGetExpr.startOffset, setOrGetExpr.endOffset).irBlock(setOrGetExpr) {
                 // `coerceToUnit()` is private in InsertImplicitCasts, have to reproduce it here
                 val receiverVoid = IrTypeOperatorCallImpl(
                     receiver.startOffset, receiver.endOffset,
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt
index 6942a6e..b1cd920 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt
@@ -24,7 +24,6 @@
 import org.jetbrains.kotlin.ir.builders.declarations.buildField
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.*
 import org.jetbrains.kotlin.ir.types.createType
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
 import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
@@ -44,16 +43,16 @@
 internal class PropertyReferenceLowering(val context: JvmBackendContext) : ClassLoweringPass {
     // Reflection metadata for local properties is serialized under the signature "<v#$N>" attached to the containing class.
     // This maps properties to values of N.
-    private val localPropertyIndices = mutableMapOf<IrSymbol, Int>()
+    private val localPropertyIndices = mutableMapOf<IrSymbolOwner, Int>()
 
     // TODO: join IrLocalDelegatedPropertyReference and IrPropertyReference via the class hierarchy?
-    private val IrMemberAccessExpression.getter: IrSimpleFunctionSymbol?
+    private val IrMemberAccessExpression.getter: IrSimpleFunction?
         get() = (this as? IrPropertyReference)?.getter ?: (this as? IrLocalDelegatedPropertyReference)?.getter
 
-    private val IrMemberAccessExpression.setter: IrSimpleFunctionSymbol?
+    private val IrMemberAccessExpression.setter: IrSimpleFunction?
         get() = (this as? IrPropertyReference)?.setter ?: (this as? IrLocalDelegatedPropertyReference)?.setter
 
-    private val IrMemberAccessExpression.field: IrFieldSymbol?
+    private val IrMemberAccessExpression.field: IrField?
         get() = (this as? IrPropertyReference)?.field
 
     private val IrSimpleFunction.signature: String
@@ -67,7 +66,7 @@
     private val IrMemberAccessExpression.signature: String
         get() = getter?.let { getter ->
             localPropertyIndices[getter]?.let { "<v#$it>" }
-        } ?: getter?.owner?.signature ?: field!!.owner.signature
+        } ?: getter?.signature ?: field!!.signature
 
     private val arrayItemGetter =
         context.ir.symbols.array.owner.functions.single { it.name.asString() == "get" }
@@ -84,7 +83,7 @@
 
     private val IrMemberAccessExpression.propertyContainer: IrDeclarationParent
         get() {
-            var current: IrDeclaration = getter?.owner ?: field?.owner ?: error("Property without getter or field: ${dump()}")
+            var current: IrDeclaration = getter ?: field ?: error("Property without getter or field: ${dump()}")
             while (current.parent is IrFunction)
                 current = current.parent as IrFunction // Local delegated property.
             return current.parent
@@ -103,7 +102,7 @@
             visibility = method.visibility
             origin = this@addOverride.origin
         }.apply {
-            overriddenSymbols.add(method.symbol)
+            overridden.add(method)
             dispatchReceiverParameter = thisReceiver!!.copyTo(this)
             for (parameter in method.valueParameters)
                 valueParameters.add(parameter.copyTo(this))
@@ -113,19 +112,19 @@
         }
 
     private class PropertyReferenceKind(
-        val interfaceSymbol: IrClassSymbol,
-        val reflectedSymbol: IrClassSymbol,
+        val interfaceClass: IrClass,
+        val reflected: IrClass,
         val wrapper: IrFunction
     )
 
     private fun propertyReferenceKind(mutable: Boolean, i: Int) = PropertyReferenceKind(
         context.ir.symbols.getPropertyReferenceClass(mutable, i, false),
         context.ir.symbols.getPropertyReferenceClass(mutable, i, true),
-        context.ir.symbols.reflection.owner.functions.single { it.name.asString() == (if (mutable) "mutableProperty$i" else "property$i") }
+        context.ir.symbols.reflection.functions.single { it.name.asString() == (if (mutable) "mutableProperty$i" else "property$i") }
     )
 
     private fun propertyReferenceKindFor(expression: IrMemberAccessExpression): PropertyReferenceKind =
-        expression.getter?.owner?.let {
+        expression.getter?.let {
             val boundReceivers = listOfNotNull(expression.dispatchReceiver, expression.extensionReceiver).size
             val needReceivers = listOfNotNull(it.dispatchReceiverParameter, it.extensionReceiverParameter).size
             // PropertyReference1 will swap the receivers if bound with the extension one, and PropertyReference0
@@ -133,14 +132,14 @@
             if (boundReceivers == 2 || (expression.extensionReceiver != null && needReceivers == 2))
                 TODO("property reference with 2 receivers")
             propertyReferenceKind(expression.setter != null, needReceivers - boundReceivers)
-        } ?: expression.field?.owner?.let {
+        } ?: expression.field?.let {
             propertyReferenceKind(!it.isFinal, if (it.isStatic || expression.dispatchReceiver != null) 0 else 1)
         } ?: throw AssertionError("property has no getter and no field: ${expression.dump()}")
 
     private data class PropertyInstance(val initializer: IrExpression, val index: Int)
 
     override fun lower(irClass: IrClass) {
-        val kProperties = mutableMapOf<IrSymbol, PropertyInstance>()
+        val kProperties = mutableMapOf<IrSymbolOwner, PropertyInstance>()
         val kPropertiesField = buildField {
             name = Name.identifier(JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME)
             type = kPropertiesFieldType
@@ -153,7 +152,7 @@
 
         irClass.transformChildrenVoid(object : IrElementTransformerVoidWithContext() {
             override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrStatement {
-                localPropertyIndices[declaration.getter.symbol] = localPropertiesInClass++
+                localPropertyIndices[declaration.getter] = localPropertiesInClass++
                 return super.visitLocalDelegatedProperty(declaration)
             }
 
@@ -169,8 +168,8 @@
 
                 // For delegated properties, the getter and setter contain a reference each as the second argument to getValue
                 // and setValue. Since it's highly unlikely that anyone will call get/set on these, optimize for space.
-                return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset).run {
-                    val (_, index) = kProperties.getOrPut(expression.symbol) {
+                return context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset).run {
+                    val (_, index) = kProperties.getOrPut(expression.target) {
                         PropertyInstance(createReflectedKProperty(expression), kProperties.size)
                     }
                     irCall(arrayItemGetter).apply {
@@ -185,9 +184,9 @@
             // Example: `C::property` -> `Reflection.property1(PropertyReference1Impl(C::class, "property", "getProperty()LType;"))`.
             private fun createReflectedKProperty(expression: IrCallableReference): IrExpression {
                 val referenceKind = propertyReferenceKindFor(expression)
-                return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset).run {
+                return context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset).run {
                     irCall(referenceKind.wrapper).apply {
-                        putValueArgument(0, irCall(referenceKind.reflectedSymbol.constructors.single()).apply {
+                        putValueArgument(0, irCall(referenceKind.reflected.constructors.single()).apply {
                             putValueArgument(0, buildReflectedContainerReference(expression))
                             putValueArgument(1, irString(expression.descriptor.name.asString()))
                             putValueArgument(2, irString(expression.signature))
@@ -212,7 +211,7 @@
             //
             private fun createSpecializedKProperty(expression: IrCallableReference): IrExpression {
                 val referenceClass = createKPropertySubclass(expression)
-                return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
+                return context.createIrBuilder(currentScope!!.scope.irScopeOwner, expression.startOffset, expression.endOffset)
                     .irBlock {
                         +referenceClass
                         +irCall(referenceClass.constructors.single()).apply {
@@ -224,10 +223,10 @@
             }
 
             private fun createKPropertySubclass(expression: IrCallableReference): IrClass {
-                val superClass = propertyReferenceKindFor(expression).interfaceSymbol.owner
+                val superClass = propertyReferenceKindFor(expression).interfaceClass
                 val referenceClass = buildClass {
                     setSourceRange(expression)
-                    name = Name.special("<property reference to ${(expression.symbol.owner as IrDeclarationWithName).fqNameWhenAvailable}>")
+                    name = Name.special("<property reference to ${(expression.target as IrDeclarationWithName).fqNameWhenAvailable}>")
                     origin = JvmLoweredDeclarationOrigin.GENERATED_PROPERTY_REFERENCE
                     visibility = Visibilities.LOCAL
                 }.apply {
@@ -251,18 +250,18 @@
                 referenceClass.addOverride(getOwner) { buildReflectedContainerReference(expression) }
                 referenceClass.addOverride(getSignature) { irString(expression.signature) }
 
-                val field = expression.field?.owner
+                val field = expression.field
                 if (field == null) {
                     fun IrBuilderWithScope.setCallArguments(call: IrCall, arguments: List<IrValueParameter>) {
                         var index = 1
                         call.copyTypeArgumentsFrom(expression)
-                        call.dispatchReceiver = call.symbol.owner.dispatchReceiverParameter?.let {
+                        call.dispatchReceiver = call.target.dispatchReceiverParameter?.let {
                             if (expression.dispatchReceiver != null)
                                 irImplicitCast(irGetField(irGet(arguments[0]), receiverField), it.type)
                             else
                                 irImplicitCast(irGet(arguments[index++]), it.type)
                         }
-                        call.extensionReceiver = call.symbol.owner.extensionReceiverParameter?.let {
+                        call.extensionReceiver = call.target.extensionReceiverParameter?.let {
                             if (expression.extensionReceiver != null)
                                 irImplicitCast(irGetField(irGet(arguments[0]), receiverField), it.type)
                             else
@@ -270,17 +269,17 @@
                         }
                     }
 
-                    expression.getter?.owner?.let { getter ->
+                    expression.getter?.let { getter ->
                         referenceClass.addOverride(get!!) { arguments ->
-                            irGet(getter.returnType, null, getter.symbol).apply {
+                            irGet(getter.returnType, null, getter).apply {
                                 setCallArguments(this, arguments)
                             }
                         }
                     }
 
-                    expression.setter?.owner?.let { setter ->
+                    expression.setter?.let { setter ->
                         referenceClass.addOverride(set!!) { arguments ->
-                            irSet(setter.returnType, null, setter.symbol, irGet(arguments.last())).apply {
+                            irSet(setter.returnType, null, setter, irGet(arguments.last())).apply {
                                 setCallArguments(this, arguments)
                             }
                         }
@@ -314,14 +313,14 @@
         if (kProperties.isNotEmpty()) {
             irClass.declarations.add(0, kPropertiesField.apply {
                 parent = irClass
-                initializer = context.createJvmIrBuilder(irClass.symbol).run {
+                initializer = context.createJvmIrBuilder(irClass).run {
                     val initializers = kProperties.values.sortedBy { it.index }.map { it.initializer }
                     irExprBody(irArrayOf(kPropertiesFieldType, initializers))
                 }
             })
 
             context.localDelegatedProperties[irClass.attributeOwnerId as IrClass] =
-                kProperties.keys.filterIsInstance<IrLocalDelegatedPropertySymbol>()
+                kProperties.keys.filterIsInstance<IrLocalDelegatedProperty>()
         }
     }
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDeclarationsThatWouldBeInlinedLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDeclarationsThatWouldBeInlinedLowering.kt
index e5fc95b..bb554c4 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDeclarationsThatWouldBeInlinedLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDeclarationsThatWouldBeInlinedLowering.kt
@@ -37,7 +37,7 @@
 
             override fun visitFunctionReference(expression: IrFunctionReference) {
                 assert(expression.origin == IrStatementOrigin.LAMBDA || expression.origin == IrStatementOrigin.ANONYMOUS_FUNCTION)
-                loweredLambdasToDelete.add(expression.symbol.owner)
+                loweredLambdasToDelete.add(expression.target)
                 expression.acceptChildrenVoid(this)
             }
         })
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt
index 58bef2c..8e05e8e 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLowering.kt
@@ -20,7 +20,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrSetField
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
 import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
 import org.jetbrains.kotlin.ir.util.hasAnnotation
 import org.jetbrains.kotlin.ir.util.patchDeclarationParents
@@ -74,7 +73,7 @@
         val renamer = FieldRenamer(newNames)
         irFile.transform(renamer, null)
 
-        irFile.transform(FieldAccessTransformer(renamer.newSymbols), null)
+        irFile.transform(FieldAccessTransformer(renamer.newFields), null)
     }
 
     private val IrField.isJvmField: Boolean
@@ -94,7 +93,7 @@
 }
 
 private class FieldRenamer(private val newNames: Map<IrField, Name>) : IrElementTransformerVoid() {
-    val newSymbols = mutableMapOf<IrField, IrFieldSymbol>()
+    val newFields = mutableMapOf<IrField, IrField>()
 
     override fun visitField(declaration: IrField): IrStatement {
         val newName = newNames[declaration] ?: return super.visitField(declaration)
@@ -112,31 +111,31 @@
                 ?.patchDeclarationParents(it)
             it.metadata = declaration.metadata
 
-            newSymbols[declaration] = symbol
+            newFields[declaration] = it
         }
     }
 }
 
-private class FieldAccessTransformer(private val oldToNew: Map<IrField, IrFieldSymbol>) : IrElementTransformerVoid() {
+private class FieldAccessTransformer(private val oldToNew: Map<IrField, IrField>) : IrElementTransformerVoid() {
     override fun visitGetField(expression: IrGetField): IrExpression {
-        val newSymbol = oldToNew[expression.symbol.owner] ?: return super.visitGetField(expression)
+        val newField = oldToNew[expression.target] ?: return super.visitGetField(expression)
 
         return IrGetFieldImpl(
-            expression.startOffset, expression.endOffset, newSymbol, expression.type,
+            expression.startOffset, expression.endOffset, newField, expression.type,
             expression.receiver?.transform(this, null),
-            expression.origin, expression.superQualifierSymbol
+            expression.origin, expression.irSuperQualifier
         )
     }
 
     override fun visitSetField(expression: IrSetField): IrExpression {
-        val newSymbol = oldToNew[expression.symbol.owner] ?: return super.visitSetField(expression)
+        val newField = oldToNew[expression.target] ?: return super.visitSetField(expression)
 
         return IrSetFieldImpl(
-            expression.startOffset, expression.endOffset, newSymbol,
+            expression.startOffset, expression.endOffset, newField,
             expression.receiver?.transform(this, null),
             expression.value.transform(this, null),
             expression.type,
-            expression.origin, expression.superQualifierSymbol
+            expression.origin, expression.irSuperQualifier
         )
     }
 }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt
index 8752e67..806a93c 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvoke.kt
@@ -39,14 +39,14 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val callee = expression.symbol.owner
+        val callee = expression.target
         if (callee !is IrSimpleFunction || callee.name != OperatorNameConventions.INVOKE) return super.visitCall(expression)
 
         val parentClass = callee.parent as? IrClass ?: return super.visitCall(expression)
         if (!parentClass.defaultType.isKFunction() && !parentClass.defaultType.isKSuspendFunction()) return super.visitCall(expression)
 
         // The single overridden function of KFunction{n}.invoke must be Function{n}.invoke.
-        val newCallee = callee.overriddenSymbols.single()
+        val newCallee = callee.overridden.single()
         return expression.run {
             IrCallImpl(startOffset, endOffset, type, newCallee).apply {
                 copyTypeArgumentsFrom(expression)
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt
index 9c0da7b..7e167a7 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt
@@ -74,7 +74,7 @@
             return super.visitTypeOperator(expression)
         val superType = expression.typeOperand
         val invokable = expression.argument.transform(this, null)
-        context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol).apply {
+        context.createIrBuilder(currentScope!!.scope.irScopeOwner).apply {
             // Do not generate a wrapper class for null, it has no invoke() anyway.
             if (invokable.isNullConst())
                 return invokable
@@ -142,7 +142,7 @@
             body = context.createIrBuilder(symbol).irBlockBody(startOffset, endOffset) {
                 +irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
                 +irSetField(irGet(subclass.thisReceiver!!), field, irGet(parameter))
-                +IrInstanceInitializerCallImpl(startOffset, endOffset, subclass.symbol, context.irBuiltIns.unitType)
+                +IrInstanceInitializerCallImpl(startOffset, endOffset, subclass, context.irBuiltIns.unitType)
             }
         }
 
@@ -153,7 +153,7 @@
             visibility = superMethod.visibility
             origin = subclass.origin
         }.apply {
-            overriddenSymbols += superMethod.symbol
+            overridden += superMethod
             dispatchReceiverParameter = subclass.thisReceiver!!.copyTo(this)
             superMethod.valueParameters.mapTo(valueParameters) { it.copyTo(this) }
             val invokableClass = invokableType.classifierOrFail.owner as IrClass
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt
index 0924e66..34d4112 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt
@@ -36,14 +36,14 @@
     }
 
     override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrExpression {
-        constructingEnums.push(expression.symbol.owner.parent)
+        constructingEnums.push(expression.target.parent)
         val call = super.visitEnumConstructorCall(expression)
         constructingEnums.pop()
         return call
     }
 
     override fun visitGetEnumValue(expression: IrGetEnumValue): IrExpression {
-        val candidate = expression.symbol.owner.correspondingClass
+        val candidate = expression.target.correspondingClass
 
         return if (candidate != null && isInScope(candidate) && !isVisitingSuperConstructor(candidate)) {
             // Replace `SomeEnumClass.SomeEnumEntry` with `this`, if possible.
@@ -51,16 +51,16 @@
             // SomeEnumEntry is a singleton, which is assigned (SETFIELD) to SomeEnumClass after the construction of the singleton is done.
             // Therefore, during the construction of SomeEnumEntry, SomeEnumClass.SomeEnumEntry isn't available yet. All references to it
             // must be replaced with `SomeEnumEntry.this`.
-            IrGetValueImpl(expression.startOffset, expression.endOffset, expression.type, candidate.thisReceiver!!.symbol)
+            IrGetValueImpl(expression.startOffset, expression.endOffset, expression.type, candidate.thisReceiver!!)
         } else {
-            val entrySymbol = context.declarationFactory.getFieldForEnumEntry(expression.symbol.owner, expression.type)
-            IrGetFieldImpl(expression.startOffset, expression.endOffset, entrySymbol.symbol, expression.type)
+            val entry = context.declarationFactory.getFieldForEnumEntry(expression.target, expression.type)
+            IrGetFieldImpl(expression.startOffset, expression.endOffset, entry, expression.type)
         }
     }
 
     override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
-        val instanceField = context.declarationFactory.getFieldForObjectInstance(expression.symbol.owner)
-        return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceField.symbol, expression.type)
+        val instanceField = context.declarationFactory.getFieldForObjectInstance(expression.target)
+        return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceField, expression.type)
     }
 
     // `this` is generally available while the reference is within the lexical scope of the containing enum entry.
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt
index 7ae0572..850b26b 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLowering.kt
@@ -73,10 +73,10 @@
 
     override fun visitReturn(expression: IrReturn): IrExpression {
         return super.visitReturn(
-            if (context.staticDefaultStubs.containsKey(expression.returnTargetSymbol)) {
+            if (context.staticDefaultStubs.containsKey(expression.irReturnTarget)) {
                 with(expression) {
-                    val irFunction = context.staticDefaultStubs[expression.returnTargetSymbol]!!
-                    IrReturnImpl(startOffset, endOffset, expression.type, irFunction.symbol, expression.value)
+                    val irFunction = context.staticDefaultStubs[expression.irReturnTarget]!!
+                    IrReturnImpl(startOffset, endOffset, expression.type, irFunction, expression.value)
                 }
             } else {
                 expression
@@ -93,7 +93,7 @@
     }
 
     override fun visitCall(expression: IrCall): IrExpression {
-        val callee = expression.symbol.owner
+        val callee = expression.target
         if (callee.origin !== IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || callee.dispatchReceiverParameter == null) {
             return super.visitCall(expression)
         }
@@ -106,7 +106,7 @@
 }
 
 private fun JvmBackendContext.getStaticFunctionWithReceivers(function: IrFunction) =
-    staticDefaultStubs.getOrPut(function.symbol) {
+    staticDefaultStubs.getOrPut(function) {
         createStaticFunctionWithReceivers(function.parent, function.name, function, copyBody = false)
     }
 
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
index 9493390..2220e4f 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt
@@ -35,6 +35,7 @@
 import org.jetbrains.kotlin.load.java.JavaVisibilities
 import org.jetbrains.kotlin.load.java.JvmAbi
 import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.utils.addToStdlib.safeAs
 
 internal val syntheticAccessorPhase = makeIrFilePhase(
     ::SyntheticAccessorLowering,
@@ -51,55 +52,55 @@
         pendingTransformations.forEach { it() }
     }
 
-    private val functionMap = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
-    private val getterMap = mutableMapOf<IrFieldSymbol, IrSimpleFunctionSymbol>()
-    private val setterMap = mutableMapOf<IrFieldSymbol, IrSimpleFunctionSymbol>()
+    private val functionMap = mutableMapOf<IrFunction, IrFunction>()
+    private val getterMap = mutableMapOf<IrField, IrSimpleFunction>()
+    private val setterMap = mutableMapOf<IrField, IrSimpleFunction>()
 
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
         if (expression.usesDefaultArguments()) {
             return super.visitFunctionAccess(expression)
         }
 
-        fun makeFunctionAccessorSymbolWithSuper(functionSymbol: IrFunctionSymbol): IrFunctionSymbol =
-            when (functionSymbol) {
-                is IrConstructorSymbol -> functionSymbol.owner.makeConstructorAccessor().symbol
-                is IrSimpleFunctionSymbol -> functionSymbol.owner.makeSimpleFunctionAccessor(expression as IrCall).symbol
-                else -> error("Unknown subclass of IrFunctionSymbol")
+        fun makeFunctionAccessorWithSuper(function: IrFunction): IrFunction =
+            when (function) {
+                is IrConstructor -> function.makeConstructorAccessor()
+                is IrSimpleFunction -> function.makeSimpleFunctionAccessor(expression as IrCall)
+                else -> error("Unknown subclass of IrFunction")
             }
 
         return super.visitExpression(
             handleAccess(
                 expression,
-                expression.symbol,
+                expression.target,
                 functionMap,
-                ::makeFunctionAccessorSymbolWithSuper,
+                ::makeFunctionAccessorWithSuper,
                 ::modifyFunctionAccessExpression,
-                (expression as? IrCall)?.superQualifierSymbol,
-                (expression as? IrCall)?.dispatchReceiver?.type?.classifierOrNull as? IrClassSymbol
+                (expression as? IrCall)?.irSuperQualifier,
+                (expression as? IrCall)?.dispatchReceiver?.type?.classifierOrNull.safeAs<IrClassSymbol>()?.owner
             )
         )
     }
 
     override fun visitGetField(expression: IrGetField) = super.visitExpression(
-        handleAccess(expression, expression.symbol, getterMap, ::makeGetterAccessorSymbol, ::modifyGetterExpression)
+        handleAccess(expression, expression.target, getterMap, ::makeGetterAccessor, ::modifyGetterExpression)
     )
 
     override fun visitSetField(expression: IrSetField) = super.visitExpression(
-        handleAccess(expression, expression.symbol, setterMap, ::makeSetterAccessorSymbol, ::modifySetterExpression)
+        handleAccess(expression, expression.target, setterMap, ::makeSetterAccessor, ::modifySetterExpression)
     )
 
-    private inline fun <ExprT : IrDeclarationReference, reified FromSyT : IrSymbol, ToSyT : IrSymbol> handleAccess(
+    private inline fun <ExprT : IrDeclarationReference, reified FromSyT : IrDeclarationWithVisibility, ToSyT : IrDeclarationWithVisibility> handleAccess(
         expression: ExprT,
-        symbol: FromSyT,
+        declaration: FromSyT,
         accumMap: MutableMap<FromSyT, ToSyT>,
-        symbolConverter: (FromSyT) -> ToSyT,
+        declarationConverter: (FromSyT) -> ToSyT,
         exprConverter: (ExprT, ToSyT) -> IrDeclarationReference,
-        superQualifierSymbol: IrClassSymbol? = null,
-        thisSymbol: IrClassSymbol? = null
+        superQualifier: IrClass? = null,
+        thisObjReference: IrClass? = null
     ): IrExpression =
-        if (!symbol.isAccessible(superQualifierSymbol != null, thisSymbol)) {
-            val accessorSymbol = accumMap.getOrPut(symbol) { symbolConverter(symbol) }
-            exprConverter(expression, accessorSymbol)
+        if (!declaration.isAccessible(superQualifier != null, thisObjReference)) {
+            val accessor = accumMap.getOrPut(declaration) { declarationConverter(declaration) }
+            exprConverter(expression, accessor)
         } else {
             expression
         }
@@ -129,22 +130,22 @@
             accessor.returnType = source.returnType.remapTypeParameters(source, accessor)
 
             accessor.addValueParameter(
-                "marker", context.ir.symbols.defaultConstructorMarker.owner.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
+                "marker", context.ir.symbols.defaultConstructorMarker.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
             )
 
             accessor.body = IrExpressionBodyImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                createConstructorCall(accessor, source.symbol)
+                createConstructorCall(accessor, source)
             )
         }
     }
 
-    private fun createConstructorCall(accessor: IrConstructor, targetSymbol: IrConstructorSymbol) =
+    private fun createConstructorCall(accessor: IrConstructor, target: IrConstructor) =
         IrDelegatingConstructorCallImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
             context.irBuiltIns.unitType,
-            targetSymbol, targetSymbol.descriptor,
-            targetSymbol.owner.parentAsClass.typeParameters.size + targetSymbol.owner.typeParameters.size
+            target, target.descriptor,
+            target.parentAsClass.typeParameters.size + target.typeParameters.size
         ).also {
             copyAllParamsToArgs(it, accessor)
         }
@@ -201,94 +202,94 @@
 
             accessor.body = IrExpressionBodyImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                createSimpleFunctionCall(accessor, source.symbol, expression.superQualifierSymbol)
+                createSimpleFunctionCall(accessor, source, expression.irSuperQualifier)
             )
         }
     }
 
-    private fun createSimpleFunctionCall(accessor: IrFunction, targetSymbol: IrFunctionSymbol, superQualifierSymbol: IrClassSymbol?) =
+    private fun createSimpleFunctionCall(accessor: IrFunction, target: IrFunction, superQualifier: IrClass?) =
         IrCallImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
             accessor.returnType,
-            targetSymbol, targetSymbol.descriptor,
-            targetSymbol.owner.typeParameters.size,
-            superQualifierSymbol = superQualifierSymbol
+            target, target.descriptor,
+            target.typeParameters.size,
+            irSuperQualifier = superQualifier
         ).also {
             copyAllParamsToArgs(it, accessor)
         }
 
-    private fun makeGetterAccessorSymbol(fieldSymbol: IrFieldSymbol): IrSimpleFunctionSymbol =
+    private fun makeGetterAccessor(field: IrField): IrSimpleFunction =
         buildFun {
             origin = JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
-            name = fieldSymbol.owner.accessorNameForGetter()
+            name = field.accessorNameForGetter()
             visibility = Visibilities.PUBLIC
             modality = Modality.FINAL
-            returnType = fieldSymbol.owner.type
+            returnType = field.type
         }.also { accessor ->
-            accessor.parent = fieldSymbol.owner.accessorParent()
+            accessor.parent = field.accessorParent()
             pendingTransformations.add { (accessor.parent as IrDeclarationContainer).declarations.add(accessor) }
 
-            if (!fieldSymbol.owner.isStatic) {
+            if (!field.isStatic) {
                 accessor.addValueParameter(
-                    "\$this", fieldSymbol.owner.parentAsClass.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
+                    "\$this", field.parentAsClass.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
                 )
             }
 
-            accessor.body = createAccessorBodyForGetter(fieldSymbol.owner, accessor)
-        }.symbol
+            accessor.body = createAccessorBodyForGetter(field, accessor)
+        }
 
     private fun createAccessorBodyForGetter(targetField: IrField, accessor: IrSimpleFunction): IrBody {
         val resolvedTargetField = targetField.resolveFakeOverride()!!
         val maybeDispatchReceiver =
             if (resolvedTargetField.isStatic) null
-            else IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, accessor.valueParameters[0].symbol)
+            else IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, accessor.valueParameters[0])
         return IrExpressionBodyImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
             IrGetFieldImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                resolvedTargetField.symbol,
+                resolvedTargetField,
                 resolvedTargetField.type,
                 maybeDispatchReceiver
             )
         )
     }
 
-    private fun makeSetterAccessorSymbol(fieldSymbol: IrFieldSymbol): IrSimpleFunctionSymbol =
+    private fun makeSetterAccessor(field: IrField): IrSimpleFunction =
         buildFun {
             origin = JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
-            name = fieldSymbol.owner.accessorNameForSetter()
+            name = field.accessorNameForSetter()
             visibility = Visibilities.PUBLIC
             modality = Modality.FINAL
             returnType = context.irBuiltIns.unitType
         }.also { accessor ->
-            accessor.parent = fieldSymbol.owner.accessorParent()
+            accessor.parent = field.accessorParent()
             pendingTransformations.add { (accessor.parent as IrDeclarationContainer).declarations.add(accessor) }
 
-            if (!fieldSymbol.owner.isStatic) {
+            if (!field.isStatic) {
                 accessor.addValueParameter(
-                    "\$this", fieldSymbol.owner.parentAsClass.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
+                    "\$this", field.parentAsClass.defaultType, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR
                 )
             }
 
-            accessor.addValueParameter("value", fieldSymbol.owner.type, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR)
+            accessor.addValueParameter("value", field.type, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR)
 
-            accessor.body = createAccessorBodyForSetter(fieldSymbol.owner, accessor)
-        }.symbol
+            accessor.body = createAccessorBodyForSetter(field, accessor)
+        }
 
     private fun createAccessorBodyForSetter(targetField: IrField, accessor: IrSimpleFunction): IrBody {
         val resolvedTargetField = targetField.resolveFakeOverride()!!
         val maybeDispatchReceiver =
             if (resolvedTargetField.isStatic) null
-            else IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, accessor.valueParameters[0].symbol)
+            else IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, accessor.valueParameters[0])
         val value = IrGetValueImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-            accessor.valueParameters[if (resolvedTargetField.isStatic) 0 else 1].symbol
+            accessor.valueParameters[if (resolvedTargetField.isStatic) 0 else 1]
         )
         return IrExpressionBodyImpl(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET,
             IrSetFieldImpl(
                 UNDEFINED_OFFSET, UNDEFINED_OFFSET,
-                resolvedTargetField.symbol,
+                resolvedTargetField,
                 maybeDispatchReceiver,
                 value,
                 context.irBuiltIns.unitType
@@ -298,27 +299,27 @@
 
     private fun modifyFunctionAccessExpression(
         oldExpression: IrFunctionAccessExpression,
-        accessorSymbol: IrFunctionSymbol
+        accessor: IrFunction
     ): IrFunctionAccessExpression {
         val newExpression = when (oldExpression) {
             is IrCall -> IrCallImpl(
                 oldExpression.startOffset, oldExpression.endOffset,
                 oldExpression.type,
-                accessorSymbol, accessorSymbol.descriptor,
+                accessor, accessor.descriptor,
                 oldExpression.typeArgumentsCount,
                 oldExpression.origin
             )
             is IrDelegatingConstructorCall -> IrDelegatingConstructorCallImpl(
                 oldExpression.startOffset, oldExpression.endOffset,
                 context.irBuiltIns.unitType,
-                accessorSymbol as IrConstructorSymbol, accessorSymbol.descriptor,
+                accessor as IrConstructor, accessor.descriptor,
                 oldExpression.typeArgumentsCount
             )
             is IrConstructorCall ->
                 IrConstructorCallImpl.fromSymbolDescriptor(
                     oldExpression.startOffset, oldExpression.endOffset,
                     oldExpression.type,
-                    accessorSymbol as IrConstructorSymbol
+                    accessor as IrConstructor
                 )
             else ->
                 error("Unexpected IrFunctionAccessExpression: $oldExpression")
@@ -328,13 +329,13 @@
         receiverAndArgs.forEachIndexed { i, irExpression ->
             newExpression.putValueArgument(i, irExpression)
         }
-        if (accessorSymbol is IrConstructorSymbol) {
+        if (accessor is IrConstructor) {
             newExpression.putValueArgument(
                 receiverAndArgs.size,
                 IrConstImpl.constNull(
                     UNDEFINED_OFFSET,
                     UNDEFINED_OFFSET,
-                    context.ir.symbols.defaultConstructorMarker.owner.defaultType
+                    context.ir.symbols.defaultConstructorMarker.defaultType
                 )
             )
         }
@@ -343,12 +344,12 @@
 
     private fun modifyGetterExpression(
         oldExpression: IrGetField,
-        accessorSymbol: IrFunctionSymbol
+        accessor: IrSimpleFunction
     ): IrCall {
         val call = IrCallImpl(
             oldExpression.startOffset, oldExpression.endOffset,
             oldExpression.type,
-            accessorSymbol, accessorSymbol.descriptor,
+            accessor, accessor.descriptor,
             0,
             oldExpression.origin
         )
@@ -360,12 +361,12 @@
 
     private fun modifySetterExpression(
         oldExpression: IrSetField,
-        accessorSymbol: IrFunctionSymbol
+        accessor: IrSimpleFunction
     ): IrCall {
         val call = IrCallImpl(
             oldExpression.startOffset, oldExpression.endOffset,
             oldExpression.type,
-            accessorSymbol, accessorSymbol.descriptor,
+            accessor, accessor.descriptor,
             0,
             oldExpression.origin
         )
@@ -388,15 +389,15 @@
         call.passTypeArgumentsFrom(syntheticFunction, offset = typeArgumentOffset)
 
         var offset = 0
-        val delegateTo = call.symbol.owner
+        val delegateTo = call.target
         delegateTo.dispatchReceiverParameter?.let {
             call.dispatchReceiver =
-                IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, syntheticFunction.valueParameters[offset++].symbol)
+                IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, syntheticFunction.valueParameters[offset++])
         }
 
         delegateTo.extensionReceiverParameter?.let {
             call.extensionReceiver =
-                IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, syntheticFunction.valueParameters[offset++].symbol)
+                IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, syntheticFunction.valueParameters[offset++])
         }
 
         delegateTo.valueParameters.forEachIndexed { i, _ ->
@@ -405,7 +406,7 @@
                 IrGetValueImpl(
                     UNDEFINED_OFFSET,
                     UNDEFINED_OFFSET,
-                    syntheticFunction.valueParameters[i + offset].symbol
+                    syntheticFunction.valueParameters[i + offset]
                 )
             )
         }
@@ -437,14 +438,13 @@
                 this == JavaVisibilities.PROTECTED_AND_PACKAGE ||
                 this == JavaVisibilities.PROTECTED_STATIC_VISIBILITY
 
-    private fun IrSymbol.isAccessible(withSuper: Boolean, thisObjReference: IrClassSymbol?): Boolean {
+    private fun IrDeclarationWithVisibility.isAccessible(withSuper: Boolean, thisObjReference: IrClass?): Boolean {
         /// We assume that IR code that reaches us has been checked for correctness at the frontend.
         /// This function needs to single out those cases where Java accessibility rules differ from Kotlin's.
 
-        val declarationRaw = owner as IrDeclarationWithVisibility
         val declaration =
-            (declarationRaw as? IrSimpleFunction)?.resolveFakeOverride()
-                ?: (declarationRaw as? IrField)?.resolveFakeOverride() ?: declarationRaw
+            (this as? IrSimpleFunction)?.resolveFakeOverride()
+                ?: (this as? IrField)?.resolveFakeOverride() ?: this
 
         // There is never a problem with visibility of inline functions, as those don't end up as Java entities
         if (declaration is IrFunction && declaration.isInline) return true
@@ -472,7 +472,7 @@
             // 1. `this` to be assign compatible with current class.
             // 2. the method is a member of a superclass of current class.
             (withSuper && contextDeclarationContainer is IrClass && symbolDeclarationContainer is IrClass &&
-                    ((thisObjReference != null && !contextDeclarationContainer.symbol.isSubtypeOfClass(thisObjReference)) ||
+                    ((thisObjReference != null && !contextDeclarationContainer.isSubtypeOfClass(thisObjReference)) ||
                             !(contextDeclarationContainer.isSubclassOf(symbolDeclarationContainer)))) -> false
             else -> true
         }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt
index 2c71982..19b451a 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ToArrayLowering.kt
@@ -123,14 +123,14 @@
                 }
             )
 
-            irFunction.body = context.createIrBuilder(irFunction.symbol).irBlockBody {
+            irFunction.body = context.createIrBuilder(irFunction).irBlockBody {
                 +irReturn(
-                    irCall(symbols.genericToArray, symbols.genericToArray.owner.returnType).apply {
+                    irCall(symbols.genericToArray, symbols.genericToArray.returnType).apply {
                         putValueArgument(
                             0,
-                            IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.dispatchReceiverParameter!!.symbol)
+                            IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.dispatchReceiverParameter!!)
                         )
-                        putValueArgument(1, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.valueParameters[0].symbol))
+                        putValueArgument(1, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.valueParameters[0]))
                     })
             }
 
@@ -172,12 +172,12 @@
                 parent = irFunction
             }
 
-            irFunction.body = context.createIrBuilder(irFunction.symbol).irBlockBody {
+            irFunction.body = context.createIrBuilder(irFunction).irBlockBody {
                 +irReturn(
-                    irCall(symbols.nonGenericToArray, symbols.nonGenericToArray.owner.returnType).apply {
+                    irCall(symbols.nonGenericToArray, symbols.nonGenericToArray.returnType).apply {
                         putValueArgument(
                             0,
-                            IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.dispatchReceiverParameter!!.symbol)
+                            IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunction.dispatchReceiverParameter!!)
                         )
                     })
             }
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt
index 17d774d..2fe4873 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLowering.kt
@@ -20,12 +20,12 @@
 import org.jetbrains.kotlin.ir.builders.*
 import org.jetbrains.kotlin.ir.declarations.IrDeclaration
 import org.jetbrains.kotlin.ir.declarations.IrFile
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
 import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
 import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.render
@@ -64,8 +64,8 @@
             argument.type.isNullable() && type.isNullable() -> {
                 irLetS(argument) { valueSymbol ->
                     context.oror(
-                        irEqualsNull(irGet(valueSymbol.owner)),
-                        irIs(irGet(valueSymbol.owner), type.makeNotNull())
+                        irEqualsNull(irGet(valueSymbol)),
+                        irIs(irGet(valueSymbol), type.makeNotNull())
                     )
                 }
             }
@@ -81,15 +81,15 @@
                 irLetS(argument) { valueSymbol ->
                     irIfNull(
                         type,
-                        irGet(valueSymbol.owner),
+                        irGet(valueSymbol),
                         irThrow(irCall(typeCastException).apply {
                             putValueArgument(0, irString("null cannot be cast to non-null type ${type.render()}"))
                         }),
-                        lowerCast(irGet(valueSymbol.owner), type.makeNullable())
+                        lowerCast(irGet(valueSymbol), type.makeNullable())
                     )
                 }
             }
-        argument.type.isSubtypeOfClass(type.erasedUpperBound.symbol) ->
+        argument.type.isSubtypeOfClass(type.erasedUpperBound) ->
             argument
         else ->
             builder.irAs(argument, type)
@@ -123,8 +123,8 @@
                     irLetS(expression.argument.transformVoid(), IrStatementOrigin.SAFE_CALL) { valueSymbol ->
                         irIfThenElse(
                             expression.type,
-                            lowerInstanceOf(irGet(valueSymbol.owner), expression.typeOperand.makeNotNull()),
-                            irGet(valueSymbol.owner),
+                            lowerInstanceOf(irGet(valueSymbol), expression.typeOperand.makeNotNull()),
+                            irGet(valueSymbol),
                             irNull(expression.type)
                         )
                     }
@@ -143,10 +143,10 @@
                 irLetS(expression.argument.transformVoid()) { valueSymbol ->
                     irComposite(resultType = expression.type) {
                         +irCall(checkExpressionValueIsNotNull).apply {
-                            putValueArgument(0, irGet(valueSymbol.owner))
+                            putValueArgument(0, irGet(valueSymbol))
                             putValueArgument(1, irString(source))
                         }
-                        +irGet(valueSymbol.owner)
+                        +irGet(valueSymbol)
                     }
                 }
             }
@@ -180,13 +180,13 @@
     private val useNullPointerExceptions: Boolean
         get() = context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
 
-    private val typeCastException: IrFunctionSymbol =
+    private val typeCastException: IrFunction =
         if (useNullPointerExceptions)
             context.ir.symbols.ThrowNullPointerException
         else
             context.ir.symbols.ThrowTypeCastException
 
-    private val checkExpressionValueIsNotNull: IrFunctionSymbol =
+    private val checkExpressionValueIsNotNull: IrFunction =
         if (useNullPointerExceptions)
             context.ir.symbols.checkNotNullExpressionValue
         else
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/VarargLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/VarargLowering.kt
index eb9650b..fff4ad4 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/VarargLowering.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/VarargLowering.kt
@@ -22,7 +22,6 @@
 import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
 import org.jetbrains.kotlin.ir.expressions.*
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.util.*
 
 val varargPhase = makeIrFilePhase(
@@ -36,7 +35,7 @@
 
     // Ignore annotations
     override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
-        val constructor = expression.symbol.owner
+        val constructor = expression.target
         if (constructor.constructedClass.isAnnotationClass)
             return expression
         return super.visitConstructorCall(expression)
@@ -44,14 +43,14 @@
 
     override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
         expression.transformChildrenVoid()
-        val function = expression.symbol
+        val function = expression.target
 
         // Replace empty varargs with empty arrays
         for (i in 0 until expression.valueArgumentsCount) {
             if (expression.getValueArgument(i) != null)
                 continue
 
-            val parameter = function.owner.valueParameters[i]
+            val parameter = function.valueParameters[i]
             if (parameter.varargElementType != null && !parameter.hasDefaultValue()) {
                 // Compute the correct type for the array argument.
                 val arrayType = parameter.type.substitute(expression.typeSubstitutionMap)
@@ -73,7 +72,7 @@
                 is IrExpression -> +element.transform(this@VarargLowering, null)
                 is IrSpreadElement -> {
                     val spread = element.expression
-                    if (spread is IrFunctionAccessExpression && spread.symbol.isArrayOf) {
+                    if (spread is IrFunctionAccessExpression && spread.target.isArrayOf) {
                         // Skip empty arrays and don't copy immediately created arrays
                         val argument = spread.getValueArgument(0) ?: continue@loop
                         if (argument is IrVararg) {
@@ -89,10 +88,10 @@
     }
 
     private fun createBuilder(startOffset: Int = UNDEFINED_OFFSET, endOffset: Int = UNDEFINED_OFFSET) =
-        context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol, startOffset, endOffset)
+        context.createJvmIrBuilder(currentScope!!.scope.irScopeOwner, startOffset, endOffset)
 
-    private val IrFunctionSymbol.isArrayOf
-        get() = this == context.ir.symbols.arrayOf || owner.isPrimitiveArrayOf
+    private val IrFunction.isArrayOf
+        get() = this == context.ir.symbols.arrayOf || isPrimitiveArrayOf
 
     companion object {
         private val PRIMITIVE_ARRAY_OF_NAMES: Set<String> =
diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt
index 5515a41..f2eb073 100644
--- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt
+++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt
@@ -18,8 +18,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
 import org.jetbrains.kotlin.ir.types.getClass
 import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
 import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl
@@ -32,7 +30,7 @@
 
 class IrReplacementFunction(
     val function: IrFunction,
-    val valueParameterMap: Map<IrValueParameterSymbol, IrValueParameter>
+    val valueParameterMap: Map<IrValueParameter, IrValueParameter>
 )
 
 /**
@@ -136,17 +134,17 @@
 
     private fun createMethodReplacement(function: IrFunction): IrReplacementFunction? {
         require(function.dispatchReceiverParameter != null && function is IrSimpleFunction)
-        val overrides = function.overriddenSymbols.mapNotNull {
-            getReplacementFunction(it.owner)?.function?.symbol as? IrSimpleFunctionSymbol
+        val overrides = function.overridden.mapNotNull {
+            getReplacementFunction(it)?.function as? IrSimpleFunction
         }
         if (function.origin == IrDeclarationOrigin.FAKE_OVERRIDE && overrides.isEmpty())
             return null
 
-        val parameterMap = mutableMapOf<IrValueParameterSymbol, IrValueParameter>()
+        val parameterMap = mutableMapOf<IrValueParameter, IrValueParameter>()
         val replacement = buildReplacement(function) {
             annotations += function.annotations
             metadata = function.metadata
-            overriddenSymbols.addAll(overrides)
+            overridden.addAll(overrides)
 
             for ((index, parameter) in function.explicitParameters.withIndex()) {
                 val name = if (parameter == function.extensionReceiverParameter) Name.identifier("\$receiver") else parameter.name
@@ -158,16 +156,16 @@
                     newParameter = parameter.copyTo(this, index = index - 1, name = name)
                     valueParameters.add(newParameter)
                 }
-                parameterMap[parameter.symbol] = newParameter
+                parameterMap[parameter] = newParameter
             }
         }
         return IrReplacementFunction(replacement, parameterMap)
     }
 
     private fun createStaticReplacement(function: IrFunction): IrReplacementFunction {
-        val parameterMap = mutableMapOf<IrValueParameterSymbol, IrValueParameter>()
+        val parameterMap = mutableMapOf<IrValueParameter, IrValueParameter>()
         val replacement = buildReplacement(function) {
-            if (function !is IrSimpleFunction || function.overriddenSymbols.isEmpty())
+            if (function !is IrSimpleFunction || function.overridden.isEmpty())
                 metadata = function.metadata
 
             for ((index, parameter) in function.explicitParameters.withIndex()) {
@@ -179,7 +177,7 @@
 
                 val newParameter = parameter.copyTo(this, index = index, name = name)
                 valueParameters.add(newParameter)
-                parameterMap[parameter.symbol] = newParameter
+                parameterMap[parameter] = newParameter
             }
         }
         return IrReplacementFunction(replacement, parameterMap)
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt
index cd82dc7..9326e1c 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt
@@ -323,7 +323,8 @@
 val wasmPhases = namedIrModulePhase<WasmBackendContext>(
     name = "IrModuleLowering",
     description = "IR module lowering",
-    lower = validateIrBeforeLowering then
+    lower = desymbolizePhase then
+            validateIrBeforeLowering then
             excludeDeclarationsFromCodegenPhase then
             expectDeclarationsRemovingPhase then
             provisionalFunctionExpressionPhase then
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/ExpressionTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/ExpressionTransformer.kt
index 54ba690..97b7c52 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/ExpressionTransformer.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/ExpressionTransformer.kt
@@ -54,7 +54,7 @@
     }
 
     override fun visitGetField(expression: IrGetField, data: WasmCodegenContext): WasmInstruction {
-        val fieldName = data.getGlobalName(expression.symbol.owner)
+        val fieldName = data.getGlobalName(expression.target)
         if (expression.receiver != null)
             TODO("Support member fields")
 
@@ -62,14 +62,14 @@
     }
 
     override fun visitGetValue(expression: IrGetValue, data: WasmCodegenContext): WasmInstruction =
-        WasmGetLocal(data.getLocalName(expression.symbol.owner))
+        WasmGetLocal(data.getLocalName(expression.target))
 
     override fun visitGetObjectValue(expression: IrGetObjectValue, data: WasmCodegenContext): WasmInstruction {
         TODO("IrGetObjectValue")
     }
 
     override fun visitSetField(expression: IrSetField, data: WasmCodegenContext): WasmInstruction {
-        val fieldName = data.getGlobalName(expression.symbol.owner)
+        val fieldName = data.getGlobalName(expression.target)
         if (expression.receiver != null)
             TODO("Support member fields")
 
@@ -78,7 +78,7 @@
     }
 
     override fun visitSetVariable(expression: IrSetVariable, data: WasmCodegenContext): WasmInstruction {
-        val fieldName = data.getLocalName(expression.symbol.owner)
+        val fieldName = data.getLocalName(expression.target)
         val value = expression.value.accept(this, data)
         return WasmSetLocal(fieldName, value)
     }
@@ -88,7 +88,7 @@
     }
 
     override fun visitCall(expression: IrCall, data: WasmCodegenContext): WasmInstruction {
-        val function = expression.symbol.owner.realOverrideTarget
+        val function = expression.target.realOverrideTarget
         require(function is IrSimpleFunction) { "Only IrSimpleFunction could be called via IrCall" }
         val valueArgs = (0 until expression.valueArgumentsCount).mapNotNull { expression.getValueArgument(it) }
         val irArguments = listOfNotNull(expression.dispatchReceiver, expression.extensionReceiver) + valueArgs
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt
index b688091..256aaca 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt
@@ -9,7 +9,6 @@
 import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
 import org.jetbrains.kotlin.ir.declarations.IrFile
 import org.jetbrains.kotlin.ir.expressions.IrCall
-import org.jetbrains.kotlin.ir.expressions.IrConst
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.util.irCall
 import org.jetbrains.kotlin.ir.util.render
@@ -21,7 +20,7 @@
     private val symbols = context.wasmSymbols
 
     fun transformCall(call: IrCall): IrExpression {
-        when (val symbol = call.symbol) {
+        when (val symbol = call.target) {
             irBuiltins.eqeqSymbol, irBuiltins.eqeqeqSymbol, in irBuiltins.ieee754equalsFunByOperandType.values -> {
                 val type = call.getValueArgument(0)!!.type
                 val newSymbol = symbols.equalityFunctions[type]
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt
index 6901294..798053c 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt
@@ -420,7 +420,7 @@
             context.symbolTable.referenceFunction(functionDescriptor.original),
             functionDescriptor,
             origin = null, // TODO origin for widening conversions?
-            superQualifierSymbol = null
+            irSuperQualifier = null
         ).apply {
             dispatchReceiver = receiver
         }
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt
index 46ca1bd..5704174 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt
@@ -17,6 +17,8 @@
 package org.jetbrains.kotlin.psi2ir.generators
 
 import org.jetbrains.kotlin.descriptors.*
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrClassifier
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
 import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt
index 43ffa8c..915ae74 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt
@@ -105,7 +105,7 @@
 
     override fun visitReturn(expression: IrReturn): IrExpression =
         expression.transformPostfix {
-            value = if (expression.returnTargetSymbol is IrConstructorSymbol) {
+            value = if (expression.irReturnTarget is IrConstructorSymbol) {
                 value.coerceToUnit()
             } else {
                 value.cast(expression.returnTarget.returnType)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt
index 597c6fa..01ef93d 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/ExpressionHelpers.kt
@@ -11,7 +11,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.*
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.util.parentAsClass
 import org.jetbrains.kotlin.types.KotlinType
@@ -23,10 +22,10 @@
     value: IrExpression,
     origin: IrStatementOrigin? = null,
     nameHint: String? = null,
-    body: (IrValueSymbol) -> IrExpression
+    body: (IrValueDeclaration) -> IrExpression
 ): IrExpression {
     val irTemporary = scope.createTemporaryVariable(value, nameHint)
-    val irResult = body(irTemporary.symbol)
+    val irResult = body(irTemporary)
     val irBlock = IrBlockImpl(startOffset, endOffset, irResult.type, origin)
     irBlock.statements.add(irTemporary)
     irBlock.statements.add(irResult)
@@ -88,7 +87,7 @@
     IrReturnImpl(
         startOffset, endOffset,
         context.irBuiltIns.nothingType,
-        scope.scopeOwnerSymbol.assertedCast<IrReturnTargetSymbol> {
+        scope.irScopeOwner.assertedCast<IrReturnTarget> {
             "Function scope expected: ${scope.scopeOwner}"
         },
         value
@@ -150,22 +149,22 @@
 fun IrBuilderWithScope.irIfThenReturnFalse(condition: IrExpression) =
     irIfThen(context.irBuiltIns.unitType, condition, irReturnFalse())
 
-fun IrBuilderWithScope.irGet(type: IrType, variable: IrValueSymbol) =
+fun IrBuilderWithScope.irGet(type: IrType, variable: IrValueDeclaration) =
     IrGetValueImpl(startOffset, endOffset, type, variable)
 
-fun IrBuilderWithScope.irGet(variable: IrValueDeclaration) = irGet(variable.type, variable.symbol)
+fun IrBuilderWithScope.irGet(variable: IrValueDeclaration) = irGet(variable.type, variable)
 
-fun IrBuilderWithScope.irSetVar(variable: IrVariableSymbol, value: IrExpression) =
+fun IrBuilderWithScope.irSetVar(variable: IrVariable, value: IrExpression) =
     IrSetVariableImpl(startOffset, endOffset, context.irBuiltIns.unitType, variable, value, IrStatementOrigin.EQ)
 
 fun IrBuilderWithScope.irGetField(receiver: IrExpression?, field: IrField) =
-    IrGetFieldImpl(startOffset, endOffset, field.symbol, field.type, receiver)
+    IrGetFieldImpl(startOffset, endOffset, field, field.type, receiver)
 
 fun IrBuilderWithScope.irSetField(receiver: IrExpression?, field: IrField, value: IrExpression) =
-    IrSetFieldImpl(startOffset, endOffset, field.symbol, receiver, value, context.irBuiltIns.unitType)
+    IrSetFieldImpl(startOffset, endOffset, field, receiver, value, context.irBuiltIns.unitType)
 
-fun IrBuilderWithScope.irGetObjectValue(type: IrType, classSymbol: IrClassSymbol) =
-    IrGetObjectValueImpl(startOffset, endOffset, type, classSymbol)
+fun IrBuilderWithScope.irGetObjectValue(type: IrType, klass: IrClass) =
+    IrGetObjectValueImpl(startOffset, endOffset, type, klass)
 
 fun IrBuilderWithScope.irEqeqeq(arg1: IrExpression, arg2: IrExpression) =
     context.eqeqeq(startOffset, endOffset, arg1, arg2)
@@ -191,26 +190,26 @@
         irEquals(arg1, arg2, origin = IrStatementOrigin.EXCLEQ)
     )
 
-fun IrBuilderWithScope.irGet(type: IrType, receiver: IrExpression?, getterSymbol: IrFunctionSymbol): IrCall =
+fun IrBuilderWithScope.irGet(type: IrType, receiver: IrExpression?, getter: IrFunction): IrCall =
     IrCallImpl(
         startOffset, endOffset,
         type,
-        getterSymbol as IrSimpleFunctionSymbol,
-        getterSymbol.descriptor,
-        typeArgumentsCount = getterSymbol.owner.typeParameters.size,
+        getter as IrSimpleFunction,
+        getter.descriptor,
+        typeArgumentsCount = getter.typeParameters.size,
         valueArgumentsCount = 0,
         origin = IrStatementOrigin.GET_PROPERTY
     ).apply {
         dispatchReceiver = receiver
     }
 
-fun IrBuilderWithScope.irSet(type: IrType, receiver: IrExpression?, setterSymbol: IrFunctionSymbol, value: IrExpression): IrCall =
+fun IrBuilderWithScope.irSet(type: IrType, receiver: IrExpression?, setter: IrFunction, value: IrExpression): IrCall =
     IrCallImpl(
         startOffset, endOffset,
         type,
-        setterSymbol as IrSimpleFunctionSymbol,
-        setterSymbol.descriptor,
-        typeArgumentsCount = setterSymbol.owner.typeParameters.size,
+        setter as IrSimpleFunction,
+        setter.descriptor,
+        typeArgumentsCount = setter.typeParameters.size,
         valueArgumentsCount = 1,
         origin = IrStatementOrigin.EQ
     ).apply {
@@ -219,7 +218,7 @@
     }
 
 fun IrBuilderWithScope.irCall(
-    callee: IrFunctionSymbol,
+    callee: IrFunction,
     type: IrType,
     typeArguments: List<IrType>
 ): IrMemberAccessExpression =
@@ -229,11 +228,11 @@
         }
     }
 
-fun IrBuilderWithScope.irCallConstructor(callee: IrConstructorSymbol, typeArguments: List<IrType>): IrConstructorCall =
+fun IrBuilderWithScope.irCallConstructor(callee: IrConstructor, typeArguments: List<IrType>): IrConstructorCall =
     IrConstructorCallImpl.fromSymbolOwner(
         startOffset,
         endOffset,
-        callee.owner.returnType,
+        callee.returnType,
         callee
     ).apply {
         typeArguments.forEachIndexed { index, irType ->
@@ -241,49 +240,46 @@
         }
     }
 
-fun IrBuilderWithScope.irCall(callee: IrSimpleFunctionSymbol, type: IrType): IrCall =
+fun IrBuilderWithScope.irCall(callee: IrSimpleFunction, type: IrType): IrCall =
     IrCallImpl(startOffset, endOffset, type, callee, callee.descriptor)
 
-fun IrBuilderWithScope.irCall(callee: IrConstructorSymbol, type: IrType): IrConstructorCall =
+fun IrBuilderWithScope.irCall(callee: IrConstructor, type: IrType): IrConstructorCall =
     IrConstructorCallImpl.fromSymbolDescriptor(startOffset, endOffset, type, callee)
 
-fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol, type: IrType): IrFunctionAccessExpression =
+fun IrBuilderWithScope.irCall(callee: IrFunction, type: IrType): IrFunctionAccessExpression =
     when (callee) {
-        is IrConstructorSymbol -> irCall(callee, type)
-        is IrSimpleFunctionSymbol -> irCall(callee, type)
+        is IrConstructor -> irCall(callee, type)
+        is IrSimpleFunction -> irCall(callee, type)
         else -> throw AssertionError("Unexpected callee: $callee")
     }
 
-fun IrBuilderWithScope.irCall(callee: IrSimpleFunctionSymbol): IrCall =
-    irCall(callee, callee.owner.returnType)
+fun IrBuilderWithScope.irCall(callee: IrSimpleFunction): IrCall =
+    irCall(callee, callee.returnType)
 
-fun IrBuilderWithScope.irCall(callee: IrConstructorSymbol): IrConstructorCall =
-    irCall(callee, callee.owner.returnType)
-
-fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol): IrFunctionAccessExpression =
-    irCall(callee, callee.owner.returnType)
-
-fun IrBuilderWithScope.irCall(callee: IrFunctionSymbol, descriptor: FunctionDescriptor, type: IrType): IrCall =
-    IrCallImpl(startOffset, endOffset, type, callee as IrSimpleFunctionSymbol, descriptor)
+fun IrBuilderWithScope.irCall(callee: IrConstructor): IrConstructorCall =
+    irCall(callee, callee.returnType)
 
 fun IrBuilderWithScope.irCall(callee: IrFunction): IrFunctionAccessExpression =
-    irCall(callee.symbol)
+    irCall(callee, callee.returnType)
+
+fun IrBuilderWithScope.irCall(callee: IrFunction, descriptor: FunctionDescriptor, type: IrType): IrCall =
+    IrCallImpl(startOffset, endOffset, type, callee as IrSimpleFunction, descriptor)
 
 fun IrBuilderWithScope.irCall(callee: IrFunction, origin: IrStatementOrigin): IrCall =
     IrCallImpl(
         startOffset, endOffset, callee.returnType,
-        callee.symbol as IrSimpleFunctionSymbol,
+        callee as IrSimpleFunction,
         callee.descriptor, origin
     )
 
 fun IrBuilderWithScope.irDelegatingConstructorCall(callee: IrConstructor): IrDelegatingConstructorCall =
     IrDelegatingConstructorCallImpl(
-        startOffset, endOffset, context.irBuiltIns.unitType, callee.symbol, callee.descriptor,
+        startOffset, endOffset, context.irBuiltIns.unitType, callee, callee.descriptor,
         callee.parentAsClass.typeParameters.size, callee.valueParameters.size
     )
 
 fun IrBuilderWithScope.irCallOp(
-    callee: IrFunctionSymbol,
+    callee: IrFunction,
     type: IrType,
     dispatchReceiver: IrExpression,
     argument: IrExpression? = null
@@ -334,7 +330,7 @@
     IrSetFieldImpl(
         startOffset,
         endOffset,
-        irField.symbol,
+        irField,
         receiver = receiver,
         value = value,
         type = context.irBuiltIns.unitType
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/Scope.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/Scope.kt
index 01cf3cc..e377feb 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/Scope.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/Scope.kt
@@ -18,10 +18,7 @@
 
 import org.jetbrains.kotlin.descriptors.*
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
-import org.jetbrains.kotlin.ir.declarations.IrDeclaration
-import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
-import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
-import org.jetbrains.kotlin.ir.declarations.IrVariable
+import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
 import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor
 import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptorImpl
@@ -34,16 +31,15 @@
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.types.KotlinType
 
-class Scope(val scopeOwnerSymbol: IrSymbol) {
-    val scopeOwner: DeclarationDescriptor get() = scopeOwnerSymbol.descriptor
+class Scope(val irScopeOwner: IrSymbolOwner) {
+    val scopeOwner: DeclarationDescriptor get() = irScopeOwner.symbol.descriptor
 
     fun getLocalDeclarationParent(): IrDeclarationParent {
-        if (!scopeOwnerSymbol.isBound) throw AssertionError("Unbound symbol: $scopeOwner")
-        val scopeOwnerElement = scopeOwnerSymbol.owner
-        return when (scopeOwnerElement) {
-            is IrDeclarationParent -> scopeOwnerElement
-            !is IrDeclaration -> throw AssertionError("Not a declaration: $scopeOwnerElement")
-            else -> scopeOwnerElement.parent
+        if (!irScopeOwner.symbol.isBound) throw AssertionError("Unbound symbol: $scopeOwner")
+        return when (irScopeOwner) {
+            is IrDeclarationParent -> irScopeOwner
+            !is IrDeclaration -> throw AssertionError("Not a declaration: $irScopeOwner")
+            else -> irScopeOwner.parent
         }
     }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt
index 285ccae..c1ee57e 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt
@@ -24,7 +24,7 @@
 import org.jetbrains.kotlin.ir.types.IrType
 
 interface IrClass :
-    IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility,
+    IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility, IrClassifier,
     IrDeclarationContainer, IrTypeParametersContainer, IrAttributeContainer {
 
     override val descriptor: ClassDescriptor
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClassifier.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClassifier.kt
new file mode 100644
index 0000000..d01bbbb
--- /dev/null
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClassifier.kt
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2010-2019 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.ir.declarations
+
+import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
+import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
+import org.jetbrains.kotlin.types.model.TypeConstructorMarker
+
+interface IrClassifier : IrDeclaration, IrSymbolOwner, TypeConstructorMarker {
+    override val symbol: IrClassifierSymbol
+    override val descriptor: ClassifierDescriptor
+}
\ No newline at end of file
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt
index d308113..332e5fd 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt
@@ -46,8 +46,8 @@
     override val symbol: S
 }
 
-interface IrOverridableDeclaration<S : IrSymbol> : IrDeclaration {
-    val overriddenSymbols: MutableList<S>
+interface IrOverridableDeclaration<S : IrDeclaration> : IrDeclaration {
+    val overridden: MutableList<S>
 }
 
 interface IrDeclarationWithVisibility : IrDeclaration {
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt
index 4232a87..af29556 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt
@@ -12,7 +12,7 @@
 import org.jetbrains.kotlin.ir.types.IrType
 
 interface IrField :
-    IrSymbolDeclaration<IrFieldSymbol>, IrOverridableDeclaration<IrFieldSymbol>,
+    IrSymbolDeclaration<IrFieldSymbol>, IrOverridableDeclaration<IrField>,
     IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent {
 
     override val descriptor: PropertyDescriptor
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt
index 31bf00f..bd8985a 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrSimpleFunction.kt
@@ -23,7 +23,7 @@
 interface IrSimpleFunction :
     IrFunction,
     IrSymbolDeclaration<IrSimpleFunctionSymbol>,
-    IrOverridableDeclaration<IrSimpleFunctionSymbol> {
+    IrOverridableDeclaration<IrSimpleFunction> {
 
     val modality: Modality
     val isTailrec: Boolean
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt
index f13063b..d2f4b26 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt
@@ -21,8 +21,11 @@
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.types.Variance
+import org.jetbrains.kotlin.types.model.TypeConstructorMarker
+import org.jetbrains.kotlin.types.model.TypeParameterMarker
 
-interface IrTypeParameter : IrSymbolDeclaration<IrTypeParameterSymbol>, IrDeclarationWithName {
+interface IrTypeParameter : IrSymbolDeclaration<IrTypeParameterSymbol>, IrDeclarationWithName, IrClassifier,
+    TypeParameterMarker {
     override val descriptor: TypeParameterDescriptor
 
     val variance: Variance
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt
index f5ff028..3462eef 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt
@@ -89,7 +89,7 @@
             correspondingProperty = value?.owner
         }
 
-    override val overriddenSymbols: MutableList<IrFieldSymbol> = mutableListOf()
+    override val overridden: MutableList<IrField> = mutableListOf()
 
     override var metadata: MetadataSource.Property? = null
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt
index 2515e51..9bac52c 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt
@@ -58,7 +58,7 @@
 
     override val descriptor: FunctionDescriptor = symbol.descriptor
 
-    override val overriddenSymbols: MutableList<IrSimpleFunctionSymbol> = SmartList()
+    override val overridden: MutableList<IrSimpleFunction> = SmartList()
 
     override var correspondingProperty: IrProperty? = null
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt
index 49ab59e..8828bd7 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt
@@ -65,9 +65,9 @@
 
     override val descriptor: PropertyDescriptor = symbol.descriptor
 
-    override val overriddenSymbols: MutableList<IrFieldSymbol> by lazy {
+    override val overridden: MutableList<IrField> by lazy {
         symbol.descriptor.overriddenDescriptors.map {
-            stubGenerator.generateFieldStub(it.original).symbol
+            stubGenerator.generateFieldStub(it.original)
         }.toMutableList()
     }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
index 816a6d2..b8693ec 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
@@ -79,9 +79,9 @@
     }
 
 
-    override val overriddenSymbols: MutableList<IrSimpleFunctionSymbol> by lazy {
+    override val overridden: MutableList<IrSimpleFunction> by lazy {
         descriptor.overriddenDescriptors.mapTo(arrayListOf()) {
-            stubGenerator.generateFunctionStub(it.original).symbol
+            stubGenerator.generateFunctionStub(it.original)
         }
     }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt
index a2640e6..0a55847 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt
@@ -16,11 +16,11 @@
 
 package org.jetbrains.kotlin.ir.expressions
 
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.declarations.IrReturnTarget
 import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.declarations.name
 import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
 import org.jetbrains.kotlin.ir.util.file
 
@@ -41,11 +41,11 @@
 
 interface IrReturnableBlock : IrBlock, IrSymbolOwner, IrReturnTarget {
     override val symbol: IrReturnableBlockSymbol
-    val inlineFunctionSymbol: IrFunctionSymbol?
+    val inlineFunction: IrFunction?
 }
 
 val IrReturnableBlock.sourceFileSymbol: IrFileSymbol?
-    get() = inlineFunctionSymbol?.owner?.file?.symbol
+    get() = inlineFunction?.file?.symbol
 
 @Deprecated("Please avoid using it")
 val IrReturnableBlock.sourceFileName: String
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCall.kt
index a042b3d..6f6b378 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCall.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCall.kt
@@ -17,9 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
+import org.jetbrains.kotlin.ir.declarations.IrClass
 
 interface IrCall : IrFunctionAccessExpression {
     val superQualifier: ClassDescriptor?
-    val superQualifierSymbol: IrClassSymbol?
+    val irSuperQualifier: IrClass?
 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt
index 221406d..5de2375 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt
@@ -20,7 +20,7 @@
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor
 import org.jetbrains.kotlin.descriptors.PropertyDescriptor
 import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
-import org.jetbrains.kotlin.ir.symbols.*
+import org.jetbrains.kotlin.ir.declarations.*
 
 interface IrCallableReference : IrMemberAccessExpression, IrDeclarationReference {
     override val descriptor: CallableDescriptor
@@ -28,21 +28,21 @@
 
 interface IrFunctionReference : IrCallableReference {
     override val descriptor: FunctionDescriptor
-    override val symbol: IrFunctionSymbol
+    override val target: IrFunction
 }
 
 interface IrPropertyReference : IrCallableReference {
     override val descriptor: PropertyDescriptor
-    override val symbol: IrPropertySymbol
-    val field: IrFieldSymbol?
-    val getter: IrSimpleFunctionSymbol?
-    val setter: IrSimpleFunctionSymbol?
+    override val target: IrProperty
+    val field: IrField?
+    val getter: IrSimpleFunction?
+    val setter: IrSimpleFunction?
 }
 
 interface IrLocalDelegatedPropertyReference : IrCallableReference {
     override val descriptor: VariableDescriptorWithAccessors
-    override val symbol: IrLocalDelegatedPropertySymbol
-    val delegate: IrVariableSymbol
-    val getter: IrSimpleFunctionSymbol
-    val setter: IrSimpleFunctionSymbol?
+    override val target: IrLocalDelegatedProperty
+    val delegate: IrVariable
+    val getter: IrSimpleFunction
+    val setter: IrSimpleFunction?
 }
\ No newline at end of file
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt
index 3ea1ba7..c73027a 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrClassReference.kt
@@ -17,13 +17,13 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
+import org.jetbrains.kotlin.ir.declarations.IrClassifier
 import org.jetbrains.kotlin.ir.types.IrType
 
 
 interface IrClassReference : IrDeclarationReference {
     override val descriptor: ClassifierDescriptor
-    override val symbol: IrClassifierSymbol
+    override val target: IrClassifier
     val classType: IrType
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrConstructorCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrConstructorCall.kt
index 646b97f..30ff176 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrConstructorCall.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrConstructorCall.kt
@@ -6,12 +6,12 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.types.IrType
 
 interface IrConstructorCall : IrFunctionAccessExpression {
     override val descriptor: ClassConstructorDescriptor
-    override val symbol: IrConstructorSymbol
+    override val target: IrConstructor
 
     val constructorTypeArgumentsCount: Int
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt
index e483d10..0ed3128 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDeclarationReference.kt
@@ -18,14 +18,13 @@
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
-
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 
 interface IrDeclarationReference : IrExpression {
     val descriptor: DeclarationDescriptor
-    val symbol: IrSymbol
+    val target: IrSymbolOwner
 }
 
 interface IrGetSingletonValue : IrDeclarationReference {
@@ -33,10 +32,10 @@
 }
 
 interface IrGetObjectValue : IrGetSingletonValue {
-    override val symbol: IrClassSymbol
+    override val target: IrClass
 }
 
 interface IrGetEnumValue : IrGetSingletonValue {
-    override val symbol: IrEnumEntrySymbol
+    override val target: IrEnumEntry
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDelegatingConstructorCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDelegatingConstructorCall.kt
index 66dacc6..3c50356 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDelegatingConstructorCall.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrDelegatingConstructorCall.kt
@@ -17,10 +17,10 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 
 interface IrDelegatingConstructorCall : IrFunctionAccessExpression {
     override val descriptor: ClassConstructorDescriptor
-    override val symbol: IrConstructorSymbol
+    override val target: IrConstructor
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrEnumConstructorCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrEnumConstructorCall.kt
index b9a7d3d..6e7c427 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrEnumConstructorCall.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrEnumConstructorCall.kt
@@ -17,10 +17,10 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 
 
 interface IrEnumConstructorCall : IrFunctionAccessExpression {
     override val descriptor: ClassConstructorDescriptor
-    override val symbol: IrConstructorSymbol
+    override val target: IrConstructor
 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrFieldAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrFieldAccessExpression.kt
index d5c85e0..72715aa 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrFieldAccessExpression.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrFieldAccessExpression.kt
@@ -18,15 +18,15 @@
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.descriptors.PropertyDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrField
 
 interface IrFieldAccessExpression : IrDeclarationReference {
     override val descriptor: PropertyDescriptor
-    override val symbol: IrFieldSymbol
+    override val target: IrField
 
     val superQualifier: ClassDescriptor?
-    val superQualifierSymbol: IrClassSymbol?
+    val irSuperQualifier: IrClass?
 
     var receiver: IrExpression?
     val origin: IrStatementOrigin?
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrInstanceInitializerCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrInstanceInitializerCall.kt
index 02c1d4b..ecd8bf1 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrInstanceInitializerCall.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrInstanceInitializerCall.kt
@@ -17,10 +17,10 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
+import org.jetbrains.kotlin.ir.declarations.IrClass
 
 interface IrInstanceInitializerCall : IrExpression {
     val classDescriptor: ClassDescriptor
-    val classSymbol: IrClassSymbol
+    val irClass: IrClass
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt
index 0c0d6fe..c56f33cb 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt
@@ -9,12 +9,8 @@
 import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
 import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.declarations.IrValueParameter
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.defaultType
-import org.jetbrains.kotlin.ir.types.toKotlinType
-import org.jetbrains.kotlin.ir.util.dump
-import org.jetbrains.kotlin.ir.util.render
 import org.jetbrains.kotlin.types.KotlinType
 
 interface IrMemberAccessExpression : IrExpression {
@@ -44,6 +40,14 @@
     for (i in 0 until typeArgumentsCount) {
         putTypeArgument(i, other.getTypeArgument(i))
     }
+    if (this is IrConstructorCall && other is IrConstructorCall) {
+        assert(constructorTypeArgumentsCount == other.constructorTypeArgumentsCount) {
+            "Mismatching constructor type arguments: $constructorTypeArgumentsCount vs ${other.constructorTypeArgumentsCount} "
+        }
+        for (i in 0 until constructorTypeArgumentsCount) {
+            putConstructorTypeArgument(i, other.getConstructorTypeArgument(i))
+        }
+    }
 }
 
 inline fun IrMemberAccessExpression.putTypeArguments(
@@ -68,7 +72,7 @@
 
 interface IrFunctionAccessExpression : IrMemberAccessExpression, IrDeclarationReference {
     override val descriptor: FunctionDescriptor
-    override val symbol: IrFunctionSymbol
+    override val target: IrFunction
 }
 
 fun IrMemberAccessExpression.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) =
@@ -111,4 +115,4 @@
     }
 
 fun IrFunctionAccessExpression.putArgument(parameter: IrValueParameter, argument: IrExpression) =
-    putArgument(symbol.owner, parameter, argument)
+    putArgument(target, parameter, argument)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrReturn.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrReturn.kt
index adae088..de079e0 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrReturn.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrReturn.kt
@@ -17,12 +17,11 @@
 package org.jetbrains.kotlin.ir.expressions
 
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
-
+import org.jetbrains.kotlin.ir.declarations.IrReturnTarget
 
 interface IrReturn : IrExpression {
     var value: IrExpression
     val returnTarget: FunctionDescriptor
-    val returnTargetSymbol: IrReturnTargetSymbol
+    val irReturnTarget: IrReturnTarget
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrValueAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrValueAccessExpression.kt
index 6cc37c7..58cb1fb 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrValueAccessExpression.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrValueAccessExpression.kt
@@ -18,12 +18,12 @@
 
 import org.jetbrains.kotlin.descriptors.ValueDescriptor
 import org.jetbrains.kotlin.descriptors.VariableDescriptor
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
+import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
+import org.jetbrains.kotlin.ir.declarations.IrVariable
 
 interface IrValueAccessExpression : IrDeclarationReference {
     override val descriptor: ValueDescriptor
-    override val symbol: IrValueSymbol
+    override val target: IrValueDeclaration
     val origin: IrStatementOrigin?
 }
 
@@ -33,7 +33,7 @@
 
 interface IrSetVariable : IrValueAccessExpression {
     override val descriptor: VariableDescriptor
-    override val symbol: IrVariableSymbol
+    override val target: IrVariable
     var value: IrExpression
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt
index b11f476..2b924b3 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt
@@ -16,14 +16,12 @@
 
 package org.jetbrains.kotlin.ir.expressions.impl
 
-import org.jetbrains.kotlin.descriptors.FunctionDescriptor
 import org.jetbrains.kotlin.ir.IrStatement
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrBlock
 import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
-import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -70,7 +68,7 @@
         type: IrType,
         override val symbol: IrReturnableBlockSymbol,
         origin: IrStatementOrigin? = null,
-        override val inlineFunctionSymbol: IrFunctionSymbol? = null
+        override val inlineFunction: IrFunction? = null
 ) :
     IrContainerExpressionBase(startOffset, endOffset, type, origin),
     IrReturnableBlock {
@@ -84,8 +82,8 @@
         symbol: IrReturnableBlockSymbol,
         origin: IrStatementOrigin?,
         statements: List<IrStatement>,
-        inlineFunctionSymbol: IrFunctionSymbol? = null
-    ) : this(startOffset, endOffset, type, symbol, origin, inlineFunctionSymbol) {
+        inlineFunction: IrFunction? = null
+    ) : this(startOffset, endOffset, type, symbol, origin, inlineFunction) {
         this.statements.addAll(statements)
     }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallImpl.kt
index 98b94c1..5788699 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallImpl.kt
@@ -19,11 +19,11 @@
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrCall
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
 import org.jetbrains.kotlin.ir.expressions.typeParametersCount
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -31,12 +31,12 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrFunctionSymbol,
+    override val target: IrFunction,
     override val descriptor: FunctionDescriptor,
     typeArgumentsCount: Int,
     valueArgumentsCount: Int,
     origin: IrStatementOrigin? = null,
-    override val superQualifierSymbol: IrClassSymbol? = null
+    override val irSuperQualifier: IrClass? = null
 ) :
     IrCallWithIndexedArgumentsBase(
         startOffset, endOffset, type,
@@ -56,34 +56,34 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrFunctionSymbol,
+        target: IrFunction,
         descriptor: FunctionDescriptor,
         origin: IrStatementOrigin? = null,
-        superQualifierSymbol: IrClassSymbol? = null
+        irSuperQualifier: IrClass? = null
     ) : this(
-        startOffset, endOffset, type, symbol, descriptor, descriptor.typeParametersCount,
-        descriptor.valueParameters.size, origin, superQualifierSymbol
+        startOffset, endOffset, type, target, descriptor, descriptor.typeParametersCount,
+        descriptor.valueParameters.size, origin, irSuperQualifier
     )
 
     constructor(
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrFunctionSymbol,
+        target: IrFunction,
         descriptor: FunctionDescriptor,
         typeArgumentsCount: Int,
         origin: IrStatementOrigin? = null,
-        superQualifierSymbol: IrClassSymbol? = null
+        irSuperQualifier: IrClass? = null
     ) : this(
-        startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount,
-        descriptor.valueParameters.size, origin, superQualifierSymbol
+        startOffset, endOffset, type, target, descriptor, typeArgumentsCount,
+        descriptor.valueParameters.size, origin, irSuperQualifier
     )
 
-    constructor(startOffset: Int, endOffset: Int, type: IrType, symbol: IrFunctionSymbol) :
-            this(startOffset, endOffset, type, symbol, symbol.descriptor)
+    constructor(startOffset: Int, endOffset: Int, type: IrType, target: IrFunction) :
+            this(startOffset, endOffset, type, target, target.descriptor)
 
 
-    override val superQualifier: ClassDescriptor? = superQualifierSymbol?.descriptor
+    override val superQualifier: ClassDescriptor? = irSuperQualifier?.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitCall(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt
index cf126d7..65917cc 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrClassReferenceImpl.kt
@@ -17,8 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrClassifier
 import org.jetbrains.kotlin.ir.expressions.IrClassReference
-import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -26,16 +27,16 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    symbol: IrClassifierSymbol,
+    target: IrClassifier,
     override val classType: IrType
 ) :
-    IrTerminalDeclarationReferenceBase<IrClassifierSymbol, ClassifierDescriptor>(
+    IrTerminalDeclarationReferenceBase<IrClassifier, ClassifierDescriptor>(
         startOffset, endOffset, type,
-        symbol, symbol.descriptor
+        target, target.descriptor
     ),
     IrClassReference {
 
-    override val descriptor: ClassifierDescriptor get() = symbol.descriptor
+    override val descriptor: ClassifierDescriptor get() = target.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitClassReference(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt
index 8145db6..549576b 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstructorCallImpl.kt
@@ -7,9 +7,9 @@
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.util.parentAsClass
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -18,7 +18,7 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrConstructorSymbol,
+    override val target: IrConstructor,
     override val descriptor: ClassConstructorDescriptor,
     typeArgumentsCount: Int,
     override val constructorTypeArgumentsCount: Int,
@@ -36,7 +36,7 @@
             startOffset: Int,
             endOffset: Int,
             type: IrType,
-            constructorSymbol: IrConstructorSymbol,
+            target: IrConstructor,
             constructorDescriptor: ClassConstructorDescriptor,
             origin: IrStatementOrigin? = null
         ): IrConstructorCallImpl {
@@ -47,7 +47,7 @@
             return IrConstructorCallImpl(
                 startOffset, endOffset,
                 type,
-                constructorSymbol,
+                target,
                 constructorDescriptor,
                 totalTypeParametersCount,
                 totalTypeParametersCount - classTypeParametersCount,
@@ -60,30 +60,29 @@
             startOffset: Int,
             endOffset: Int,
             type: IrType,
-            constructorSymbol: IrConstructorSymbol,
+            target: IrConstructor,
             origin: IrStatementOrigin? = null
         ): IrConstructorCallImpl =
-            fromSubstitutedDescriptor(startOffset, endOffset, type, constructorSymbol, constructorSymbol.descriptor, origin)
+            fromSubstitutedDescriptor(startOffset, endOffset, type, target, target.descriptor, origin)
 
         fun fromSymbolOwner(
             startOffset: Int,
             endOffset: Int,
             type: IrType,
-            constructorSymbol: IrConstructorSymbol,
+            target: IrConstructor,
             origin: IrStatementOrigin? = null
         ): IrConstructorCallImpl {
-            val constructor = constructorSymbol.owner
-            val constructedClass = constructor.parentAsClass
+            val constructedClass = target.parentAsClass
             val classTypeParametersCount = constructedClass.typeParameters.size
-            val constructorTypeParametersCount = constructor.typeParameters.size
+            val constructorTypeParametersCount = target.typeParameters.size
             val totalTypeParametersCount = classTypeParametersCount + constructorTypeParametersCount
-            val valueParametersCount = constructor.valueParameters.size
+            val valueParametersCount = target.valueParameters.size
 
             return IrConstructorCallImpl(
                 startOffset, endOffset,
                 type,
-                constructorSymbol,
-                constructorSymbol.descriptor,
+                target,
+                target.descriptor,
                 totalTypeParametersCount,
                 constructorTypeParametersCount,
                 valueParametersCount,
@@ -93,10 +92,10 @@
 
         fun fromSymbolOwner(
             type: IrType,
-            constructorSymbol: IrConstructorSymbol,
+            target: IrConstructor,
             origin: IrStatementOrigin? = null
         ) =
-            fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, constructorSymbol, origin)
+            fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, target, origin)
     }
 }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDeclarationReferenceBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDeclarationReferenceBase.kt
index c4de372..bcd9a1e 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDeclarationReferenceBase.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDeclarationReferenceBase.kt
@@ -17,15 +17,15 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 
-abstract class IrDeclarationReferenceBase<out S : IrSymbol, out D : DeclarationDescriptor>(
+abstract class IrDeclarationReferenceBase<out S : IrSymbolOwner, out D : DeclarationDescriptor>(
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: S,
+    override val target: S,
     override val descriptor: D
 ) :
     IrExpressionBase(startOffset, endOffset, type),
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt
index 001548b..dae93f1 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrDelegatingConstructorCallImpl.kt
@@ -17,9 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
 import org.jetbrains.kotlin.ir.expressions.typeParametersCount
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -27,7 +27,7 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrConstructorSymbol,
+    override val target: IrConstructor,
     override val descriptor: ClassConstructorDescriptor,
     typeArgumentsCount: Int,
     valueArgumentsCount: Int
@@ -45,25 +45,25 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrConstructorSymbol,
+        target: IrConstructor,
         descriptor: ClassConstructorDescriptor
-    ) : this(startOffset, endOffset, type, symbol, descriptor, descriptor.typeParametersCount, descriptor.valueParameters.size)
+    ) : this(startOffset, endOffset, type, target, descriptor, descriptor.typeParametersCount, descriptor.valueParameters.size)
 
     constructor(
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrConstructorSymbol
-    ) : this(startOffset, endOffset, type, symbol, symbol.descriptor)
+        target: IrConstructor
+    ) : this(startOffset, endOffset, type, target, target.descriptor)
 
     constructor(
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrConstructorSymbol,
+        target: IrConstructor,
         descriptor: ClassConstructorDescriptor,
         typeArgumentsCount: Int
-    ) : this(startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount, descriptor.valueParameters.size)
+    ) : this(startOffset, endOffset, type, target, descriptor, typeArgumentsCount, descriptor.valueParameters.size)
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
         return visitor.visitDelegatingConstructorCall(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrEnumConstructorCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrEnumConstructorCallImpl.kt
index ba7c70d..439c60e 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrEnumConstructorCallImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrEnumConstructorCallImpl.kt
@@ -17,9 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.expressions.IrEnumConstructorCall
 import org.jetbrains.kotlin.ir.expressions.typeParametersCount
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -27,7 +27,7 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrConstructorSymbol,
+    override val target: IrConstructor,
     typeArgumentsCount: Int,
     valueArgumentsCount: Int
 ) :
@@ -44,18 +44,18 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrConstructorSymbol
-    ) : this(startOffset, endOffset, type, symbol, symbol.descriptor.typeParametersCount, symbol.descriptor.valueParameters.size)
+        target: IrConstructor
+    ) : this(startOffset, endOffset, type, target, target.descriptor.typeParametersCount, target.descriptor.valueParameters.size)
 
     constructor(
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrConstructorSymbol,
+        target: IrConstructor,
         typeArgumentsCount: Int
-    ) : this(startOffset, endOffset, type, symbol, typeArgumentsCount, symbol.descriptor.valueParameters.size)
+    ) : this(startOffset, endOffset, type, target, typeArgumentsCount, target.descriptor.valueParameters.size)
 
-    override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor
+    override val descriptor: ClassConstructorDescriptor get() = target.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
         return visitor.visitEnumConstructorCall(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFieldExpressionBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFieldExpressionBase.kt
index 7800d7a..70d91fa 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFieldExpressionBase.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFieldExpressionBase.kt
@@ -18,25 +18,25 @@
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.descriptors.PropertyDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrField
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFieldAccessExpression
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 
 abstract class IrFieldExpressionBase(
     startOffset: Int, endOffset: Int,
-    override val symbol: IrFieldSymbol,
+    override val target: IrField,
     type: IrType,
     override val origin: IrStatementOrigin? = null,
-    override val superQualifierSymbol: IrClassSymbol?
+    override val irSuperQualifier: IrClass?
 ) :
     IrExpressionBase(startOffset, endOffset, type),
     IrFieldAccessExpression {
 
-    override val descriptor: PropertyDescriptor get() = symbol.descriptor
-    override val superQualifier: ClassDescriptor? get() = superQualifierSymbol?.descriptor
+    override val descriptor: PropertyDescriptor get() = target.descriptor
+    override val superQualifier: ClassDescriptor? get() = irSuperQualifier?.descriptor
 
     final override var receiver: IrExpression? = null
 }
\ No newline at end of file
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt
index 9af008f..797c469 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt
@@ -17,9 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrFunction
 import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -27,7 +27,7 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrFunctionSymbol,
+    override val target: IrFunction,
     override val descriptor: FunctionDescriptor,
     typeArgumentsCount: Int,
     valueArgumentsCount: Int,
@@ -47,11 +47,11 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrFunctionSymbol,
+        target: IrFunction,
         descriptor: FunctionDescriptor,
         typeArgumentsCount: Int,
         origin: IrStatementOrigin? = null
-    ) : this(startOffset, endOffset, type, symbol, descriptor, typeArgumentsCount, descriptor.valueParameters.size, origin)
+    ) : this(startOffset, endOffset, type, target, descriptor, typeArgumentsCount, descriptor.valueParameters.size, origin)
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitFunctionReference(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetEnumValueImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetEnumValueImpl.kt
index 359e3ed..2535abc 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetEnumValueImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetEnumValueImpl.kt
@@ -17,8 +17,8 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
 import org.jetbrains.kotlin.ir.expressions.IrGetEnumValue
-import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -26,9 +26,9 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    symbol: IrEnumEntrySymbol
+    target: IrEnumEntry
 ) :
-    IrTerminalDeclarationReferenceBase<IrEnumEntrySymbol, ClassDescriptor>(startOffset, endOffset, type, symbol, symbol.descriptor),
+    IrTerminalDeclarationReferenceBase<IrEnumEntry, ClassDescriptor>(startOffset, endOffset, type, target, target.descriptor),
     IrGetEnumValue {
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetFieldImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetFieldImpl.kt
index 7a4edd9..05d437d 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetFieldImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetFieldImpl.kt
@@ -16,11 +16,11 @@
 
 package org.jetbrains.kotlin.ir.expressions.impl
 
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrField
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrGetField
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -28,22 +28,22 @@
 class IrGetFieldImpl(
     startOffset: Int,
     endOffset: Int,
-    symbol: IrFieldSymbol,
+    target: IrField,
     type: IrType,
     origin: IrStatementOrigin? = null,
-    superQualifierSymbol: IrClassSymbol? = null
+    irSuperQualifier: IrClass? = null
 ) :
-    IrFieldExpressionBase(startOffset, endOffset, symbol, type, origin, superQualifierSymbol),
+    IrFieldExpressionBase(startOffset, endOffset, target, type, origin, irSuperQualifier),
     IrGetField {
 
     constructor(
         startOffset: Int, endOffset: Int,
-        symbol: IrFieldSymbol,
+        target: IrField,
         type: IrType,
         receiver: IrExpression?,
         origin: IrStatementOrigin? = null,
-        superQualifierSymbol: IrClassSymbol? = null
-    ) : this(startOffset, endOffset, symbol, type, origin, superQualifierSymbol) {
+        irSuperQualifier: IrClass? = null
+    ) : this(startOffset, endOffset, target, type, origin, irSuperQualifier) {
         this.receiver = receiver
     }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt
index 24f715a..d0b3f4c 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetObjectValueImpl.kt
@@ -17,8 +17,8 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrClass
 import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -26,9 +26,9 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    symbol: IrClassSymbol
+    target: IrClass
 ) :
-    IrTerminalDeclarationReferenceBase<IrClassSymbol, ClassDescriptor>(startOffset, endOffset, type, symbol, symbol.descriptor),
+    IrTerminalDeclarationReferenceBase<IrClass, ClassDescriptor>(startOffset, endOffset, type, target, target.descriptor),
     IrGetObjectValue {
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetValueImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetValueImpl.kt
index 458c4ab..2ef1114 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetValueImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrGetValueImpl.kt
@@ -6,9 +6,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ValueDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
 import org.jetbrains.kotlin.ir.expressions.IrGetValue
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -16,28 +16,28 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    symbol: IrValueSymbol,
+    target: IrValueDeclaration,
     override val origin: IrStatementOrigin? = null
 ) :
-    IrTerminalDeclarationReferenceBase<IrValueSymbol, ValueDescriptor>(
+    IrTerminalDeclarationReferenceBase<IrValueDeclaration, ValueDescriptor>(
         startOffset,
         endOffset,
         type,
-        symbol,
-        symbol.descriptor
+        target,
+        target.descriptor
     ),
     IrGetValue {
 
     constructor(
         startOffset: Int,
         endOffset: Int,
-        symbol: IrValueSymbol,
+        target: IrValueDeclaration,
         origin: IrStatementOrigin? = null
-    ) : this(startOffset, endOffset, symbol.owner.type, symbol, origin)
+    ) : this(startOffset, endOffset, target.type, target, origin)
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitGetValue(this, data)
 
     override fun copy(): IrGetValue =
-        IrGetValueImpl(startOffset, endOffset, type, symbol, origin)
+        IrGetValueImpl(startOffset, endOffset, type, target, origin)
 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrInstanceInitializerCallImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrInstanceInitializerCallImpl.kt
index f25f014..09091b8 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrInstanceInitializerCallImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrInstanceInitializerCallImpl.kt
@@ -17,21 +17,21 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrClass
 import org.jetbrains.kotlin.ir.expressions.IrInstanceInitializerCall
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
 class IrInstanceInitializerCallImpl(
     startOffset: Int,
     endOffset: Int,
-    override val classSymbol: IrClassSymbol,
+    override val irClass: IrClass,
     type: IrType
 ) :
     IrTerminalExpressionBase(startOffset, endOffset, type),
     IrInstanceInitializerCall {
 
-    override val classDescriptor: ClassDescriptor get() = classSymbol.descriptor
+    override val classDescriptor: ClassDescriptor get() = irClass.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
         return visitor.visitInstanceInitializerCall(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt
index b3fd9e1..c82dbc5 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt
@@ -17,11 +17,11 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
+import org.jetbrains.kotlin.ir.declarations.IrLocalDelegatedProperty
+import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
+import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
@@ -29,17 +29,17 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrLocalDelegatedPropertySymbol,
-    override val delegate: IrVariableSymbol,
-    override val getter: IrSimpleFunctionSymbol,
-    override val setter: IrSimpleFunctionSymbol?,
+    override val target: IrLocalDelegatedProperty,
+    override val delegate: IrVariable,
+    override val getter: IrSimpleFunction,
+    override val setter: IrSimpleFunction?,
     origin: IrStatementOrigin? = null
 ) :
     IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, 0, origin),
     IrLocalDelegatedPropertyReference {
 
     override val descriptor: VariableDescriptorWithAccessors
-        get() = symbol.descriptor
+        get() = target.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitLocalDelegatedPropertyReference(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt
index 17cb397..cfd2b9e 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt
@@ -17,11 +17,11 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.PropertyDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrField
+import org.jetbrains.kotlin.ir.declarations.IrProperty
+import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
 import org.jetbrains.kotlin.ir.expressions.IrPropertyReference
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
-import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
-import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -30,12 +30,12 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrPropertySymbol,
+    override val target: IrProperty,
     override val descriptor: PropertyDescriptor,
     typeArgumentsCount: Int,
-    override val field: IrFieldSymbol?,
-    override val getter: IrSimpleFunctionSymbol?,
-    override val setter: IrSimpleFunctionSymbol?,
+    override val field: IrField?,
+    override val getter: IrSimpleFunction?,
+    override val setter: IrSimpleFunction?,
     origin: IrStatementOrigin? = null
 ) :
     IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, typeArgumentsCount, origin),
@@ -45,15 +45,15 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrPropertySymbol,
+        target: IrProperty,
         typeArgumentsCount: Int,
-        field: IrFieldSymbol?,
-        getter: IrSimpleFunctionSymbol?,
-        setter: IrSimpleFunctionSymbol?,
+        field: IrField?,
+        getter: IrSimpleFunction?,
+        setter: IrSimpleFunction?,
         origin: IrStatementOrigin? = null
     ) : this(
         startOffset, endOffset, type,
-        symbol, symbol.descriptor,
+        target, target.descriptor,
         typeArgumentsCount, field, getter, setter, origin
     )
 
@@ -64,9 +64,9 @@
         type: IrType,
         descriptor: PropertyDescriptor,
         typeArgumentsCount: Int,
-        field: IrFieldSymbol?,
-        getter: IrSimpleFunctionSymbol?,
-        setter: IrSimpleFunctionSymbol?,
+        field: IrField?,
+        getter: IrSimpleFunction?,
+        setter: IrSimpleFunction?,
         origin: IrStatementOrigin? = null
     ) : this(
         startOffset, endOffset, type,
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrReturnImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrReturnImpl.kt
index 04e669f..7214ae5 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrReturnImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrReturnImpl.kt
@@ -17,9 +17,9 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrReturnTarget
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrReturn
-import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -28,13 +28,13 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val returnTargetSymbol: IrReturnTargetSymbol,
+    override val irReturnTarget: IrReturnTarget,
     override var value: IrExpression
 ) :
     IrExpressionBase(startOffset, endOffset, type),
     IrReturn {
 
-    override val returnTarget: FunctionDescriptor get() = returnTargetSymbol.descriptor
+    override val returnTarget: FunctionDescriptor get() = irReturnTarget.descriptor
 
     override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
         visitor.visitReturn(this, data)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetFieldImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetFieldImpl.kt
index b3fe569..ec1fba5 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetFieldImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetFieldImpl.kt
@@ -16,11 +16,11 @@
 
 package org.jetbrains.kotlin.ir.expressions.impl
 
+import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrField
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrSetField
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -28,29 +28,29 @@
 class IrSetFieldImpl(
     startOffset: Int,
     endOffset: Int,
-    symbol: IrFieldSymbol,
+    target: IrField,
     type: IrType,
     origin: IrStatementOrigin? = null,
-    superQualifierSymbol: IrClassSymbol? = null
+    irSuperQualifier: IrClass? = null
 ) :
     IrFieldExpressionBase(
         startOffset, endOffset,
-        symbol,
+        target,
         type,
         origin,
-        superQualifierSymbol
+        irSuperQualifier
     ),
     IrSetField {
 
     constructor(
         startOffset: Int, endOffset: Int,
-        symbol: IrFieldSymbol,
+        target: IrField,
         receiver: IrExpression?,
         value: IrExpression,
         type: IrType,
         origin: IrStatementOrigin? = null,
-        superQualifierSymbol: IrClassSymbol? = null
-    ) : this(startOffset, endOffset, symbol, type, origin, superQualifierSymbol) {
+        irSuperQualifier: IrClass? = null
+    ) : this(startOffset, endOffset, target, type, origin, irSuperQualifier) {
         this.receiver = receiver
         this.value = value
     }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetVariableImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetVariableImpl.kt
index ec1ae7f..f0ef2cf3 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetVariableImpl.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetVariableImpl.kt
@@ -17,10 +17,10 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.VariableDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrSetVariable
 import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
-import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -29,7 +29,7 @@
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    override val symbol: IrVariableSymbol,
+    override val target: IrVariable,
     override val origin: IrStatementOrigin?
 ) :
     IrExpressionBase(startOffset, endOffset, type),
@@ -39,14 +39,14 @@
         startOffset: Int,
         endOffset: Int,
         type: IrType,
-        symbol: IrVariableSymbol,
+        target: IrVariable,
         value: IrExpression,
         origin: IrStatementOrigin?
-    ) : this(startOffset, endOffset, type, symbol, origin) {
+    ) : this(startOffset, endOffset, type, target, origin) {
         this.value = value
     }
 
-    override val descriptor: VariableDescriptor get() = symbol.descriptor
+    override val descriptor: VariableDescriptor get() = target.descriptor
 
     override lateinit var value: IrExpression
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTerminalDeclarationReferenceBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTerminalDeclarationReferenceBase.kt
index cded755..5b05185 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTerminalDeclarationReferenceBase.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTerminalDeclarationReferenceBase.kt
@@ -17,20 +17,20 @@
 package org.jetbrains.kotlin.ir.expressions.impl
 
 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
 import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference
-import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
 
-abstract class IrTerminalDeclarationReferenceBase<out S : IrSymbol, out D : DeclarationDescriptor>(
+abstract class IrTerminalDeclarationReferenceBase<out S : IrSymbolOwner, out D : DeclarationDescriptor>(
     startOffset: Int,
     endOffset: Int,
     type: IrType,
-    symbol: S,
+    target: S,
     descriptor: D
 ) :
-    IrDeclarationReferenceBase<S, D>(startOffset, endOffset, type, symbol, descriptor),
+    IrDeclarationReferenceBase<S, D>(startOffset, endOffset, type, target, descriptor),
     IrDeclarationReference {
 
     override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt
index db4ca1c..13cedf4 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt
@@ -21,7 +21,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
 import org.jetbrains.kotlin.ir.util.IrSymbolVisitor
 import org.jetbrains.kotlin.types.model.TypeConstructorMarker
-import org.jetbrains.kotlin.types.model.TypeParameterMarker
 
 interface IrSymbol : IrSymbolOwner {
     val owner: IrSymbolOwner
@@ -86,9 +85,11 @@
 }
 
 interface IrClassifierSymbol :
-    IrSymbol, TypeConstructorMarker {
+    IrSymbol, TypeConstructorMarker,
+    IrClassifier {
 
     override val descriptor: ClassifierDescriptor
+    override val owner: IrClassifier
 
     override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
         visitor.visitClassifierSymbol(this, data)
@@ -103,7 +104,7 @@
 }
 
 interface IrTypeParameterSymbol :
-    IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter>, TypeParameterMarker,
+    IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter>,
     IrTypeParameter {
 
     override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
@@ -111,7 +112,7 @@
 }
 
 interface IrValueSymbol :
-    IrSymbol {
+    IrSymbol, IrValueDeclaration {
 
     override val descriptor: ValueDescriptor
     override val owner: IrValueDeclaration
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt
index a38f3cb..3a26e37 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/impl/IrSymbolBase.kt
@@ -97,7 +97,7 @@
 class IrAnonymousInitializerSymbolImpl(descriptor: ClassDescriptor) :
     IrBindableSymbolBase<ClassDescriptor, IrAnonymousInitializer>(descriptor),
     IrAnonymousInitializerSymbol, IrAnonymousInitializer {
-    constructor(irClassSymbol: IrClassSymbol) : this(irClassSymbol.descriptor) {}
+    constructor(irClass: IrClass) : this(irClass.descriptor) {}
     override val symbol get() = this
     override val startOffset get() = owner.startOffset
     override val endOffset get() = owner.endOffset
@@ -181,7 +181,7 @@
     override val isFinal get() = owner.isFinal
     override val isExternal get() = owner.isExternal
     override val isStatic get() = owner.isStatic
-    override val overriddenSymbols get() = owner.overriddenSymbols
+    override val overridden get() = owner.overridden
     override val visibility get() = owner.visibility
 
     override var parent get() = owner.parent; set(value) { owner.parent = value }
@@ -281,7 +281,7 @@
     override val visibility get() = owner.visibility
     override val typeParameters get() = owner.typeParameters
     override val valueParameters get() = owner.valueParameters
-    override val overriddenSymbols get() = owner.overriddenSymbols
+    override val overridden get() = owner.overridden
     override val isTailrec get() = owner.isTailrec
     override val isSuspend get() = owner.isSuspend
     override val isInline get() = owner.isInline
@@ -338,7 +338,7 @@
     override val startOffset get() = owner.startOffset
     override val endOffset get() = owner.endOffset
     override val type get() = owner.type
-    override val inlineFunctionSymbol get() = owner.inlineFunctionSymbol
+    override val inlineFunction get() = owner.inlineFunction
     override val statements get() = owner.statements
     override val origin get() = owner.origin
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
index 0e8db66..9cd6d77 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.builtins.KotlinBuiltIns
 import org.jetbrains.kotlin.builtins.PrimitiveType
-import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.descriptors.ClassKind
 import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.descriptors.Visibilities
@@ -97,37 +96,37 @@
 
     private fun getTypeParameters(typeConstructor: TypeConstructorMarker): List<IrTypeParameter> {
         return when (typeConstructor) {
-            is IrTypeParameterSymbol -> emptyList()
-            is IrClassSymbol -> typeConstructor.owner.typeParameters
+            is IrTypeParameter -> emptyList()
+            is IrClass -> typeConstructor.typeParameters
             else -> error("unsupported type constructor")
         }
     }
 
     override fun TypeConstructorMarker.parametersCount() = getTypeParameters(this).size
 
-    override fun TypeConstructorMarker.getParameter(index: Int) = getTypeParameters(this)[index].symbol
+    override fun TypeConstructorMarker.getParameter(index: Int) = getTypeParameters(this)[index]
 
     override fun TypeConstructorMarker.supertypes(): Collection<KotlinTypeMarker> {
         return when (this) {
-            is IrClassSymbol -> owner.superTypes
-            is IrTypeParameterSymbol -> owner.superTypes
+            is IrClass -> superTypes
+            is IrTypeParameter -> superTypes
             else -> error("unsupported type constructor")
         }
     }
 
     override fun TypeConstructorMarker.isIntersection() = false
 
-    override fun TypeConstructorMarker.isClassTypeConstructor() = this is IrClassSymbol
+    override fun TypeConstructorMarker.isClassTypeConstructor() = this is IrClass
 
-    override fun TypeParameterMarker.getVariance() = (this as IrTypeParameterSymbol).owner.variance.convertVariance()
+    override fun TypeParameterMarker.getVariance() = (this as IrTypeParameter).variance.convertVariance()
 
-    private fun getSuperTypes(typeParameterMarker: TypeParameterMarker) = (typeParameterMarker as IrTypeParameterSymbol).owner.superTypes
+    private fun getSuperTypes(typeParameterMarker: TypeParameterMarker) = (typeParameterMarker as IrTypeParameter).superTypes
 
     override fun TypeParameterMarker.upperBoundCount() = getSuperTypes(this).size
 
     override fun TypeParameterMarker.getUpperBound(index: Int) = getSuperTypes(this)[index] as KotlinTypeMarker
 
-    override fun TypeParameterMarker.getTypeConstructor() = this as IrTypeParameterSymbol
+    override fun TypeParameterMarker.getTypeConstructor() = this as IrTypeParameter
 
     override fun isEqualTypeConstructors(c1: TypeConstructorMarker, c2: TypeConstructorMarker) = FqNameEqualityChecker.areEqual(
         c1 as IrClassifierSymbol, c2 as IrClassifierSymbol
@@ -136,8 +135,7 @@
     override fun TypeConstructorMarker.isDenotable() = true
 
     override fun TypeConstructorMarker.isCommonFinalClassConstructor(): Boolean {
-        val classSymbol = this as? IrClassSymbol ?: return false
-        return classSymbol.owner.run { modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS && kind != ClassKind.ANNOTATION_CLASS }
+        return this is IrClass && modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS && kind != ClassKind.ANNOTATION_CLASS
     }
 
     /*
@@ -191,10 +189,10 @@
     override fun SimpleTypeMarker.asArgumentList() = this as IrSimpleType
 
     override fun TypeConstructorMarker.isAnyConstructor(): Boolean =
-        this is IrClassSymbol && isClassWithFqName(KotlinBuiltIns.FQ_NAMES.any)
+        this is IrClass && isClassWithFqName(KotlinBuiltIns.FQ_NAMES.any)
 
     override fun TypeConstructorMarker.isNothingConstructor(): Boolean =
-        this is IrClassSymbol && isClassWithFqName(KotlinBuiltIns.FQ_NAMES.nothing)
+        this is IrClass && isClassWithFqName(KotlinBuiltIns.FQ_NAMES.nothing)
 
     override fun SimpleTypeMarker.isSingleClassifierType() = true
 
@@ -214,7 +212,7 @@
         constructor: TypeConstructorMarker,
         arguments: List<TypeArgumentMarker>,
         nullable: Boolean
-    ): SimpleTypeMarker = IrSimpleTypeImpl(constructor as IrClassifierSymbol, nullable, arguments.map { it as IrTypeArgument }, emptyList())
+    ): SimpleTypeMarker = IrSimpleTypeImpl((constructor as IrClassifier).symbol, nullable, arguments.map { it as IrTypeArgument }, emptyList())
 
     private fun TypeVariance.convertVariance(): Variance {
         return when (this) {
@@ -277,10 +275,7 @@
         (this as IrType).isArray() || isNullableArray()
 
     override fun TypeConstructorMarker.isFinalClassOrEnumEntryOrAnnotationClassConstructor(): Boolean {
-        val symbol = this as IrClassifierSymbol
-        return symbol is IrClassSymbol && symbol.owner.let {
-            it.modality == Modality.FINAL && !it.isEnumClass
-        }
+        return this is IrClass && modality == Modality.FINAL && !isEnumClass
     }
 
     override fun KotlinTypeMarker.hasAnnotation(fqName: FqName): Boolean =
@@ -290,22 +285,22 @@
 
     override fun KotlinTypeMarker.getAnnotationFirstArgumentValue(fqName: FqName): Any? =
         (this as? IrType)?.annotations?.firstOrNull { annotation ->
-            annotation.symbol.owner.parentAsClass.descriptor.fqNameSafe == fqName
+            annotation.target.parentAsClass.descriptor.fqNameSafe == fqName
         }?.run {
             if (valueArgumentsCount > 0) (getValueArgument(0) as? IrConst<*>)?.value else null
         }
 
     override fun TypeConstructorMarker.getTypeParameterClassifier(): TypeParameterMarker? =
-        this as? IrTypeParameterSymbol
+        this as? IrTypeParameter
 
     override fun TypeConstructorMarker.isInlineClass(): Boolean =
-        (this as? IrClassSymbol)?.owner?.isInline == true
+        (this as? IrClass)?.isInline == true
 
     override fun TypeParameterMarker.getRepresentativeUpperBound(): KotlinTypeMarker =
-        (this as IrTypeParameterSymbol).owner.superTypes.firstOrNull {
+        (this as IrTypeParameter).superTypes.firstOrNull {
             val irClass = it.classOrNull?.owner ?: return@firstOrNull false
             irClass.kind != ClassKind.INTERFACE && irClass.kind != ClassKind.ANNOTATION_CLASS
-        } ?: owner.superTypes.first()
+        } ?: superTypes.first()
 
     override fun KotlinTypeMarker.getSubstitutedUnderlyingType(): KotlinTypeMarker? {
         // Code in inlineClassesUtils.kt loads the property with the same name from the scope of the substituted type and takes its type.
@@ -324,16 +319,16 @@
 
     override fun TypeConstructorMarker.getPrimitiveType(): PrimitiveType? {
         // TODO: get rid of descriptor
-        return KotlinBuiltIns.getPrimitiveType((this as IrClassifierSymbol).descriptor as ClassDescriptor)
+        return KotlinBuiltIns.getPrimitiveType((this as IrClass).descriptor)
     }
 
     override fun TypeConstructorMarker.getPrimitiveArrayType(): PrimitiveType? {
         // TODO: get rid of descriptor
-        return KotlinBuiltIns.getPrimitiveArrayType((this as IrClassifierSymbol).descriptor as ClassDescriptor)
+        return KotlinBuiltIns.getPrimitiveArrayType((this as IrClass).descriptor)
     }
 
     override fun TypeConstructorMarker.isUnderKotlinPackage(): Boolean {
-        var declaration: IrDeclaration = (this as? IrClassifierSymbol)?.owner as? IrClass ?: return false
+        var declaration: IrDeclaration = this as? IrClass ?: return false
         while (true) {
             val parent = declaration.parent
             if (parent is IrPackageFragment) {
@@ -344,13 +339,13 @@
     }
 
     override fun TypeConstructorMarker.getClassFqNameUnsafe(): FqNameUnsafe? =
-        (this as IrClassSymbol).owner.fqNameWhenAvailable?.toUnsafe()
+        (this as IrClass).fqNameWhenAvailable?.toUnsafe()
 
     override fun TypeParameterMarker.getName(): Name =
-        (this as IrTypeParameterSymbol).owner.name
+        (this as IrTypeParameter).name
 
     override fun TypeParameterMarker.isReified(): Boolean =
-        (this as IrTypeParameterSymbol).owner.isReified
+        (this as IrTypeParameter).isReified
 
     override fun KotlinTypeMarker.isInterfaceOrAnnotationClass(): Boolean {
         val irClass = (this as IrType).classOrNull?.owner
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt
index 6259f8e..6a2112a 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.ir.types
 
+import org.jetbrains.kotlin.ir.declarations.IrClass
 import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
 import org.jetbrains.kotlin.ir.symbols.FqNameEqualityChecker
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
@@ -22,12 +23,14 @@
     else -> emptyList<IrType>()
 }
 
-fun IrClassifierSymbol.isSubtypeOfClass(superClass: IrClassSymbol): Boolean {
-    if (FqNameEqualityChecker.areEqual(this, superClass)) return true
+fun IrClass.isSubtypeOfClass(superClass: IrClass): Boolean = (symbol as IrClassifierSymbol).isSubtypeOfClass(superClass)
+
+fun IrClassifierSymbol.isSubtypeOfClass(superClass: IrClass): Boolean {
+    if (FqNameEqualityChecker.areEqual(this, superClass.symbol)) return true
     return superTypes().any { it.isSubtypeOfClass(superClass) }
 }
 
-fun IrType.isSubtypeOfClass(superClass: IrClassSymbol): Boolean {
+fun IrType.isSubtypeOfClass(superClass: IrClass): Boolean {
     if (this !is IrSimpleType) return false
     return classifier.isSubtypeOfClass(superClass)
 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt
index 230342b..834ffe4 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypePredicates.kt
@@ -8,8 +8,8 @@
 import org.jetbrains.kotlin.builtins.KotlinBuiltIns
 import org.jetbrains.kotlin.descriptors.ClassDescriptor
 import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrClassifier
 import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
-import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
 import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
 import org.jetbrains.kotlin.name.FqNameUnsafe
 import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -21,11 +21,12 @@
 private fun IrType.isClassType(fqName: FqNameUnsafe, hasQuestionMark: Boolean? = null): Boolean {
     if (this !is IrSimpleType) return false
     if (hasQuestionMark != null && this.hasQuestionMark != hasQuestionMark) return false
-    return classifier.isClassWithFqName(fqName)
+    return classifier.owner.isClassWithFqName(fqName)
 }
 
-fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
-    this is IrClassSymbol && classFqNameEquals(this, fqName)
+fun IrClassifier.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
+    this is IrClass && isClassWithFqName(fqName)
+fun IrClass.isClassWithFqName(fqName: FqNameUnsafe): Boolean = classFqNameEquals(this, fqName)
 
 private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean =
     if (symbol.isBound) classFqNameEquals(symbol.owner, fqName) else classFqNameEquals(symbol.descriptor, fqName)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt
index c618d76..f583b7d 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt
@@ -73,9 +73,9 @@
 fun IrType.getClass(): IrClass? =
     classOrNull?.owner
 
-fun IrClassSymbol.createType(hasQuestionMark: Boolean, arguments: List<IrTypeArgument>): IrSimpleType =
+fun IrClass.createType(hasQuestionMark: Boolean, arguments: List<IrTypeArgument>): IrSimpleType =
     IrSimpleTypeImpl(
-        this,
+        this.symbol,
         hasQuestionMark,
         arguments,
         emptyList()
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
index c0ca56a..d58fb6d 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
@@ -68,8 +68,8 @@
 fun IrSimpleFunction.overrides(other: IrSimpleFunction): Boolean {
     if (this == other) return true
 
-    this.overriddenSymbols.forEach {
-        if (it.owner.overrides(other)) {
+    this.overridden.forEach {
+        if (it.overrides(other)) {
             return true
         }
     }
@@ -78,7 +78,7 @@
 }
 
 private val IrConstructorCall.annotationClass
-    get() = this.symbol.owner.constructedClass
+    get() = this.target.constructedClass
 
 fun List<IrConstructorCall>.hasAnnotation(fqName: FqName): Boolean =
     any { it.annotationClass.fqNameWhenAvailable == fqName }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt
index 02810dc..f45f1b2 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ConstantValueGenerator.kt
@@ -11,6 +11,7 @@
 import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
 import org.jetbrains.kotlin.incremental.components.NoLookupLocation
 import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
+import org.jetbrains.kotlin.ir.declarations.IrClassifier
 import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.impl.*
@@ -109,7 +110,7 @@
                     IrClassReferenceImpl(
                         startOffset, endOffset,
                         constantValue.getType(moduleDescriptor).toIrType(),
-                        classifierDescriptor.defaultType.toIrType().classifierOrFail,
+                        classifierDescriptor.defaultType.toIrType().classifierOrFail as IrClassifier,
                         classifierKtType.toIrType()
                     )
                 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt
index f6c9946..a005b36 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt
@@ -38,7 +38,9 @@
     val symbolRemapper = DeepCopySymbolRemapper(descriptorRemapper)
     acceptVoid(symbolRemapper)
     val typeRemapper = DeepCopyTypeRemapper(symbolRemapper)
-    return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T
+    return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null)
+        .desymbolize()
+        .patchDeclarationParents(initialParent) as T
 }
 
 interface SymbolRenamer {
@@ -155,8 +157,8 @@
             declaration.isTailrec,
             declaration.isSuspend
         ).apply {
-            declaration.overriddenSymbols.mapTo(overriddenSymbols) {
-                symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
+            declaration.overridden.mapTo(overridden) {
+                (symbolRemapper.getReferencedFunction(it.symbol) as IrSimpleFunctionSymbol)
             }
             transformFunctionChildren(declaration)
         }
@@ -229,8 +231,8 @@
             declaration.isStatic
         ).apply {
             transformAnnotations(declaration)
-            declaration.overriddenSymbols.mapTo(overriddenSymbols) {
-                symbolRemapper.getReferencedField(it)
+            declaration.overridden.mapTo(overridden) {
+                symbolRemapper.getReferencedField(it.symbol)
             }
             initializer = declaration.initializer?.transform()
         }
@@ -389,7 +391,7 @@
                 symbolRemapper.getReferencedReturnableBlock(expression.symbol),
                 mapStatementOrigin(expression.origin),
                 expression.statements.map { it.transform() },
-                expression.inlineFunctionSymbol
+                expression.inlineFunction
             ).copyAttributes(expression)
         else
             IrBlockImpl(
@@ -418,21 +420,21 @@
         IrGetObjectValueImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedClass(expression.symbol)
+            symbolRemapper.getReferencedClass(expression.target.symbol)
         ).copyAttributes(expression)
 
     override fun visitGetEnumValue(expression: IrGetEnumValue): IrGetEnumValue =
         IrGetEnumValueImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedEnumEntry(expression.symbol)
+            symbolRemapper.getReferencedEnumEntry(expression.target.symbol)
         ).copyAttributes(expression)
 
     override fun visitGetValue(expression: IrGetValue): IrGetValue =
         IrGetValueImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedValue(expression.symbol),
+            symbolRemapper.getReferencedValue(expression.target.symbol),
             mapStatementOrigin(expression.origin)
         ).copyAttributes(expression)
 
@@ -440,7 +442,7 @@
         IrSetVariableImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedVariable(expression.symbol),
+            symbolRemapper.getReferencedVariable(expression.target.symbol),
             expression.value.transform(),
             mapStatementOrigin(expression.origin)
         ).copyAttributes(expression)
@@ -448,22 +450,22 @@
     override fun visitGetField(expression: IrGetField): IrGetField =
         IrGetFieldImpl(
             expression.startOffset, expression.endOffset,
-            symbolRemapper.getReferencedField(expression.symbol),
+            symbolRemapper.getReferencedField(expression.target.symbol),
             expression.type.remapType(),
             expression.receiver?.transform(),
             mapStatementOrigin(expression.origin),
-            symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
+            symbolRemapper.getReferencedClassOrNull(expression.irSuperQualifier?.symbol)
         ).copyAttributes(expression)
 
     override fun visitSetField(expression: IrSetField): IrSetField =
         IrSetFieldImpl(
             expression.startOffset, expression.endOffset,
-            symbolRemapper.getReferencedField(expression.symbol),
+            symbolRemapper.getReferencedField(expression.target.symbol),
             expression.receiver?.transform(),
             expression.value.transform(),
             expression.type.remapType(),
             mapStatementOrigin(expression.origin),
-            symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
+            symbolRemapper.getReferencedClassOrNull(expression.irSuperQualifier?.symbol)
         ).copyAttributes(expression)
 
     override fun visitCall(expression: IrCall): IrCall =
@@ -473,12 +475,12 @@
         }
 
     override fun visitConstructorCall(expression: IrConstructorCall): IrConstructorCall {
-        val constructorSymbol = symbolRemapper.getReferencedConstructor(expression.symbol)
+        val constructor = symbolRemapper.getReferencedConstructor(expression.target.symbol)
         return IrConstructorCallImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            constructorSymbol,
-            constructorSymbol.descriptor,
+            constructor,
+            constructor.descriptor,
             expression.typeArgumentsCount,
             expression.constructorTypeArgumentsCount,
             expression.valueArgumentsCount,
@@ -499,7 +501,7 @@
     }
 
     private fun shallowCopyCall(expression: IrCall): IrCall {
-        val newCallee = symbolRemapper.getReferencedFunction(expression.symbol)
+        val newCallee = symbolRemapper.getReferencedFunction(expression.target.symbol)
         return IrCallImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
@@ -508,7 +510,7 @@
             expression.typeArgumentsCount,
             expression.valueArgumentsCount,
             mapStatementOrigin(expression.origin),
-            symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
+            symbolRemapper.getReferencedClassOrNull(expression.irSuperQualifier?.symbol)
         ).apply {
             copyRemappedTypeArgumentsFrom(expression)
         }.copyAttributes(expression)
@@ -528,7 +530,7 @@
     }
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrDelegatingConstructorCall {
-        val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol)
+        val newConstructor = symbolRemapper.getReferencedConstructor(expression.target.symbol)
         return IrDelegatingConstructorCallImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
@@ -542,7 +544,7 @@
     }
 
     override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrEnumConstructorCall {
-        val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol)
+        val newConstructor = symbolRemapper.getReferencedConstructor(expression.target.symbol)
         return IrEnumConstructorCallImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
@@ -562,12 +564,12 @@
         ).copyAttributes(expression)
 
     override fun visitFunctionReference(expression: IrFunctionReference): IrFunctionReference {
-        val symbol = symbolRemapper.getReferencedFunction(expression.symbol)
+        val target = symbolRemapper.getReferencedFunction(expression.target.symbol)
         return IrFunctionReferenceImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbol,
-            symbol.descriptor,
+            target,
+            target.descriptor,
             expression.typeArgumentsCount,
             expression.valueArgumentsCount,
             mapStatementOrigin(expression.origin)
@@ -581,11 +583,11 @@
         IrPropertyReferenceImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedProperty(expression.symbol),
+            symbolRemapper.getReferencedProperty(expression.target.symbol),
             expression.typeArgumentsCount,
-            expression.field?.let { symbolRemapper.getReferencedField(it) },
-            expression.getter?.let { symbolRemapper.getReferencedSimpleFunction(it) },
-            expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it) },
+            expression.field?.let { symbolRemapper.getReferencedField(it.symbol) },
+            expression.getter?.let { symbolRemapper.getReferencedSimpleFunction(it.symbol) },
+            expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it.symbol) },
             mapStatementOrigin(expression.origin)
         ).apply {
             copyRemappedTypeArgumentsFrom(expression)
@@ -596,10 +598,10 @@
         IrLocalDelegatedPropertyReferenceImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedLocalDelegatedProperty(expression.symbol),
-            symbolRemapper.getReferencedVariable(expression.delegate),
-            symbolRemapper.getReferencedSimpleFunction(expression.getter),
-            expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it) },
+            symbolRemapper.getReferencedLocalDelegatedProperty(expression.target.symbol),
+            symbolRemapper.getReferencedVariable(expression.delegate.symbol),
+            symbolRemapper.getReferencedSimpleFunction(expression.getter.symbol),
+            expression.setter?.let { symbolRemapper.getReferencedSimpleFunction(it.symbol) },
             mapStatementOrigin(expression.origin)
         ).copyAttributes(expression)
 
@@ -615,14 +617,14 @@
         IrClassReferenceImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedClassifier(expression.symbol),
+            symbolRemapper.getReferencedClassifier(expression.target.symbol),
             expression.classType.remapType()
         ).copyAttributes(expression)
 
     override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall =
         IrInstanceInitializerCallImpl(
             expression.startOffset, expression.endOffset,
-            symbolRemapper.getReferencedClass(expression.classSymbol),
+            symbolRemapper.getReferencedClass(expression.irClass.symbol),
             expression.type.remapType()
         ).copyAttributes(expression)
 
@@ -715,7 +717,7 @@
         IrReturnImpl(
             expression.startOffset, expression.endOffset,
             expression.type.remapType(),
-            symbolRemapper.getReferencedReturnTarget(expression.returnTargetSymbol),
+            symbolRemapper.getReferencedReturnTarget(expression.irReturnTarget.symbol),
             expression.value.transform()
         ).copyAttributes(expression)
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Desymbolize.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Desymbolize.kt
new file mode 100644
index 0000000..7c6b12a
--- /dev/null
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Desymbolize.kt
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2010-2019 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.ir.util
+
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.ir.IrElement
+import org.jetbrains.kotlin.ir.IrStatement
+import org.jetbrains.kotlin.ir.declarations.IrField
+import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
+import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
+import org.jetbrains.kotlin.ir.declarations.copyAttributes
+import org.jetbrains.kotlin.ir.expressions.*
+import org.jetbrains.kotlin.ir.expressions.impl.*
+import org.jetbrains.kotlin.ir.symbols.*
+import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
+
+fun IrElement.desymbolize(): IrElement = transform(DesymbolizeTransformer, null)
+
+object DesymbolizeTransformer : IrElementTransformerVoid() {
+    override fun visitField(declaration: IrField): IrStatement {
+        declaration.overridden.replaceAll {
+            if (it is IrFieldSymbol) it.owner else it
+        }
+        return super.visitField(declaration)
+    }
+
+    override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
+        declaration.overridden.replaceAll {
+            if (it is IrSimpleFunctionSymbol) it.owner else it
+        }
+        return super.visitSimpleFunction(declaration)
+    }
+
+    override fun visitClassReference(expression: IrClassReference): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrClassifierSymbol)
+            IrClassReferenceImpl(
+                expression.startOffset, expression.endOffset,
+                expression.type,
+                target.owner,
+                expression.classType
+            )
+        else expression
+        return super.visitClassReference(newExpression)
+    }
+
+    override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrFunctionSymbol)
+            IrFunctionReferenceImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.descriptor, expression.typeArgumentsCount, expression.valueArgumentsCount, expression.origin
+            ).apply {
+                copyTypeAndValueArgumentsFrom(expression)
+                copyAttributes(expression)
+            }
+        else expression
+        return super.visitFunctionReference(newExpression)
+    }
+
+    override fun visitPropertyReference(expression: IrPropertyReference): IrExpression {
+        val newExpression = IrPropertyReferenceImpl(
+            expression.startOffset, expression.endOffset, expression.type,
+            expression.target.desymbolizeLink(),
+            expression.descriptor, expression.typeArgumentsCount,
+            expression.field?.desymbolizeLink(),
+            expression.getter?.desymbolizeLink(),
+            expression.setter?.desymbolizeLink(),
+            expression.origin
+        ).apply {
+            copyTypeArgumentsFrom(expression)
+            dispatchReceiver = expression.dispatchReceiver
+            extensionReceiver = expression.extensionReceiver
+            copyAttributes(expression)
+        }
+        return super.visitPropertyReference(newExpression)
+    }
+
+    override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrExpression {
+        val newExpression = IrLocalDelegatedPropertyReferenceImpl(
+            expression.startOffset, expression.endOffset, expression.type,
+            expression.target.desymbolizeLink(),
+            expression.delegate.desymbolizeLink(),
+            expression.getter.desymbolizeLink(),
+            expression.setter?.desymbolizeLink(),
+            expression.origin
+        ).apply {
+            copyAttributes(expression)
+        }
+        return super.visitLocalDelegatedPropertyReference(newExpression)
+    }
+
+    override fun visitGetField(expression: IrGetField): IrExpression {
+        val target = expression.target.desymbolizeLink()
+        val irSuperQualifier = expression.irSuperQualifier?.desymbolizeLink()
+        val newExpression = IrGetFieldImpl(
+            expression.startOffset, expression.endOffset,
+            target,
+            expression.type, expression.receiver, expression.origin,
+            irSuperQualifier
+        )
+        return super.visitGetField(newExpression)
+    }
+
+    override fun visitSetField(expression: IrSetField): IrExpression {
+        val newExpression = IrSetFieldImpl(
+            expression.startOffset, expression.endOffset,
+            expression.target.desymbolizeLink(),
+            expression.receiver, expression.value, expression.type, expression.origin,
+            expression.irSuperQualifier?.desymbolizeLink()
+        )
+        return super.visitSetField(newExpression)
+    }
+
+    override fun visitGetValue(expression: IrGetValue): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrValueSymbol)
+            IrGetValueImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.origin
+            )
+        else expression
+        return super.visitGetValue(newExpression)
+    }
+
+    override fun visitSetVariable(expression: IrSetVariable): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrVariableSymbol)
+            IrSetVariableImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.value, expression.origin
+            )
+        else expression
+        return super.visitSetVariable(newExpression)
+    }
+
+    override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrConstructorSymbol)
+            IrDelegatingConstructorCallImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.descriptor, expression.typeArgumentsCount, expression.valueArgumentsCount
+            ).apply {
+                copyTypeAndValueArgumentsFrom(expression)
+            }
+        else expression
+        return super.visitDelegatingConstructorCall(newExpression)
+    }
+
+    override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrConstructorSymbol)
+            IrConstructorCallImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.descriptor,
+                expression.typeArgumentsCount, expression.constructorTypeArgumentsCount, expression.valueArgumentsCount,
+                expression.origin
+            ).apply {
+                copyTypeAndValueArgumentsFrom(expression)
+            }
+        else expression
+        return super.visitConstructorCall(newExpression)
+    }
+
+    override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrExpression {
+        val target = expression.target
+        val newExpression = if (target is IrConstructorSymbol)
+            IrEnumConstructorCallImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.typeArgumentsCount, expression.valueArgumentsCount
+            ).apply {
+                copyTypeAndValueArgumentsFrom(expression)
+            }
+        else expression
+        return super.visitEnumConstructorCall(newExpression)
+    }
+
+    override fun visitCall(expression: IrCall): IrExpression {
+        val newExpression = IrCallImpl(
+            expression.startOffset, expression.endOffset, expression.type,
+            expression.target.desymbolizeLink(),
+            expression.descriptor,
+            expression.typeArgumentsCount, expression.valueArgumentsCount, expression.origin,
+            expression.irSuperQualifier?.desymbolizeLink()
+        ).apply {
+            copyTypeAndValueArgumentsFrom(expression)
+        }
+        return super.visitCall(newExpression)
+    }
+
+    override fun visitReturn(expression: IrReturn): IrExpression {
+        val target = expression.irReturnTarget
+        val newExpression = if (target is IrReturnTargetSymbol)
+            IrReturnImpl(
+                expression.startOffset, expression.endOffset, expression.type,
+                target.owner,
+                expression.value
+            )
+        else expression
+        return super.visitReturn(newExpression)
+    }
+
+    private inline fun <reified Ir : IrSymbolOwner, D : DeclarationDescriptor, reified S : IrBindableSymbol<D, Ir>> Ir.desymbolizeLink() =
+        if (this is S) owner else this
+}
\ No newline at end of file
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
index 258b1ab..6e02c82 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
@@ -94,8 +94,8 @@
         declaration.dumpLabeledElementWith(data) {
             dumpAnnotations(declaration)
             declaration.correspondingPropertySymbol?.dumpInternal("correspondingProperty")
-            declaration.overriddenSymbols.dumpItems<IrSymbol>("overridden") {
-                it.dump()
+            declaration.overridden.dumpItems("overridden") {
+                it.symbol.dump()
             }
             declaration.typeParameters.dumpElements()
             declaration.dispatchReceiverParameter?.accept(this, "\$this")
@@ -140,8 +140,8 @@
     override fun visitField(declaration: IrField, data: String) {
         declaration.dumpLabeledElementWith(data) {
             dumpAnnotations(declaration)
-            declaration.overriddenSymbols.dumpItems("overridden") {
-                it.dump()
+            declaration.overridden.dumpItems("overridden") {
+                it.symbol.dump()
             }
             declaration.initializer?.accept(this, "")
         }
@@ -214,8 +214,8 @@
     }
 
     private fun IrMemberAccessExpression.getTypeParameterNames(expectedCount: Int): List<String> =
-        if (this is IrDeclarationReference && symbol.isBound)
-            symbol.owner.getTypeParameterNames(expectedCount)
+        if (this is IrDeclarationReference && target.symbol.isBound)
+            target.getTypeParameterNames(expectedCount)
         else
             getPlaceholderParameterNames(expectedCount)
 
@@ -371,8 +371,8 @@
 
 internal fun IrMemberAccessExpression.getValueParameterNamesForDebug(): List<String> {
     val expectedCount = valueArgumentsCount
-    return if (this is IrDeclarationReference && symbol.isBound) {
-        val owner = symbol.owner
+    return if (this is IrDeclarationReference && target.symbol.isBound) {
+        val owner = target
         if (owner is IrFunction) {
             (0 until expectedCount).map {
                 if (it < owner.valueParameters.size)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExpectDeclarationRemover.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExpectDeclarationRemover.kt
index 1c05b63..8cbbad8 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExpectDeclarationRemover.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/ExpectDeclarationRemover.kt
@@ -11,8 +11,6 @@
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrGetValue
 import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
-import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
-import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
 import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -98,42 +96,41 @@
 
             override fun visitGetValue(expression: IrGetValue): IrExpression {
                 expression.transformChildrenVoid()
-                val newValue = remapExpectValue(expression.symbol)
+                val newValue = remapExpectValue(expression.target)
                     ?: return expression
 
                 return IrGetValueImpl(
                     expression.startOffset,
                     expression.endOffset,
                     newValue.type,
-                    newValue.symbol,
+                    newValue,
                     expression.origin
                 )
             }
         }, data = null)
     }
 
-    private fun remapExpectValue(symbol: IrValueSymbol): IrValueParameter? {
-        if (symbol !is IrValueParameterSymbol) {
+    private fun remapExpectValue(declaration: IrValueDeclaration): IrValueParameter? {
+        if (declaration !is IrValueParameter) {
             return null
         }
 
-        val parameter = symbol.owner
-        val parent = parameter.parent
+        val parent = declaration.parent
 
         return when (parent) {
             is IrClass -> {
-                assert(parameter == parent.thisReceiver)
+                assert(declaration == parent.thisReceiver)
                 parent.findActualForExpected().thisReceiver!!
             }
 
-            is IrFunction -> when (parameter) {
+            is IrFunction -> when (declaration) {
                 parent.dispatchReceiverParameter ->
                     parent.findActualForExpected().dispatchReceiverParameter!!
                 parent.extensionReceiverParameter ->
                     parent.findActualForExpected().extensionReceiverParameter!!
                 else -> {
-                    assert(parent.valueParameters[parameter.index] == parameter)
-                    parent.findActualForExpected().valueParameters[parameter.index]
+                    assert(parent.valueParameters[declaration.index] == declaration)
+                    parent.findActualForExpected().valueParameters[declaration.index]
                 }
             }
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
index ec27fba..a628381 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt
@@ -59,22 +59,21 @@
  * Binds the arguments explicitly represented in the IR to the parameters of the accessed function.
  * The arguments are to be evaluated in the same order as they appear in the resulting list.
  */
-fun IrFunctionAccessExpression.getArgumentsWithSymbols(): List<Pair<IrValueParameterSymbol, IrExpression>> {
-    val res = mutableListOf<Pair<IrValueParameterSymbol, IrExpression>>()
-    val irFunction = symbol.owner
+fun IrFunctionAccessExpression.getArgumentsWithParameters(): List<Pair<IrValueParameter, IrExpression>> {
+    val res = mutableListOf<Pair<IrValueParameter, IrExpression>>()
 
     dispatchReceiver?.let {
-        res += (irFunction.dispatchReceiverParameter!!.symbol to it)
+        res += (target.dispatchReceiverParameter!! to it)
     }
 
     extensionReceiver?.let {
-        res += (irFunction.extensionReceiverParameter!!.symbol to it)
+        res += (target.extensionReceiverParameter!! to it)
     }
 
-    irFunction.valueParameters.forEach {
+    target.valueParameters.forEach {
         val arg = getValueArgument(it.descriptor as ValueParameterDescriptor)
         if (arg != null) {
-            res += (it.symbol to arg)
+            res += (it to arg)
         }
     }
 
@@ -88,8 +87,8 @@
 fun IrMemberAccessExpression.getArgumentsWithIr(): List<Pair<IrValueParameter, IrExpression>> {
     val res = mutableListOf<Pair<IrValueParameter, IrExpression>>()
     val irFunction = when (this) {
-        is IrFunctionAccessExpression -> this.symbol.owner
-        is IrFunctionReference -> this.symbol.owner
+        is IrFunctionAccessExpression -> this.target
+        is IrFunctionReference -> this.target
         else -> error(this)
     }
 
@@ -181,21 +180,12 @@
 val IrClass.functions: Sequence<IrSimpleFunction>
     get() = declarations.asSequence().filterIsInstance<IrSimpleFunction>()
 
-val IrClassSymbol.functions: Sequence<IrSimpleFunctionSymbol>
-    get() = owner.functions.map { it.symbol }
-
 val IrClass.constructors: Sequence<IrConstructor>
     get() = declarations.asSequence().filterIsInstance<IrConstructor>()
 
-val IrClassSymbol.constructors: Sequence<IrConstructorSymbol>
-    get() = owner.constructors.map { it.symbol }
-
 val IrClass.fields: Sequence<IrField>
     get() = declarations.asSequence().filterIsInstance<IrField>()
 
-val IrClassSymbol.fields: Sequence<IrFieldSymbol>
-    get() = owner.fields.map { it.symbol }
-
 val IrClass.primaryConstructor: IrConstructor?
     get() = this.declarations.singleOrNull { it is IrConstructor && it.isPrimary } as IrConstructor?
 
@@ -223,9 +213,9 @@
 val IrDeclaration.isFakeOverride: Boolean get() = origin == IrDeclarationOrigin.FAKE_OVERRIDE
 
 fun IrClass.isSubclassOf(ancestor: IrClass): Boolean {
-
     val alreadyVisited = mutableSetOf<IrClass>()
 
+
     fun IrClass.hasAncestorInSuperTypes(): Boolean = when {
         this === ancestor -> true
         this in alreadyVisited -> false
@@ -250,18 +240,18 @@
         if (func.isReal) {
             realOverrides += func
         } else {
-            func.overriddenSymbols.forEach { collectRealOverrides(it.owner) }
+            func.overridden.forEach { collectRealOverrides(it) }
         }
     }
 
-    overriddenSymbols.forEach { collectRealOverrides(it.owner) }
+    overridden.forEach { collectRealOverrides(it) }
 
     fun excludeRepeated(func: IrSimpleFunction) {
         if (!visited.add(func)) return
 
-        func.overriddenSymbols.forEach {
-            realOverrides.remove(it.owner)
-            excludeRepeated(it.owner)
+        func.overridden.forEach {
+            realOverrides.remove(it)
+            excludeRepeated(it)
         }
     }
 
@@ -280,7 +270,7 @@
 fun IrSimpleFunction.isOrOverridesSynthesized(): Boolean {
     if (isSynthesized) return true
 
-    if (isFakeOverride) return overriddenSymbols.all { it.owner.isOrOverridesSynthesized() }
+    if (isFakeOverride) return overridden.all { it.isOrOverridesSynthesized() }
 
     return false
 }
@@ -297,8 +287,8 @@
     var toVisit = setOf(this)
     val nonOverridden = mutableSetOf<IrField>()
     while (toVisit.isNotEmpty()) {
-        nonOverridden += toVisit.filter { it.overriddenSymbols.isEmpty() }
-        toVisit = toVisit.flatMap { it.overriddenSymbols }.map { it.owner }.toSet()
+        nonOverridden += toVisit.filter { it.overridden.isEmpty() }
+        toVisit = toVisit.flatMap { it.overridden }.toSet()
     }
     return nonOverridden.singleOrNull()
 }
@@ -343,17 +333,17 @@
 
 fun IrAnnotationContainer.getAnnotation(name: FqName): IrConstructorCall? =
     annotations.find {
-        it.symbol.owner.parentAsClass.descriptor.fqNameSafe == name
+        it.target.parentAsClass.descriptor.fqNameSafe == name
     }
 
 fun IrAnnotationContainer.hasAnnotation(name: FqName) =
     annotations.any {
-        it.symbol.owner.parentAsClass.descriptor.fqNameSafe == name
+        it.target.parentAsClass.descriptor.fqNameSafe == name
     }
 
-fun IrAnnotationContainer.hasAnnotation(symbol: IrClassSymbol) =
+fun IrAnnotationContainer.hasAnnotation(clazz: IrClass) =
     annotations.any {
-        it.symbol.owner.parentAsClass.symbol == symbol
+        it.target.parentAsClass == clazz
     }
 
 
@@ -364,10 +354,10 @@
         return (parent as? IrClass)?.thisReceiver?.type?.isAny() ?: false
     }
 
-    return (this as IrSimpleFunction).overriddenSymbols.all { it.owner.isFakeOverriddenFromAny() }
+    return (this as IrSimpleFunction).overridden.all { it.isFakeOverriddenFromAny() }
 }
 
-fun IrCall.isSuperToAny() = superQualifier?.let { this.symbol.owner.isFakeOverriddenFromAny() } ?: false
+fun IrCall.isSuperToAny() = superQualifier?.let { this.target.isFakeOverriddenFromAny() } ?: false
 
 fun IrDeclaration.isEffectivelyExternal(): Boolean {
 
@@ -389,7 +379,7 @@
 
 fun IrFunction.isExternalOrInheritedFromExternal(): Boolean {
     fun isExternalOrInheritedFromExternalImpl(f: IrSimpleFunction): Boolean =
-        f.isEffectivelyExternal() || f.overriddenSymbols.any { isExternalOrInheritedFromExternalImpl(it.owner) }
+        f.isEffectivelyExternal() || f.overridden.any { isExternalOrInheritedFromExternalImpl(it) }
 
     return isEffectivelyExternal() || (this is IrSimpleFunction && isExternalOrInheritedFromExternalImpl(this))
 }
@@ -403,7 +393,7 @@
 
 fun IrValueParameter.hasDefaultValue(): Boolean = DFS.ifAny(
     listOf(this),
-    { current -> (current.parent as? IrSimpleFunction)?.overriddenSymbols?.map { it.owner.valueParameters[current.index] } ?: listOf() },
+    { current -> (current.parent as? IrSimpleFunction)?.overridden?.map { it.valueParameters[current.index] } ?: listOf() },
     { current -> current.defaultValue != null }
 )
 
@@ -454,15 +444,7 @@
 
 fun irConstructorCall(
     call: IrFunctionAccessExpression,
-    newFunction: IrConstructor,
-    receiversAsArguments: Boolean = false,
-    argumentsAsReceivers: Boolean = false
-): IrConstructorCall =
-    irConstructorCall(call, newFunction.symbol, receiversAsArguments, argumentsAsReceivers)
-
-fun irConstructorCall(
-    call: IrFunctionAccessExpression,
-    newSymbol: IrConstructorSymbol,
+    newCallee: IrConstructor,
     receiversAsArguments: Boolean = false,
     argumentsAsDispatchers: Boolean = false
 ): IrConstructorCall =
@@ -471,8 +453,8 @@
             startOffset,
             endOffset,
             type,
-            newSymbol,
-            newSymbol.descriptor,
+            newCallee,
+            newCallee.descriptor,
             typeArgumentsCount,
             0,
             call.valueArgumentsCount,
@@ -492,26 +474,13 @@
     receiversAsArguments: Boolean = false,
     argumentsAsReceivers: Boolean = false
 ): IrCall =
-    irCall(
-        call,
-        newFunction.symbol,
-        receiversAsArguments,
-        argumentsAsReceivers
-    )
-
-fun irCall(
-    call: IrFunctionAccessExpression,
-    newSymbol: IrFunctionSymbol,
-    receiversAsArguments: Boolean = false,
-    argumentsAsReceivers: Boolean = false
-): IrCall =
     call.run {
         IrCallImpl(
             startOffset,
             endOffset,
             type,
-            newSymbol,
-            newSymbol.descriptor,
+            newFunction,
+            newFunction.descriptor,
             typeArgumentsCount,
             origin
         ).apply {
@@ -529,8 +498,8 @@
     argumentsAsReceivers: Boolean = false
 ) = copyTypeAndValueArgumentsFrom(
     src,
-    src.symbol.owner,
-    symbol.owner,
+    src.target,
+    target,
     receiversAsArguments,
     argumentsAsReceivers
 )
@@ -541,8 +510,8 @@
     argumentsAsReceivers: Boolean = false
 ) = copyTypeAndValueArgumentsFrom(
     src,
-    src.symbol.owner,
-    symbol.owner,
+    src.target,
+    target,
     receiversAsArguments,
     argumentsAsReceivers
 )
@@ -604,13 +573,13 @@
     else
         typeParameters
 
-fun IrMemberAccessExpression.getTypeSubstitutionMap(irFunction: IrFunction): Map<IrTypeParameterSymbol, IrType> =
+fun IrMemberAccessExpression.getTypeSubstitutionMap(irFunction: IrFunction): Map<IrTypeParameter, IrType> =
     irFunction.allTypeParameters.withIndex().associate {
-        it.value.symbol to getTypeArgument(it.index)!!
+        it.value to getTypeArgument(it.index)!!
     }
 
-val IrFunctionReference.typeSubstitutionMap: Map<IrTypeParameterSymbol, IrType>
-    get() = getTypeSubstitutionMap(symbol.owner)
+val IrFunctionReference.typeSubstitutionMap: Map<IrTypeParameter, IrType>
+    get() = getTypeSubstitutionMap(target)
 
-val IrFunctionAccessExpression.typeSubstitutionMap: Map<IrTypeParameterSymbol, IrType>
-    get() = getTypeSubstitutionMap(symbol.owner)
+val IrFunctionAccessExpression.typeSubstitutionMap: Map<IrTypeParameter, IrType>
+    get() = getTypeSubstitutionMap(target)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
index bad56ef..5917bc9 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
@@ -45,7 +45,7 @@
 
     private fun StringBuilder.renderAsAnnotation(irAnnotation: IrConstructorCall) {
         val annotationClassName = try {
-            irAnnotation.symbol.owner.parentAsClass.name.asString()
+            irAnnotation.target.parentAsClass.name.asString()
         } catch (e: Exception) {
             "<unbound>"
         }
@@ -545,44 +545,44 @@
         "COMPOSITE type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitReturn(expression: IrReturn, data: Nothing?): String =
-        "RETURN type=${expression.type.render()} from='${expression.returnTargetSymbol.renderReference()}'"
+        "RETURN type=${expression.type.render()} from='${expression.irReturnTarget.symbol.renderReference()}'"
 
     override fun visitCall(expression: IrCall, data: Nothing?): String =
-        "CALL '${expression.symbol.renderReference()}' ${expression.renderSuperQualifier()}" +
+        "CALL '${expression.target.symbol.renderReference()}' ${expression.renderSuperQualifier()}" +
                 "type=${expression.type.render()} origin=${expression.origin}"
 
     private fun IrCall.renderSuperQualifier(): String =
-        superQualifierSymbol?.let { "superQualifier='${it.renderReference()}' " } ?: ""
+        irSuperQualifier?.let { "superQualifier='${it.symbol.renderReference()}' " } ?: ""
 
     override fun visitConstructorCall(expression: IrConstructorCall, data: Nothing?): String =
-        "CONSTRUCTOR_CALL '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "CONSTRUCTOR_CALL '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: Nothing?): String =
-        "DELEGATING_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}'"
+        "DELEGATING_CONSTRUCTOR_CALL '${expression.target.symbol.renderReference()}'"
 
     override fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: Nothing?): String =
-        "ENUM_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}'"
+        "ENUM_CONSTRUCTOR_CALL '${expression.target.symbol.renderReference()}'"
 
     override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: Nothing?): String =
-        "INSTANCE_INITIALIZER_CALL classDescriptor='${expression.classSymbol.renderReference()}'"
+        "INSTANCE_INITIALIZER_CALL classDescriptor='${expression.irClass.symbol.renderReference()}'"
 
     override fun visitGetValue(expression: IrGetValue, data: Nothing?): String =
-        "GET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "GET_VAR '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): String =
-        "SET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "SET_VAR '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitGetField(expression: IrGetField, data: Nothing?): String =
-        "GET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "GET_FIELD '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitSetField(expression: IrSetField, data: Nothing?): String =
-        "SET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "SET_FIELD '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitGetObjectValue(expression: IrGetObjectValue, data: Nothing?): String =
-        "GET_OBJECT '${expression.symbol.renderReference()}' type=${expression.type.render()}"
+        "GET_OBJECT '${expression.target.symbol.renderReference()}' type=${expression.type.render()}"
 
     override fun visitGetEnumValue(expression: IrGetEnumValue, data: Nothing?): String =
-        "GET_ENUM '${expression.symbol.renderReference()}' type=${expression.type.render()}"
+        "GET_ENUM '${expression.target.symbol.renderReference()}' type=${expression.type.render()}"
 
     override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?): String =
         "STRING_CONCATENATION type=${expression.type.render()}"
@@ -612,15 +612,15 @@
         "THROW type=${expression.type.render()}"
 
     override fun visitFunctionReference(expression: IrFunctionReference, data: Nothing?): String =
-        "FUNCTION_REFERENCE '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+        "FUNCTION_REFERENCE '${expression.target.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
 
     override fun visitPropertyReference(expression: IrPropertyReference, data: Nothing?): String =
         buildTrimEnd {
             append("PROPERTY_REFERENCE ")
-            append("'${expression.symbol.renderReference()}' ")
-            appendNullableAttribute("field=", expression.field) { "'${it.renderReference()}'" }
-            appendNullableAttribute("getter=", expression.getter) { "'${it.renderReference()}'" }
-            appendNullableAttribute("setter=", expression.setter) { "'${it.renderReference()}'" }
+            append("'${expression.target.symbol.renderReference()}' ")
+            appendNullableAttribute("field=", expression.field) { "'${it.symbol.renderReference()}'" }
+            appendNullableAttribute("getter=", expression.getter) { "'${it.symbol.renderReference()}'" }
+            appendNullableAttribute("setter=", expression.setter) { "'${it.symbol.renderReference()}'" }
             append("type=${expression.type.render()} ")
             append("origin=${expression.origin}")
         }
@@ -638,10 +638,10 @@
     override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: Nothing?): String =
         buildTrimEnd {
             append("LOCAL_DELEGATED_PROPERTY_REFERENCE ")
-            append("'${expression.symbol.renderReference()}' ")
-            append("delegate='${expression.delegate.renderReference()}' ")
-            append("getter='${expression.getter.renderReference()}' ")
-            appendNullableAttribute("setter=", expression.setter) { "'${it.renderReference()}'" }
+            append("'${expression.target.symbol.renderReference()}' ")
+            append("delegate='${expression.delegate.symbol.renderReference()}' ")
+            append("getter='${expression.getter.symbol.renderReference()}' ")
+            appendNullableAttribute("setter=", expression.setter) { "'${it.symbol.renderReference()}'" }
             append("type=${expression.type.render()} ")
             append("origin=${expression.origin}")
         }
@@ -652,7 +652,7 @@
         }
 
     override fun visitClassReference(expression: IrClassReference, data: Nothing?): String =
-        "CLASS_REFERENCE '${expression.symbol.renderReference()}' type=${expression.type.render()}"
+        "CLASS_REFERENCE '${expression.target.symbol.renderReference()}' type=${expression.type.render()}"
 
     override fun visitGetClass(expression: IrGetClass, data: Nothing?): String =
         "GET_CLASS type=${expression.type.render()}"
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt
index 24299c5..6ba993e 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt
@@ -27,7 +27,7 @@
     declaration: IrSimpleFunction,
     symbolTable: SymbolTable
 ) {
-    declaration.descriptor.overriddenDescriptors.mapTo(declaration.overriddenSymbols) {
+    declaration.descriptor.overriddenDescriptors.mapTo(declaration.overridden) {
         symbolTable.referenceSimpleFunction(it.original)
     }
 }
@@ -49,7 +49,7 @@
     symbolTable: SymbolTable,
     hasBackingField: (PropertyDescriptor) -> Boolean
 ) {
-    declaration.descriptor.overriddenDescriptors.mapNotNullTo(declaration.overriddenSymbols) {
+    declaration.descriptor.overriddenDescriptors.mapNotNullTo(declaration.overridden) {
         if (hasBackingField(it)) {
             symbolTable.referenceField(it.original)
         } else null
diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFakeOverrideUtils.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFakeOverrideUtils.kt
index 407ba2a..7d30274 100644
--- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFakeOverrideUtils.kt
+++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFakeOverrideUtils.kt
@@ -7,13 +7,12 @@
 
 import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.ir.declarations.*
-import org.jetbrains.kotlin.ir.symbols.IrBindableSymbol
 import org.jetbrains.kotlin.ir.util.isReal
 import org.jetbrains.kotlin.ir.util.original
 
 // We may get several real supers here (e.g. see the code snippet from KT-33034).
 // TODO: Consider reworking the resolution algorithm to get a determined super declaration.
-private fun <S: IrBindableSymbol<*, D>, D: IrOverridableDeclaration<S>> D.getRealSupers(): Set<D> {
+private fun <D: IrOverridableDeclaration<D>> D.getRealSupers(): Set<D> {
     if (this.isReal) {
         return setOf(this)
     }
@@ -27,7 +26,7 @@
         if (declaration.isReal) {
             realSupers += declaration
         } else {
-            declaration.overriddenSymbols.forEach { findRealSupers(it.owner) }
+            declaration.overridden.forEach { findRealSupers(it) }
         }
     }
 
@@ -39,9 +38,9 @@
         fun excludeOverridden(declaration: D) {
             if (declaration in visited) return
             visited += declaration
-            declaration.overriddenSymbols.forEach {
-                realSupers.remove(it.owner)
-                excludeOverridden(it.owner)
+            declaration.overridden.forEach {
+                realSupers.remove(it)
+                excludeOverridden(it)
             }
         }
 
@@ -85,11 +84,11 @@
  */
 internal fun IrField.resolveFakeOverride(): IrField = getRealSupers().first()
 
-val IrSimpleFunction.target: IrSimpleFunction
-    get() = (if (modality == Modality.ABSTRACT) this else resolveFakeOverride()).original
+val IrSimpleFunction.resolved: IrSimpleFunction
+    get() = (if (modality == Modality.ABSTRACT) this else resolveFakeOverride())
 
-val IrFunction.target: IrFunction get() = when (this) {
-    is IrSimpleFunction -> this.target
+val IrFunction.resolved: IrFunction get() = when (this) {
+    is IrSimpleFunction -> this.resolved
     is IrConstructor -> this
     else -> error(this)
 }
diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt
index b14134e..3842abb 100644
--- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt
+++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt
@@ -1059,7 +1059,7 @@
                     proto.isSuspend
                 )
             }.apply {
-                proto.overriddenList.mapTo(overriddenSymbols) { deserializeIrSymbol(it) as IrSimpleFunctionSymbol }
+                proto.overriddenList.mapTo(overridden) { deserializeIrSymbol(it) as IrSimpleFunctionSymbol }
 
                 (descriptor as? WrappedSimpleFunctionDescriptor)?.bind(this)
             }
diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt
index 3ac41b4..ba4d243 100644
--- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt
+++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt
@@ -543,11 +543,11 @@
 
     private fun serializeCall(call: IrCall): ProtoCall {
         val proto = ProtoCall.newBuilder()
-        proto.symbol = serializeIrSymbol(call.symbol)
+        proto.symbol = serializeIrSymbol(call.target.symbol)
         call.origin?.let { proto.origin = serializeIrStatementOrigin(it) }
 
-        call.superQualifierSymbol?.let {
-            proto.`super` = serializeIrSymbol(it)
+        call.irSuperQualifier?.let {
+            proto.`super` = serializeIrSymbol(it.symbol)
         }
         proto.memberAccess = serializeMemberAccessCommon(call)
 
@@ -556,7 +556,7 @@
 
     private fun serializeConstructorCall(call: IrConstructorCall): ProtoConstructorCall =
         ProtoConstructorCall.newBuilder().apply {
-            symbol = serializeIrSymbol(call.symbol)
+            symbol = serializeIrSymbol(call.target.symbol)
             constructorTypeArgumentsCount = call.constructorTypeArgumentsCount
             memberAccess = serializeMemberAccessCommon(call)
         }.build()
@@ -569,7 +569,7 @@
 
     private fun serializeFunctionReference(callable: IrFunctionReference): ProtoFunctionReference {
         val proto = ProtoFunctionReference.newBuilder()
-            .setSymbol(serializeIrSymbol(callable.symbol))
+            .setSymbol(serializeIrSymbol(callable.target.symbol))
             .setMemberAccess(serializeMemberAccessCommon(callable))
 
         callable.origin?.let { proto.setOrigin(serializeIrStatementOrigin(it)) }
@@ -580,12 +580,12 @@
         callable: IrLocalDelegatedPropertyReference
     ): ProtoLocalDelegatedPropertyReference {
         val proto = ProtoLocalDelegatedPropertyReference.newBuilder()
-            .setDelegate(serializeIrSymbol(callable.delegate))
-            .setGetter(serializeIrSymbol(callable.getter))
-            .setSymbol(serializeIrSymbol(callable.symbol))
+            .setDelegate(serializeIrSymbol(callable.delegate.symbol))
+            .setGetter(serializeIrSymbol(callable.getter.symbol))
+            .setSymbol(serializeIrSymbol(callable.target.symbol))
 
         callable.origin?.let { proto.setOrigin(serializeIrStatementOrigin(it)) }
-        callable.setter?.let { proto.setSetter(serializeIrSymbol(it)) }
+        callable.setter?.let { proto.setSetter(serializeIrSymbol(it.symbol)) }
 
         return proto.build()
     }
@@ -593,18 +593,18 @@
     private fun serializePropertyReference(callable: IrPropertyReference): ProtoPropertyReference {
         val proto = ProtoPropertyReference.newBuilder()
             .setMemberAccess(serializeMemberAccessCommon(callable))
-            .setSymbol(serializeIrSymbol(callable.symbol))
+            .setSymbol(serializeIrSymbol(callable.target.symbol))
         callable.origin?.let { proto.origin = serializeIrStatementOrigin(it) }
-        callable.field?.let { proto.field = serializeIrSymbol(it) }
-        callable.getter?.let { proto.getter = serializeIrSymbol(it) }
-        callable.setter?.let { proto.setter = serializeIrSymbol(it) }
+        callable.field?.let { proto.field = serializeIrSymbol(it.symbol) }
+        callable.getter?.let { proto.getter = serializeIrSymbol(it.symbol) }
+        callable.setter?.let { proto.setter = serializeIrSymbol(it.symbol) }
 
         return proto.build()
     }
 
     private fun serializeClassReference(expression: IrClassReference): ProtoClassReference {
         val proto = ProtoClassReference.newBuilder()
-            .setClassSymbol(serializeIrSymbol(expression.symbol))
+            .setClassSymbol(serializeIrSymbol(expression.target.symbol))
             .setClassType(serializeIrType(expression.classType))
         return proto.build()
     }
@@ -628,7 +628,7 @@
 
     private fun serializeDelegatingConstructorCall(call: IrDelegatingConstructorCall): ProtoDelegatingConstructorCall {
         val proto = ProtoDelegatingConstructorCall.newBuilder()
-            .setSymbol(serializeIrSymbol(call.symbol))
+            .setSymbol(serializeIrSymbol(call.target.symbol))
             .setMemberAccess(serializeMemberAccessCommon(call))
         return proto.build()
     }
@@ -640,7 +640,7 @@
 
     private fun serializeEnumConstructorCall(call: IrEnumConstructorCall): ProtoEnumConstructorCall {
         val proto = ProtoEnumConstructorCall.newBuilder()
-            .setSymbol(serializeIrSymbol(call.symbol))
+            .setSymbol(serializeIrSymbol(call.target.symbol))
             .setMemberAccess(serializeMemberAccessCommon(call))
         return proto.build()
     }
@@ -653,14 +653,14 @@
 
     private fun serializeGetEnumValue(expression: IrGetEnumValue): ProtoGetEnumValue {
         val proto = ProtoGetEnumValue.newBuilder()
-            .setSymbol(serializeIrSymbol(expression.symbol))
+            .setSymbol(serializeIrSymbol(expression.target.symbol))
         return proto.build()
     }
 
     private fun serializeFieldAccessCommon(expression: IrFieldAccessExpression): ProtoFieldAccessCommon {
         val proto = ProtoFieldAccessCommon.newBuilder()
-            .setSymbol(serializeIrSymbol(expression.symbol))
-        expression.superQualifierSymbol?.let { proto.`super` = serializeIrSymbol(it) }
+            .setSymbol(serializeIrSymbol(expression.target.symbol))
+        expression.irSuperQualifier?.let { proto.`super` = serializeIrSymbol(it.symbol) }
         expression.receiver?.let { proto.receiver = serializeExpression(it) }
         return proto.build()
     }
@@ -674,28 +674,28 @@
 
     private fun serializeGetValue(expression: IrGetValue): ProtoGetValue =
         ProtoGetValue.newBuilder()
-            .setSymbol(serializeIrSymbol(expression.symbol)).apply {
+            .setSymbol(serializeIrSymbol(expression.target.symbol)).apply {
                 expression.origin?.let { origin = serializeIrStatementOrigin(it) }
             }
             .build()
 
     private fun serializeGetObject(expression: IrGetObjectValue): ProtoGetObject {
         val proto = ProtoGetObject.newBuilder()
-            .setSymbol(serializeIrSymbol(expression.symbol))
+            .setSymbol(serializeIrSymbol(expression.target.symbol))
         return proto.build()
     }
 
     private fun serializeInstanceInitializerCall(call: IrInstanceInitializerCall): ProtoInstanceInitializerCall {
         val proto = ProtoInstanceInitializerCall.newBuilder()
 
-        proto.symbol = serializeIrSymbol(call.classSymbol)
+        proto.symbol = serializeIrSymbol(call.irClass.symbol)
 
         return proto.build()
     }
 
     private fun serializeReturn(expression: IrReturn): ProtoReturn {
         val proto = ProtoReturn.newBuilder()
-            .setReturnTarget(serializeIrSymbol(expression.returnTargetSymbol))
+            .setReturnTarget(serializeIrSymbol(expression.irReturnTarget.symbol))
             .setValue(serializeExpression(expression.value))
         return proto.build()
     }
@@ -710,7 +710,7 @@
 
     private fun serializeSetVariable(expression: IrSetVariable): ProtoSetVariable =
         ProtoSetVariable.newBuilder()
-            .setSymbol(serializeIrSymbol(expression.symbol))
+            .setSymbol(serializeIrSymbol(expression.target.symbol))
             .setValue(serializeExpression(expression.value)).apply {
                 expression.origin?.let { origin = serializeIrStatementOrigin(it) }
             }
@@ -1103,8 +1103,8 @@
             .setIsTailrec(declaration.isTailrec)
             .setIsSuspend(declaration.isSuspend)
 
-        declaration.overriddenSymbols.forEach {
-            proto.addOverridden(serializeIrSymbol(it))
+        declaration.overridden.forEach {
+            proto.addOverridden(serializeIrSymbol(it.symbol))
         }
 
         return proto.build()
diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt
index 8dfac0d..bda06b5 100644
--- a/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt
+++ b/compiler/tests-common/tests/org/jetbrains/kotlin/ir/AbstractIrTextTestCase.kt
@@ -223,11 +223,11 @@
         }
 
         override fun visitDeclarationReference(expression: IrDeclarationReference) {
-            expression.symbol.checkBinding("ref", expression)
+            expression.target.checkBinding("ref", expression)
         }
 
         override fun visitFunctionReference(expression: IrFunctionReference) {
-            expression.symbol.checkBinding("ref", expression)
+            expression.target.checkBinding("ref", expression)
         }
 
         override fun visitPropertyReference(expression: IrPropertyReference) {
@@ -242,11 +242,11 @@
             expression.setter?.checkBinding("setter", expression)
         }
 
-        private fun IrSymbol.checkBinding(kind: String, irElement: IrElement) {
-            if (!isBound) {
-                error("${javaClass.simpleName} $descriptor is unbound @$kind ${irElement.render()}")
+        private fun IrSymbolOwner.checkBinding(kind: String, irElement: IrElement) {
+            if (!symbol.isBound) {
+                error("${javaClass.simpleName} ${symbol.descriptor} is unbound @$kind ${irElement.render()}")
             } else {
-                val irDeclaration = owner as? IrDeclaration
+                val irDeclaration = this as? IrDeclaration
                 if (irDeclaration != null) {
                     try {
                         irDeclaration.parent
@@ -256,9 +256,9 @@
                 }
             }
 
-            val otherSymbol = symbolForDeclaration.getOrPut(owner) { this }
+            val otherSymbol = symbolForDeclaration.getOrPut(this) { symbol }
             if (this != otherSymbol) {
-                error("Multiple symbols for $descriptor @$kind ${irElement.render()}")
+                error("Multiple symbols for ${symbol.descriptor} @$kind ${irElement.render()}")
             }
         }
 
diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt
index 02170aa..6e9ff65 100644
--- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt
+++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt
@@ -62,7 +62,7 @@
     private fun IrClass.declareSimpleFunctionWithExternalOverrides(descriptor: FunctionDescriptor): IrSimpleFunction {
         return compilerContext.localSymbolTable.declareSimpleFunction(startOffset, endOffset, SERIALIZABLE_PLUGIN_ORIGIN, descriptor)
             .also { f ->
-                descriptor.overriddenDescriptors.mapTo(f.overriddenSymbols) {
+                descriptor.overriddenDescriptors.mapTo(f.overridden) {
                     compilerContext.externalSymbols.referenceSimpleFunction(it.original)
                 }
             }
@@ -79,7 +79,7 @@
         f.parent = this
         f.returnType = descriptor.returnType!!.toIrType()
         if (!fromStubs) f.createParameterDeclarations(this.thisReceiver!!)
-        f.body = compilerContext.createIrBuilder(f.symbol).at(this).irBlockBody(this.startOffset, this.endOffset) { bodyGen(f) }
+        f.body = compilerContext.createIrBuilder(f).at(this).irBlockBody(this.startOffset, this.endOffset) { bodyGen(f) }
         this.addMember(f)
     }
 
@@ -102,13 +102,13 @@
             overwriteValueParameters = overwriteValueParameters,
             copyTypeParameters = false
         )
-        c.body = compilerContext.createIrBuilder(c.symbol).at(this).irBlockBody(this.startOffset, this.endOffset) { bodyGen(c) }
+        c.body = compilerContext.createIrBuilder(c).at(this).irBlockBody(this.startOffset, this.endOffset) { bodyGen(c) }
         this.addMember(c)
     }
 
     fun IrBuilderWithScope.irInvoke(
         dispatchReceiver: IrExpression? = null,
-        callee: IrFunctionSymbol,
+        callee: IrFunction,
         vararg args: IrExpression,
         typeHint: IrType? = null
     ): IrMemberAccessExpression {
@@ -120,7 +120,7 @@
 
     fun IrBuilderWithScope.irInvoke(
         dispatchReceiver: IrExpression? = null,
-        callee: IrFunctionSymbol,
+        callee: IrFunction,
         typeArguments: List<IrType?>,
         valueArguments: List<IrExpression>,
         returnTypeHint: IrType? = null
@@ -147,12 +147,12 @@
     }
 
     fun IrBuilderWithScope.irBinOp(name: Name, lhs: IrExpression, rhs: IrExpression): IrExpression {
-        val symbol = compilerContext.ir.symbols.getBinaryOperator(
+        val function = compilerContext.ir.symbols.getBinaryOperator(
             name,
             lhs.type.toKotlinType(),
             rhs.type.toKotlinType()
         )
-        return irInvoke(lhs, symbol, rhs)
+        return irInvoke(lhs, function, rhs)
     }
 
     fun IrBuilderWithScope.irGetObject(classDescriptor: ClassDescriptor) =
@@ -168,7 +168,7 @@
             startOffset,
             endOffset,
             irObject.defaultType,
-            irObject.symbol
+            irObject
         )
 
     fun <T : IrDeclaration> T.buildWithScope(builder: (T) -> Unit): T =
@@ -239,7 +239,7 @@
     }
 
     fun generateSimplePropertyWithBackingField(
-        ownerSymbol: IrValueSymbol,
+        owner: IrValueDeclaration,
         propertyDescriptor: PropertyDescriptor,
         propertyParent: IrClass
     ): IrProperty {
@@ -253,10 +253,10 @@
             parent = propertyParent
             correspondingPropertySymbol = irProperty.symbol
         }
-        val fieldSymbol = irProperty.backingField!!.symbol
-        irProperty.getter = propertyDescriptor.getter?.let { generatePropertyAccessor(it, fieldSymbol) }
+        val field = irProperty.backingField!!
+        irProperty.getter = propertyDescriptor.getter?.let { generatePropertyAccessor(it, field) }
             ?.apply { parent = propertyParent }
-        irProperty.setter = propertyDescriptor.setter?.let { generatePropertyAccessor(it, fieldSymbol) }
+        irProperty.setter = propertyDescriptor.setter?.let { generatePropertyAccessor(it, field) }
             ?.apply { parent = propertyParent }
         return irProperty
     }
@@ -276,7 +276,7 @@
 
     fun generatePropertyAccessor(
         descriptor: PropertyAccessorDescriptor,
-        fieldSymbol: IrFieldSymbol
+        field: IrField
     ): IrSimpleFunction {
         // Declaration can also be called from user code. Since we lookup descriptor getter in externalSymbols
         // (see generateSave/generateLoad), seems it is correct approach to declare getter lazily there.
@@ -302,12 +302,12 @@
         val endOffset = irAccessor.endOffset
         val irBody = IrBlockBodyImpl(startOffset, endOffset)
 
-        val receiver = generateReceiverExpressionForFieldAccess(irAccessor.dispatchReceiverParameter!!.symbol, property)
+        val receiver = generateReceiverExpressionForFieldAccess(irAccessor.dispatchReceiverParameter!!, property)
 
         irBody.statements.add(
             IrReturnImpl(
                 startOffset, endOffset, compilerContext.irBuiltIns.nothingType,
-                irAccessor.symbol,
+                irAccessor,
                 IrGetFieldImpl(
                     startOffset, endOffset,
                     compilerContext.localSymbolTable.referenceField(property),
@@ -329,7 +329,7 @@
         val endOffset = irAccessor.endOffset
         val irBody = IrBlockBodyImpl(startOffset, endOffset)
 
-        val receiver = generateReceiverExpressionForFieldAccess(irAccessor.dispatchReceiverParameter!!.symbol, property)
+        val receiver = generateReceiverExpressionForFieldAccess(irAccessor.dispatchReceiverParameter!!, property)
 
         val irValueParameter = irAccessor.valueParameters.single()
         irBody.statements.add(
@@ -337,7 +337,7 @@
                 startOffset, endOffset,
                 compilerContext.localSymbolTable.referenceField(property),
                 receiver,
-                IrGetValueImpl(startOffset, endOffset, irValueParameter.type, irValueParameter.symbol),
+                IrGetValueImpl(startOffset, endOffset, irValueParameter.type, irValueParameter),
                 compilerContext.irBuiltIns.unitType
             )
         )
@@ -345,16 +345,16 @@
     }
 
     fun generateReceiverExpressionForFieldAccess(
-        ownerSymbol: IrValueSymbol,
+        owner: IrValueDeclaration,
         property: PropertyDescriptor
     ): IrExpression {
         val containingDeclaration = property.containingDeclaration
         return when (containingDeclaration) {
             is ClassDescriptor ->
                 IrGetValueImpl(
-                    ownerSymbol.owner.startOffset, ownerSymbol.owner.endOffset,
+                    owner.startOffset, owner.endOffset,
 //                symbolTable.referenceValue(containingDeclaration.thisAsReceiverParameter)
-                    ownerSymbol
+                    owner
                 )
             else -> throw AssertionError("Property must be in class")
         }
@@ -409,7 +409,7 @@
             startOffset,
             endOffset,
             returnType.toIrType(),
-            compilerContext.externalSymbols.referenceClassifier(clazz),
+            (compilerContext.externalSymbols.referenceClassifier(clazz) as IrClassSymbol).owner,
             classType.toIrType()
         )
     }
@@ -481,7 +481,7 @@
         module: ModuleDescriptor,
         type: KotlinType,
         expression: IrExpression,
-        nullableSerializerClass: IrClassSymbol
+        nullableSerializerClass: IrClass
     ): IrExpression {
         return if (type.isMarkedNullable)
             irInvoke(
@@ -591,6 +591,6 @@
         }
     }
 
-    fun ReferenceSymbolTable.serializableSyntheticConstructor(forClass: ClassDescriptor): IrConstructorSymbol =
+    fun ReferenceSymbolTable.serializableSyntheticConstructor(forClass: ClassDescriptor): IrConstructor =
         referenceConstructor(forClass.constructors.single { it.isSerializationCtor() })
 }
diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt
index c4c36d9..e926100 100644
--- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt
+++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt
@@ -152,7 +152,7 @@
             endOffset,
             compilerContext.irBuiltIns.unitType,
             superCtorRef,
-            superCtorRef.owner.descriptor
+            superCtorRef.descriptor
         )
         arguments.forEachIndexed { index, parameter -> call.putValueArgument(index, irGet(parameter)) }
         call.insertTypeArgumentsForSuperClass(superClass)
diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt
index d52ee6a..43c1628 100644
--- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt
+++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt
@@ -15,7 +15,6 @@
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.*
 import org.jetbrains.kotlin.ir.expressions.impl.*
-import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
 import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
 import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.*
@@ -428,7 +427,7 @@
         // todo: set properties in external deserialization
         var args: List<IrExpression> = localProps.map { it.get() }
         val typeArgs = (loadFunc.returnType as IrSimpleType).arguments.map { (it as IrTypeProjection).type }
-        val ctor: IrConstructorSymbol = if (serializableDescriptor.isInternalSerializable) {
+        val ctor: IrConstructor = if (serializableDescriptor.isInternalSerializable) {
             args = bitMasks.map { irGet(it) } + args + irNull()
             compilerContext.externalSymbols.serializableSyntheticConstructor(serializableDescriptor)
         } else {
