diff --git a/src/mol-model/structure/structure.ts b/src/mol-model/structure/structure.ts
index c57bb2a47cb40b67ac59da9cd567439d728d49c7..44a299b2e5c3a9c41148e6298e8fc5488fb8c04d 100644
--- a/src/mol-model/structure/structure.ts
+++ b/src/mol-model/structure/structure.ts
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author David Sehnal <david.sehnal@gmail.com>
  */
@@ -8,5 +8,6 @@ import Element from './structure/element'
 import Structure from './structure/structure'
 import Unit from './structure/unit'
 import StructureSymmetry from './structure/symmetry'
+import { Bond } from './structure/unit/bonds'
 
-export { Element, Structure, Unit, StructureSymmetry }
\ No newline at end of file
+export { Element, Bond, Structure, Unit, StructureSymmetry }
\ No newline at end of file
diff --git a/src/mol-model/structure/structure/element.ts b/src/mol-model/structure/structure/element.ts
index 48e0307605f4516c66b8540c46f74fefb05340a2..270fdcdf764fa6ee1174c3b539f57243c300a997 100644
--- a/src/mol-model/structure/structure/element.ts
+++ b/src/mol-model/structure/structure/element.ts
@@ -24,7 +24,7 @@ namespace Element {
 
     /** All the information required to access element properties */
     export interface Location { unit: Unit, element: number }
-    export function Location(): Location { return { unit: {} as any, element: 0 }; }
+    export function Location(unit?: Unit, element?: number): Location { return { unit: unit as any, element: element || 0 }; }
     export interface Property<T> { (location: Location): T }
     export interface Predicate extends Property<boolean> { }
 
@@ -37,7 +37,18 @@ namespace Element {
     export function property<T>(p: Property<T>) { return p; }
 
     /** Represents multiple element locations */
-    export type Loci = ReadonlyArray<{ unit: Unit, elements: SortedArray }>
+    export interface Loci {
+        readonly kind: 'element-loci',
+        readonly elements: ReadonlyArray<{ unit: Unit, elements: SortedArray }>
+    }
+
+    export function Loci(elements: ArrayLike<{ unit: Unit, elements: SortedArray }>): Loci {
+        return { kind: 'element-loci', elements: elements as Loci['elements'] };
+    }
+
+    export function isLoci(x: any): x is Loci {
+        return !!x && x.kind === 'element-loci';
+    }
 }
 
 export default Element
\ No newline at end of file
diff --git a/src/mol-model/structure/structure/unit/bonds.ts b/src/mol-model/structure/structure/unit/bonds.ts
index 6316c3eebbdd5a53cc1c3a9b8fd85c6a6cf4dd15..73b6ff8d67893590bf5babc999bd04fd60c9118d 100644
--- a/src/mol-model/structure/structure/unit/bonds.ts
+++ b/src/mol-model/structure/structure/unit/bonds.ts
@@ -4,5 +4,29 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
+import { Element } from '../../structure'
+
 export * from './bonds/intra-data'
-export * from './bonds/intra-compute'
\ No newline at end of file
+export * from './bonds/intra-compute'
+
+interface Bond {
+    readonly a: Readonly<Element.Location>,
+    readonly b: Readonly<Element.Location>
+}
+
+namespace Bond {
+    export interface Loci {
+        readonly kind: 'bond-loci',
+        readonly bonds: ReadonlyArray<Bond>
+    }
+
+    export function Loci(bonds: ArrayLike<Bond>): Loci {
+        return { kind: 'bond-loci', bonds: bonds as Loci['bonds'] };
+    }
+
+    export function isLoci(x: any): x is Loci {
+        return !!x && x.kind === 'bond-loci';
+    }
+}
+
+export { Bond }
\ No newline at end of file