diff --git a/package-lock.json b/package-lock.json
index 3db077f62b8a695813533388b3ad68e8f0917b91..63217087816db2a87969dcfecf735d221decc48a 100644
Binary files a/package-lock.json and b/package-lock.json differ
diff --git a/package.json b/package.json
index 4e0873b4b3cf0c183a882a2f1a625064132c81e4..6b9b892807e53451b820a0c0144989a84a168838 100644
--- a/package.json
+++ b/package.json
@@ -67,6 +67,11 @@
     "testRegex": "\\.spec\\.ts$"
   },
   "author": "Mol* Contributors",
+  "contributors": [
+    "Alexander Rose <alexander.rose@weirdbyte.de>",
+    "David Sehnal <david.sehnal@gmail.com>",
+    "Sebastian Bittrich <sebastian.bittrich@rcsb.org>"
+  ],
   "license": "MIT",
   "devDependencies": {
     "benchmark": "^2.1.4",
@@ -81,18 +86,18 @@
     "graphql-codegen-typescript-template": "^0.18.2",
     "jest": "^24.8.0",
     "jest-raw-loader": "^1.0.1",
-    "mini-css-extract-plugin": "^0.6.0",
+    "mini-css-extract-plugin": "^0.7.0",
     "node-sass": "^4.12.0",
     "raw-loader": "^2.0.0",
     "resolve-url-loader": "^3.1.0",
     "sass-loader": "^7.1.0",
     "style-loader": "^0.23.1",
     "ts-jest": "^24.0.2",
-    "tslint": "^5.16.0",
-    "typescript": "^3.4.5",
-    "uglify-js": "^3.5.13",
+    "tslint": "^5.17.0",
+    "typescript": "^3.5.1",
+    "uglify-js": "^3.6.0",
     "util.promisify": "^1.0.0",
-    "webpack": "^4.31.0",
+    "webpack": "^4.32.2",
     "webpack-cli": "^3.3.2"
   },
   "dependencies": {
@@ -102,25 +107,25 @@
     "@types/express": "^4.16.1",
     "@types/gl": "^4.1.0",
     "@types/jest": "^24.0.13",
-    "@types/node": "^12.0.2",
+    "@types/node": "^12.0.4",
     "@types/node-fetch": "^2.3.4",
     "@types/pngjs": "^3.3.2",
-    "@types/react": "^16.8.17",
+    "@types/react": "^16.8.19",
     "@types/react-dom": "^16.8.4",
     "@types/swagger-ui-dist": "3.0.0",
     "@types/webgl2": "0.0.4",
     "argparse": "^1.0.10",
     "compression": "^1.7.4",
-    "express": "^4.17.0",
-    "gl": "^4.2.2",
-    "graphql": "^14.3.0",
+    "express": "^4.17.1",
+    "gl": "^4.3.3",
+    "graphql": "^14.3.1",
     "immutable": "^3.8.2",
     "node-fetch": "^2.6.0",
     "pngjs": "^3.4.0",
     "react": "^16.8.6",
     "react-dom": "^16.8.6",
     "rxjs": "^6.5.2",
-    "swagger-ui-dist": "^3.22.1",
-    "xhr2": "^0.1.4"
+    "swagger-ui-dist": "^3.22.2",
+    "xhr2": "^0.2.0"
   }
 }
