diff --git a/src/mol-model/structure/model/model.ts b/src/mol-model/structure/model/model.ts
index c777d8d55fe61d75afc5b24f07e58dbfe0b4748e..d096d4c92ee3e5c79d503f87d57ba52cbc301cba 100644
--- a/src/mol-model/structure/model/model.ts
+++ b/src/mol-model/structure/model/model.ts
@@ -49,6 +49,8 @@ export interface Model extends Readonly<{
         readonly chemicalComponentMap: ChemicalComponentMap
         /** maps residue name to `SaccharideComponent` data */
         readonly saccharideComponentMap: SaccharideComponentMap
+        /** brute-force way to add ASA data, prob should be a custom property */
+        readonly asa: number[]
     },
 
     customProperties: CustomProperties,
diff --git a/src/mol-model/structure/model/properties/utils/accessible-surface-area.ts b/src/mol-model/structure/model/properties/utils/accessible-surface-area.ts
index 2ee085fabac386d70113f9ec4ead53a76f7c1011..8fb4ae37ae50de5808a3d3fb74709944781c48a6 100644
--- a/src/mol-model/structure/model/properties/utils/accessible-surface-area.ts
+++ b/src/mol-model/structure/model/properties/utils/accessible-surface-area.ts
@@ -1,7 +1,6 @@
 import { Vec3 } from 'mol-math/linear-algebra';
 import { AtomicHierarchy, AtomicConformation } from '../atomic';
 import { ElementSymbol, VdwRadii, MaxAsa, DefaultMaxAsa } from '../../types';
-import { max } from 'mol-data/int/impl/ordered-set';
 
 const defaultNumberOfPoints = 960;
 const defaultProbeSize = 1.4;
@@ -25,7 +24,7 @@ export function computeModelASA(hierarchy: AtomicHierarchy, conformation: Atomic
         conformation
     }
 
-    calculateASA(ctx);
+    return calculateASA(ctx);
 }
 
 const valueForIgnoredAtom = -1.0;
@@ -133,7 +132,7 @@ function calculateASA(ctx: ASAContext) {
         residueAsa[residueAtomSegments.index[i]] += value;
     }
 
-    console.log(residueAsa);
+    // console.log(residueAsa);
 
     // normalize by maximum value expected for a particular amino acid - needs lookup of max values
     for (let i = 0; i < residues.label_comp_id.rowCount; ++i) {
@@ -145,7 +144,8 @@ function calculateASA(ctx: ASAContext) {
         residueAsa[i] /= (maxAsa === undefined ? DefaultMaxAsa : maxAsa);
     }
 
-    console.log(residueAsa);
+    // console.log(residueAsa);
+    return residueAsa;
 }
 
 /**
diff --git a/src/mol-theme/color/accessible-surface-area.ts b/src/mol-theme/color/accessible-surface-area.ts
index 9f7307023902ef5291a876f1ba42862118e4204f..080c679e16790840083e54ebc2d4efa5e5e52c0b 100644
--- a/src/mol-theme/color/accessible-surface-area.ts
+++ b/src/mol-theme/color/accessible-surface-area.ts
@@ -10,8 +10,9 @@ import { ColorTheme } from '../color';
 import { ParamDefinition as PD } from 'mol-util/param-definition'
 import { ThemeDataContext } from '../theme';
 import { ColorListOptions, ColorListName, ColorScale } from 'mol-util/color/scale';
+import { StructureElement, Link, ElementIndex, Unit } from 'mol-model/structure';
 
-// const DefaultAccessibleSurfaceAreaColor = Color(0xCCCCCC)
+const DefaultAccessibleSurfaceAreaColor = Color(0xCCCCCC)
 const Description = 'Assigns a color based on the relative accessible surface area of a residue.'
 
 export const AccessibleSurfaceAreaColorThemeParams = {
@@ -28,9 +29,22 @@ export function AccessibleSurfaceAreaColorTheme(ctx: ThemeDataContext, props: PD
         minLabel: 'Start',
         maxLabel: 'End',
     })
+    const scaleColor = scale.color
+
+    function asaColor(unit: Unit, element: ElementIndex): Color {
+        if (Unit.isAtomic(unit)) {
+            return scaleColor(unit.model.properties.asa[unit.residueIndex[element]]);
+        }
+        return DefaultAccessibleSurfaceAreaColor;
+    }
+
     const color = (location: Location): Color => {
-        return scale.color(Math.random())
-        // TODO impl
+        if (StructureElement.isLocation(location)) {
+            return asaColor(location.unit, location.element);
+        } else if (Link.isLocation(location)) {
+            return asaColor(location.aUnit, location.aUnit.elements[location.aIndex]);
+        }
+        return DefaultAccessibleSurfaceAreaColor;
     }
 
     return {