diff --git a/core/builtins/native/kotlin/Arrays.kt b/core/builtins/native/kotlin/Arrays.kt
index b57605e..b1ab157f 100644
--- a/core/builtins/native/kotlin/Arrays.kt
+++ b/core/builtins/native/kotlin/Arrays.kt
@@ -7,299 +7,19 @@
 
 package kotlin
 
-/**
- * An array of bytes. When targeting the JVM, instances of this class are represented as `byte[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class ByteArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Byte)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Byte
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Byte): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): ByteIterator
-}
-
-/**
- * An array of chars. When targeting the JVM, instances of this class are represented as `char[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to null char (`\u0000').
- */
-public class CharArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Char)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Char
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Char): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): CharIterator
-}
-
-/**
- * An array of shorts. When targeting the JVM, instances of this class are represented as `short[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class ShortArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Short)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Short
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Short): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): ShortIterator
-}
-
-/**
- * An array of ints. When targeting the JVM, instances of this class are represented as `int[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class IntArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Int)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Int
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Int): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): IntIterator
-}
-
-/**
- * An array of longs. When targeting the JVM, instances of this class are represented as `long[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class LongArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Long)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Long
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Long): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): LongIterator
-}
-
-/**
- * An array of floats. When targeting the JVM, instances of this class are represented as `float[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class FloatArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Float)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Float
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Float): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): FloatIterator
-}
-
-/**
- * An array of doubles. When targeting the JVM, instances of this class are represented as `double[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
- */
-public class DoubleArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Double)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Double
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Double): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): DoubleIterator
-}
-
-/**
- * An array of booleans. When targeting the JVM, instances of this class are represented as `boolean[]`.
- * @constructor Creates a new array of the specified [size], with all elements initialized to `false`.
- */
-public class BooleanArray(size: Int) {
-    /**
-     * Creates a new array of the specified [size], where each element is calculated by calling the specified
-     * [init] function.
-     *
-     * The function [init] is called for each array element sequentially starting from the first one.
-     * It should return the value for an array element given its index.
-     */
-    public inline constructor(size: Int, init: (Int) -> Boolean)
-
-    /**
-     * Returns the array element at the given [index].  This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun get(index: Int): Boolean
-
-    /**
-     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.
-     *
-     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS
-     * where the behavior is unspecified.
-     */
-    public operator fun set(index: Int, value: Boolean): Unit
-
-    /** Returns the number of elements in the array. */
-    public val size: Int
-
-    /** Creates an iterator over the elements of the array. */
-    public operator fun iterator(): BooleanIterator
-}
-
+typealias ByteArray = VArray<Byte>
+typealias CharArray = VArray<Char>
+typealias ShortArray = VArray<Short>
+typealias IntArray = VArray<Int>
+typealias LongArray = VArray<Long>
+typealias FloatArray = VArray<Float>
+typealias DoubleArray = VArray<Double>
+typealias BooleanArray = VArray<Boolean>
+fun ByteArray(size : Int) = VArray(size) { 0.toByte() }
+fun CharArray(size : Int) = VArray(size) { '\u0000' }
+fun ShortArray(size : Int) = VArray(size) { 0.toShort() }
+fun IntArray(size : Int) = VArray(size) { 0.toInt() }
+fun LongArray(size : Int) = VArray(size) { 0.toLong() }
+fun FloatArray(size : Int) = VArray(size) { 0.toFloat() }
+fun DoubleArray(size : Int) = VArray(size) { 0.toDouble() }
+fun BooleanArray(size : Int) = VArray(size) { false }
\ No newline at end of file
