diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts
index 190e21d27a4cf9ebfe361c2d1b280902e26ebef9..8533bc34244aa8a4691e389d249d7e50655aeee2 100644
--- a/src/mol-geo/geometry/geometry.ts
+++ b/src/mol-geo/geometry/geometry.ts
@@ -104,6 +104,7 @@ export namespace Geometry {
 export function createRenderableState(props: PD.Values<Geometry.Params>): RenderableState {
     return {
         visible: true,
+        pickable: true,
         depthMask: props.depthMask
     }
 }
diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts
index 51552ebf2dac61950224535024a725c0574b78d6..e62c5415f7be59b638ff97167f2ca012d6d2c34a 100644
--- a/src/mol-gl/_spec/renderer.spec.ts
+++ b/src/mol-gl/_spec/renderer.spec.ts
@@ -85,6 +85,7 @@ function createPoints() {
     }
     const state: RenderableState = {
         visible: true,
+        pickable: true,
         depthMask: true,
     }
 
diff --git a/src/mol-gl/renderable.ts b/src/mol-gl/renderable.ts
index 370437898cfee60a0df4e37d155640412c21a6fb..9693861ed06631f06bb82b8b3cef778c2664403d 100644
--- a/src/mol-gl/renderable.ts
+++ b/src/mol-gl/renderable.ts
@@ -12,6 +12,7 @@ import { Vec3 } from 'mol-math/linear-algebra';
 
 export type RenderableState = {
     visible: boolean
+    pickable: boolean
     depthMask: boolean
 }
 
diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts
index c7d4ce3a4fec1c3b17a1dd68cd02d8d020f80a49..b3a8d51dd2d961cc6326bc2798358947b754b910 100644
--- a/src/mol-gl/renderer.ts
+++ b/src/mol-gl/renderer.ts
@@ -103,7 +103,7 @@ namespace Renderer {
         let currentProgramId = -1
         const renderObject = (r: Renderable<RenderableValues & BaseValues>, variant: RenderVariant) => {
             const program = r.getProgram(variant)
-            if (r.state.visible) {
+            if (r.state.visible && (variant === 'draw' || r.state.pickable)) {
                 if (currentProgramId !== program.id) {
                     program.use()
                     program.setUniforms(globalUniforms)
diff --git a/src/mol-math/geometry/gaussian-density/gpu.ts b/src/mol-math/geometry/gaussian-density/gpu.ts
index e14fb754a15fa825b4b1b98dcfda5593a076c65e..d0429a36dfee714b53ba6de3a59c0cae93856e9a 100644
--- a/src/mol-math/geometry/gaussian-density/gpu.ts
+++ b/src/mol-math/geometry/gaussian-density/gpu.ts
@@ -232,6 +232,7 @@ function getGaussianDensityRenderObject(webgl: WebGLContext, drawCount: number,
     }
     const state: RenderableState = {
         visible: true,
+        pickable: false,
         depthMask: false
     }
 
diff --git a/src/mol-repr/representation.ts b/src/mol-repr/representation.ts
index 1325c1481edc2963cb4cff2584431022142599da..cdd92dbcce622beba428691e64f8c8bde84a64ac 100644
--- a/src/mol-repr/representation.ts
+++ b/src/mol-repr/representation.ts
@@ -88,6 +88,7 @@ interface Representation<D, P extends PD.Params = {}> {
     getLoci: (pickingId: PickingId) => Loci
     mark: (loci: Loci, action: MarkerAction) => boolean
     setVisibility: (value: boolean) => void
+    setPickable: (value: boolean) => void
     destroy: () => void
 }
 namespace Representation {
@@ -98,6 +99,7 @@ namespace Representation {
         getLoci: () => EmptyLoci,
         mark: () => false,
         setVisibility: () => {},
+        setPickable: () => {},
         destroy: () => {}
     }
 
@@ -175,6 +177,11 @@ namespace Representation {
                     reprList[i].setVisibility(value)
                 }
             },
+            setPickable: (value: boolean) => {
+                for (let i = 0, il = reprList.length; i < il; ++i) {
+                    reprList[i].setPickable(value)
+                }
+            },
             destroy() {
                 for (let i = 0, il = reprList.length; i < il; ++i) {
                     reprList[i].destroy()
@@ -197,5 +204,6 @@ export interface Visual<D, P extends PD.Params> {
     getLoci: (pickingId: PickingId) => Loci
     mark: (loci: Loci, action: MarkerAction) => boolean
     setVisibility: (value: boolean) => void
+    setPickable: (value: boolean) => void
     destroy: () => void
 }
\ No newline at end of file
diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts
index 27c7d9e7339a29438bce609f766c8cc2d8bf3570..87333b0e41e49770e1d229d7c7cd69eca8904635 100644
--- a/src/mol-repr/shape/representation.ts
+++ b/src/mol-repr/shape/representation.ts
@@ -103,6 +103,9 @@ export function ShapeRepresentation<P extends ShapeParams>(): ShapeRepresentatio
         setVisibility(value: boolean) {
             renderObjects.forEach(ro => ro.state.visible = value)
         },
+        setPickable(value: boolean) {
+            renderObjects.forEach(ro => ro.state.pickable = value)
+        },
         destroy() {
             // TODO
             renderObjects.length = 0
diff --git a/src/mol-repr/structure/complex-representation.ts b/src/mol-repr/structure/complex-representation.ts
index f74d0551005db1201cd232d17b9b23321ade0838..c3b9051ac0989766600760af5d8e0f34ec70d87e 100644
--- a/src/mol-repr/structure/complex-representation.ts
+++ b/src/mol-repr/structure/complex-representation.ts
@@ -54,6 +54,10 @@ export function ComplexRepresentation<P extends StructureParams>(label: string,
         if (visual) visual.setVisibility(value)
     }
 
+    function setPickable(value: boolean) {
+        if (visual) visual.setPickable(value)
+    }
+
     function destroy() {
         if (visual) visual.destroy()
     }
@@ -70,6 +74,7 @@ export function ComplexRepresentation<P extends StructureParams>(label: string,
         getLoci,
         mark,
         setVisibility,
+        setPickable,
         destroy
     }
 }
\ No newline at end of file
diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts
index 25823c82f05c06438cb4c61af328390ad3a87395..d7110771a18beecf1180f367165514ce71e6d0b0 100644
--- a/src/mol-repr/structure/complex-visual.ts
+++ b/src/mol-repr/structure/complex-visual.ts
@@ -165,6 +165,9 @@ export function ComplexVisual<P extends ComplexParams>(builder: ComplexVisualGeo
         setVisibility(value: boolean) {
             if (renderObject) renderObject.state.visible = value
         },
+        setPickable(value: boolean) {
+            if (renderObject) renderObject.state.pickable = value
+        },
         destroy() {
             // TODO
             renderObject = undefined
diff --git a/src/mol-repr/structure/units-representation.ts b/src/mol-repr/structure/units-representation.ts
index 42bb3fb8604b8660664dbdf7476772105c6cab63..aa525857dad38c11a419e7ffc99803ca8b2f6e3e 100644
--- a/src/mol-repr/structure/units-representation.ts
+++ b/src/mol-repr/structure/units-representation.ts
@@ -147,6 +147,12 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, getPar
         })
     }
 
+    function setPickable(value: boolean) {
+        visuals.forEach(({ visual }) => {
+            visual.setPickable(value)
+        })
+    }
+
     function destroy() {
         visuals.forEach(({ visual }) => visual.destroy())
         visuals.clear()
@@ -168,6 +174,7 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, getPar
         getLoci,
         mark,
         setVisibility,
+        setPickable,
         destroy
     }
 }
\ No newline at end of file
diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts
index f5cc5a4a58ce0ae94f8eb3bd551a47d0d49565f8..c1f6716ce51ce2f0b306258a8302759c0015c83f 100644
--- a/src/mol-repr/structure/units-visual.ts
+++ b/src/mol-repr/structure/units-visual.ts
@@ -195,6 +195,9 @@ export function UnitsVisual<P extends UnitsParams>(builder: UnitsVisualGeometryB
         setVisibility(value: boolean) {
             if (renderObject) renderObject.state.visible = value
         },
+        setPickable(value: boolean) {
+            if (renderObject) renderObject.state.pickable = value
+        },
         destroy() {
             // TODO
             renderObject = undefined
diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts
index 12e24cdf1cd98895bb3e61971202c9aea2a1b5b8..81e7d1ad09b81a4c4f7b327c574ebd6b6078abe1 100644
--- a/src/mol-repr/volume/representation.ts
+++ b/src/mol-repr/volume/representation.ts
@@ -39,7 +39,7 @@ interface VolumeVisualGeometryBuilder<P extends VolumeParams, G extends Geometry
     updateValues(values: RenderableValues, newProps: PD.Values<P>): void
 }
 
-export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeometryBuilder<P, Geometry>) {
+export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeometryBuilder<P, Geometry>): VolumeVisual<P> {
     const { defaultProps, createGeometry, getLoci, mark, setUpdateState } = builder
     const { createRenderObject, updateValues } = builder
     const updateState = VisualUpdateState.create()
@@ -120,6 +120,9 @@ export function VolumeVisual<P extends VolumeParams>(builder: VolumeVisualGeomet
         setVisibility(value: boolean) {
             if (renderObject) renderObject.state.visible = value
         },
+        setPickable(value: boolean) {
+            if (renderObject) renderObject.state.pickable = value
+        },
         destroy() {
             // TODO
             renderObject = undefined
@@ -194,6 +197,10 @@ export function VolumeRepresentation<P extends VolumeParams>(label: string, getP
         if (visual) visual.setVisibility(value)
     }
 
+    function setPickable(value: boolean) {
+        if (visual) visual.setPickable(value)
+    }
+
     return {
         label,
         get renderObjects() {
@@ -206,6 +213,7 @@ export function VolumeRepresentation<P extends VolumeParams>(label: string, getP
         getLoci,
         mark,
         setVisibility,
+        setPickable,
         destroy
     }
 }
\ No newline at end of file