From 9cf599d8f8fe95d30d4504c1172a710a1e575102 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Wed, 31 Oct 2018 11:31:53 -0700
Subject: [PATCH] renamed Viewer to Canvas3D, Context to WebGLContext, moved
 themes to mol-theme

---
 src/apps/canvas/app.ts                        | 14 +++++------
 src/apps/canvas/assembly-symmetry.ts          |  2 +-
 src/apps/canvas/component/representation.tsx  |  6 ++---
 src/apps/canvas/component/viewport.tsx        |  6 ++---
 src/apps/canvas/structure-view.ts             |  6 ++---
 src/apps/canvas/volume-view.ts                |  6 ++---
 src/mol-app/component/color-theme.tsx         |  2 +-
 src/mol-canvas3d/{viewer.ts => canvas3d.ts}   | 12 +++++-----
 src/mol-geo/geometry/color-data.ts            |  2 +-
 src/mol-geo/geometry/geometry.ts              |  6 ++---
 src/mol-geo/geometry/lines/lines.ts           |  2 +-
 src/mol-geo/geometry/points/points.ts         |  2 +-
 src/mol-geo/geometry/size-data.ts             |  2 +-
 src/mol-geo/representation/shape/index.ts     |  2 +-
 src/mol-geo/representation/structure/index.ts |  4 ++--
 .../representation/ball-and-stick.ts          |  2 +-
 .../structure/representation/carbohydrate.ts  |  2 +-
 .../structure/representation/cartoon.ts       |  2 +-
 .../representation/distance-restraint.ts      |  2 +-
 .../representation/molecular-surface.ts       |  2 +-
 .../visual/carbohydrate-link-cylinder.ts      |  2 +-
 .../visual/carbohydrate-symbol-mesh.ts        |  2 +-
 .../visual/cross-link-restraint-cylinder.ts   |  2 +-
 .../structure/visual/element-point.ts         |  2 +-
 .../structure/visual/element-sphere.ts        |  2 +-
 .../visual/gaussian-density-point.ts          |  2 +-
 .../visual/gaussian-surface-wireframe.ts      |  2 +-
 .../visual/inter-unit-link-cylinder.ts        |  2 +-
 .../visual/intra-unit-link-cylinder.ts        |  2 +-
 .../visual/polymer-backbone-cylinder.ts       |  2 +-
 .../visual/polymer-direction-wedge.ts         |  2 +-
 .../structure/visual/polymer-gap-cylinder.ts  |  2 +-
 .../structure/visual/polymer-trace-mesh.ts    |  2 +-
 .../structure/visual/util/element.ts          |  2 +-
 .../structure/visual/util/link.ts             |  2 +-
 .../representation/volume/direct-volume.ts    |  6 ++---
 src/mol-gl/render-object.ts                   |  4 ++--
 src/mol-gl/renderable/direct-volume.ts        |  4 ++--
 src/mol-gl/renderable/gaussian-density.ts     |  4 ++--
 src/mol-gl/renderable/lines.ts                |  4 ++--
 src/mol-gl/renderable/mesh.ts                 |  4 ++--
 src/mol-gl/renderable/points.ts               |  4 ++--
 src/mol-gl/renderer.ts                        |  4 ++--
 src/mol-gl/scene.ts                           |  4 ++--
 src/mol-gl/shader-code.ts                     |  6 ++---
 src/mol-gl/webgl/buffer.ts                    | 18 +++++++-------
 src/mol-gl/webgl/context.ts                   | 15 ++++++------
 src/mol-gl/webgl/framebuffer.ts               |  8 +++----
 src/mol-gl/webgl/program.ts                   | 10 ++++----
 src/mol-gl/webgl/render-item.ts               |  6 ++---
 src/mol-gl/webgl/render-target.ts             |  4 ++--
 src/mol-gl/webgl/renderbuffer.ts              |  8 +++----
 src/mol-gl/webgl/shader.ts                    |  8 +++----
 src/mol-gl/webgl/texture.ts                   | 18 +++++++-------
 src/mol-gl/webgl/uniform.ts                   | 10 ++++----
 src/mol-gl/webgl/vertex-array.ts              |  6 ++---
 src/mol-math/geometry/gaussian-density.ts     |  4 ++--
 src/mol-math/geometry/gaussian-density/gpu.ts | 22 ++++++++---------
 .../structure/unit/gaussian-density.ts        |  6 ++---
 src/mol-plugin/context.ts                     | 24 +++++++++----------
 src/mol-plugin/ui/viewport.tsx                |  8 +++----
 .../theme => mol-theme}/color.ts              |  0
 .../color/carbohydrate-symbol.ts              |  0
 .../theme => mol-theme}/color/chain-id.ts     |  0
 .../theme => mol-theme}/color/cross-link.ts   |  0
 .../theme => mol-theme}/color/custom.ts       |  0
 .../color/element-index.ts                    |  0
 .../color/element-symbol.ts                   |  0
 .../color/molecule-type.ts                    |  0
 .../theme => mol-theme}/color/residue-name.ts |  0
 .../color/secondary-structure.ts              |  0
 .../theme => mol-theme}/color/sequence-id.ts  |  0
 .../theme => mol-theme}/color/shape-group.ts  |  0
 .../theme => mol-theme}/color/uniform.ts      |  0
 .../theme => mol-theme}/color/unit-index.ts   |  0
 src/{mol-canvas3d => mol-theme}/label.ts      |  0
 src/{mol-canvas3d/theme => mol-theme}/size.ts |  0
 .../theme => mol-theme}/size/physical.ts      |  0
 .../theme => mol-theme}/size/uniform.ts       |  0
 src/mol-util/color/scale.ts                   |  2 +-
 80 files changed, 168 insertions(+), 167 deletions(-)
 rename src/mol-canvas3d/{viewer.ts => canvas3d.ts} (98%)
 rename src/{mol-canvas3d/theme => mol-theme}/color.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/carbohydrate-symbol.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/chain-id.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/cross-link.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/custom.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/element-index.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/element-symbol.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/molecule-type.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/residue-name.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/secondary-structure.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/sequence-id.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/shape-group.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/uniform.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/color/unit-index.ts (100%)
 rename src/{mol-canvas3d => mol-theme}/label.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/size.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/size/physical.ts (100%)
 rename src/{mol-canvas3d/theme => mol-theme}/size/uniform.ts (100%)

diff --git a/src/apps/canvas/app.ts b/src/apps/canvas/app.ts
index 0abfc41d4..d4eb773e6 100644
--- a/src/apps/canvas/app.ts
+++ b/src/apps/canvas/app.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import Viewer from 'mol-canvas3d/viewer';
+import Canvas3D from 'mol-canvas3d/canvas3d';
 import { getCifFromUrl, getModelsFromMmcif, getCifFromFile, getCcp4FromUrl, getVolumeFromCcp4, getCcp4FromFile, getVolumeFromVolcif } from './util';
 import { StructureView } from './structure-view';
 import { BehaviorSubject } from 'rxjs';
