diff --git a/src/helpers.d.ts b/src/helpers.d.ts
deleted file mode 100644
index 654affd3f465a3c5d64f168acb7d89eac3b94b8a..0000000000000000000000000000000000000000
--- a/src/helpers.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
- *
- * @author Alexander Rose <alexander.rose@weirdbyte.de>
- * @author David Sehnal <david.sehnal@gmail.com>
- */
-
-declare module Helpers {
-    export type Mutable<T> = {
-        -readonly [P in keyof T]: T[P]
-    }
-    export type TypedIntArray = Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array
-    export type TypedFloatArray = Float32Array | Float64Array
-
-    export type TypedArray = TypedIntArray | TypedFloatArray
-    export type NumberArray = TypedArray | number[]
-    export type UintArray = Uint8Array | Uint16Array | Uint32Array | number[]
-    export type ValueOf<T> = T[keyof T]
-    export type ArrayCtor<T> = { new(size: number): { [i: number]: T, length: number } }
-    /** assignable ArrayLike version */
-    export type ArrayLike<T> =  { [i: number]: T, length: number }
-}
\ No newline at end of file
diff --git a/src/mol-data/util/array.ts b/src/mol-data/util/array.ts
index 94311c38c2ad057768411f1c65c9762244c341e5..4df70a7115c4b51ae5d414d099120a6ae8c40a26 100644
--- a/src/mol-data/util/array.ts
+++ b/src/mol-data/util/array.ts
@@ -5,6 +5,8 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
+import { ArrayCtor } from 'mol-util/type-helpers';
+
 export function arrayFind<T>(array: ArrayLike<T>, f: (v: T) => boolean): T | undefined {
     for (let i = 0, _i = array.length; i < _i; i++) {
         if (f(array[i])) return array[i];
@@ -25,7 +27,7 @@ export function iterableToArray<T>(it: IterableIterator<T>): T[] {
 }
 
 /** Fills the array so that array[0] = start and array[array.length - 1] = end */
-export function createRangeArray(start: number, end: number, ctor?: Helpers.ArrayCtor<number>) {
+export function createRangeArray(start: number, end: number, ctor?: ArrayCtor<number>) {
     const len = end - start + 1;
     const array = ctor ? new ctor(len) : new Int32Array(len);
     for (let i = 0; i < len; i++) {
@@ -42,7 +44,7 @@ export function arrayPickIndices<T>(array: ArrayLike<T>, indices: ArrayLike<numb
     return ret;
 }
 
-export function arrayGetCtor<T>(data: ArrayLike<T>): Helpers.ArrayCtor<T> {
+export function arrayGetCtor<T>(data: ArrayLike<T>): ArrayCtor<T> {
     const ret = (data as any).constructor;
     if (!ret) throw new Error('data does not define a constructor and it should');
     return ret;
diff --git a/src/mol-data/util/buckets.ts b/src/mol-data/util/buckets.ts
index 1e8568a09cefa714427585147f261a62fa753815..956a8e365e7259b3b4d8cb9dadf6dfd46c420d78 100644
--- a/src/mol-data/util/buckets.ts
+++ b/src/mol-data/util/buckets.ts
@@ -5,6 +5,7 @@
  */
 
 import { sort, arraySwap } from './sort';
+import { AssignableArrayLike } from 'mol-util/type-helpers';
 
 type Bucket = {
     key: any,
@@ -14,7 +15,7 @@ type Bucket = {
 
 function sortAsc(bs: Bucket[], i: number, j: number) { return bs[i].key < bs[j].key ? -1 : 1; }
 
-function _makeBuckets(indices: Helpers.ArrayLike<number>,
+function _makeBuckets(indices: AssignableArrayLike<number>,
     getKey: (i: number) => any, sortBuckets: boolean, start: number, end: number) {
 
     const buckets = new Map<any, Bucket>();
@@ -95,7 +96,7 @@ export interface MakeBucketsOptions<K> {
  * Returns the offsets of buckets. So that [offsets[i], offsets[i + 1]) determines the range.
  */
 export function makeBuckets<K extends string | number>(
-    indices: Helpers.ArrayLike<number>, getKey: (i: number) => K, options?: MakeBucketsOptions<K>): ArrayLike<number> {
+    indices: AssignableArrayLike<number>, getKey: (i: number) => K, options?: MakeBucketsOptions<K>): ArrayLike<number> {
     const s = (options && options.start) || 0;
     const e = (options && options.end) || indices.length;
     if (e - s <= 0) throw new Error('Can only bucket non-empty collections.');
diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts
index 76ef6d452f4e2ffd374afe72447b4adf5bcd3e8e..668e118df8cb0377f01069cf1c9ffadcd0a36d51 100644
--- a/src/mol-geo/geometry/geometry.ts
+++ b/src/mol-geo/geometry/geometry.ts
@@ -20,6 +20,7 @@ import { arrayMax } from 'mol-util/array';
 import { TransformData } from './transform-data';
 import { Theme } from 'mol-theme/theme';
 import { RenderObjectValuesType } from 'mol-gl/render-object';
+import { ValueOf } from 'mol-util/type-helpers';
 
 export type GeometryKindType = {
     'mesh': Mesh,
@@ -38,7 +39,7 @@ export type GeometryKindParams = {
     'direct-volume': DirectVolume.Params,
 }
 export type GeometryKind = keyof GeometryKindType
-export type Geometry = Helpers.ValueOf<GeometryKindType>
+export type Geometry = ValueOf<GeometryKindType>
 
 export interface GeometryUtils<G extends Geometry, P extends PD.Params = GeometryKindParams[G['kind']], V = RenderObjectValuesType[G['kind']]> {
     Params: P
diff --git a/src/mol-geo/util.ts b/src/mol-geo/util.ts
index ad2156c06c38cccc9ec3ae6b5b87745276785738..d683696c56ca6101e99169c8e3875c35d6400929 100644
--- a/src/mol-geo/util.ts
+++ b/src/mol-geo/util.ts
@@ -5,8 +5,9 @@
  */
 
 import { Vec3, Mat4, Mat3 } from 'mol-math/linear-algebra'
+import { NumberArray } from 'mol-util/type-helpers';
 
-export function normalizeVec3Array<T extends Helpers.NumberArray> (a: T) {
+export function normalizeVec3Array<T extends NumberArray> (a: T) {
     const n = a.length
     for (let i = 0; i < n; i += 3) {
         const x = a[ i ]
@@ -28,7 +29,7 @@ export function getNormalMatrix(out: Mat3, t: Mat4) {
 
 const tmpV3 = Vec3.zero()
 
-export function transformPositionArray (t: Mat4, array: Helpers.NumberArray, offset: number, count: number) {
+export function transformPositionArray (t: Mat4, array: NumberArray, offset: number, count: number) {
     for (let i = 0, il = count * 3; i < il; i += 3) {
         Vec3.fromArray(tmpV3, array, offset + i)
         Vec3.transformMat4(tmpV3, tmpV3, t)
@@ -36,7 +37,7 @@ export function transformPositionArray (t: Mat4, array: Helpers.NumberArray, off
     }
 }
 
-export function transformDirectionArray (n: Mat3, array: Helpers.NumberArray, offset: number, count: number) {
+export function transformDirectionArray (n: Mat3, array: NumberArray, offset: number, count: number) {
     for (let i = 0, il = count * 3; i < il; i += 3) {
         Vec3.fromArray(tmpV3, array, offset + i)
         Vec3.transformMat3(tmpV3, tmpV3, n)
@@ -44,13 +45,13 @@ export function transformDirectionArray (n: Mat3, array: Helpers.NumberArray, of
     }
 }
 
-export function setArrayZero(array: Helpers.NumberArray) {
+export function setArrayZero(array: NumberArray) {
     const n = array.length
     for (let i = 0; i < n; ++i) array[i] = 0
 }
 
 /** iterate over the entire buffer and apply the radius to each vertex */
-export function appplyRadius(vertices: Helpers.NumberArray, radius: number) {
+export function appplyRadius(vertices: NumberArray, radius: number) {
     const v = Vec3.zero()
     const n = vertices.length
     for (let i = 0; i < n; i += 3) {
@@ -65,7 +66,7 @@ export function appplyRadius(vertices: Helpers.NumberArray, radius: number) {
  * indexed vertex normals weighted by triangle areas http://www.iquilezles.org/www/articles/normals/normals.htm
  * normal array must contain only zeros
  */
-export function computeIndexedVertexNormals<T extends Helpers.NumberArray> (vertices: Helpers.NumberArray, indices: Helpers.NumberArray, normals: T) {
+export function computeIndexedVertexNormals<T extends NumberArray> (vertices: NumberArray, indices: NumberArray, normals: T) {
     const a = Vec3.zero()
     const b = Vec3.zero()
     const c = Vec3.zero()
@@ -103,7 +104,7 @@ export function computeIndexedVertexNormals<T extends Helpers.NumberArray> (vert
 }
 
 /** vertex normals for unindexed triangle soup, normal array must contain only zeros */
-export function computeVertexNormals<T extends Helpers.NumberArray> (vertices: Helpers.NumberArray, normals: T) {
+export function computeVertexNormals<T extends NumberArray> (vertices: NumberArray, normals: T) {
     setArrayZero(normals)
 
     const a = Vec3.zero()
diff --git a/src/mol-gl/webgl/buffer.ts b/src/mol-gl/webgl/buffer.ts
index 5c2d5b0801427b8f586be8f8c9695a55a32f124b..80cd13401bfe84604f844b89b75d5c42d816812d 100644
--- a/src/mol-gl/webgl/buffer.ts
+++ b/src/mol-gl/webgl/buffer.ts
@@ -8,6 +8,7 @@ import { WebGLContext } from './context'
 import { ValueCell } from 'mol-util';
 import { RenderableSchema } from '../renderable/schema';
 import { idFactory } from 'mol-util/id-factory';
+import { ValueOf } from 'mol-util/type-helpers';
 
 const getNextBufferId = idFactory()
 
@@ -24,7 +25,7 @@ export type DataTypeArrayType = {
     'int32': Int32Array
     'float32': Float32Array
 }
-export type ArrayType = Helpers.ValueOf<DataTypeArrayType>
+export type ArrayType = ValueOf<DataTypeArrayType>
 export type ArrayKind = keyof DataTypeArrayType
 
 export type BufferItemSize = 1 | 2 | 3 | 4 | 16
diff --git a/src/mol-gl/webgl/render-target.ts b/src/mol-gl/webgl/render-target.ts
index 52203d0134b92584511a7fd6ab7df5d92b77a7da..d26ec40b136d87c9669b32d2ddfca8ee55c7285c 100644
--- a/src/mol-gl/webgl/render-target.ts
+++ b/src/mol-gl/webgl/render-target.ts
@@ -10,6 +10,7 @@ import { createTexture, Texture } from './texture';
 import { createFramebuffer } from './framebuffer';
 import { createRenderbuffer } from './renderbuffer';
 import { TextureImage } from '../renderable/util';
+import { Mutable } from 'mol-util/type-helpers';
 
 const getNextRenderTargetId = idFactory()
 
@@ -32,7 +33,7 @@ export interface RenderTarget {
 export function createRenderTarget (ctx: WebGLContext, _width: number, _height: number): RenderTarget {
     const { gl } = ctx
 
-    const image: Helpers.Mutable<TextureImage<Uint8Array>> = {
+    const image: Mutable<TextureImage<Uint8Array>> = {
         array: new Uint8Array(_width * _height * 4),
         width: _width,
         height: _height
diff --git a/src/mol-gl/webgl/texture.ts b/src/mol-gl/webgl/texture.ts
index 763bf9fdc396e77bed78eef13b0295e41995d529..b08790f3321dd154deff6d8eeb6eb68297fcb8f9 100644
--- a/src/mol-gl/webgl/texture.ts
+++ b/src/mol-gl/webgl/texture.ts
@@ -11,6 +11,7 @@ import { RenderableSchema } from '../renderable/schema';
 import { idFactory } from 'mol-util/id-factory';
 import { Framebuffer } from './framebuffer';
 import { isWebGL2 } from './compat';
+import { ValueOf } from 'mol-util/type-helpers';
 
 const getNextTextureId = idFactory()
 
@@ -21,7 +22,7 @@ export type TextureKindValue = {
     'volume-float32': TextureVolume<Float32Array>
     'texture': Texture
 }
-export type TextureValueType = Helpers.ValueOf<TextureKindValue>
+export type TextureValueType = ValueOf<TextureKindValue>
 export type TextureKind = keyof TextureKindValue
 export type TextureType = 'ubyte' | 'float'
 export type TextureFormat = 'alpha' | 'rgb' | 'rgba'
diff --git a/src/mol-io/common/binary-cif/array-encoder.ts b/src/mol-io/common/binary-cif/array-encoder.ts
index a681faeef47f5645f73c32128ba5f360f6613f81..0d745598e5e645989d7451246fc5ad75236384bf 100644
--- a/src/mol-io/common/binary-cif/array-encoder.ts
+++ b/src/mol-io/common/binary-cif/array-encoder.ts
@@ -10,6 +10,7 @@
 import { ChunkedArray } from 'mol-data/util'
 import { Encoding, EncodedData } from './encoding'
 import { classifyIntArray } from './classifier';
+import { TypedIntArray, TypedFloatArray } from 'mol-util/type-helpers';
 
 export interface ArrayEncoder {
     and(f: ArrayEncoding.Provider): ArrayEncoder,
@@ -119,7 +120,7 @@ export namespace ArrayEncoding {
         [Encoding.FloatDataType.Float64]: 8
     }
 
-    export function byteArray(data: Encoding.TypedFloatArray | Encoding.TypedIntArray) {
+    export function byteArray(data: TypedFloatArray | TypedIntArray) {
         const type = Encoding.getDataType(data);
 
         if (type === Encoding.IntDataType.Int8) return int8(data as Int8Array);
@@ -137,7 +138,7 @@ export namespace ArrayEncoding {
         };
     }
 
-    function _fixedPoint(data: Encoding.TypedFloatArray, factor: number): Result {
+    function _fixedPoint(data: TypedFloatArray, factor: number): Result {
         const srcType = Encoding.getDataType(data) as Encoding.FloatDataType;
         const result = new Int32Array(data.length);
         for (let i = 0, n = data.length; i < n; i++) {
@@ -148,9 +149,9 @@ export namespace ArrayEncoding {
             data: result
         };
     }
-    export function fixedPoint(factor: number): Provider { return data => _fixedPoint(data as Encoding.TypedFloatArray, factor); }
+    export function fixedPoint(factor: number): Provider { return data => _fixedPoint(data as TypedFloatArray, factor); }
 
-    function _intervalQuantizaiton(data: Encoding.TypedFloatArray, min: number, max: number, numSteps: number, arrayType: new (size: number) => Encoding.TypedIntArray): Result {
+    function _intervalQuantizaiton(data: TypedFloatArray, min: number, max: number, numSteps: number, arrayType: new (size: number) => TypedIntArray): Result {
         const srcType = Encoding.getDataType(data) as Encoding.FloatDataType;
         if (!data.length) {
             return {
@@ -180,11 +181,11 @@ export namespace ArrayEncoding {
             data: output
         };
     }
-    export function intervalQuantizaiton(min: number, max: number, numSteps: number, arrayType: new (size: number) => Encoding.TypedIntArray = Int32Array): Provider {
-        return data => _intervalQuantizaiton(data as Encoding.TypedFloatArray, min, max, numSteps, arrayType);
+    export function intervalQuantizaiton(min: number, max: number, numSteps: number, arrayType: new (size: number) => TypedIntArray = Int32Array): Provider {
+        return data => _intervalQuantizaiton(data as TypedFloatArray, min, max, numSteps, arrayType);
     }
 
-    export function runLength(data: Encoding.TypedIntArray): Result {
+    export function runLength(data: TypedIntArray): Result {
         let srcType = Encoding.getDataType(data) as Encoding.IntDataType;
         if (srcType === void 0) {
             data = new Int32Array(data);
diff --git a/src/mol-io/common/binary-cif/encoding.ts b/src/mol-io/common/binary-cif/encoding.ts
index 6fc0d20a092e7dad6df07756618ad773fbc328ec..899d246adf90bc46565a97dc16cbae9101c4857f 100644
--- a/src/mol-io/common/binary-cif/encoding.ts
+++ b/src/mol-io/common/binary-cif/encoding.ts
@@ -5,6 +5,8 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
+import { TypedIntArray, TypedFloatArray } from 'mol-util/type-helpers';
+
 export const VERSION = '0.3.0';
 
 export type Encoding =
@@ -71,9 +73,6 @@ export namespace Encoding {
 
     export type DataType = IntDataType | FloatDataType
 
-    export type TypedIntArray = Helpers.TypedIntArray
-    export type TypedFloatArray = Helpers.TypedFloatArray
-
     export function getDataType(data: TypedIntArray | TypedFloatArray): DataType {
         let srcType: DataType;
         if (data instanceof Int8Array) srcType = Encoding.IntDataType.Int8;
diff --git a/src/mol-io/writer/cif/encoder/binary.ts b/src/mol-io/writer/cif/encoder/binary.ts
index f85d81aa93045b9e157b0811b96c396a3c6fd588..c9b39a799c775ee62cbce8dd13358e44b6469faf 100644
--- a/src/mol-io/writer/cif/encoder/binary.ts
+++ b/src/mol-io/writer/cif/encoder/binary.ts
@@ -15,6 +15,7 @@ import { Field, Category, Encoder } from '../encoder'
 import Writer from '../../writer'
 import { getIncludedFields, getCategoryInstanceData, CategoryInstanceData } from './util';
 import { classifyIntArray, classifyFloatArray } from '../../../common/binary-cif/classifier';
+import { ArrayCtor } from 'mol-util/type-helpers';
 
 export interface EncodingProvider {
     get(category: string, field: string): ArrayEncoder | undefined;
@@ -96,7 +97,7 @@ export default class BinaryEncoder implements Encoder<Uint8Array> {
     }
 }
 
-function getArrayCtor(field: Field, format: Field.Format | undefined): Helpers.ArrayCtor<string | number> {
+function getArrayCtor(field: Field, format: Field.Format | undefined): ArrayCtor<string | number> {
     if (format && format.typedArray) return format.typedArray;
     if (field.defaultFormat && field.defaultFormat.typedArray) return field.defaultFormat.typedArray;
     if (field.type === Field.Type.Str) return Array;
@@ -157,7 +158,7 @@ function encodeField(categoryName: string, field: Field, data: CategoryInstanceD
     };
 }
 
-function getFieldData(field: Field<any, any>, arrayCtor: Helpers.ArrayCtor<string | number>, totalCount: number, data: CategoryInstanceData['source']) {
+function getFieldData(field: Field<any, any>, arrayCtor: ArrayCtor<string | number>, totalCount: number, data: CategoryInstanceData['source']) {
     const isStr = field.type === Field.Type.Str;
     const array = new arrayCtor(totalCount);
     const mask = new Uint8Array(totalCount);
diff --git a/src/mol-math/geometry/distance-transform.ts b/src/mol-math/geometry/distance-transform.ts
index fa9551c4d29c03ff65abce37d4b70b48ddf54460..df3c5693fcc64e6091e4e8ba38a38ad35f9fc1a0 100644
--- a/src/mol-math/geometry/distance-transform.ts
+++ b/src/mol-math/geometry/distance-transform.ts
@@ -4,10 +4,12 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
+import { NumberArray } from 'mol-util/type-helpers';
+
 /**
  * 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf
  */
-export function edt(data: Helpers.NumberArray, width: number, height: number, f: Helpers.NumberArray, d: Helpers.NumberArray, v: Helpers.NumberArray, z: Helpers.NumberArray) {
+export function edt(data: NumberArray, width: number, height: number, f: NumberArray, d: NumberArray, v: NumberArray, z: NumberArray) {
     for (let x = 0; x < width; x++) {
         for (let y = 0; y < height; y++) {
             f[y] = data[y * width + x]
@@ -31,7 +33,7 @@ export function edt(data: Helpers.NumberArray, width: number, height: number, f:
 /**
  * 1D squared distance transform
  */
-function edt1d(f: Helpers.NumberArray, d: Helpers.NumberArray, v: Helpers.NumberArray, z: Helpers.NumberArray, n: number) {
+function edt1d(f: NumberArray, d: NumberArray, v: NumberArray, z: NumberArray, n: number) {
     v[0] = 0
     z[0] = Number.MIN_SAFE_INTEGER
     z[1] = Number.MAX_SAFE_INTEGER
diff --git a/src/mol-math/geometry/primitives/sphere3d.ts b/src/mol-math/geometry/primitives/sphere3d.ts
index 5dbbf1315b9ea054ff2d2d46ded3fdc0cfa57892..94c9593f9889b9a68b694cb71968a2cfc221d762 100644
--- a/src/mol-math/geometry/primitives/sphere3d.ts
+++ b/src/mol-math/geometry/primitives/sphere3d.ts
@@ -8,6 +8,7 @@
 import { Vec3, Mat4, EPSILON } from '../../linear-algebra'
 import { PositionData } from '../common'
 import { OrderedSet } from 'mol-data/int';
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Sphere3D { center: Vec3, radius: number }
 
@@ -64,12 +65,12 @@ namespace Sphere3D {
         return out
     }
 
-    export function toArray(s: Sphere3D, out: Helpers.NumberArray, offset: number) {
+    export function toArray(s: Sphere3D, out: NumberArray, offset: number) {
         Vec3.toArray(s.center, out, offset)
         out[offset + 3] = s.radius
     }
 
-    export function fromArray(out: Sphere3D, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(out: Sphere3D, array: NumberArray, offset: number) {
         Vec3.fromArray(out.center, array, offset)
         out.radius = array[offset + 3]
         return out
diff --git a/src/mol-math/linear-algebra/3d/mat3.ts b/src/mol-math/linear-algebra/3d/mat3.ts
index f18d68fb2dac152966f946dedbddceba64a7bcfd..a646193d7d6ecc7403bde52b2ec097610169e964 100644
--- a/src/mol-math/linear-algebra/3d/mat3.ts
+++ b/src/mol-math/linear-algebra/3d/mat3.ts
@@ -18,6 +18,7 @@
  */
 
 import { Mat4 } from '../3d'
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Mat3 extends Array<number> { [d: number]: number, '@type': 'mat3', length: 9 }
 
@@ -56,7 +57,7 @@ namespace Mat3 {
         return mat;
     }
 
-    export function toArray(a: Mat3, out: Helpers.NumberArray, offset: number) {
+    export function toArray(a: Mat3, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
         out[offset + 2] = a[2];
@@ -68,7 +69,7 @@ namespace Mat3 {
         out[offset + 8] = a[8];
     }
 
-    export function fromArray(a: Mat3, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(a: Mat3, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         a[2] = array[offset + 2]
diff --git a/src/mol-math/linear-algebra/3d/mat4.ts b/src/mol-math/linear-algebra/3d/mat4.ts
index be275d960bf494d3937f4537d666336ddeed7d7a..b18fb3e5cc57036ca1ea9d69a9dba0f5162bf7cb 100644
--- a/src/mol-math/linear-algebra/3d/mat4.ts
+++ b/src/mol-math/linear-algebra/3d/mat4.ts
@@ -21,6 +21,7 @@ import { EPSILON, equalEps } from './common'
 import Vec3 from './vec3';
 import Quat from './quat';
 import { degToRad } from '../../misc';
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Mat4 extends Array<number> { [d: number]: number, '@type': 'mat4', length: 16 }
 interface ReadonlyMat4 extends Array<number> { readonly [d: number]: number, '@type': 'mat4', length: 16 }
@@ -118,7 +119,7 @@ namespace Mat4 {
         a[4 * j + i] = value;
     }
 
-    export function toArray(a: Mat4, out: Helpers.NumberArray, offset: number) {
+    export function toArray(a: Mat4, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
         out[offset + 2] = a[2];
@@ -137,7 +138,7 @@ namespace Mat4 {
         out[offset + 15] = a[15];
     }
 
-    export function fromArray(a: Mat4, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(a: Mat4, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         a[2] = array[offset + 2]
@@ -370,7 +371,7 @@ namespace Mat4 {
     /**
      * Like `mul` but with offsets into arrays
      */
-    export function mulOffset(out: Helpers.NumberArray, a: Helpers.NumberArray, b: Helpers.NumberArray, oOut: number, oA: number, oB: number) {
+    export function mulOffset(out: NumberArray, a: NumberArray, b: NumberArray, oOut: number, oA: number, oB: number) {
         const a00 = a[0 + oA], a01 = a[1 + oA], a02 = a[2 + oA], a03 = a[3 + oA],
             a10 = a[4 + oA], a11 = a[5 + oA], a12 = a[6 + oA], a13 = a[7 + oA],
             a20 = a[8 + oA], a21 = a[9 + oA], a22 = a[10 + oA], a23 = a[11 + oA],
diff --git a/src/mol-math/linear-algebra/3d/quat.ts b/src/mol-math/linear-algebra/3d/quat.ts
index 8c85b36c094284689029d852aa42a4cfb7c48f09..59e68c88bd5fe70b02d7e19bbc4cac22ed614956 100644
--- a/src/mol-math/linear-algebra/3d/quat.ts
+++ b/src/mol-math/linear-algebra/3d/quat.ts
@@ -25,6 +25,7 @@
 import Mat3 from './mat3';
 import Vec3 from './vec3';
 import { EPSILON } from './common';
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Quat extends Array<number> { [d: number]: number, '@type': 'quat', length: 4 }
 
@@ -312,14 +313,14 @@ namespace Quat {
         return out;
     }
 
-    export function toArray(a: Quat, out: Helpers.NumberArray, offset: number) {
+    export function toArray(a: Quat, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
         out[offset + 2] = a[2];
         out[offset + 3] = a[3];
     }
 
-    export function fromArray(a: Quat, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(a: Quat, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         a[2] = array[offset + 2]
diff --git a/src/mol-math/linear-algebra/3d/vec2.ts b/src/mol-math/linear-algebra/3d/vec2.ts
index 34bdb70bfd5d7a45c82c323c7462f775d3a6f7a6..be7b7cdf93b52dac9b90fca247f42f75485fd383 100644
--- a/src/mol-math/linear-algebra/3d/vec2.ts
+++ b/src/mol-math/linear-algebra/3d/vec2.ts
@@ -1,3 +1,5 @@
+import { NumberArray } from 'mol-util/type-helpers';
+
 /**
  * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
@@ -44,12 +46,12 @@ namespace Vec2 {
         return isNaN(a[0]) || isNaN(a[1])
     }
 
-    export function toArray(a: Vec2, out: Helpers.NumberArray, offset: number) {
+    export function toArray(a: Vec2, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
     }
 
-    export function fromArray(a: Vec2, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(a: Vec2, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         return a
diff --git a/src/mol-math/linear-algebra/3d/vec3.ts b/src/mol-math/linear-algebra/3d/vec3.ts
index 5a230ea9054ebe66f723285bd26e79f0897c92e6..0be0f033dcbff1020f4ea5f9ac22566f45daf100 100644
--- a/src/mol-math/linear-algebra/3d/vec3.ts
+++ b/src/mol-math/linear-algebra/3d/vec3.ts
@@ -20,6 +20,7 @@
 import Mat4 from './mat4';
 import { Quat, Mat3, EPSILON } from '../3d';
 import { spline as _spline, clamp } from '../../interpolate'
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Vec3 extends Array<number> { [d: number]: number, '@type': 'vec3', length: 3 }
 
@@ -57,7 +58,7 @@ namespace Vec3 {
         return v
     }
 
-    export function toArray(v: Vec3, out: Helpers.NumberArray, offset: number) {
+    export function toArray(v: Vec3, out: NumberArray, offset: number) {
         out[offset + 0] = v[0]
         out[offset + 1] = v[1]
         out[offset + 2] = v[2]
@@ -372,7 +373,7 @@ namespace Vec3 {
     /**
      * Like `transformMat4` but with offsets into arrays
      */
-    export function transformMat4Offset(out: Helpers.NumberArray, a: Helpers.NumberArray, m: Helpers.NumberArray, outO: number, aO: number, oM: number) {
+    export function transformMat4Offset(out: NumberArray, a: NumberArray, m: NumberArray, outO: number, aO: number, oM: number) {
         const x = a[0 + aO], y = a[1 + aO], z = a[2 + aO],
             w = 1 / ((m[3 + oM] * x + m[7 + oM] * y + m[11 + oM] * z + m[15 + oM]) || 1.0);
         out[0 + outO] = (m[0 + oM] * x + m[4 + oM] * y + m[8 + oM] * z + m[12 + oM]) * w;
diff --git a/src/mol-math/linear-algebra/3d/vec4.ts b/src/mol-math/linear-algebra/3d/vec4.ts
index e54d6d4970a6b4468b50f4d8719c5eab24cd2149..c7c4e3380250572a684ce87ce4bdbd90ee8d19df 100644
--- a/src/mol-math/linear-algebra/3d/vec4.ts
+++ b/src/mol-math/linear-algebra/3d/vec4.ts
@@ -19,6 +19,7 @@
 
 import Mat4 from './mat4';
 import { EPSILON } from '../3d';
+import { NumberArray } from 'mol-util/type-helpers';
 
 interface Vec4 extends Array<number> { [d: number]: number, '@type': 'vec4', length: 4 }
 
@@ -52,14 +53,14 @@ namespace Vec4 {
         return isNaN(a[0]) || isNaN(a[1]) || isNaN(a[2]) || isNaN(a[3])
     }
 
-    export function toArray(a: Vec4, out: Helpers.NumberArray, offset: number) {
+    export function toArray(a: Vec4, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
         out[offset + 2] = a[2];
         out[offset + 3] = a[3];
     }
 
-    export function fromArray(a: Vec4, array: Helpers.NumberArray, offset: number) {
+    export function fromArray(a: Vec4, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         a[2] = array[offset + 2]
@@ -67,13 +68,13 @@ namespace Vec4 {
         return a
     }
 
-    export function toVec3Array(a: Vec4, out: Helpers.NumberArray, offset: number) {
+    export function toVec3Array(a: Vec4, out: NumberArray, offset: number) {
         out[offset + 0] = a[0];
         out[offset + 1] = a[1];
         out[offset + 2] = a[2];
     }
 
-    export function fromVec3Array(a: Vec4, array: Helpers.NumberArray, offset: number) {
+    export function fromVec3Array(a: Vec4, array: NumberArray, offset: number) {
         a[0] = array[offset + 0]
         a[1] = array[offset + 1]
         a[2] = array[offset + 2]
diff --git a/src/mol-math/linear-algebra/matrix/matrix.ts b/src/mol-math/linear-algebra/matrix/matrix.ts
index 549635053c5ce1ff03ecd97490d6cba7a76ea9ee..0610a4648d3715a6cb1c833663fbe751a99ec515 100644
--- a/src/mol-math/linear-algebra/matrix/matrix.ts
+++ b/src/mol-math/linear-algebra/matrix/matrix.ts
@@ -4,15 +4,17 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-interface Matrix { data: Helpers.NumberArray, size: number, cols: number, rows: number }
+import { NumberArray } from 'mol-util/type-helpers';
+
+interface Matrix { data: NumberArray, size: number, cols: number, rows: number }
 
 namespace Matrix {
-    export function create(cols: number, rows: number, ctor: { new (size: number): Helpers.NumberArray } = Float32Array): Matrix {
+    export function create(cols: number, rows: number, ctor: { new (size: number): NumberArray } = Float32Array): Matrix {
         const size = cols * rows
         return { data: new ctor(size), size, cols, rows }
     }
 
-    export function fromArray(data: Helpers.NumberArray, cols: number, rows: number): Matrix {
+    export function fromArray(data: NumberArray, cols: number, rows: number): Matrix {
         return { data, size: cols * rows, cols, rows }
     }
 
@@ -61,7 +63,7 @@ namespace Matrix {
     }
 
     /** Subtract `row` from all rows in `mat` */
-    export function subRows (mat: Matrix, row: Helpers.NumberArray) {
+    export function subRows (mat: Matrix, row: NumberArray) {
         const nrows = mat.rows, ncols = mat.cols
         const md = mat.data
 
diff --git a/src/mol-math/linear-algebra/matrix/svd.ts b/src/mol-math/linear-algebra/matrix/svd.ts
index e7ace3f959ae173d49c9869ce0015cce89c18b3f..ad276f4ac0fed1fb6b2adce2868a327013f2ea20 100644
--- a/src/mol-math/linear-algebra/matrix/svd.ts
+++ b/src/mol-math/linear-algebra/matrix/svd.ts
@@ -5,10 +5,11 @@
  */
 
 import Matrix from './matrix';
+import { NumberArray } from 'mol-util/type-helpers';
 
 // svd method adapted from http://inspirit.github.io/jsfeat/ MIT Eugene Zatepyakin
 
-export function swap(A: Helpers.NumberArray, i0: number, i1: number, t: number) {
+export function swap(A: NumberArray, i0: number, i1: number, t: number) {
     t = A[i0]
     A[i0] = A[i1]
     A[i1] = t
@@ -31,7 +32,7 @@ export function hypot(a: number, b: number) {
 const EPSILON = 0.0000001192092896
 const FLT_MIN = 1E-37
 
-export function JacobiSVDImpl(At: Helpers.NumberArray, astep: number, _W: Helpers.NumberArray, Vt: Helpers.NumberArray, vstep: number, m: number, n: number, n1: number) {
+export function JacobiSVDImpl(At: NumberArray, astep: number, _W: NumberArray, Vt: NumberArray, vstep: number, m: number, n: number, n1: number) {
     const eps = EPSILON * 2.0
     const minval = FLT_MIN
     let i = 0
diff --git a/src/mol-repr/structure/visual/util/polymer/curve-segment.ts b/src/mol-repr/structure/visual/util/polymer/curve-segment.ts
index bef8bd5e91958bdf819f8b0202169699ad3f083c..1231c6bb0f9e160f9ed62b36cae038b867f9c2f8 100644
--- a/src/mol-repr/structure/visual/util/polymer/curve-segment.ts
+++ b/src/mol-repr/structure/visual/util/polymer/curve-segment.ts
@@ -5,12 +5,13 @@
  */
 
 import { Vec3 } from 'mol-math/linear-algebra';
+import { NumberArray } from 'mol-util/type-helpers';
 
 export interface CurveSegmentState {
-    curvePoints: Helpers.NumberArray,
-    tangentVectors: Helpers.NumberArray,
-    normalVectors: Helpers.NumberArray,
-    binormalVectors: Helpers.NumberArray,
+    curvePoints: NumberArray,
+    tangentVectors: NumberArray,
+    normalVectors: NumberArray,
+    binormalVectors: NumberArray,
     linearSegments: number
 }
 
diff --git a/src/mol-util/array.ts b/src/mol-util/array.ts
index 6895f81ed2b5b7a5db5172170a0b76656bad1aba..95b5ef5be19ea24383680e0e6ca84054cf6c70d7 100644
--- a/src/mol-util/array.ts
+++ b/src/mol-util/array.ts
@@ -4,10 +4,12 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
+import { NumberArray } from './type-helpers';
+
 // TODO move to mol-math as Vector???
 
 /** Get the maximum value in an array */
-export function arrayMax(array: Helpers.NumberArray) {
+export function arrayMax(array: NumberArray) {
     let max = -Infinity
     for (let i = 0, il = array.length; i < il; ++i) {
         if (array[i] > max) max = array[i]
@@ -16,7 +18,7 @@ export function arrayMax(array: Helpers.NumberArray) {
 }
 
 /** Get the minimum value in an array */
-export function arrayMin(array: Helpers.NumberArray) {
+export function arrayMin(array: NumberArray) {
     let min = Infinity
     for (let i = 0, il = array.length; i < il; ++i) {
         if (array[i] < min) min = array[i]
@@ -25,7 +27,7 @@ export function arrayMin(array: Helpers.NumberArray) {
 }
 
 /** Get the sum of values in an array */
-export function arraySum(array: Helpers.NumberArray, stride = 1, offset = 0) {
+export function arraySum(array: NumberArray, stride = 1, offset = 0) {
     const n = array.length
     let sum = 0
     for (let i = offset; i < n; i += stride) {
@@ -35,12 +37,12 @@ export function arraySum(array: Helpers.NumberArray, stride = 1, offset = 0) {
 }
 
 /** Get the mean of values in an array */
-export function arrayMean(array: Helpers.NumberArray, stride = 1, offset = 0) {
+export function arrayMean(array: NumberArray, stride = 1, offset = 0) {
     return arraySum(array, stride, offset) / (array.length / stride)
 }
 
 /** Get the root mean square of values in an array */
-export function arrayRms(array: Helpers.NumberArray) {
+export function arrayRms(array: NumberArray) {
     const n = array.length
     let sumSq = 0
     for (let i = 0; i < n; ++i) {
@@ -51,7 +53,7 @@ export function arrayRms(array: Helpers.NumberArray) {
 }
 
 /** Fill an array with serial numbers starting from 0 until n - 1 (defaults to array.length) */
-export function fillSerial<T extends Helpers.NumberArray> (array: T, n?: number) {
+export function fillSerial<T extends NumberArray> (array: T, n?: number) {
     for (let i = 0, il = n ? Math.min(n, array.length) : array.length; i < il; ++i) array[ i ] = i
     return array
 }
\ No newline at end of file
diff --git a/src/mol-util/color/color.ts b/src/mol-util/color/color.ts
index ec15dbf3e49fd23fa2b52e585d0605b9984cc39e..150417a6820ebfb44ac7fe6ff46884b0c1e926fa 100644
--- a/src/mol-util/color/color.ts
+++ b/src/mol-util/color/color.ts
@@ -4,6 +4,8 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
+import { NumberArray } from 'mol-util/type-helpers';
+
 /** RGB color triplet expressed as a single number */
 export type Color = { readonly '@type': 'color' } & number
 
@@ -38,16 +40,16 @@ export namespace Color {
         return (((r * 255) << 16) | ((g * 255) << 8) | (b * 255)) as Color
     }
 
-    export function fromArray(array: Helpers.NumberArray, offset: number): Color {
+    export function fromArray(array: NumberArray, offset: number): Color {
         return fromRgb(array[offset], array[offset + 1], array[offset + 2])
     }
 
-    export function fromNormalizedArray(array: Helpers.NumberArray, offset: number): Color {
+    export function fromNormalizedArray(array: NumberArray, offset: number): Color {
         return fromNormalizedRgb(array[offset], array[offset + 1], array[offset + 2])
     }
 
     /** Copies hex color to rgb array */
-    export function toArray(hexColor: Color, array: Helpers.NumberArray, offset: number) {
+    export function toArray(hexColor: Color, array: NumberArray, offset: number) {
         array[ offset ] = (hexColor >> 16 & 255)
         array[ offset + 1 ] = (hexColor >> 8 & 255)
         array[ offset + 2 ] = (hexColor & 255)
@@ -55,7 +57,7 @@ export namespace Color {
     }
 
     /** Copies normalized (0 to 1) hex color to rgb array */
-    export function toArrayNormalized<T extends Helpers.NumberArray>(hexColor: Color, array: T, offset: number) {
+    export function toArrayNormalized<T extends NumberArray>(hexColor: Color, array: T, offset: number) {
         array[ offset ] = (hexColor >> 16 & 255) / 255
         array[ offset + 1 ] = (hexColor >> 8 & 255) / 255
         array[ offset + 2 ] = (hexColor & 255) / 255
diff --git a/src/mol-util/color/scale.ts b/src/mol-util/color/scale.ts
index 3437b80d84a49da05b46c604786c8cf8a7cc09c6..39f1b716c2511002c81578c45ac8fdb7742c3281 100644
--- a/src/mol-util/color/scale.ts
+++ b/src/mol-util/color/scale.ts
@@ -7,6 +7,7 @@
 import { Color } from './color'
 import { ColorBrewer, ColorMatplotlib, ColorOther } from './tables'
 import { defaults } from 'mol-util';
+import { NumberArray } from 'mol-util/type-helpers';
 
 export type ColorListName = (
     keyof typeof ColorBrewer | keyof typeof ColorMatplotlib | keyof typeof ColorOther
@@ -44,9 +45,9 @@ export interface ColorScale {
     /** Returns hex color for given value */
     color: (value: number) => Color
     /** Copies color to rgb int8 array */
-    colorToArray: (value: number, array: Helpers.NumberArray, offset: number) => void
+    colorToArray: (value: number, array: NumberArray, offset: number) => void
     /** Copies normalized (0 to 1) hex color to rgb array */
-    normalizedColorToArray: (value: number, array: Helpers.NumberArray, offset: number) => void
+    normalizedColorToArray: (value: number, array: NumberArray, offset: number) => void
     /**  */
     setDomain: (min: number, max: number) => void
     /** Legend */
@@ -90,10 +91,10 @@ export namespace ColorScale {
         }
         return {
             color,
-            colorToArray: (value: number, array: Helpers.NumberArray, offset: number) => {
+            colorToArray: (value: number, array: NumberArray, offset: number) => {
                 Color.toArray(color(value), array, offset)
             },
-            normalizedColorToArray: (value: number, array: Helpers.NumberArray, offset: number) => {
+            normalizedColorToArray: (value: number, array: NumberArray, offset: number) => {
                 Color.toArrayNormalized(color(value), array, offset)
             },
             setDomain,
diff --git a/src/mol-util/type-helpers.ts b/src/mol-util/type-helpers.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a6e5f3c4206311ab97ceea6d6ff591c68577830d
--- /dev/null
+++ b/src/mol-util/type-helpers.ts
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ * @author David Sehnal <david.sehnal@gmail.com>
+ */
+
+export type Mutable<T> = {
+    -readonly [P in keyof T]: T[P]
+}
+export type TypedIntArray = Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array
+export type TypedFloatArray = Float32Array | Float64Array
+
+export type TypedArray = TypedIntArray | TypedFloatArray
+export type NumberArray = TypedArray | number[]
+export type UintArray = Uint8Array | Uint16Array | Uint32Array | number[]
+export type ValueOf<T> = T[keyof T]
+export type ArrayCtor<T> = { new(size: number): { [i: number]: T, length: number } }
+/** assignable ArrayLike version */
+export type AssignableArrayLike<T> =  { [i: number]: T, length: number }
\ No newline at end of file