diff --git a/src/apps/render-test/state.ts b/src/apps/render-test/state.ts
index c0e92f901c4d9955f900e78f03c193acf2ce28bc..58f3404e7347b1632c2885754c8a57a20b0c865f 100644
--- a/src/apps/render-test/state.ts
+++ b/src/apps/render-test/state.ts
@@ -178,7 +178,8 @@ export default class State {
         if (this.spacefillRepr) this.viewer.remove(this.spacefillRepr)
         if (this.pdbId.length !== 4) return
         this.loading.next(true)
-        this.setModel((await getModelFromPdbId(this.pdbId))[0])
+        const models = await getModelFromPdbId(this.pdbId);
+        this.setModel(models[0])
     }
 
     setVolume(volume: Volume) {
diff --git a/src/apps/render-test/utils/index.ts b/src/apps/render-test/utils/index.ts
index 54486ffb3323d4808327e4ed013c332e38ed04de..b5eb271c7a63815185263d5e7185934d33b4ed12 100644
--- a/src/apps/render-test/utils/index.ts
+++ b/src/apps/render-test/utils/index.ts
@@ -29,7 +29,7 @@ export async function parseCif(data: string|Uint8Array) {
 
 export async function getModelFromPdbId(pdbid: string) {
     const cif = await downloadCif(`https://files.rcsb.org/download/${pdbid}.cif`, false)
-    return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })
+    return Run(Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) }))
 }
 
 const readFileAsText = (file: File) => {
@@ -46,7 +46,7 @@ const readFileAsText = (file: File) => {
 
 export async function getModelFromFile(file: File) {
     const cif = await parseCif(await readFileAsText(file))
-    return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })
+    return Run(Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) }))
 }
 
 export type Volume = { source: DensityServer_Data_Database, volume: VolumeData }
diff --git a/src/apps/structure-info/model.ts b/src/apps/structure-info/model.ts
index 15ee55fd8578f3d636fe1173b980fd6990d42f38..3f7957df85e57f94552e10188669cb6059f5d30d 100644
--- a/src/apps/structure-info/model.ts
+++ b/src/apps/structure-info/model.ts
@@ -16,6 +16,7 @@ import { OrderedSet } from 'mol-data/int';
 import { Table } from 'mol-data/db';
 import { mmCIF_Database } from 'mol-io/reader/cif/schema/mmcif';
 import { openCif, downloadCif } from './helpers';
+import { Run } from 'mol-task';
 
 
 async function downloadFromPdb(pdb: string) {
@@ -117,7 +118,7 @@ export function printIHMModels(model: Model) {
 }
 
 async function run(mmcif: mmCIF_Database) {
-    const models = Model.create({ kind: 'mmCIF', data: mmcif });
+    const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif }));
     const structure = Structure.ofModel(models[0]);
     printSequence(models[0]);
     printIHMModels(models[0]);
diff --git a/src/mol-model/structure/model/formats/mmcif.ts b/src/mol-model/structure/model/formats/mmcif.ts
index 3f68d54440d673ad55a30bd8b7e6fefec442df8d..d2a2338f386b8d5fd5c91c3f766f22f423097ed8 100644
--- a/src/mol-model/structure/model/formats/mmcif.ts
+++ b/src/mol-model/structure/model/formats/mmcif.ts
@@ -21,6 +21,7 @@ import { getIHMCoarse } from './mmcif/ihm';
 import { getSequence } from './mmcif/sequence';
 
 import mmCIF_Format = Format.mmCIF
+import { Task } from 'mol-task';
 
 function findModelBounds({ data }: mmCIF_Format, startIndex: number) {
     const num = data.atom_site.pdbx_PDB_model_num;
@@ -154,25 +155,27 @@ function createModel(format: mmCIF_Format, bounds: Interval, previous?: Model):
     };
 }
 