diff --git a/src/mol-data/db/table.ts b/src/mol-data/db/table.ts
index 3573c7bd604a7ce5bf5877efbd1a53a89d38bcec..b67be9677ddbf317c310f44ef5d05bfd297f7d46 100644
--- a/src/mol-data/db/table.ts
+++ b/src/mol-data/db/table.ts
@@ -196,7 +196,7 @@ namespace Table {
         const row: Row<S> = Object.create(null);
         const { _columns: cols } = table;
         for (let i = 0; i < cols.length; i++) {
-            const c = cols[i];
+            const c = cols[i] as keyof S;
             row[c] = table[c].value(index);
         }
         return row;
diff --git a/src/mol-gl/render-object.ts b/src/mol-gl/render-object.ts
index ec7536ff335d4b2405125dd1088a109cc7d889ca..a464f730d9e801bce6edeb6b6281096b3d01c7fd 100644
--- a/src/mol-gl/render-object.ts
+++ b/src/mol-gl/render-object.ts
@@ -20,14 +20,14 @@ const getNextId = idFactory(0, 0x7FFFFFFF)
 
 export const getNextMaterialId = idFactory(0, 0x7FFFFFFF)
 
-export interface BaseRenderObject { id: number, type: string, values: RenderableValues, state: RenderableState, materialId: number }
-export interface MeshRenderObject extends BaseRenderObject { type: 'mesh', values: MeshValues }
-export interface PointsRenderObject extends BaseRenderObject { type: 'points', values: PointsValues }
-export interface SpheresRenderObject extends BaseRenderObject { type: 'spheres', values: SpheresValues }
-export interface TextRenderObject extends BaseRenderObject { type: 'text', values: TextValues }
-export interface LinesRenderObject extends BaseRenderObject { type: 'lines', values: LinesValues }
-export interface DirectVolumeRenderObject extends BaseRenderObject { type: 'direct-volume', values: DirectVolumeValues }
-export interface TextureMeshRenderObject extends BaseRenderObject { type: 'texture-mesh', values: TextureMeshValues }
+export interface BaseRenderObject<T extends RenderableValues> { id: number, type: string, values: T, state: RenderableState, materialId: number }
+export interface MeshRenderObject extends BaseRenderObject<MeshValues> { type: 'mesh' }
+export interface PointsRenderObject extends BaseRenderObject<PointsValues> { type: 'points' }
+export interface SpheresRenderObject extends BaseRenderObject<SpheresValues> { type: 'spheres' }
+export interface TextRenderObject extends BaseRenderObject<TextValues> { type: 'text' }
+export interface LinesRenderObject extends BaseRenderObject<LinesValues> { type: 'lines' }
+export interface DirectVolumeRenderObject extends BaseRenderObject<DirectVolumeValues> { type: 'direct-volume' }
+export interface TextureMeshRenderObject extends BaseRenderObject<TextureMeshValues> { type: 'texture-mesh' }
 
 //
 
diff --git a/src/mol-math/graph/int-adjacency-graph.ts b/src/mol-math/graph/int-adjacency-graph.ts
index efd567b2e54d76084c74fb7f990b715c5cb44a86..d9460e2288fb449ba42464d981dd64eba38a029a 100644
--- a/src/mol-math/graph/int-adjacency-graph.ts
+++ b/src/mol-math/graph/int-adjacency-graph.ts
@@ -297,9 +297,9 @@ export namespace IntAdjacencyGraph {
             newOffsets[++vo] = eo;
         }
 
-        const newEdgeProps: P = {} as any;
-        for (const key of Object.keys(edgeProps)) {
-            newEdgeProps[key] = arrayPickIndices(edgeProps[key], edgeIndices);
+        const newEdgeProps = {} as P;
+        for (const key of Object.keys(edgeProps) as (keyof P)[]) {
+            newEdgeProps[key] = arrayPickIndices(edgeProps[key], edgeIndices) as P[keyof P];
         }
 
         return create(newOffsets, newA, newB, newEdgeCount, newEdgeProps);
diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts
index b84a0bffc03e96a677e7fb103f10f52de4b011c3..43fb6ea0f44cbe77c4ebabe94b0d3096657460f5 100644
--- a/src/mol-repr/shape/representation.ts
+++ b/src/mol-repr/shape/representation.ts
@@ -5,7 +5,7 @@
  */
 
 import { Task, RuntimeContext } from 'mol-task'
-import { createRenderObject, GraphicsRenderObject, getNextMaterialId } from 'mol-gl/render-object';
+import { createRenderObject, getNextMaterialId, RenderObjectKindType, RenderObjectValuesType } from 'mol-gl/render-object';
 import { Representation } from '../representation';
 import { Loci, EmptyLoci, isEveryLoci } from 'mol-model/loci';
 import { ValueCell } from 'mol-util';
@@ -36,8 +36,8 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa
     const updated = new Subject<number>()
     const _state = Representation.createState()
     const materialId = getNextMaterialId()
-    const renderObjects: GraphicsRenderObject[] = []
-    let _renderObject: GraphicsRenderObject | undefined
+    const renderObjects: RenderObjectKindType[G['kind']][] = []
+    let _renderObject: RenderObjectKindType[G['kind']] | undefined
     let _shape: Shape<G>
     let _theme = createEmptyTheme()
     let currentProps: PD.Values<P> = PD.getDefaultValues(geometryUtils.Params as P) // TODO avoid casting
@@ -122,7 +122,7 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa
 
                 if (updateState.updateTransform || updateState.createGeometry) {
                     // console.log('updateBoundingSphere')
-                    geometryUtils.updateBoundingSphere(_renderObject.values, _shape.geometry)
+                    geometryUtils.updateBoundingSphere(_renderObject.values as RenderObjectValuesType[G['kind']], _shape.geometry)
                 }
 
                 if (updateState.updateColor) {
@@ -138,7 +138,7 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa
                     }
                 }
 
-                geometryUtils.updateValues(_renderObject.values, newProps)
+                geometryUtils.updateValues(_renderObject.values as RenderObjectValuesType[G['kind']], newProps)
                 geometryUtils.updateRenderableState(_renderObject.state, newProps)
             }
 
diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts
index f42df562b0d99b868cb49759faf5c633082dfd96..6728dfd3dfa217313e782b884ff3da9ee2eb106b 100644
--- a/src/mol-repr/structure/complex-visual.ts
+++ b/src/mol-repr/structure/complex-visual.ts
@@ -6,7 +6,7 @@
 
 import { Structure } from 'mol-model/structure';
 import { Visual, VisualContext } from '../visual';
-import { createRenderObject, GraphicsRenderObject } from 'mol-gl/render-object';
+import { createRenderObject, RenderObjectValuesType, RenderObjectKindType } from 'mol-gl/render-object';
 import { UnitKind, UnitKindOptions } from './visual/util/common';
 import { StructureMeshParams, StructureParams, StructureDirectVolumeParams } from './representation';
 import { deepEqual, ValueCell } from 'mol-util';
@@ -65,7 +65,7 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom
     const { updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils
     const updateState = VisualUpdateState.create()
 
-    let renderObject: GraphicsRenderObject | undefined
+    let renderObject: RenderObjectKindType[G['kind']] | undefined
 
     let newProps: PD.Values<P>
     let newTheme: Theme
@@ -137,7 +137,7 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom
             if (updateState.createGeometry) {
                 if (newGeometry) {
                     ValueCell.update(renderObject.values.drawCount, Geometry.getDrawCount(newGeometry))
-                    updateBoundingSphere(renderObject.values, newGeometry)
+                    updateBoundingSphere(renderObject.values as RenderObjectValuesType[G['kind']], newGeometry)
                 } else {
                     throw new Error('expected geometry to be given')
                 }
@@ -154,7 +154,7 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom
                 createColors(locationIt, newTheme.color, renderObject.values)
             }
 
-            updateValues(renderObject.values, newProps)
+            updateValues(renderObject.values as RenderObjectValuesType[G['kind']], newProps)
             updateRenderableState(renderObject.state, newProps)
         }
 
diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts
index f622140015e3bf5e579fb3026f326e9abea19cf0..8f86a0556bff652edf3abef7f3f5f104bab5f37d 100644
--- a/src/mol-repr/structure/units-visual.ts
+++ b/src/mol-repr/structure/units-visual.ts
@@ -9,7 +9,7 @@ import { RepresentationProps } from '../representation';
 import { Visual, VisualContext } from '../visual';
 import { StructureMeshParams, StructurePointsParams, StructureLinesParams, StructureDirectVolumeParams, StructureSpheresParams, StructureTextureMeshParams } from './representation';
 import { Loci, isEveryLoci, EmptyLoci } from 'mol-model/loci';
-import { GraphicsRenderObject, createRenderObject } from 'mol-gl/render-object';
+import { createRenderObject, RenderObjectKindType, RenderObjectValuesType } from 'mol-gl/render-object';
 import { deepEqual, ValueCell } from 'mol-util';
 import { Interval } from 'mol-data/int';
 import { ParamDefinition as PD } from 'mol-util/param-definition';
@@ -65,7 +65,7 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry
     const { createEmpty: createEmptyGeometry, updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils
     const updateState = VisualUpdateState.create()
 
-    let renderObject: GraphicsRenderObject | undefined
+    let renderObject: RenderObjectKindType[G['kind']] | undefined
 
     let newProps: PD.Values<P> = Object.assign({}, defaultProps)
     let newTheme: Theme = createEmptyTheme()
@@ -181,7 +181,7 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry
 
             if (updateState.updateTransform || updateState.createGeometry) {
                 // console.log('UnitsVisual.updateBoundingSphere')
-                updateBoundingSphere(renderObject.values, newGeometry || geometry)
+                updateBoundingSphere(renderObject.values as RenderObjectValuesType[G['kind']], newGeometry || geometry)
             }
 
             if (updateState.updateSize) {
@@ -197,7 +197,7 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry
                 createColors(locationIt, newTheme.color, renderObject.values)
             }
 
-            updateValues(renderObject.values, newProps)
+            updateValues(renderObject.values as RenderObjectValuesType[G['kind']], newProps)
             updateRenderableState(renderObject.state, newProps)
         }
 
diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts
index 621c17ebcf8fb4e07924573f8b544e7e2fa28291..309a65ac9bccea852e46dadefe3b6c943d554fca 100644
--- a/src/mol-repr/volume/representation.ts
+++ b/src/mol-repr/volume/representation.ts
@@ -13,7 +13,7 @@ import { Geometry, GeometryUtils } from 'mol-geo/geometry/geometry';
 import { ParamDefinition as PD } from 'mol-util/param-definition';
 import { PickingId } from 'mol-geo/geometry/picking';
 import { MarkerAction } from 'mol-geo/geometry/marker-data';
-import { GraphicsRenderObject, createRenderObject, getNextMaterialId } from 'mol-gl/render-object';
+import { GraphicsRenderObject, createRenderObject, getNextMaterialId, RenderObjectKindType, RenderObjectValuesType } from 'mol-gl/render-object';
 import { Interval } from 'mol-data/int';
 import { LocationIterator } from 'mol-geo/util/location-iterator';
 import { VisualUpdateState } from 'mol-repr/util';
@@ -57,7 +57,7 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet
     const { updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils
     const updateState = VisualUpdateState.create()
 
-    let renderObject: GraphicsRenderObject | undefined
+    let renderObject: RenderObjectKindType[G['kind']] | undefined
 
     let newProps: PD.Values<P>
     let newTheme: Theme
@@ -119,7 +119,7 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet
             if (updateState.createGeometry) {
                 if (newGeometry) {
                     ValueCell.update(renderObject.values.drawCount, Geometry.getDrawCount(newGeometry))
-                    updateBoundingSphere(renderObject.values, newGeometry)
+                    updateBoundingSphere(renderObject.values as RenderObjectValuesType[G['kind']], newGeometry)
                 } else {
                     throw new Error('expected geometry to be given')
                 }
@@ -136,7 +136,7 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet
                 createColors(locationIt, newTheme.color, renderObject.values)
             }
 
-            updateValues(renderObject.values, newProps)
+            updateValues(renderObject.values as RenderObjectValuesType[G['kind']], newProps)
             updateRenderableState(renderObject.state, newProps)
         }
 
diff --git a/src/mol-util/set.ts b/src/mol-util/set.ts
index 3d5f648d9a58f12450353da24cd3f5cd9ade0dc7..af09cf6081d49d14ce51cbf51192993d1ae7850f 100644
--- a/src/mol-util/set.ts
+++ b/src/mol-util/set.ts
@@ -43,7 +43,7 @@ export namespace SetUtils {
 
     /** Create set containing elements of set a that are also in set b. */
     export function intersection<T>(setA: Set<T>, setB: Set<T>): Set<T> {
-        const intersection = new Set();
+        const intersection = new Set<T>();
         for (const elem of Array.from(setB)) {
             if (setA.has(elem)) intersection.add(elem);
         }
diff --git a/src/servers/volume/config.ts b/src/servers/volume/config.ts
index 236c1c7ba32beead71a5d9e7cf49e1eeb394fa42..7227d773847609c2dd76b700cade62791d569981 100644
--- a/src/servers/volume/config.ts
+++ b/src/servers/volume/config.ts
@@ -75,9 +75,7 @@ const DefaultServerConfig = {
 export type ServerConfig = typeof DefaultServerConfig
 export const ServerConfig = { ...DefaultServerConfig }
 export function setServerConfig(config: ServerConfig) {
-    for (const name in DefaultServerConfig) {
-        ServerConfig[name as keyof ServerConfig] = config[name as keyof ServerConfig]
-    }
+    Object.assign(ServerConfig, config)
 }
 
 const DefaultLimitsConfig = {
@@ -96,9 +94,7 @@ const DefaultLimitsConfig = {
 export type LimitsConfig = typeof DefaultLimitsConfig
 export const LimitsConfig = { ...DefaultLimitsConfig }
 export function setLimitsConfig(config: LimitsConfig) {
-    for (const name in DefaultLimitsConfig) {
-        LimitsConfig[name as keyof LimitsConfig] = config[name as keyof LimitsConfig]
-    }
+    Object.assign(LimitsConfig, config)
 }
 
 export function setConfig(config: ServerConfig & LimitsConfig) {