@@ -13,7 +13,7 @@ import { VolumeView } from './volume-view';
 import { Ccp4File } from 'mol-io/reader/ccp4/schema';
 
 export class App {
-    viewer: Viewer
+    canvas3d: Canvas3D
     container: HTMLDivElement | null = null;
     canvas: HTMLCanvasElement | null = null;
     structureView: StructureView | null = null;
@@ -27,8 +27,8 @@ export class App {
         this.container = _container
 
         try {
-            this.viewer = Viewer.create(this.canvas, this.container)
-            this.viewer.animate()
+            this.canvas3d = Canvas3D.create(this.canvas, this.container)
+            this.canvas3d.animate()
             return true
         } catch (e) {
             console.error(e)
@@ -63,7 +63,7 @@ export class App {
 
     async loadMmcif(cif: CifBlock, assemblyId?: string) {
         const models = await this.runTask(getModelsFromMmcif(cif), 'Build models')
-        this.structureView = await this.runTask(StructureView(this, this.viewer, models, { assemblyId }), 'Init structure view')
+        this.structureView = await this.runTask(StructureView(this, this.canvas3d, models, { assemblyId }), 'Init structure view')
         this.structureLoaded.next(this.structureView)
     }
 
@@ -85,7 +85,7 @@ export class App {
 
     async loadCcp4(ccp4: Ccp4File) {
         const volume = await this.runTask(getVolumeFromCcp4(ccp4), 'Get Volume')
-        this.volumeView = await this.runTask(VolumeView(this, this.viewer, volume), 'Init volume view')
+        this.volumeView = await this.runTask(VolumeView(this, this.canvas3d, volume), 'Init volume view')
         this.volumeLoaded.next(this.volumeView)
     }
 
@@ -105,7 +105,7 @@ export class App {
 
     async loadVolcif(cif: CifBlock) {
         const volume = await this.runTask(getVolumeFromVolcif(cif), 'Get Volume')
-        this.volumeView = await this.runTask(VolumeView(this, this.viewer, volume), 'Init volume view')
+        this.volumeView = await this.runTask(VolumeView(this, this.canvas3d, volume), 'Init volume view')
         this.volumeLoaded.next(this.volumeView)
     }
 
diff --git a/src/apps/canvas/assembly-symmetry.ts b/src/apps/canvas/assembly-symmetry.ts
index 6929fb091..1cc665a5b 100644
--- a/src/apps/canvas/assembly-symmetry.ts
+++ b/src/apps/canvas/assembly-symmetry.ts
@@ -12,7 +12,7 @@ import { Tensor } from 'mol-math/linear-algebra';
 import { addSphere } from 'mol-geo/geometry/mesh/builder/sphere';
 import { addCylinder } from 'mol-geo/geometry/mesh/builder/cylinder';
 import { Shape } from 'mol-model/shape';
-import { ColorTheme } from 'mol-canvas3d/theme/color';
+import { ColorTheme } from 'mol-theme/color';
 import { Location } from 'mol-model/location';
 import { StructureElement, Unit, StructureProperties } from 'mol-model/structure';
 
diff --git a/src/apps/canvas/component/representation.tsx b/src/apps/canvas/component/representation.tsx
index c5284562e..231d1c406 100644
--- a/src/apps/canvas/component/representation.tsx
+++ b/src/apps/canvas/component/representation.tsx
@@ -5,19 +5,19 @@
  */
 
 import * as React from 'react'
-import Viewer from 'mol-canvas3d/viewer';
+import Canvas3D from 'mol-canvas3d/canvas3d';
 import { App } from '../app';
 import { Params } from 'mol-util/parameter';
 import { Representation } from 'mol-geo/representation';
 import { ParametersComponent } from 'mol-app/component/parameters';
 import { Progress } from 'mol-task';
-import { ColorTheme } from 'mol-canvas3d/theme/color';
+import { ColorTheme } from 'mol-theme/color';
 import { getColorThemeProps } from 'mol-geo/geometry/color-data';
 import { ColorThemeComponent } from 'mol-app/component/color-theme';
 
 export interface RepresentationComponentProps {
     app: App
-    viewer: Viewer
+    viewer: Canvas3D
     repr: Representation<Params>
 }
 
diff --git a/src/apps/canvas/component/viewport.tsx b/src/apps/canvas/component/viewport.tsx
index 3a5d2072c..427b32a20 100644
--- a/src/apps/canvas/component/viewport.tsx
+++ b/src/apps/canvas/component/viewport.tsx
@@ -8,7 +8,7 @@ import * as React from 'react'
 import { App } from '../app';
 import { MarkerAction } from 'mol-geo/geometry/marker-data';
 import { EmptyLoci, Loci, areLociEqual } from 'mol-model/loci';
-import { labelFirst } from 'mol-canvas3d/label';
+import { labelFirst } from 'mol-theme/label';
 
 interface ViewportProps {
     app: App
@@ -31,7 +31,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> {
     };
 
     handleResize() {
-        this.props.app.viewer.handleResize()
+        this.props.app.canvas3d.handleResize()
     }
 
     componentDidMount() {
@@ -40,7 +40,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> {
         }
         this.handleResize()
 
-        const viewer = this.props.app.viewer
+        const viewer = this.props.app.canvas3d
 
         viewer.input.resize.subscribe(() => this.handleResize())
 
diff --git a/src/apps/canvas/structure-view.ts b/src/apps/canvas/structure-view.ts
index f78d02f97..12d52a091 100644
--- a/src/apps/canvas/structure-view.ts
+++ b/src/apps/canvas/structure-view.ts
@@ -11,7 +11,7 @@ import { getStructureFromModel } from './util';
 import { AssemblySymmetry } from 'mol-model-props/rcsb/symmetry';
 import { ShapeRepresentation, ShapeProps } from 'mol-geo/representation/shape';
 import { getAxesShape } from './assembly-symmetry';
-import Viewer from 'mol-canvas3d/viewer';
+import Canvas3D from 'mol-canvas3d/canvas3d';
 import { CarbohydrateRepresentation } from 'mol-geo/representation/structure/representation/carbohydrate';
 // import { MeshBuilder } from 'mol-geo/mesh/mesh-builder';
 // import { addSphere } from 'mol-geo/mesh/builder/sphere';
@@ -30,7 +30,7 @@ import { Progress } from 'mol-task';
 
 export interface StructureView {
     readonly app: App
-    readonly viewer: Viewer
+    readonly viewer: Canvas3D
 
     readonly label: string
     readonly models: ReadonlyArray<Model>
@@ -64,7 +64,7 @@ interface StructureViewProps {
     symmetryFeatureId?: number
 }
 
-export async function StructureView(app: App, viewer: Viewer, models: ReadonlyArray<Model>, props: StructureViewProps = {}): Promise<StructureView> {
+export async function StructureView(app: App, viewer: Canvas3D, models: ReadonlyArray<Model>, props: StructureViewProps = {}): Promise<StructureView> {
     const active: { [k: string]: boolean } = {
         cartoon: false,
         point: false,
diff --git a/src/apps/canvas/volume-view.ts b/src/apps/canvas/volume-view.ts
index a68038391..6bb76dc85 100644
--- a/src/apps/canvas/volume-view.ts
+++ b/src/apps/canvas/volume-view.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import Viewer from 'mol-canvas3d/viewer';
+import Canvas3D from 'mol-canvas3d/canvas3d';
 import { BehaviorSubject } from 'rxjs';
 import { App } from './app';
 import { Progress } from 'mol-task';
@@ -15,7 +15,7 @@ import { DirectVolumeRepresentation } from 'mol-geo/representation/volume/direct
 
 export interface VolumeView {
     readonly app: App
-    readonly viewer: Viewer
+    readonly viewer: Canvas3D
 
     readonly label: string
     readonly volume: VolumeData
@@ -32,7 +32,7 @@ interface VolumeViewProps {
 
 }
 
-export async function VolumeView(app: App, viewer: Viewer, volume: VolumeData, props: VolumeViewProps = {}): Promise<VolumeView> {
+export async function VolumeView(app: App, viewer: Canvas3D, volume: VolumeData, props: VolumeViewProps = {}): Promise<VolumeView> {
     const active: { [k: string]: boolean } = {
         isosurface: true,
         directVolume: false,
diff --git a/src/mol-app/component/color-theme.tsx b/src/mol-app/component/color-theme.tsx
index 3c8b414de..43f8d1290 100644
--- a/src/mol-app/component/color-theme.tsx
+++ b/src/mol-app/component/color-theme.tsx
@@ -5,7 +5,7 @@
  */
 
 import * as React from 'react'
-import { ColorTheme } from 'mol-canvas3d/theme/color';
+import { ColorTheme } from 'mol-theme/color';
 import { Color } from 'mol-util/color';
 
 export interface ColorThemeComponentProps {
diff --git a/src/mol-canvas3d/viewer.ts b/src/mol-canvas3d/canvas3d.ts
similarity index 98%
rename from src/mol-canvas3d/viewer.ts
rename to src/mol-canvas3d/canvas3d.ts
index 788a2a0bd..692d71d24 100644
--- a/src/mol-canvas3d/viewer.ts
+++ b/src/mol-canvas3d/canvas3d.ts
@@ -16,7 +16,7 @@ import TrackballControls from './controls/trackball'
 import { Viewport } from './camera/util'
 import { PerspectiveCamera } from './camera/perspective'
 import { resizeCanvas } from './util';
-import { createContext, getGLContext, Context } from 'mol-gl/webgl/context';
+import { createContext, getGLContext, WebGLContext } from 'mol-gl/webgl/context';
 import { Representation } from 'mol-geo/representation';
 import { createRenderTarget } from 'mol-gl/webgl/render-target';
 import Scene from 'mol-gl/scene';
@@ -26,8 +26,8 @@ import { MarkerAction } from 'mol-geo/geometry/marker-data';
 import { Loci, EmptyLoci, isEmptyLoci } from 'mol-model/loci';
 import { Color } from 'mol-util/color';
 
-interface Viewer {
-    webgl: Context,
+interface Canvas3D {
+    webgl: WebGLContext,
 
     center: (p: Vec3) => void
 
@@ -61,8 +61,8 @@ interface Viewer {
     dispose: () => void
 }
 
-namespace Viewer {
-    export function create(canvas: HTMLCanvasElement, container: Element): Viewer {
+namespace Canvas3D {
+    export function create(canvas: HTMLCanvasElement, container: Element): Canvas3D {
         const reprMap = new Map<Representation<any>, Set<RenderObject>>()
         const reprCount = new BehaviorSubject(0)
         const identified = new BehaviorSubject('')
@@ -350,4 +350,4 @@ namespace Viewer {
     }
 }
 
-export default Viewer
\ No newline at end of file
+export default Canvas3D
\ No newline at end of file
diff --git a/src/mol-geo/geometry/color-data.ts b/src/mol-geo/geometry/color-data.ts
index fe1dfae7b..5b58eef7d 100644
--- a/src/mol-geo/geometry/color-data.ts
+++ b/src/mol-geo/geometry/color-data.ts
@@ -10,7 +10,7 @@ import { Color } from 'mol-util/color';
 import { Vec2, Vec3 } from 'mol-math/linear-algebra';
 import { LocationIterator } from '../util/location-iterator';
 import { NullLocation } from 'mol-model/location';
-import { LocationColor, ColorThemeProps, ColorTheme, ColorThemeName } from 'mol-canvas3d/theme/color';
+import { LocationColor, ColorThemeProps, ColorTheme, ColorThemeName } from 'mol-theme/color';
 import { RuntimeContext } from 'mol-task';
 import { getGranularity } from './geometry';
 import { Structure } from 'mol-model/structure';
diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts
index dcabc0353..a1e1e221e 100644
--- a/src/mol-geo/geometry/geometry.ts
+++ b/src/mol-geo/geometry/geometry.ts
@@ -10,14 +10,14 @@ import { RenderableState } from 'mol-gl/renderable';
 import { ValueCell } from 'mol-util';
 import { BaseValues } from 'mol-gl/renderable/schema';
 import { Color } from 'mol-util/color';
-import { ColorThemeOptions, ColorThemeName } from 'mol-canvas3d/theme/color';
+import { ColorThemeOptions, ColorThemeName } from 'mol-theme/color';
 import { LocationIterator } from '../util/location-iterator';
 import { ColorType } from './color-data';
 import { SizeType } from './size-data';
 import { Lines } from './lines/lines';
 import { paramDefaultValues, RangeParam, BooleanParam, SelectParam, ColorParam, ValueParam } from 'mol-util/parameter'
 import { DirectVolume } from './direct-volume/direct-volume';
-import { Context } from 'mol-gl/webgl/context';
+import { WebGLContext } from 'mol-gl/webgl/context';
 
 //
 
@@ -67,7 +67,7 @@ export namespace Geometry {
         quality: SelectParam<VisualQuality>('Quality', '', 'auto', VisualQualityOptions),
         colorTheme: SelectParam<ColorThemeName>('Color Theme', '', 'uniform', ColorThemeOptions),
         colorValue: ColorParam('Color Value', '', Color(0xCCCCCC)),
-        webgl: ValueParam('WebGL Context', '', undefined as Context | undefined),
+        webgl: ValueParam('WebGL Context', '', undefined as WebGLContext | undefined),
     }
     export const DefaultProps = paramDefaultValues(Params)
     export type Props = typeof DefaultProps
diff --git a/src/mol-geo/geometry/lines/lines.ts b/src/mol-geo/geometry/lines/lines.ts
index c4e80b3f3..a6a7c83bd 100644
--- a/src/mol-geo/geometry/lines/lines.ts
+++ b/src/mol-geo/geometry/lines/lines.ts
@@ -14,7 +14,7 @@ import { createMarkers } from '../marker-data';
 import { createSizes } from '../size-data';
 import { TransformData } from '../transform-data';
 import { LocationIterator } from '../../util/location-iterator';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { LinesValues } from 'mol-gl/renderable/lines';
 import { Mesh } from '../mesh/mesh';
 import { LinesBuilder } from './lines-builder';
diff --git a/src/mol-geo/geometry/points/points.ts b/src/mol-geo/geometry/points/points.ts
index 3a4799600..277528b60 100644
--- a/src/mol-geo/geometry/points/points.ts
+++ b/src/mol-geo/geometry/points/points.ts
@@ -15,7 +15,7 @@ import { createMarkers } from '../marker-data';
 import { createSizes } from '../size-data';
 import { TransformData } from '../transform-data';
 import { LocationIterator } from '../../util/location-iterator';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { BooleanParam, NumberParam, SelectParam, paramDefaultValues } from 'mol-util/parameter';
 
 /** Point cloud */
diff --git a/src/mol-geo/geometry/size-data.ts b/src/mol-geo/geometry/size-data.ts
index 8a5d574b3..7c7ab2794 100644
--- a/src/mol-geo/geometry/size-data.ts
+++ b/src/mol-geo/geometry/size-data.ts
@@ -10,7 +10,7 @@ import { TextureImage, createTextureImage } from 'mol-gl/renderable/util';
 import { LocationIterator } from '../util/location-iterator';
 import { Location, NullLocation } from 'mol-model/location';
 import { RuntimeContext } from 'mol-task';
-import { SizeThemeProps, SizeTheme, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeThemeProps, SizeTheme, SizeThemeName } from 'mol-theme/size';
 import { getGranularity } from './geometry';
 import { Structure } from 'mol-model/structure';
 
diff --git a/src/mol-geo/representation/shape/index.ts b/src/mol-geo/representation/shape/index.ts
index 43b4d06f6..529b67b8d 100644
--- a/src/mol-geo/representation/shape/index.ts
+++ b/src/mol-geo/representation/shape/index.ts
@@ -11,7 +11,7 @@ import { PickingId } from '../../geometry/picking';
 import { Loci, EmptyLoci, isEveryLoci } from 'mol-model/loci';
 import { MarkerAction, applyMarkerAction } from '../../geometry/marker-data';
 import { ValueCell } from 'mol-util';
-import { ColorThemeName, ColorThemeOptions } from 'mol-canvas3d/theme/color';
+import { ColorThemeName, ColorThemeOptions } from 'mol-theme/color';
 import { Shape } from 'mol-model/shape';
 import { LocationIterator } from '../../util/location-iterator';
 import { OrderedSet, Interval } from 'mol-data/int';
diff --git a/src/mol-geo/representation/structure/index.ts b/src/mol-geo/representation/structure/index.ts
index 01769aeab..a1822294d 100644
--- a/src/mol-geo/representation/structure/index.ts
+++ b/src/mol-geo/representation/structure/index.ts
@@ -6,8 +6,8 @@
  */
 
 import { Structure } from 'mol-model/structure';
-import { ColorThemeName, ColorThemeOptions } from 'mol-canvas3d/theme/color';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { ColorThemeName, ColorThemeOptions } from 'mol-theme/color';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { Representation, RepresentationProps } from '..';
 import { Geometry } from '../../geometry/geometry';
 import { Mesh } from '../../geometry/mesh/mesh';
diff --git a/src/mol-geo/representation/structure/representation/ball-and-stick.ts b/src/mol-geo/representation/structure/representation/ball-and-stick.ts
index c4f50b145..c66376daf 100644
--- a/src/mol-geo/representation/structure/representation/ball-and-stick.ts
+++ b/src/mol-geo/representation/structure/representation/ball-and-stick.ts
@@ -13,7 +13,7 @@ import { Task } from 'mol-task';
 import { Loci, isEmptyLoci } from 'mol-model/loci';
 import { MarkerAction } from '../../../geometry/marker-data';
 import { InterUnitLinkVisual } from '../visual/inter-unit-link-cylinder';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { getQualityProps } from '../../util';
 import { paramDefaultValues, SelectParam, NumberParam, MultiSelectParam } from 'mol-util/parameter';
 import { UnitKind, UnitKindOptions } from '../visual/util/common';
diff --git a/src/mol-geo/representation/structure/representation/carbohydrate.ts b/src/mol-geo/representation/structure/representation/carbohydrate.ts
index 17373bbce..e9580f4e0 100644
--- a/src/mol-geo/representation/structure/representation/carbohydrate.ts
+++ b/src/mol-geo/representation/structure/representation/carbohydrate.ts
@@ -12,7 +12,7 @@ import { Loci, isEmptyLoci } from 'mol-model/loci';
 import { MarkerAction } from '../../../geometry/marker-data';
 import { CarbohydrateSymbolVisual, CarbohydrateSymbolParams } from '../visual/carbohydrate-symbol-mesh';
 import { CarbohydrateLinkVisual, CarbohydrateLinkParams } from '../visual/carbohydrate-link-cylinder';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { getQualityProps } from '../../util';
 import { paramDefaultValues, SelectParam, NumberParam } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/representation/cartoon.ts b/src/mol-geo/representation/structure/representation/cartoon.ts
index 3f5e915cd..6083f0233 100644
--- a/src/mol-geo/representation/structure/representation/cartoon.ts
+++ b/src/mol-geo/representation/structure/representation/cartoon.ts
@@ -13,7 +13,7 @@ import { MarkerAction } from '../../../geometry/marker-data';
 import { PolymerTraceVisual,  PolymerTraceParams } from '../visual/polymer-trace-mesh';
 import { PolymerGapVisual, PolymerGapParams } from '../visual/polymer-gap-cylinder';
 import { NucleotideBlockVisual, NucleotideBlockParams } from '../visual/nucleotide-block-mesh';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { getQualityProps } from '../../util';
 import { paramDefaultValues, SelectParam, NumberParam } from 'mol-util/parameter';
 // import { PolymerDirectionVisual, DefaultPolymerDirectionProps } from '../visual/polymer-direction-wedge';
diff --git a/src/mol-geo/representation/structure/representation/distance-restraint.ts b/src/mol-geo/representation/structure/representation/distance-restraint.ts
index 7e6838651..d0f5ef74b 100644
--- a/src/mol-geo/representation/structure/representation/distance-restraint.ts
+++ b/src/mol-geo/representation/structure/representation/distance-restraint.ts
@@ -11,7 +11,7 @@ import { Task } from 'mol-task';
 import { Loci } from 'mol-model/loci';
 import { MarkerAction } from '../../../geometry/marker-data';
 import { CrossLinkRestraintVisual, CrossLinkRestraintParams } from '../visual/cross-link-restraint-cylinder';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { getQualityProps } from '../../util';
 import { paramDefaultValues, SelectParam, NumberParam } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/representation/molecular-surface.ts b/src/mol-geo/representation/structure/representation/molecular-surface.ts
index 9a4fd1378..355a95d6e 100644
--- a/src/mol-geo/representation/structure/representation/molecular-surface.ts
+++ b/src/mol-geo/representation/structure/representation/molecular-surface.ts
@@ -16,7 +16,7 @@ import { GaussianWireframeVisual, GaussianWireframeParams } from '../visual/gaus
 import { getQualityProps } from '../../util';
 import { paramDefaultValues, MultiSelectParam, SelectParam } from 'mol-util/parameter';
 import { GaussianDensityVolumeParams, GaussianDensityVolumeVisual } from '../visual/gaussian-density-volume';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 
 const VisualOptions = [['surface', 'Surface'], ['wireframe', 'Wireframe'], ['volume', 'Volume']] as [string, string][]
 
diff --git a/src/mol-geo/representation/structure/visual/carbohydrate-link-cylinder.ts b/src/mol-geo/representation/structure/visual/carbohydrate-link-cylinder.ts
index bfc6af645..acfb00dc0 100644
--- a/src/mol-geo/representation/structure/visual/carbohydrate-link-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/carbohydrate-link-cylinder.ts
@@ -15,7 +15,7 @@ import { LocationIterator } from '../../../util/location-iterator';
 import { createLinkCylinderMesh, LinkCylinderProps, LinkCylinderParams } from './util/link';
 import { OrderedSet, Interval } from 'mol-data/int';
 import { ComplexMeshVisual } from '../complex-visual';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { LinkType } from 'mol-model/structure/model/types';
 import { BitFlags } from 'mol-util';
 import { UnitsMeshParams } from '../units-visual';
diff --git a/src/mol-geo/representation/structure/visual/carbohydrate-symbol-mesh.ts b/src/mol-geo/representation/structure/visual/carbohydrate-symbol-mesh.ts
index 14e275795..b6f6b0e29 100644
--- a/src/mol-geo/representation/structure/visual/carbohydrate-symbol-mesh.ts
+++ b/src/mol-geo/representation/structure/visual/carbohydrate-symbol-mesh.ts
@@ -16,7 +16,7 @@ import { getSaccharideShape, SaccharideShapes } from 'mol-model/structure/struct
 import { LocationIterator } from '../../../util/location-iterator';
 import { OrderedSet, Interval } from 'mol-data/int';
 import { ComplexMeshVisual, ComplexMeshParams } from '../complex-visual';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { addSphere } from '../../../geometry/mesh/builder/sphere';
 import { Box, PerforatedBox } from '../../../primitive/box';
 import { OctagonalPyramid, PerforatedOctagonalPyramid } from '../../../primitive/pyramid';
diff --git a/src/mol-geo/representation/structure/visual/cross-link-restraint-cylinder.ts b/src/mol-geo/representation/structure/visual/cross-link-restraint-cylinder.ts
index 703feccb4..21eb98795 100644
--- a/src/mol-geo/representation/structure/visual/cross-link-restraint-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/cross-link-restraint-cylinder.ts
@@ -15,7 +15,7 @@ import { Loci, EmptyLoci } from 'mol-model/loci';
 import { ComplexMeshVisual, ComplexMeshParams } from '../complex-visual';
 import { LocationIterator } from '../../../util/location-iterator';
 import { Interval } from 'mol-data/int';
-import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-theme/size';
 import { BitFlags } from 'mol-util';
 import { LinkType } from 'mol-model/structure/model/types';
 import { SelectParam, NumberParam, paramDefaultValues } from 'mol-util/parameter';
diff --git a/src/mol-geo/representation/structure/visual/element-point.ts b/src/mol-geo/representation/structure/visual/element-point.ts
index 6b25c8608..5bbb7f4fe 100644
--- a/src/mol-geo/representation/structure/visual/element-point.ts
+++ b/src/mol-geo/representation/structure/visual/element-point.ts
@@ -9,7 +9,7 @@ import { RuntimeContext } from 'mol-task'
 import { UnitsVisual, VisualUpdateState } from '..';
 import { getElementLoci, StructureElementIterator, markElement } from './util/element';
 import { Vec3 } from 'mol-math/linear-algebra';
-import { SizeThemeOptions, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeThemeOptions, SizeThemeName } from 'mol-theme/size';
 import { UnitsPointsVisual, UnitsPointsParams } from '../units-visual';
 import { Points } from '../../../geometry/points/points';
 import { PointsBuilder } from '../../../geometry/points/points-builder';
diff --git a/src/mol-geo/representation/structure/visual/element-sphere.ts b/src/mol-geo/representation/structure/visual/element-sphere.ts
index baa542429..5d8cbbb8b 100644
--- a/src/mol-geo/representation/structure/visual/element-sphere.ts
+++ b/src/mol-geo/representation/structure/visual/element-sphere.ts
@@ -9,7 +9,7 @@ import { UnitsVisual, VisualUpdateState } from '..';
 import { createElementSphereMesh, markElement, getElementLoci, StructureElementIterator } from './util/element';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
 import { NumberParam, paramDefaultValues, SelectParam } from 'mol-util/parameter';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 
 export const ElementSphereParams = {
     ...UnitsMeshParams,
diff --git a/src/mol-geo/representation/structure/visual/gaussian-density-point.ts b/src/mol-geo/representation/structure/visual/gaussian-density-point.ts
index 7ff641e91..a6a1ec839 100644
--- a/src/mol-geo/representation/structure/visual/gaussian-density-point.ts
+++ b/src/mol-geo/representation/structure/visual/gaussian-density-point.ts
@@ -13,7 +13,7 @@ import { Vec3 } from 'mol-math/linear-algebra';
 import { UnitsPointsVisual, UnitsPointsParams } from '../units-visual';
 import { Points } from '../../../geometry/points/points';
 import { PointsBuilder } from '../../../geometry/points/points-builder';
-import { SizeThemeOptions, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeThemeOptions, SizeThemeName } from 'mol-theme/size';
 import { GaussianDensityProps, GaussianDensityParams } from 'mol-model/structure/structure/unit/gaussian-density';
 import { paramDefaultValues, SelectParam, NumberParam, BooleanParam } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/visual/gaussian-surface-wireframe.ts b/src/mol-geo/representation/structure/visual/gaussian-surface-wireframe.ts
index 0bb363663..c59b4bcf2 100644
--- a/src/mol-geo/representation/structure/visual/gaussian-surface-wireframe.ts
+++ b/src/mol-geo/representation/structure/visual/gaussian-surface-wireframe.ts
@@ -13,7 +13,7 @@ import { computeMarchingCubesLines } from '../../../util/marching-cubes/algorith
 import { Lines } from '../../../geometry/lines/lines';
 import { GaussianDensityProps, GaussianDensityParams } from 'mol-model/structure/structure/unit/gaussian-density';
 import { paramDefaultValues, SelectParam, NumberParam, BooleanParam } from 'mol-util/parameter';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 
 async function createGaussianWireframe(ctx: RuntimeContext, unit: Unit, structure: Structure, props: GaussianDensityProps, lines?: Lines): Promise<Lines> {
     const { smoothness } = props
diff --git a/src/mol-geo/representation/structure/visual/inter-unit-link-cylinder.ts b/src/mol-geo/representation/structure/visual/inter-unit-link-cylinder.ts
index 796adcb04..bf4c66294 100644
--- a/src/mol-geo/representation/structure/visual/inter-unit-link-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/inter-unit-link-cylinder.ts
@@ -14,7 +14,7 @@ import { Vec3 } from 'mol-math/linear-algebra';
 import { Loci, EmptyLoci } from 'mol-model/loci';
 import { ComplexMeshVisual, ComplexMeshParams } from '../complex-visual';
 import { Interval } from 'mol-data/int';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { BitFlags } from 'mol-util';
 import { SelectParam, NumberParam, paramDefaultValues } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/visual/intra-unit-link-cylinder.ts b/src/mol-geo/representation/structure/visual/intra-unit-link-cylinder.ts
index c3569027b..f3a19843a 100644
--- a/src/mol-geo/representation/structure/visual/intra-unit-link-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/intra-unit-link-cylinder.ts
@@ -15,7 +15,7 @@ import { Vec3 } from 'mol-math/linear-algebra';
 import { Loci, EmptyLoci } from 'mol-model/loci';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
 import { Interval } from 'mol-data/int';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { BitFlags } from 'mol-util';
 import { SelectParam, NumberParam, paramDefaultValues } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/visual/polymer-backbone-cylinder.ts b/src/mol-geo/representation/structure/visual/polymer-backbone-cylinder.ts
index 62860a718..95ccb9311 100644
--- a/src/mol-geo/representation/structure/visual/polymer-backbone-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/polymer-backbone-cylinder.ts
@@ -13,7 +13,7 @@ import { PolymerBackboneIterator } from './util/polymer';
 import { getElementLoci, markElement, StructureElementIterator } from './util/element';
 import { Vec3 } from 'mol-math/linear-algebra';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
-import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-theme/size';
 import { CylinderProps } from '../../../primitive/cylinder';
 import { OrderedSet } from 'mol-data/int';
 import { addCylinder } from '../../../geometry/mesh/builder/cylinder';
diff --git a/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts b/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts
index 1601fca4b..eb2a9f926 100644
--- a/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts
+++ b/src/mol-geo/representation/structure/visual/polymer-direction-wedge.ts
@@ -13,7 +13,7 @@ import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment,
 import { Vec3, Mat4 } from 'mol-math/linear-algebra';
 import { SecondaryStructureType, isNucleic } from 'mol-model/structure/model/types';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { Wedge } from '../../../primitive/wedge';
 import { SelectParam, NumberParam, paramDefaultValues } from 'mol-util/parameter';
 
diff --git a/src/mol-geo/representation/structure/visual/polymer-gap-cylinder.ts b/src/mol-geo/representation/structure/visual/polymer-gap-cylinder.ts
index 98ace9ba4..b4539c324 100644
--- a/src/mol-geo/representation/structure/visual/polymer-gap-cylinder.ts
+++ b/src/mol-geo/representation/structure/visual/polymer-gap-cylinder.ts
@@ -12,7 +12,7 @@ import { MeshBuilder } from '../../../geometry/mesh/mesh-builder';
 import { PolymerGapIterator, PolymerGapLocationIterator, markPolymerGapElement, getPolymerGapElementLoci } from './util/polymer';
 import { Vec3 } from 'mol-math/linear-algebra';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
-import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeOptions, SizeThemeName } from 'mol-theme/size';
 import { CylinderProps } from '../../../primitive/cylinder';
 import { addSphere } from '../../../geometry/mesh/builder/sphere';
 import { addFixedCountDashedCylinder } from '../../../geometry/mesh/builder/cylinder';
diff --git a/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts b/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts
index a4bf1e842..390a757fe 100644
--- a/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts
+++ b/src/mol-geo/representation/structure/visual/polymer-trace-mesh.ts
@@ -12,7 +12,7 @@ import { MeshBuilder } from '../../../geometry/mesh/mesh-builder';
 import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, markPolymerElement } from './util/polymer';
 import { SecondaryStructureType, isNucleic } from 'mol-model/structure/model/types';
 import { UnitsMeshVisual, UnitsMeshParams } from '../units-visual';
-import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { addSheet } from '../../../geometry/mesh/builder/sheet';
 import { addTube } from '../../../geometry/mesh/builder/tube';
 import { SelectParam, NumberParam, paramDefaultValues } from 'mol-util/parameter';
diff --git a/src/mol-geo/representation/structure/visual/util/element.ts b/src/mol-geo/representation/structure/visual/util/element.ts
index b2205660c..dfd6cf68c 100644
--- a/src/mol-geo/representation/structure/visual/util/element.ts
+++ b/src/mol-geo/representation/structure/visual/util/element.ts
@@ -13,7 +13,7 @@ import { MeshBuilder } from '../../../../geometry/mesh/mesh-builder';
 import { Loci, EmptyLoci } from 'mol-model/loci';
 import { Interval, OrderedSet } from 'mol-data/int';
 import { PickingId } from '../../../../geometry/picking';
-import { SizeTheme, SizeThemeName } from 'mol-canvas3d/theme/size';
+import { SizeTheme, SizeThemeName } from 'mol-theme/size';
 import { LocationIterator } from '../../../../util/location-iterator';
 import { addSphere } from '../../../../geometry/mesh/builder/sphere';
 
diff --git a/src/mol-geo/representation/structure/visual/util/link.ts b/src/mol-geo/representation/structure/visual/util/link.ts
index 0c2eede02..a5aa87686 100644
--- a/src/mol-geo/representation/structure/visual/util/link.ts
+++ b/src/mol-geo/representation/structure/visual/util/link.ts
@@ -9,7 +9,7 @@ import { RuntimeContext } from 'mol-task';
 import { Mesh } from '../../../../geometry/mesh/mesh';
 import { MeshBuilder } from '../../../../geometry/mesh/mesh-builder';
 import { LinkType } from 'mol-model/structure/model/types';
-import { SizeThemeName, SizeThemeOptions } from 'mol-canvas3d/theme/size';
+import { SizeThemeName, SizeThemeOptions } from 'mol-theme/size';
 import { CylinderProps } from '../../../../primitive/cylinder';
 import { LocationIterator } from '../../../../util/location-iterator';
 import { Unit, StructureElement, Structure, Link } from 'mol-model/structure';
diff --git a/src/mol-geo/representation/volume/direct-volume.ts b/src/mol-geo/representation/volume/direct-volume.ts
index 49d12ef2a..0654ab530 100644
--- a/src/mol-geo/representation/volume/direct-volume.ts
+++ b/src/mol-geo/representation/volume/direct-volume.ts
@@ -16,7 +16,7 @@ import { paramDefaultValues } from 'mol-util/parameter';
 import { DirectVolume } from '../../geometry/direct-volume/direct-volume';
 import { Vec3, Mat4 } from 'mol-math/linear-algebra';
 import { Box3D } from 'mol-math/geometry';
-import { Context } from 'mol-gl/webgl/context';
+import { WebGLContext } from 'mol-gl/webgl/context';
 import { createTexture } from 'mol-gl/webgl/texture';
 import { LocationIterator } from 'mol-geo/util/location-iterator';
 import { NullLocation } from 'mol-model/location';
@@ -85,7 +85,7 @@ function createVolumeTexture2d(volume: VolumeData, maxTextureSize: number) {
     return textureImage
 }
 
-export function createDirectVolume2d(ctx: RuntimeContext, webgl: Context, volume: VolumeData, directVolume?: DirectVolume) {
+export function createDirectVolume2d(ctx: RuntimeContext, webgl: WebGLContext, volume: VolumeData, directVolume?: DirectVolume) {
     const gridDimension = volume.data.space.dimensions as Vec3
     const textureImage = createVolumeTexture2d(volume, webgl.maxTextureSize)
     // debugTexture(createImageData(textureImage.array, textureImage.width, textureImage.height), 1/3)
@@ -155,7 +155,7 @@ function createVolumeTexture3d(volume: VolumeData) {
     return textureVolume
 }
 
-export function createDirectVolume3d(ctx: RuntimeContext, webgl: Context, volume: VolumeData, directVolume?: DirectVolume) {
+export function createDirectVolume3d(ctx: RuntimeContext, webgl: WebGLContext, volume: VolumeData, directVolume?: DirectVolume) {
     const gridDimension = volume.data.space.dimensions as Vec3
     const textureVolume = createVolumeTexture3d(volume)
     const transform = VolumeData.getGridToCartesianTransform(volume)
diff --git a/src/mol-gl/render-object.ts b/src/mol-gl/render-object.ts
index 34dff9145..84e892862 100644
--- a/src/mol-gl/render-object.ts
+++ b/src/mol-gl/render-object.ts
@@ -7,7 +7,7 @@
 import { PointsRenderable, MeshRenderable, RenderableState, MeshValues, PointsValues, LinesValues, LinesRenderable, Renderable } from './renderable'
 import { RenderableValues } from './renderable/schema';
 import { idFactory } from 'mol-util/id-factory';
-import { Context } from './webgl/context';
+import { WebGLContext } from './webgl/context';
 import { GaussianDensityValues, GaussianDensityRenderable } from './renderable/gaussian-density';
 import { DirectVolumeValues, DirectVolumeRenderable } from './renderable/direct-volume';
 
@@ -40,7 +40,7 @@ export function createDirectVolumeRenderObject(values: DirectVolumeValues, state
     return { id: getNextId(), type: 'direct-volume', values, state }
 }
 
-export function createRenderable(ctx: Context, o: RenderObject): Renderable<any> {
+export function createRenderable(ctx: WebGLContext, o: RenderObject): Renderable<any> {
     switch (o.type) {
         case 'mesh': return MeshRenderable(ctx, o.id, o.values, o.state)
         case 'points': return PointsRenderable(ctx, o.id, o.values, o.state)
diff --git a/src/mol-gl/renderable/direct-volume.ts b/src/mol-gl/renderable/direct-volume.ts
index 0f9ddcbbe..a27ec8edd 100644
--- a/src/mol-gl/renderable/direct-volume.ts
+++ b/src/mol-gl/renderable/direct-volume.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable, RenderableState, createRenderable } from '../renderable'
-import { Context } from '../webgl/context';
+import { WebGLContext } from '../webgl/context';
 import { createRenderItem } from '../webgl/render-item';
 import { AttributeSpec, Values, UniformSpec, GlobalUniformSchema, InternalSchema, TextureSpec, ValueSpec, ElementsSpec, DefineSpec, InternalValues } from './schema';
 import { DirectVolumeShaderCode } from '../shader-code';
@@ -53,7 +53,7 @@ export const DirectVolumeSchema = {
 export type DirectVolumeSchema = typeof DirectVolumeSchema
 export type DirectVolumeValues = Values<DirectVolumeSchema>
 
-export function DirectVolumeRenderable(ctx: Context, id: number, values: DirectVolumeValues, state: RenderableState): Renderable<DirectVolumeValues> {
+export function DirectVolumeRenderable(ctx: WebGLContext, id: number, values: DirectVolumeValues, state: RenderableState): Renderable<DirectVolumeValues> {
     const schema = { ...GlobalUniformSchema, ...InternalSchema, ...DirectVolumeSchema }
     const internalValues: InternalValues = {
         uObjectId: ValueCell.create(id)
diff --git a/src/mol-gl/renderable/gaussian-density.ts b/src/mol-gl/renderable/gaussian-density.ts
index e07143628..a8b4f1518 100644
--- a/src/mol-gl/renderable/gaussian-density.ts
+++ b/src/mol-gl/renderable/gaussian-density.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable, RenderableState, createRenderable } from '../renderable'
-import { Context } from '../webgl/context';
+import { WebGLContext } from '../webgl/context';
 import { createRenderItem } from '../webgl/render-item';
 import { AttributeSpec, Values, UniformSpec, ValueSpec, DefineSpec, TextureSpec } from './schema';
 import { GaussianDensityShaderCode } from '../shader-code';
@@ -35,7 +35,7 @@ export const GaussianDensitySchema = {
 export type GaussianDensitySchema = typeof GaussianDensitySchema
 export type GaussianDensityValues = Values<GaussianDensitySchema>
 
-export function GaussianDensityRenderable(ctx: Context, id: number, values: GaussianDensityValues, state: RenderableState): Renderable<GaussianDensityValues> {
+export function GaussianDensityRenderable(ctx: WebGLContext, id: number, values: GaussianDensityValues, state: RenderableState): Renderable<GaussianDensityValues> {
     const schema = { ...GaussianDensitySchema }
     const shaderCode = GaussianDensityShaderCode
     const renderItem = createRenderItem(ctx, 'points', shaderCode, schema, values)
diff --git a/src/mol-gl/renderable/lines.ts b/src/mol-gl/renderable/lines.ts
index 7baaa5585..31ebfd493 100644
--- a/src/mol-gl/renderable/lines.ts
+++ b/src/mol-gl/renderable/lines.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable, RenderableState, createRenderable } from '../renderable'
-import { Context } from '../webgl/context';
+import { WebGLContext } from '../webgl/context';
 import { createRenderItem } from '../webgl/render-item';
 import { GlobalUniformSchema, BaseSchema, AttributeSpec, DefineSpec, Values, InternalSchema, SizeSchema, ElementsSpec, InternalValues } from './schema';
 import { ValueCell } from 'mol-util';
@@ -25,7 +25,7 @@ export const LinesSchema = {
 export type LinesSchema = typeof LinesSchema
 export type LinesValues = Values<LinesSchema>
 
-export function LinesRenderable(ctx: Context, id: number, values: LinesValues, state: RenderableState): Renderable<LinesValues> {
+export function LinesRenderable(ctx: WebGLContext, id: number, values: LinesValues, state: RenderableState): Renderable<LinesValues> {
     const schema = { ...GlobalUniformSchema, ...InternalSchema, ...LinesSchema }
     const internalValues: InternalValues = {
         uObjectId: ValueCell.create(id)
diff --git a/src/mol-gl/renderable/mesh.ts b/src/mol-gl/renderable/mesh.ts
index 3d5d7d23c..e79f78159 100644
--- a/src/mol-gl/renderable/mesh.ts
+++ b/src/mol-gl/renderable/mesh.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable, RenderableState, createRenderable } from '../renderable'
-import { Context } from '../webgl/context';
+import { WebGLContext } from '../webgl/context';
 import { createRenderItem } from '../webgl/render-item';
 import { GlobalUniformSchema, BaseSchema, AttributeSpec, ElementsSpec, DefineSpec, Values, InternalSchema, InternalValues } from './schema';
 import { MeshShaderCode } from '../shader-code';
@@ -23,7 +23,7 @@ export const MeshSchema = {
 export type MeshSchema = typeof MeshSchema
 export type MeshValues = Values<MeshSchema>
 
-export function MeshRenderable(ctx: Context, id: number, values: MeshValues, state: RenderableState): Renderable<MeshValues> {
+export function MeshRenderable(ctx: WebGLContext, id: number, values: MeshValues, state: RenderableState): Renderable<MeshValues> {
     const schema = { ...GlobalUniformSchema, ...InternalSchema, ...MeshSchema }
     const internalValues: InternalValues = {
         uObjectId: ValueCell.create(id)
diff --git a/src/mol-gl/renderable/points.ts b/src/mol-gl/renderable/points.ts
index 9b5e09e2a..95a45cced 100644
--- a/src/mol-gl/renderable/points.ts
+++ b/src/mol-gl/renderable/points.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable, RenderableState, createRenderable } from '../renderable'
-import { Context } from '../webgl/context';
+import { WebGLContext } from '../webgl/context';
 import { createRenderItem } from '../webgl/render-item';
 import { GlobalUniformSchema, BaseSchema, AttributeSpec, UniformSpec, DefineSpec, Values, InternalSchema, SizeSchema, InternalValues } from './schema';
 import { PointsShaderCode } from '../shader-code';
@@ -22,7 +22,7 @@ export const PointsSchema = {
 export type PointsSchema = typeof PointsSchema
 export type PointsValues = Values<PointsSchema>
 
-export function PointsRenderable(ctx: Context, id: number, values: PointsValues, state: RenderableState): Renderable<PointsValues> {
+export function PointsRenderable(ctx: WebGLContext, id: number, values: PointsValues, state: RenderableState): Renderable<PointsValues> {
     const schema = { ...GlobalUniformSchema, ...InternalSchema, ...PointsSchema }
     const internalValues: InternalValues = {
         uObjectId: ValueCell.create(id)
diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts
index 3437f75c1..39e422e60 100644
--- a/src/mol-gl/renderer.ts
+++ b/src/mol-gl/renderer.ts
@@ -9,7 +9,7 @@ import { Viewport } from 'mol-canvas3d/camera/util';
 import { Camera } from 'mol-canvas3d/camera/base';
 
 import Scene from './scene';
-import { Context, createImageData } from './webgl/context';
+import { WebGLContext, createImageData } from './webgl/context';
 import { Mat4, Vec3, Vec4 } from 'mol-math/linear-algebra';
 import { Renderable } from './renderable';
 import { Color } from 'mol-util/color';
@@ -49,7 +49,7 @@ export const DefaultRendererProps = {
 export type RendererProps = Partial<typeof DefaultRendererProps>
 
 namespace Renderer {
-    export function create(ctx: Context, camera: Camera, props: RendererProps = {}): Renderer {
+    export function create(ctx: WebGLContext, camera: Camera, props: RendererProps = {}): Renderer {
         const { gl } = ctx
         let { clearColor, viewport: _viewport } = { ...DefaultRendererProps, ...props }
 
diff --git a/src/mol-gl/scene.ts b/src/mol-gl/scene.ts
index 98bde44e7..217f082cd 100644
--- a/src/mol-gl/scene.ts
+++ b/src/mol-gl/scene.ts
@@ -5,7 +5,7 @@
  */
 
 import { Renderable } from './renderable'
-import { Context } from './webgl/context';
+import { WebGLContext } from './webgl/context';
 import { RenderableValues, BaseValues } from './renderable/schema';
 import { RenderObject, createRenderable } from './render-object';
 import { Object3D, createObject3D } from './object3d';
@@ -48,7 +48,7 @@ interface Scene extends Object3D {
 }
 
 namespace Scene {
-    export function create(ctx: Context): Scene {
+    export function create(ctx: WebGLContext): Scene {
         const renderableMap = new Map<RenderObject, Renderable<RenderableValues & BaseValues>>()
         let boundingSphere: Sphere3D | undefined
 
diff --git a/src/mol-gl/shader-code.ts b/src/mol-gl/shader-code.ts
index 097d5bbd4..49467749f 100644
--- a/src/mol-gl/shader-code.ts
+++ b/src/mol-gl/shader-code.ts
@@ -6,7 +6,7 @@
 
 import { ValueCell } from 'mol-util';
 import { idFactory } from 'mol-util/id-factory';
-import { Context } from './webgl/context';
+import { WebGLContext } from './webgl/context';
 
 export type DefineKind = 'boolean' | 'string' | 'number'
 export type DefineType = boolean | string
@@ -85,7 +85,7 @@ function getDefinesCode (defines: ShaderDefines) {
     return lines.join('\n') + '\n'
 }
 
-function getGlsl100FragPrefix(ctx: Context, extensions: ShaderExtensions) {
+function getGlsl100FragPrefix(ctx: WebGLContext, extensions: ShaderExtensions) {
     const prefix: string[] = []
     if (extensions.standardDerivatives) {
         prefix.push('#extension GL_OES_standard_derivatives : enable')
@@ -117,7 +117,7 @@ layout(location = 0) out highp vec4 out_FragColor;
 #define enabledFragDepth
 `
 
-export function addShaderDefines(ctx: Context, defines: ShaderDefines, shaders: ShaderCode): ShaderCode {
+export function addShaderDefines(ctx: WebGLContext, defines: ShaderDefines, shaders: ShaderCode): ShaderCode {
     const { isWebGL2 } = ctx
     const header = getDefinesCode(defines)
     const vertPrefix = isWebGL2 ? glsl300VertPrefix : ''
diff --git a/src/mol-gl/webgl/buffer.ts b/src/mol-gl/webgl/buffer.ts
index 8cd11ef8c..8f2c0e719 100644
--- a/src/mol-gl/webgl/buffer.ts
+++ b/src/mol-gl/webgl/buffer.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context } from './context'
+import { WebGLContext } from './context'
 import { ValueCell } from 'mol-util';
 import { RenderableSchema } from '../renderable/schema';
 import { idFactory } from 'mol-util/id-factory';
@@ -29,7 +29,7 @@ export type ArrayKind = keyof DataTypeArrayType
 
 export type BufferItemSize = 1 | 2 | 3 | 4 | 16
 
-export function getUsageHint(ctx: Context, usageHint: UsageHint) {
+export function getUsageHint(ctx: WebGLContext, usageHint: UsageHint) {
     const { gl } = ctx
     switch (usageHint) {
         case 'static': return gl.STATIC_DRAW
@@ -38,7 +38,7 @@ export function getUsageHint(ctx: Context, usageHint: UsageHint) {
     }
 }
 
-export function getDataType(ctx: Context, dataType: DataType) {
+export function getDataType(ctx: WebGLContext, dataType: DataType) {
     const { gl } = ctx
     switch (dataType) {
         case 'uint8': return gl.UNSIGNED_BYTE
@@ -51,7 +51,7 @@ export function getDataType(ctx: Context, dataType: DataType) {
     }
 }
 
-function dataTypeFromArray(ctx: Context, array: ArrayType) {
+function dataTypeFromArray(ctx: WebGLContext, array: ArrayType) {
     const { gl } = ctx
     if (array instanceof Uint8Array) {
         return gl.UNSIGNED_BYTE
@@ -72,7 +72,7 @@ function dataTypeFromArray(ctx: Context, array: ArrayType) {
     }
 }
 
-export function getBufferType(ctx: Context, bufferType: BufferType) {
+export function getBufferType(ctx: WebGLContext, bufferType: BufferType) {
     const { gl } = ctx
     switch (bufferType) {
         case 'attribute': return gl.ARRAY_BUFFER
@@ -98,7 +98,7 @@ export interface Buffer {
     destroy: () => void
 }
 
-export function createBuffer(ctx: Context, array: ArrayType, itemSize: BufferItemSize, usageHint: UsageHint, bufferType: BufferType): Buffer {
+export function createBuffer(ctx: WebGLContext, array: ArrayType, itemSize: BufferItemSize, usageHint: UsageHint, bufferType: BufferType): Buffer {
     const { gl } = ctx
     const _buffer = gl.createBuffer()
     if (_buffer === null) {
@@ -162,7 +162,7 @@ export interface AttributeBuffer extends Buffer {
     bind: (location: number) => void
 }
 
-export function createAttributeBuffer<T extends ArrayType, S extends BufferItemSize>(ctx: Context, array: ArrayType, itemSize: S, divisor: number, usageHint: UsageHint = 'dynamic'): AttributeBuffer {
+export function createAttributeBuffer<T extends ArrayType, S extends BufferItemSize>(ctx: WebGLContext, array: ArrayType, itemSize: S, divisor: number, usageHint: UsageHint = 'dynamic'): AttributeBuffer {
     const { gl } = ctx
     const { instancedArrays } = ctx.extensions
 
@@ -188,7 +188,7 @@ export function createAttributeBuffer<T extends ArrayType, S extends BufferItemS
     }
 }
 
-export function createAttributeBuffers(ctx: Context, schema: RenderableSchema, values: AttributeValues) {
+export function createAttributeBuffers(ctx: WebGLContext, schema: RenderableSchema, values: AttributeValues) {
     const buffers: AttributeBuffers = {}
     Object.keys(schema).forEach(k => {
         const spec = schema[k]
@@ -206,7 +206,7 @@ export interface ElementsBuffer extends Buffer {
     bind: () => void
 }
 
-export function createElementsBuffer(ctx: Context, array: ElementsType, usageHint: UsageHint = 'static'): ElementsBuffer {
+export function createElementsBuffer(ctx: WebGLContext, array: ElementsType, usageHint: UsageHint = 'static'): ElementsBuffer {
     const { gl } = ctx
     const buffer = createBuffer(ctx, array, 1, usageHint, 'elements')
     const { _buffer } = buffer
diff --git a/src/mol-gl/webgl/context.ts b/src/mol-gl/webgl/context.ts
index a94f6e583..2f0a9f0a7 100644
--- a/src/mol-gl/webgl/context.ts
+++ b/src/mol-gl/webgl/context.ts
@@ -8,6 +8,7 @@ import { createProgramCache, ProgramCache } from './program'
 import { createShaderCache, ShaderCache } from './shader'
 import { GLRenderingContext, COMPAT_instanced_arrays, COMPAT_standard_derivatives, COMPAT_vertex_array_object, getInstancedArrays, getStandardDerivatives, getVertexArrayObject, isWebGL2, COMPAT_element_index_uint, getElementIndexUint, COMPAT_texture_float, getTextureFloat, COMPAT_texture_float_linear, getTextureFloatLinear, COMPAT_blend_minmax, getBlendMinMax, getFragDepth, COMPAT_frag_depth } from './compat';
 import { createFramebufferCache, FramebufferCache } from './framebuffer';
+import { Scheduler } from 'mol-task';
 
 export function getGLContext(canvas: HTMLCanvasElement, contextAttributes?: WebGLContextAttributes): GLRenderingContext | null {
     function getContext(contextId: 'webgl' | 'experimental-webgl' | 'webgl2') {
@@ -65,14 +66,14 @@ function fence(gl: WebGL2RenderingContext) {
             gl.flush(); // Ensure the fence is submitted.
             const check = () => {
                 const status = gl.getSyncParameter(sync, gl.SYNC_STATUS)
-                if (status == gl.SIGNALED) {
-                    gl.deleteSync(sync);
-                    resolve();
+                if (status === gl.SIGNALED) {
+                    gl.deleteSync(sync)
+                    resolve()
                 } else {
-                    setTimeout(check, 0)
+                    Scheduler.setImmediate(check, 0)
                 }
             }
-            setTimeout(check, 0)
+            Scheduler.setImmediate(check, 0)
         }
     })
 }
@@ -115,7 +116,7 @@ type Extensions = {
 }
 
 /** A WebGL context object, including the rendering context, resource caches and counts */
-export interface Context {
+export interface WebGLContext {
     readonly gl: GLRenderingContext
     readonly isWebGL2: boolean
     readonly extensions: Extensions
@@ -145,7 +146,7 @@ export interface Context {
     destroy: () => void
 }
 
-export function createContext(gl: GLRenderingContext): Context {
+export function createContext(gl: GLRenderingContext): WebGLContext {
     const instancedArrays = getInstancedArrays(gl)
     if (instancedArrays === null) {
         throw new Error('Could not find support for "instanced_arrays"')
diff --git a/src/mol-gl/webgl/framebuffer.ts b/src/mol-gl/webgl/framebuffer.ts
index 77eeee74a..ef3439b72 100644
--- a/src/mol-gl/webgl/framebuffer.ts
+++ b/src/mol-gl/webgl/framebuffer.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context } from './context'
+import { WebGLContext } from './context'
 import { idFactory } from 'mol-util/id-factory';
 import { ReferenceCache, createReferenceCache } from 'mol-util/reference-cache';
 
@@ -17,7 +17,7 @@ export interface Framebuffer {
     destroy: () => void
 }
 
-export function createFramebuffer (ctx: Context): Framebuffer {
+export function createFramebuffer (ctx: WebGLContext): Framebuffer {
     const { gl } = ctx
     const _framebuffer = gl.createFramebuffer()
     if (_framebuffer === null) {
@@ -40,12 +40,12 @@ export function createFramebuffer (ctx: Context): Framebuffer {
     }
 }
 
-export type FramebufferCache = ReferenceCache<Framebuffer, string, Context>
+export type FramebufferCache = ReferenceCache<Framebuffer, string, WebGLContext>
 
 export function createFramebufferCache(): FramebufferCache {
     return createReferenceCache(
         (name: string) => name,
-        (ctx: Context) => createFramebuffer(ctx),
+        (ctx: WebGLContext) => createFramebuffer(ctx),
         (framebuffer: Framebuffer) => { framebuffer.destroy() }
     )
 }
\ No newline at end of file
diff --git a/src/mol-gl/webgl/program.ts b/src/mol-gl/webgl/program.ts
index 551f42abe..b7eb34b26 100644
--- a/src/mol-gl/webgl/program.ts
+++ b/src/mol-gl/webgl/program.ts
@@ -5,7 +5,7 @@
  */
 
 import { ShaderCode, DefineValues, addShaderDefines } from '../shader-code'
-import { Context } from './context';
+import { WebGLContext } from './context';
 import { getUniformUpdaters, getTextureUniformUpdaters, UniformValues } from './uniform';
 import { AttributeBuffers } from './buffer';
 import { TextureId, Textures } from './texture';
@@ -29,7 +29,7 @@ export interface Program {
 
 type AttributeLocations = { [k: string]: number }
 
-function getAttributeLocations(ctx: Context, program: WebGLProgram, schema: RenderableSchema) {
+function getAttributeLocations(ctx: WebGLContext, program: WebGLProgram, schema: RenderableSchema) {
     const { gl } = ctx
     const locations: AttributeLocations = {}
     gl.useProgram(program)
@@ -52,7 +52,7 @@ export interface ProgramProps {
     schema: RenderableSchema
 }
 
-export function createProgram(ctx: Context, props: ProgramProps): Program {
+export function createProgram(ctx: WebGLContext, props: ProgramProps): Program {
     const { gl, shaderCache } = ctx
     const { defineValues, shaderCode: _shaderCode, schema } = props
 
@@ -112,7 +112,7 @@ export function createProgram(ctx: Context, props: ProgramProps): Program {
     }
 }
 
-export type ProgramCache = ReferenceCache<Program, ProgramProps, Context>
+export type ProgramCache = ReferenceCache<Program, ProgramProps, WebGLContext>
 
 function defineValueHash(v: boolean | number | string): number {
     return typeof v === 'boolean' ? (v ? 1 : 0) :
@@ -129,7 +129,7 @@ export function createProgramCache(): ProgramCache {
             })
             return hashFnv32a(array).toString()
         },
-        (ctx: Context, props: ProgramProps) => createProgram(ctx, props),
+        (ctx: WebGLContext, props: ProgramProps) => createProgram(ctx, props),
         (program: Program) => { program.destroy() }
     )
 }
\ No newline at end of file
diff --git a/src/mol-gl/webgl/render-item.ts b/src/mol-gl/webgl/render-item.ts
index d2f59286b..bc7d302b1 100644
--- a/src/mol-gl/webgl/render-item.ts
+++ b/src/mol-gl/webgl/render-item.ts
@@ -6,7 +6,7 @@
 
 import { createAttributeBuffers, createElementsBuffer, ElementsBuffer, createAttributeBuffer, ArrayKind } from './buffer';
 import { createTextures } from './texture';
-import { Context } from './context';
+import { WebGLContext } from './context';
 import { ShaderCode } from '../shader-code';
 import { Program } from './program';
 import { RenderableSchema, RenderableValues, AttributeSpec, getValueVersions, splitValues, Values } from '../renderable/schema';
@@ -20,7 +20,7 @@ const getNextRenderItemId = idFactory()
 
 export type DrawMode = 'points' | 'lines' | 'line-strip' | 'line-loop' | 'triangles' | 'triangle-strip' | 'triangle-fan'
 
-export function getDrawMode(ctx: Context, drawMode: DrawMode) {
+export function getDrawMode(ctx: WebGLContext, drawMode: DrawMode) {
     const { gl } = ctx
     switch (drawMode) {
         case 'points': return gl.POINTS
@@ -68,7 +68,7 @@ interface ValueChanges {
  *
  * - assumes that `values.drawCount` and `values.instanceCount` exist
  */
-export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues): RenderItem {
+export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues): RenderItem {
     const id = getNextRenderItemId()
     const { programCache } = ctx
     const { instancedArrays, vertexArrayObject } = ctx.extensions
diff --git a/src/mol-gl/webgl/render-target.ts b/src/mol-gl/webgl/render-target.ts
index a40fc4522..12bbe860e 100644
--- a/src/mol-gl/webgl/render-target.ts
+++ b/src/mol-gl/webgl/render-target.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context, createImageData } from './context'
+import { WebGLContext, createImageData } from './context'
 import { idFactory } from 'mol-util/id-factory';
 import { createTexture, Texture } from './texture';
 import { createFramebuffer } from './framebuffer';
@@ -28,7 +28,7 @@ export interface RenderTarget {
     destroy: () => void
 }
 
-export function createRenderTarget (ctx: Context, _width: number, _height: number): RenderTarget {
+export function createRenderTarget (ctx: WebGLContext, _width: number, _height: number): RenderTarget {
     const { gl } = ctx
 
     const image: Helpers.Mutable<TextureImage<Uint8Array>> = {
diff --git a/src/mol-gl/webgl/renderbuffer.ts b/src/mol-gl/webgl/renderbuffer.ts
index c123a3a39..8cc41d487 100644
--- a/src/mol-gl/webgl/renderbuffer.ts
+++ b/src/mol-gl/webgl/renderbuffer.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context } from './context'
+import { WebGLContext } from './context'
 import { idFactory } from 'mol-util/id-factory';
 
 const getNextRenderbufferId = idFactory()
@@ -12,7 +12,7 @@ const getNextRenderbufferId = idFactory()
 export type RenderbufferFormat = 'depth16' | 'stencil8' | 'rgba4' | 'depth-stencil'
 export type RenderbufferAttachment = 'depth' | 'stencil' | 'depth-stencil' | 'color0'
 
-export function getFormat(ctx: Context, format: RenderbufferFormat) {
+export function getFormat(ctx: WebGLContext, format: RenderbufferFormat) {
     const { gl } = ctx
     switch (format) {
         case 'depth16': return gl.DEPTH_COMPONENT16
@@ -22,7 +22,7 @@ export function getFormat(ctx: Context, format: RenderbufferFormat) {
     }
 }
 
-export function getAttachment(ctx: Context, attachment: RenderbufferAttachment) {
+export function getAttachment(ctx: WebGLContext, attachment: RenderbufferAttachment) {
     const { gl } = ctx
     switch (attachment) {
         case 'depth': return gl.DEPTH_ATTACHMENT
@@ -41,7 +41,7 @@ export interface Renderbuffer {
     destroy: () => void
 }
 
-export function createRenderbuffer (ctx: Context, format: RenderbufferFormat, attachment: RenderbufferAttachment, _width: number, _height: number): Renderbuffer {
+export function createRenderbuffer (ctx: WebGLContext, format: RenderbufferFormat, attachment: RenderbufferAttachment, _width: number, _height: number): Renderbuffer {
     const { gl } = ctx
     const _renderbuffer = gl.createRenderbuffer()
     if (_renderbuffer === null) {
diff --git a/src/mol-gl/webgl/shader.ts b/src/mol-gl/webgl/shader.ts
index 9181afec5..a209cd017 100644
--- a/src/mol-gl/webgl/shader.ts
+++ b/src/mol-gl/webgl/shader.ts
@@ -5,7 +5,7 @@
  */
 
 import { createReferenceCache, ReferenceCache } from 'mol-util/reference-cache';
-import { Context } from './context';
+import { WebGLContext } from './context';
 import { idFactory } from 'mol-util/id-factory';
 
 const getNextShaderId = idFactory()
@@ -26,7 +26,7 @@ export interface Shader {
     destroy: () => void
 }
 
-function createShader(ctx: Context, props: ShaderProps): Shader {
+function createShader(ctx: WebGLContext, props: ShaderProps): Shader {
     const { gl } = ctx
     const { type, source } = props
 
@@ -54,12 +54,12 @@ function createShader(ctx: Context, props: ShaderProps): Shader {
     }
 }
 
-export type ShaderCache = ReferenceCache<Shader, ShaderProps, Context>
+export type ShaderCache = ReferenceCache<Shader, ShaderProps, WebGLContext>
 
 export function createShaderCache(): ShaderCache {
     return createReferenceCache(
         (props: ShaderProps) => JSON.stringify(props),
-        (ctx: Context, props: ShaderProps) => createShader(ctx, props),
+        (ctx: WebGLContext, props: ShaderProps) => createShader(ctx, props),
         (shader: Shader) => { shader.destroy() }
     )
 }
\ No newline at end of file
diff --git a/src/mol-gl/webgl/texture.ts b/src/mol-gl/webgl/texture.ts
index c7bbe7ab7..763bf9fdc 100644
--- a/src/mol-gl/webgl/texture.ts
+++ b/src/mol-gl/webgl/texture.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context } from './context'
+import { WebGLContext } from './context'
 import { TextureImage, TextureVolume } from '../renderable/util';
 import { ValueCell } from 'mol-util';
 import { RenderableSchema } from '../renderable/schema';
@@ -29,7 +29,7 @@ export type TextureFormat = 'alpha' | 'rgb' | 'rgba'
 export type TextureAttachment = 'depth' | 'stencil' | 'color0' | 'color1' | 'color2' | 'color3' | 'color4' | 'color5' | 'color6' | 'color7' | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
 export type TextureFilter = 'nearest' | 'linear'
 
-export function getTarget(ctx: Context, kind: TextureKind): number {
+export function getTarget(ctx: WebGLContext, kind: TextureKind): number {
     const { gl } = ctx
     switch (kind) {
         case 'image-uint8': return gl.TEXTURE_2D
@@ -44,7 +44,7 @@ export function getTarget(ctx: Context, kind: TextureKind): number {
     throw new Error('unknown texture kind')
 }
 
-export function getFormat(ctx: Context, format: TextureFormat): number {
+export function getFormat(ctx: WebGLContext, format: TextureFormat): number {
     const { gl } = ctx
     switch (format) {
         case 'alpha': return gl.ALPHA
@@ -53,7 +53,7 @@ export function getFormat(ctx: Context, format: TextureFormat): number {
     }
 }
 
-export function getInternalFormat(ctx: Context, format: TextureFormat, type: TextureType): number {
+export function getInternalFormat(ctx: WebGLContext, format: TextureFormat, type: TextureType): number {
     const { gl, isWebGL2 } = ctx
     if (isWebGL2) {
         switch (format) {
@@ -77,7 +77,7 @@ export function getInternalFormat(ctx: Context, format: TextureFormat, type: Tex
     return getFormat(ctx, format)
 }
 
-export function getType(ctx: Context, type: TextureType): number {
+export function getType(ctx: WebGLContext, type: TextureType): number {
     const { gl } = ctx
     switch (type) {
         case 'ubyte': return gl.UNSIGNED_BYTE
@@ -85,7 +85,7 @@ export function getType(ctx: Context, type: TextureType): number {
     }
 }
 
-export function getFilter(ctx: Context, type: TextureFilter): number {
+export function getFilter(ctx: WebGLContext, type: TextureFilter): number {
     const { gl } = ctx
     switch (type) {
         case 'nearest': return gl.NEAREST
@@ -93,7 +93,7 @@ export function getFilter(ctx: Context, type: TextureFilter): number {
     }
 }
 
-export function getAttachment(ctx: Context, attachment: TextureAttachment): number {
+export function getAttachment(ctx: WebGLContext, attachment: TextureAttachment): number {
     const { gl } = ctx
     switch (attachment) {
         case 'depth': return gl.DEPTH_ATTACHMENT
@@ -140,7 +140,7 @@ export type TextureId = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 1
 export type TextureValues = { [k: string]: ValueCell<TextureValueType> }
 export type Textures = { [k: string]: Texture }
 
-export function createTexture(ctx: Context, kind: TextureKind, _format: TextureFormat, _type: TextureType, _filter: TextureFilter): Texture {
+export function createTexture(ctx: WebGLContext, kind: TextureKind, _format: TextureFormat, _type: TextureType, _filter: TextureFilter): Texture {
     const id = getNextTextureId()
     const { gl } = ctx
     const texture = gl.createTexture()
@@ -244,7 +244,7 @@ export function createTexture(ctx: Context, kind: TextureKind, _format: TextureF
     }
 }
 
-export function createTextures(ctx: Context, schema: RenderableSchema, values: TextureValues) {
+export function createTextures(ctx: WebGLContext, schema: RenderableSchema, values: TextureValues) {
     const textures: Textures = {}
     Object.keys(schema).forEach((k, i) => {
         const spec = schema[k]
diff --git a/src/mol-gl/webgl/uniform.ts b/src/mol-gl/webgl/uniform.ts
index 7ef816a1d..d04ad1069 100644
--- a/src/mol-gl/webgl/uniform.ts
+++ b/src/mol-gl/webgl/uniform.ts
@@ -5,7 +5,7 @@
  */
 
 import { Mat3, Mat4, Vec2, Vec3, Vec4 } from 'mol-math/linear-algebra'
-import { Context } from './context';
+import { WebGLContext } from './context';
 import { ValueCell } from 'mol-util';
 import { RenderableSchema } from '../renderable/schema';
 
@@ -29,7 +29,7 @@ export interface UniformUpdater {
 export type UniformValues = { [k: string]: ValueCell<UniformType> }
 export type UniformUpdaters = { [k: string]: UniformUpdater }
 
-function createUniformSetter(ctx: Context, program: WebGLProgram, name: string, kind: UniformKind): (value: any) => void {
+function createUniformSetter(ctx: WebGLContext, program: WebGLProgram, name: string, kind: UniformKind): (value: any) => void {
     const { gl } = ctx
     const location = gl.getUniformLocation(program, name)
     if (location === null) {
@@ -46,7 +46,7 @@ function createUniformSetter(ctx: Context, program: WebGLProgram, name: string,
     }
 }
 
-function createUniformUpdater(ctx: Context, program: WebGLProgram, name: string, kind: UniformKind): UniformUpdater {
+function createUniformUpdater(ctx: WebGLContext, program: WebGLProgram, name: string, kind: UniformKind): UniformUpdater {
     const setter = createUniformSetter(ctx, program, name, kind)
     let _value: UniformType | undefined = undefined
     return {
@@ -62,7 +62,7 @@ function createUniformUpdater(ctx: Context, program: WebGLProgram, name: string,
     }
 }
 
-export function getUniformUpdaters(ctx: Context, program: WebGLProgram, schema: RenderableSchema) {
+export function getUniformUpdaters(ctx: WebGLContext, program: WebGLProgram, schema: RenderableSchema) {
     const updaters: UniformUpdaters = {}
     Object.keys(schema).forEach(k => {
         const spec = schema[k]
@@ -73,7 +73,7 @@ export function getUniformUpdaters(ctx: Context, program: WebGLProgram, schema:
     return updaters
 }
 
-export function getTextureUniformUpdaters(ctx: Context, program: WebGLProgram, schema: RenderableSchema) {
+export function getTextureUniformUpdaters(ctx: WebGLContext, program: WebGLProgram, schema: RenderableSchema) {
     const updaters: UniformUpdaters = {}
     Object.keys(schema).forEach(k => {
         const spec = schema[k]
diff --git a/src/mol-gl/webgl/vertex-array.ts b/src/mol-gl/webgl/vertex-array.ts
index 19a2adc2f..cb9d6d696 100644
--- a/src/mol-gl/webgl/vertex-array.ts
+++ b/src/mol-gl/webgl/vertex-array.ts
@@ -4,11 +4,11 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import { Context } from './context';
+import { WebGLContext } from './context';
 import { Program } from './program';
 import { AttributeBuffers, ElementsBuffer } from './buffer';
 
-export function createVertexArray(ctx: Context, program: Program, attributeBuffers: AttributeBuffers, elementsBuffer?: ElementsBuffer) {
+export function createVertexArray(ctx: WebGLContext, program: Program, attributeBuffers: AttributeBuffers, elementsBuffer?: ElementsBuffer) {
     const { vertexArrayObject } = ctx.extensions
     let vertexArray: WebGLVertexArrayObject | null = null
     if (vertexArrayObject) {
@@ -22,7 +22,7 @@ export function createVertexArray(ctx: Context, program: Program, attributeBuffe
     return vertexArray
 }
 
-export function deleteVertexArray(ctx: Context, vertexArray: WebGLVertexArrayObject | null) {
+export function deleteVertexArray(ctx: WebGLContext, vertexArray: WebGLVertexArrayObject | null) {
     const { vertexArrayObject } = ctx.extensions
     if (vertexArrayObject && vertexArray) {
         vertexArrayObject.deleteVertexArray(vertexArray)
diff --git a/src/mol-math/geometry/gaussian-density.ts b/src/mol-math/geometry/gaussian-density.ts
index f7e39348e..fc89c5fe9 100644
--- a/src/mol-math/geometry/gaussian-density.ts
+++ b/src/mol-math/geometry/gaussian-density.ts
@@ -9,7 +9,7 @@ import { Vec3 } from '../linear-algebra';
 import { RuntimeContext, Task } from 'mol-task';
 import { PositionData, DensityData } from './common';
 import { GaussianDensityCPU } from './gaussian-density/cpu';
-import { Context } from 'mol-gl/webgl/context';
+import { WebGLContext } from 'mol-gl/webgl/context';
 
 // import { GaussianDensityGPU } from './gaussian-density/gpu';
 const GaussianDensityGPU = typeof document !== 'undefined'
@@ -21,7 +21,7 @@ export const DefaultGaussianDensityProps = {
     radiusOffset: 0,
     smoothness: 1.5,
     useGpu: true,
-    webgl: undefined as Context | undefined
+    webgl: undefined as WebGLContext | undefined
 }
 export type GaussianDensityProps = typeof DefaultGaussianDensityProps
 
diff --git a/src/mol-math/geometry/gaussian-density/gpu.ts b/src/mol-math/geometry/gaussian-density/gpu.ts
index dffd04cad..7771088ec 100644
--- a/src/mol-math/geometry/gaussian-density/gpu.ts
+++ b/src/mol-math/geometry/gaussian-density/gpu.ts
@@ -15,7 +15,7 @@ import { GaussianDensityValues } from 'mol-gl/renderable/gaussian-density'
 import { ValueCell, defaults } from 'mol-util'
 import { RenderableState, Renderable } from 'mol-gl/renderable'
 import { createRenderable, createGaussianDensityRenderObject } from 'mol-gl/render-object'
-import { Context, createContext, getGLContext } from 'mol-gl/webgl/context';
+import { WebGLContext, createContext, getGLContext } from 'mol-gl/webgl/context';
 import { createTexture, Texture } from 'mol-gl/webgl/texture';
 import { GLRenderingContext, isWebGL2 } from 'mol-gl/webgl/compat';
 import { decodeIdRGB } from 'mol-geo/geometry/picking';
@@ -39,7 +39,7 @@ export async function GaussianDensityGPU(ctx: RuntimeContext, position: Position
     return { field, idField, transform }
 }
 
-export async function GaussianDensityTexture(ctx: RuntimeContext, webgl: Context, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, oldTexture?: Texture): Promise<DensityTextureData> {
+export async function GaussianDensityTexture(ctx: RuntimeContext, webgl: WebGLContext, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, oldTexture?: Texture): Promise<DensityTextureData> {
     console.time(`GaussianDensityTexture, ${webgl.isWebGL2 ? '3d' : '2d'}`)
     const { texture, scale, bbox, dim } = webgl.isWebGL2 ?
         await GaussianDensityTexture3d(ctx, webgl, position, box, radius, props, oldTexture) :
@@ -55,7 +55,7 @@ export async function GaussianDensityTexture(ctx: RuntimeContext, webgl: Context
 
 //
 
-async function GaussianDensityTexture2d(ctx: RuntimeContext, webgl: Context, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, texture?: Texture) {
+async function GaussianDensityTexture2d(ctx: RuntimeContext, webgl: WebGLContext, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, texture?: Texture) {
     const { smoothness } = props
 
     const { drawCount, positions, radii, groups, delta, expandedBox, dim } = await prepareGaussianDensityData(ctx, position, box, radius, props)
@@ -116,7 +116,7 @@ async function GaussianDensityTexture2d(ctx: RuntimeContext, webgl: Context, pos
     return { texture, scale: Vec3.inverse(Vec3.zero(), delta), bbox: expandedBox, dim }
 }
 
-async function GaussianDensityTexture3d(ctx: RuntimeContext, webgl: Context, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, texture?: Texture) {
+async function GaussianDensityTexture3d(ctx: RuntimeContext, webgl: WebGLContext, position: PositionData, box: Box3D, radius: (index: number) => number, props: GaussianDensityProps, texture?: Texture) {
     const { smoothness } = props
 
     const { drawCount, positions, radii, groups, delta, expandedBox, dim } = await prepareGaussianDensityData(ctx, position, box, radius, props)
@@ -165,7 +165,7 @@ async function GaussianDensityTexture3d(ctx: RuntimeContext, webgl: Context, pos
 
 //
 
-let webglContext: Context
+let webglContext: WebGLContext
 function getWebGLContext() {
     if (webglContext) return webglContext
     const canvas = document.createElement('canvas')
@@ -220,7 +220,7 @@ async function prepareGaussianDensityData(ctx: RuntimeContext, position: Positio
     return { drawCount: n, positions, radii, groups, delta, expandedBox, dim }
 }
 
-function getGaussianDensityRenderObject(webgl: Context, drawCount: number, positions: Float32Array, radii: Float32Array, groups: Float32Array, minDistanceTexture: Texture, box: Box3D, dimensions: Vec3, smoothness: number) {
+function getGaussianDensityRenderObject(webgl: WebGLContext, drawCount: number, positions: Float32Array, radii: Float32Array, groups: Float32Array, minDistanceTexture: Texture, box: Box3D, dimensions: Vec3, smoothness: number) {
     const extent = Vec3.sub(Vec3.zero(), box.max, box.min)
     const { texDimX, texDimY } = getTexture2dSize(webgl.maxTextureSize, dimensions)
 
@@ -263,7 +263,7 @@ function setRenderingDefaults(gl: GLRenderingContext) {
     gl.enable(gl.BLEND)
 }
 
-function setupMinDistanceRendering(webgl: Context, renderable: Renderable<any>) {
+function setupMinDistanceRendering(webgl: WebGLContext, renderable: Renderable<any>) {
     const { gl } = webgl
     ValueCell.update(renderable.values.dCalcType, 'minDistance')
     renderable.update()
@@ -273,7 +273,7 @@ function setupMinDistanceRendering(webgl: Context, renderable: Renderable<any>)
     gl.blendEquation(webgl.extensions.blendMinMax.MAX)
 }
 
-function setupDensityRendering(webgl: Context, renderable: Renderable<any>) {
+function setupDensityRendering(webgl: WebGLContext, renderable: Renderable<any>) {
     const { gl } = webgl
     ValueCell.update(renderable.values.dCalcType, 'density')
     renderable.update()
@@ -282,7 +282,7 @@ function setupDensityRendering(webgl: Context, renderable: Renderable<any>) {
     gl.blendEquation(gl.FUNC_ADD)
 }
 
-function setupGroupIdRendering(webgl: Context, renderable: Renderable<any>) {
+function setupGroupIdRendering(webgl: WebGLContext, renderable: Renderable<any>) {
     const { gl } = webgl
     ValueCell.update(renderable.values.dCalcType, 'groupId')
     renderable.update()
@@ -308,7 +308,7 @@ function getTexture2dSize(maxTexSize: number, gridDim: Vec3) {
     return { texDimX, texDimY, texRows, texCols }
 }
 
-async function fieldFromTexture2d(ctx: Context, texture: Texture, dim: Vec3) {
+async function fieldFromTexture2d(ctx: WebGLContext, texture: Texture, dim: Vec3) {
     console.log('isWebGL2', isWebGL2(ctx.gl))
     console.time('fieldFromTexture2d')
     const { framebufferCache } = ctx
@@ -326,7 +326,7 @@ async function fieldFromTexture2d(ctx: Context, texture: Texture, dim: Vec3) {
 
     const framebuffer = framebufferCache.get(ctx, FramebufferName).value
     framebuffer.bind()
-    texture.attachFramebuffer(framebuffer, 0)   
+    texture.attachFramebuffer(framebuffer, 0)
     await ctx.readPixelsAsync(0, 0, width, height, image)
 
     let j = 0
diff --git a/src/mol-model/structure/structure/unit/gaussian-density.ts b/src/mol-model/structure/structure/unit/gaussian-density.ts
index e79797d22..b7895e3de 100644
--- a/src/mol-model/structure/structure/unit/gaussian-density.ts
+++ b/src/mol-model/structure/structure/unit/gaussian-density.ts
@@ -5,12 +5,12 @@
  */
 
 import { Unit, StructureElement, ElementIndex } from 'mol-model/structure';
-import { SizeTheme } from 'mol-canvas3d/theme/size';
+import { SizeTheme } from 'mol-theme/size';
 import { GaussianDensity } from 'mol-math/geometry/gaussian-density';
 import { Task, RuntimeContext } from 'mol-task';
 import { DensityData } from 'mol-math/geometry';
 import { NumberParam, paramDefaultValues, BooleanParam, ValueParam } from 'mol-util/parameter';
-import { Context } from 'mol-gl/webgl/context';
+import { WebGLContext } from 'mol-gl/webgl/context';
 import { GaussianDensityTexture } from 'mol-math/geometry/gaussian-density/gpu';
 import { Texture } from 'mol-gl/webgl/texture';
 
@@ -20,7 +20,7 @@ export const GaussianDensityParams = {
     smoothness: NumberParam('Smoothness', '', 1.5, 0.5, 2.5, 0.1),
     useGpu: BooleanParam('Use GPU', '', true),
     ignoreCache: BooleanParam('Ignore Cache', '', false),
-    webgl: ValueParam('WebGL Context', '', undefined as Context | undefined),
+    webgl: ValueParam('WebGL Context', '', undefined as WebGLContext | undefined),
 }
 export const DefaultGaussianDensityProps = paramDefaultValues(GaussianDensityParams)
 export type GaussianDensityProps = typeof DefaultGaussianDensityProps
diff --git a/src/mol-plugin/context.ts b/src/mol-plugin/context.ts
index 9c98a4235..4aa5439e7 100644
--- a/src/mol-plugin/context.ts
+++ b/src/mol-plugin/context.ts
@@ -5,7 +5,7 @@
  */
 
 import { State, StateTree, StateSelection, Transformer } from 'mol-state';
-import Viewer from 'mol-canvas3d/viewer';
+import Canvas3D from 'mol-canvas3d/canvas3d';
 import { StateTransforms } from './state/transforms';
 import { Subject } from 'rxjs';
 import { PluginStateObjects as SO } from './state/objects';
@@ -22,13 +22,13 @@ export class PluginContext {
         stateUpdated: new Subject<undefined>()
     };
 
-    viewer: Viewer;
+    canvas3d: Canvas3D;
 
     initViewer(canvas: HTMLCanvasElement, container: HTMLDivElement) {
         try {
-            this.viewer = Viewer.create(canvas, container);
-            this.viewer.animate();
-            console.log('viewer created');
+            this.canvas3d = Canvas3D.create(canvas, container);
+            this.canvas3d.animate();
+            console.log('canvas3d created');
             return true;
         } catch (e) {
             console.error(e);
@@ -60,24 +60,24 @@ export class PluginContext {
         this.state.data.context.events.object.created.subscribe(o => {
             if (!SO.StructureRepresentation3D.is(o.obj)) return;
             console.log('adding repr', o.obj.data.repr);
-            this.viewer.add(o.obj.data.repr);
-            this.viewer.requestDraw(true);
+            this.canvas3d.add(o.obj.data.repr);
+            this.canvas3d.requestDraw(true);
         });
         this.state.data.context.events.object.updated.subscribe(o => {
             const oo = o.obj;
             if (!SO.StructureRepresentation3D.is(oo)) return;
             console.log('adding repr', oo.data.repr);
-            this.viewer.add(oo.data.repr);
-            this.viewer.requestDraw(true);
+            this.canvas3d.add(oo.data.repr);
+            this.canvas3d.requestDraw(true);
         });
     }
 
     _test_centerView() {
         const sel = StateSelection.select('structure', this.state.data);
         const center = (sel[0].obj! as SO.Structure).data.boundary.sphere.center;
-        console.log({ sel, center, rc: this.viewer.reprCount });
-        this.viewer.center(center);
-        this.viewer.requestDraw(true);
+        console.log({ sel, center, rc: this.canvas3d.reprCount });
+        this.canvas3d.center(center);
+        this.canvas3d.requestDraw(true);
     }
 
     _test_nextModel() {
diff --git a/src/mol-plugin/ui/viewport.tsx b/src/mol-plugin/ui/viewport.tsx
index fa904d12e..b1e55009f 100644
--- a/src/mol-plugin/ui/viewport.tsx
+++ b/src/mol-plugin/ui/viewport.tsx
@@ -27,7 +27,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> {
     };
 
     handleResize() {
-        this.props.plugin.viewer.handleResize();
+        this.props.plugin.canvas3d.handleResize();
     }
 
     componentDidMount() {
@@ -36,13 +36,13 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> {
         }
         this.handleResize();
 
-        const viewer = this.props.plugin.viewer;
+        const viewer = this.props.plugin.canvas3d;
         viewer.input.resize.subscribe(() => this.handleResize());
 
         let prevLoci: Loci = EmptyLoci;
-        viewer.input.move.subscribe(({x, y, inside, buttons}) => {
+        viewer.input.move.subscribe(async ({x, y, inside, buttons}) => {
             if (!inside || buttons) return;
-            const p = viewer.identify(x, y);
+            const p = await viewer.identify(x, y);
             if (p) {
                 const loci = viewer.getLoci(p);
 
diff --git a/src/mol-canvas3d/theme/color.ts b/src/mol-theme/color.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color.ts
rename to src/mol-theme/color.ts
diff --git a/src/mol-canvas3d/theme/color/carbohydrate-symbol.ts b/src/mol-theme/color/carbohydrate-symbol.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/carbohydrate-symbol.ts
rename to src/mol-theme/color/carbohydrate-symbol.ts
diff --git a/src/mol-canvas3d/theme/color/chain-id.ts b/src/mol-theme/color/chain-id.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/chain-id.ts
rename to src/mol-theme/color/chain-id.ts
diff --git a/src/mol-canvas3d/theme/color/cross-link.ts b/src/mol-theme/color/cross-link.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/cross-link.ts
rename to src/mol-theme/color/cross-link.ts
diff --git a/src/mol-canvas3d/theme/color/custom.ts b/src/mol-theme/color/custom.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/custom.ts
rename to src/mol-theme/color/custom.ts
diff --git a/src/mol-canvas3d/theme/color/element-index.ts b/src/mol-theme/color/element-index.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/element-index.ts
rename to src/mol-theme/color/element-index.ts
diff --git a/src/mol-canvas3d/theme/color/element-symbol.ts b/src/mol-theme/color/element-symbol.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/element-symbol.ts
rename to src/mol-theme/color/element-symbol.ts
diff --git a/src/mol-canvas3d/theme/color/molecule-type.ts b/src/mol-theme/color/molecule-type.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/molecule-type.ts
rename to src/mol-theme/color/molecule-type.ts
diff --git a/src/mol-canvas3d/theme/color/residue-name.ts b/src/mol-theme/color/residue-name.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/residue-name.ts
rename to src/mol-theme/color/residue-name.ts
diff --git a/src/mol-canvas3d/theme/color/secondary-structure.ts b/src/mol-theme/color/secondary-structure.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/secondary-structure.ts
rename to src/mol-theme/color/secondary-structure.ts
diff --git a/src/mol-canvas3d/theme/color/sequence-id.ts b/src/mol-theme/color/sequence-id.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/sequence-id.ts
rename to src/mol-theme/color/sequence-id.ts
diff --git a/src/mol-canvas3d/theme/color/shape-group.ts b/src/mol-theme/color/shape-group.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/shape-group.ts
rename to src/mol-theme/color/shape-group.ts
diff --git a/src/mol-canvas3d/theme/color/uniform.ts b/src/mol-theme/color/uniform.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/uniform.ts
rename to src/mol-theme/color/uniform.ts
diff --git a/src/mol-canvas3d/theme/color/unit-index.ts b/src/mol-theme/color/unit-index.ts
similarity index 100%
rename from src/mol-canvas3d/theme/color/unit-index.ts
rename to src/mol-theme/color/unit-index.ts
diff --git a/src/mol-canvas3d/label.ts b/src/mol-theme/label.ts
similarity index 100%
rename from src/mol-canvas3d/label.ts
rename to src/mol-theme/label.ts
diff --git a/src/mol-canvas3d/theme/size.ts b/src/mol-theme/size.ts
similarity index 100%
rename from src/mol-canvas3d/theme/size.ts
rename to src/mol-theme/size.ts
diff --git a/src/mol-canvas3d/theme/size/physical.ts b/src/mol-theme/size/physical.ts
similarity index 100%
rename from src/mol-canvas3d/theme/size/physical.ts
rename to src/mol-theme/size/physical.ts
diff --git a/src/mol-canvas3d/theme/size/uniform.ts b/src/mol-theme/size/uniform.ts
similarity index 100%
rename from src/mol-canvas3d/theme/size/uniform.ts
rename to src/mol-theme/size/uniform.ts
diff --git a/src/mol-util/color/scale.ts b/src/mol-util/color/scale.ts
index 08f3a2c05..e4bc9bb02 100644
--- a/src/mol-util/color/scale.ts
+++ b/src/mol-util/color/scale.ts
@@ -6,7 +6,7 @@
 
 import { Color } from './color'
 import { ColorBrewer } from './tables'
-import { ScaleLegend } from 'mol-canvas3d/theme/color';
+import { ScaleLegend } from 'mol-theme/color';
 import { defaults } from 'mol-util';
 
 export interface ColorScale {
-- 
GitLab