-function buildModels(format: mmCIF_Format): ReadonlyArray<Model> {
-    const atomCount = format.data.atom_site._rowCount;
-    const isIHM = format.data.ihm_model_list._rowCount > 0;
-
-    if (atomCount === 0) {
-        return isIHM
-            ? [createModel(format, Interval.Empty, void 0)]
-            : [];
-    }
-
-    const models: Model[] = [];
-    let modelStart = 0;
-    while (modelStart < atomCount) {
-        const bounds = findModelBounds(format, modelStart);
-        const model = createModel(format, bounds, models.length > 0 ? models[models.length - 1] : void 0);
-        models.push(model);
-        modelStart = Interval.end(bounds);
-    }
-    return models;
+function buildModels(format: mmCIF_Format): Task<ReadonlyArray<Model>> {
+    return Task.create('Create mmCIF Model', async ctx => {
+        const atomCount = format.data.atom_site._rowCount;
+        const isIHM = format.data.ihm_model_list._rowCount > 0;
+
+        if (atomCount === 0) {
+            return isIHM
+                ? [createModel(format, Interval.Empty, void 0)]
+                : [];
+        }
+
+        const models: Model[] = [];
+        let modelStart = 0;
+        while (modelStart < atomCount) {
+            const bounds = findModelBounds(format, modelStart);
+            const model = createModel(format, bounds, models.length > 0 ? models[models.length - 1] : void 0);
+            models.push(model);
+            modelStart = Interval.end(bounds);
+        }
+        return models;
+    });
 }
 
 export default buildModels;
\ No newline at end of file
diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts
index efe4e8bde3ba92dd75c98953f01ccc5ec4e3370a..93d7d4b1405311c7927f2704c637ad0a1ac8e66e 100644
--- a/src/mol-model/structure/structure/structure.ts
+++ b/src/mol-model/structure/structure/structure.ts
@@ -7,7 +7,7 @@
 import { IntMap, SortedArray, Iterator } from 'mol-data/int'
 import { UniqueArray } from 'mol-data/generic'
 import { SymmetryOperator } from 'mol-math/geometry/symmetry-operator'
-import { Model, Format } from '../model'
+import { Model } from '../model'
 import { sortArray, sort, arraySwap, hash1 } from 'mol-data/util';
 import Element from './element'
 import Unit from './unit'
@@ -85,11 +85,6 @@ namespace Structure {
 
     export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); }
 
-    export function ofData(format: Format) {
-        const models = Model.create(format);
-        return models.map(ofModel);
-    }
-
     export function ofModel(model: Model): Structure {
         const chains = model.atomicHierarchy.chainSegments;
         const builder = new StructureBuilder();
diff --git a/src/perf-tests/lookup3d.ts b/src/perf-tests/lookup3d.ts
index 3875a8c138aa79364204574cebb6b97d2c9a17b0..1245d80d4cf4f2509d15316fa9871aae83aa54e6 100644
--- a/src/perf-tests/lookup3d.ts
+++ b/src/perf-tests/lookup3d.ts
@@ -34,7 +34,7 @@ export async function readCIF(path: string) {
 
     const data = parsed.result.blocks[0];
     const mmcif = CIF.schema.mmCIF(data);
-    const models = Model.create({ kind: 'mmCIF', data: mmcif });
+    const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif }));
     const structures = models.map(Structure.ofModel);
 
     return { mmcif, models, structures };
diff --git a/src/perf-tests/structure.ts b/src/perf-tests/structure.ts
index 92831adec5440d24c6a0eee1e44491ccfca12211..e859ff78eb862628727f5d66f17d11a20195123e 100644
--- a/src/perf-tests/structure.ts
+++ b/src/perf-tests/structure.ts
@@ -74,7 +74,7 @@ export async function readCIF(path: string) {
 
     console.timeEnd('schema')
     console.time('buildModels')
-    const models = Model.create({ kind: 'mmCIF', data: mmcif });
+    const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif }));
     console.timeEnd('buildModels')
     const structures = models.map(Structure.ofModel);