diff --git a/src/collection.rs b/src/collection.rs
new file mode 100644
index 0000000000000000000000000000000000000000..aa7f7e0517220e8d255b33a284d8e664d0b195ec
--- /dev/null
+++ b/src/collection.rs
@@ -0,0 +1,30 @@
+use collections::Vec;
+
+use system::error::Result;
+
+use super::{ExNode, FileSystem, Node};
+
+/// A collection of a Node and its associated ExNodes
+pub struct Collection {
+    pub node: (u64, Node),
+    pub ex_nodes: Vec<(u64, ExNode)>
+}
+
+impl Collection {
+    pub fn load(fs: &mut FileSystem, block: u64) -> Result<Collection> {
+        let node = try!(fs.node(block));
+
+        let mut next = node.1.next;
+        let mut ex_nodes = Vec::new();
+        while next > 0 {
+            let ex_node = try!(fs.ex_node(next));
+            next = ex_node.1.next;
+            ex_nodes.push(ex_node);
+        }
+
+        Ok(Collection {
+            node: node,
+            ex_nodes: ex_nodes,
+        })
+    }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 03b5667f0400de9a6775c6150ca4dc3cad1970d1..9e3d93401b035e0b73f1ab6e18b2536b1febee8e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -15,6 +15,7 @@ extern crate collections;
 
 extern crate system;
 
+pub use self::collection::Collection;
 pub use self::disk::Disk;
 pub use self::ex_node::ExNode;
 pub use self::extent::Extent;
@@ -22,6 +23,7 @@ pub use self::filesystem::FileSystem;
 pub use self::header::Header;
 pub use self::node::Node;
 
+pub mod collection;
 pub mod disk;
 pub mod ex_node;
 pub mod extent;