diff --git a/src/mol-model/structure/_spec/atom-set.spec.ts b/src/mol-model/structure/_spec/atom-set.spec.ts
index 5489a9a4fb0afbd8381a024b03f5a673de253dcd..797ef623ad856884370d46b091a870399b046474 100644
--- a/src/mol-model/structure/_spec/atom-set.spec.ts
+++ b/src/mol-model/structure/_spec/atom-set.spec.ts
@@ -49,8 +49,8 @@ describe('atom set', () => {
     it('template', () => {
         const template = AtomSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], AtomSet.Empty)
         const gen = AtomSet.TemplateGenerator(template);
-        gen.add(0, AtomGroup.createNew(OrderedSet.ofSortedArray([1, 2, 6])));
-        gen.add(1, AtomGroup.createNew(OrderedSet.ofSingleton(3)));
+        gen.add(0, OrderedSet.ofSortedArray([1, 2, 6]));
+        gen.add(1, OrderedSet.ofSingleton(3));
         const set = gen.getSet();
 
         expect(AtomSet.unitGetById(set, 0)).toBe(AtomSet.unitGetById(template, 0));
@@ -61,8 +61,8 @@ describe('atom set', () => {
     it('template 1', () => {
         const template = AtomSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], AtomSet.Empty)
         const gen = AtomSet.TemplateGenerator(template);
-        gen.add(0, AtomGroup.createNew(OrderedSet.ofSortedArray([1, 2, 6])));
-        gen.add(1, AtomGroup.createNew(OrderedSet.ofSingleton(4)));
+        gen.add(0, OrderedSet.ofSortedArray([1, 2, 6]));
+        gen.add(1, OrderedSet.ofSingleton(4));
         const set = gen.getSet();
 
         expect(AtomSet.unitGetById(set, 0)).toBe(AtomSet.unitGetById(template, 0));
diff --git a/src/mol-model/structure/structure/atom/impl/builder.ts b/src/mol-model/structure/structure/atom/impl/set-builder.ts
similarity index 78%
rename from src/mol-model/structure/structure/atom/impl/builder.ts
rename to src/mol-model/structure/structure/atom/impl/set-builder.ts
index ca98139142b508c2f0df5a2ecb203d5ba591ac5e..84c754775dbe0e14ef82ba78c1636b53d88051ce 100644
--- a/src/mol-model/structure/structure/atom/impl/builder.ts
+++ b/src/mol-model/structure/structure/atom/impl/set-builder.ts
@@ -6,7 +6,6 @@
 
 import AtomSet from '../set'
 import Atom from '../../atom'
-import AtomGroup from '../group'
 import { OrderedSet, IntMap } from 'mol-data/int'
 import { sortArray } from 'mol-data/util/sort'
 
@@ -36,22 +35,17 @@ export class Builder {
     }
 
     getSet(): AtomSet {
-        const generator = AtomSet.Generator();
-
-        let allEqual = this.keys.length === AtomSet.unitCount(this.parent);
+        const generator = AtomSet.TemplateGenerator(this.parent);
 
         for (let i = 0, _i = this.keys.length; i < _i; i++) {
             const k = this.keys[i];
             const unit = this.units.get(k);
             const l = unit.length;
             if (!this.sorted && l > 1) sortArray(unit);
-
-            const parentGroup = AtomSet.unitGetById(this.parent, k);
-            const group = AtomGroup.createChild(parentGroup, OrderedSet.ofSortedArray(unit));
-            if (group !== parentGroup) allEqual = false;
-            generator.add(k, group);
+            generator.add(k, OrderedSet.ofSortedArray(unit));
         }
-        return allEqual ? this.parent : generator.getSet();
+
+        return generator.getSet();
     }
 
     singleton(): Atom {
diff --git a/src/mol-model/structure/structure/atom/impl/set.ts b/src/mol-model/structure/structure/atom/impl/set.ts
index 34ec544afa3b1005a02b0cbeb592cdacf5eadd5d..5919b327c49b05872608f42cb375f4623cb222ca 100644
--- a/src/mol-model/structure/structure/atom/impl/set.ts
+++ b/src/mol-model/structure/structure/atom/impl/set.ts
@@ -215,15 +215,19 @@ export class TemplateAtomSetGenerator {
     private templateGroups: IntMap<AtomGroup>;
     private equalGroups = 0;
 
-    add(unit: number, group: AtomGroup) {
-        if (AtomGroup.size(group) === 0) return;
+    add(unit: number, set: OS) {
+        if (OS.size(set) === 0) return;
         this.keys[this.keys.length] = unit;
-        let t: AtomGroup;
-        if (this.templateGroups.has(unit) && AtomGroup.areEqual(t = this.templateGroups.get(unit), group)) {
-            this.groups.set(unit, t);
-            this.equalGroups++;
+        if (this.templateGroups.has(unit)) {
+            const t = this.templateGroups.get(unit);
+            if (OS.areEqual(t.atoms, set)) {
+                this.groups.set(unit, t);
+                this.equalGroups++;
+            } else {
+                this.groups.set(unit, AtomGroup.createNew(set));
+            }
         } else {
-            this.groups.set(unit, group);
+            this.groups.set(unit, AtomGroup.createNew(set));
         }
     }
 
@@ -348,8 +352,7 @@ function ofAtomsImpl(xs: ArrayLike<Atom>, template: AtomSetImpl) {
     const generator = TemplateGenerator(template);
     for (let i = 0, _i = keys.length; i < _i; i++) {
         const k = keys[i];
-        const group = AtomGroup.createNew(OS.ofSortedArray(normalizeArray(elements.get(k))));
-        generator.add(k, group);
+        generator.add(k, OS.ofSortedArray(normalizeArray(elements.get(k))));
     }
 
     return generator.getSet();
diff --git a/src/mol-model/structure/structure/atom/set.ts b/src/mol-model/structure/structure/atom/set.ts
index 2d675f3f6aba8ac81a418bdfa7b056adff3acaeb..2c30cec4435d9346d73e26fa521172aacb959189 100644
--- a/src/mol-model/structure/structure/atom/set.ts
+++ b/src/mol-model/structure/structure/atom/set.ts
@@ -4,11 +4,11 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
-import { SortedArray, Iterator } from 'mol-data/int'
+import { SortedArray, Iterator, OrderedSet } from 'mol-data/int'
 import Atom from '../atom'
 import AtomGroup from './group'
 import * as Impl from './impl/set'
-import * as Builders from './impl/builder'
+import * as Builders from './impl/set-builder'
 
 /** A map-like representation of grouped atom set */
 namespace AtomSet {
@@ -44,7 +44,9 @@ namespace AtomSet {
 
     export interface Generator { add(unit: number, set: AtomGroup): void, getSet(): AtomSet }
     export const Generator: () => Generator = Impl.Generator as any
-    export const TemplateGenerator: (template: AtomSet) => Generator = Impl.TemplateGenerator as any
+
+    export interface TemplateGenerator { add(unit: number, set: OrderedSet): void, getSet(): AtomSet }
+    export const TemplateGenerator: (template: AtomSet) => TemplateGenerator = Impl.TemplateGenerator as any
 
     // TODO: bounding sphere
     // TODO: distance, areWithIn?