diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..c3b4793
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,4 @@
+# 0.0.6
+
+* Fixed broken podspec
+* Fixed simply analyzer warning
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a9cb168
--- /dev/null
+++ b/README.md
@@ -0,0 +1,85 @@
+# StoreMad
+
+StoreMad is a collection of helpful categories and controllers that encourage a healthy relationship with Core Data. Your best bet it to sit down and learn Core Data, as you will be way better off in the long term. At the very least, there are some patterns that you may find helpful here.
+
+# Store Controller
+
+The SMStoreController is the main controller you use to add Core Data to your app. Instantiate a new SMStoreController which points to your sqlite store URL and momd URL.
+
+```objective-c
+#import <StoreMad/StoreMad.h>
+
+- (SMStoreController *)storeController
+{
+    if (_storeController) return _storeController;
+
+    // sqlite
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    NSURL *applicationDocDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
+    NSURL *storeURL = [applicationDocDirectory URLByAppendingPathComponent:@"StoreMadApp.sqlite"];
+
+    // momd
+    NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"StoreMadApp" withExtension:@"momd"];
+    
+    // controller
+    SMStoreController *newStoreController = [SMStoreController storeControllerWithStoreURL:storeURL
+                                                                               andModelURL:modelURL];
+    
+    //
+    // Context saves when app changes state
+    //
+    [newStoreController shouldSaveOnAppStateChanges:YES];
+  
+    _storeController = newStoreController;
+  
+    return _storeController;
+}
+```
+
+## SMContextObserverController
+
+This controller is intended to be used much the same way that you interact with `NSNotificationCenter`. An `NSManagedObjectContext` emits various notifications when it performs inserts, updates, and deletes. Using `SMContextObserverController`,  you can run a block on an object or set of objects of interest. This is an essential Core Data pattern for updating your UI, and decoupling your data and UI later.
+
+## Observe an Object
+
+Here is a simple pattern for observing changes to an NSManagedObject. Note that whenever you add an observer, you must remove it when finished, just like NSNotificationCenter.
+
+```objective-c
+#import <StoreMad/StoreMad.h>
+
+@interface MyViewController ()
+
+@property (nonatomic, strong) id observer;
+
+@property (nonatomic, weak) IBOutlet UILabel *employmentStatusLabel;
+
+@end
+
+@implementation MyViewController
+
+- (void)dealloc
+{
+	[[SMContextObserverController defaultController] removeContextObserver:self.observer];
+}
+
+- (void)viewDidLoad
+{
+	[super viewDidLoad];
+	
+    Employee *employee = [Employee createInContext:context];
+    
+    __weak MyViewController *weakSelf = self;
+    self.observer = [[SMContextObserverController defaultController] addContextObserverForChangesToObject:employee
+                                                                                                workBlock:^(NSManagedObject *object) {
+                                                                                                    [weakSelf configureWithEmployee:object];
+                                                                                                }];
+}
+
+- (void)configureWithEmployee:(Employee *)employee
+{
+    _employmentStatusLabel.text = employee.isFired ? @"Fired" : "Hired";
+}
+
+@end
+```
+
diff --git a/StoreMad.podspec b/StoreMad.podspec
new file mode 100644
index 0000000..e98a8ba
--- /dev/null
+++ b/StoreMad.podspec
@@ -0,0 +1,20 @@
+Pod::Spec.new do |s|
+  s.name         = 'StoreMad'
+  s.version      = '0.0.6'
+  s.summary      = 'A collection of helpful categories and controllers that encourage a healthy relationship with Core Data'
+  s.license      = 'MIT'
+  s.author       = { 
+    'Andrew Smith' => 'drewsmits@gmail.com'
+  }
+  s.social_media_url = 'http://twitter.com/drewsmits'
+  s.requires_arc = true
+  s.platform     = :ios, '7.0'
+  s.source       = { 
+    :git => 'ssh://git@stash.nestlabs.com:7999/clients/storemad.git', 
+    :tag => s.version.to_s
+  }
+  s.homepage = 'http://github.com/Drewsmits/StoreMad'
+  s.source_files  = 'StoreMad/*.{h,m}'
+  s.public_header_files = 'StoreMad/*.h'
+  s.frameworks = 'CoreData', 'Foundation'
+end
diff --git a/StoreMad.xcodeproj/project.pbxproj b/StoreMad.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..15020d6
--- /dev/null
+++ b/StoreMad.xcodeproj/project.pbxproj
@@ -0,0 +1,556 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		889B8B051888CFFA0099C1A3 /* SMCollectionViewDataSource.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB1F446B16D94D530017B23D /* SMCollectionViewDataSource.h */; };
+		889B8B061888CFFA0099C1A3 /* SMDataSource.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB7273D41781D39E00CE5D7E /* SMDataSource.h */; };
+		889B8B071888CFFA0099C1A3 /* SMTableViewDataSource.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB7BF647161E2E0400EAAE5E /* SMTableViewDataSource.h */; };
+		889B8B081888CFFA0099C1A3 /* NSManagedObject+StoreMad.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB0DE55015B9CCEE007F382F /* NSManagedObject+StoreMad.h */; };
+		889B8B091888CFFA0099C1A3 /* NSManagedObjectContext+StoreMad.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB0DE55415B9CE1A007F382F /* NSManagedObjectContext+StoreMad.h */; };
+		889B8B0B1888CFFA0099C1A3 /* SMStoreController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB0DE4E415B9BDC6007F382F /* SMStoreController.h */; };
+		889B8B0C1888CFFA0099C1A3 /* StoreMad.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DB83D02016F516F000D6A980 /* StoreMad.h */; };
+		889D834A18D27546006EE54D /* SMContextObserverController.m in Sources */ = {isa = PBXBuildFile; fileRef = 889D834918D27546006EE54D /* SMContextObserverController.m */; };
+		889D835918D27F45006EE54D /* SMContextObserverControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 889D835818D27F45006EE54D /* SMContextObserverControllerTests.m */; };
+		889D835B18D37242006EE54D /* SMContextObserverController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 889D834818D27546006EE54D /* SMContextObserverController.h */; };
+		88C3B13818CF9F16007E89A0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C3B13718CF9F16007E89A0 /* UIKit.framework */; };
+		88C3B13A18CF9F20007E89A0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C3B13918CF9F20007E89A0 /* XCTest.framework */; };
+		88EDD9C8180E21B80085463D /* SMStoreControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88EDD9C7180E21B80085463D /* SMStoreControllerTests.m */; };
+		DB0DE4A415B9BB5F007F382F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB0DE4A315B9BB5F007F382F /* Foundation.framework */; };
+		DB0DE4B515B9BB5F007F382F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB0DE4A315B9BB5F007F382F /* Foundation.framework */; };
+		DB0DE4B815B9BB5F007F382F /* libStoreMad.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DB0DE4A015B9BB5F007F382F /* libStoreMad.a */; };
+		DB0DE4BE15B9BB60007F382F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB0DE4BC15B9BB60007F382F /* InfoPlist.strings */; };
+		DB0DE4E715B9BDC6007F382F /* SMStoreController.m in Sources */ = {isa = PBXBuildFile; fileRef = DB0DE4E515B9BDC6007F382F /* SMStoreController.m */; };
+		DB0DE4E915B9BDD4007F382F /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB0DE4E815B9BDD4007F382F /* CoreData.framework */; };
+		DB0DE55315B9CCEF007F382F /* NSManagedObject+StoreMad.m in Sources */ = {isa = PBXBuildFile; fileRef = DB0DE55115B9CCEF007F382F /* NSManagedObject+StoreMad.m */; };
+		DB0DE55715B9CE1B007F382F /* NSManagedObjectContext+StoreMad.m in Sources */ = {isa = PBXBuildFile; fileRef = DB0DE55515B9CE1A007F382F /* NSManagedObjectContext+StoreMad.m */; };
+		DB1F446E16D94D530017B23D /* SMCollectionViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = DB1F446C16D94D530017B23D /* SMCollectionViewDataSource.m */; };
+		DB7273D71781D39E00CE5D7E /* SMDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273D51781D39E00CE5D7E /* SMDataSource.m */; };
+		DB7BF64A161E2E0400EAAE5E /* SMTableViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7BF648161E2E0400EAAE5E /* SMTableViewDataSource.m */; };
+		DB9A837D16165FE000910CEB /* StoreMadObjectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DB9A837C16165FE000910CEB /* StoreMadObjectTests.m */; };
+		DB9A83811616609A00910CEB /* Employee.m in Sources */ = {isa = PBXBuildFile; fileRef = DB9A83801616609A00910CEB /* Employee.m */; };
+		DB9D043A15DC082D0035FC30 /* StoreMadBaseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DB9D043915DC082D0035FC30 /* StoreMadBaseTest.m */; };
+		DB9D043E15DC0B290035FC30 /* StoreMadTests.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DB9D043C15DC0B290035FC30 /* StoreMadTests.xcdatamodeld */; };
+		DB9D044115DC0DD70035FC30 /* StoreMadContextTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DB9D044015DC0DD70035FC30 /* StoreMadContextTests.m */; };
+		DB9D044215DC0E300035FC30 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB0DE4E815B9BDD4007F382F /* CoreData.framework */; };
+		DBBF6015177F9B22008694F1 /* Department.m in Sources */ = {isa = PBXBuildFile; fileRef = DBBF6014177F9B22008694F1 /* Department.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		DB0DE4B615B9BB5F007F382F /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = DB0DE49715B9BB5F007F382F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = DB0DE49F15B9BB5F007F382F;
+			remoteInfo = StoreMad;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		889B8B041888CFE10099C1A3 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "include/$(PRODUCT_NAME)";
+			dstSubfolderSpec = 16;
+			files = (
+				889D835B18D37242006EE54D /* SMContextObserverController.h in CopyFiles */,
+				889B8B051888CFFA0099C1A3 /* SMCollectionViewDataSource.h in CopyFiles */,
+				889B8B061888CFFA0099C1A3 /* SMDataSource.h in CopyFiles */,
+				889B8B071888CFFA0099C1A3 /* SMTableViewDataSource.h in CopyFiles */,
+				889B8B081888CFFA0099C1A3 /* NSManagedObject+StoreMad.h in CopyFiles */,
+				889B8B091888CFFA0099C1A3 /* NSManagedObjectContext+StoreMad.h in CopyFiles */,
+				889B8B0B1888CFFA0099C1A3 /* SMStoreController.h in CopyFiles */,
+				889B8B0C1888CFFA0099C1A3 /* StoreMad.h in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		889D834818D27546006EE54D /* SMContextObserverController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMContextObserverController.h; sourceTree = "<group>"; };
+		889D834918D27546006EE54D /* SMContextObserverController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMContextObserverController.m; sourceTree = "<group>"; };
+		889D835818D27F45006EE54D /* SMContextObserverControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMContextObserverControllerTests.m; sourceTree = "<group>"; };
+		88C3B13718CF9F16007E89A0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		88C3B13918CF9F20007E89A0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+		88EDD9C7180E21B80085463D /* SMStoreControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMStoreControllerTests.m; sourceTree = "<group>"; };
+		DB0DE4A015B9BB5F007F382F /* libStoreMad.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStoreMad.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		DB0DE4A315B9BB5F007F382F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		DB0DE4A715B9BB5F007F382F /* StoreMad-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StoreMad-Prefix.pch"; sourceTree = "<group>"; };
+		DB0DE4B015B9BB5F007F382F /* StoreMadTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StoreMadTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		DB0DE4B315B9BB5F007F382F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+		DB0DE4BB15B9BB5F007F382F /* StoreMadTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "StoreMadTests-Info.plist"; sourceTree = "<group>"; };
+		DB0DE4BD15B9BB60007F382F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DB0DE4E415B9BDC6007F382F /* SMStoreController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMStoreController.h; sourceTree = "<group>"; };
+		DB0DE4E515B9BDC6007F382F /* SMStoreController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMStoreController.m; sourceTree = "<group>"; };
+		DB0DE4E815B9BDD4007F382F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+		DB0DE55015B9CCEE007F382F /* NSManagedObject+StoreMad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+StoreMad.h"; sourceTree = "<group>"; };
+		DB0DE55115B9CCEF007F382F /* NSManagedObject+StoreMad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+StoreMad.m"; sourceTree = "<group>"; };
+		DB0DE55415B9CE1A007F382F /* NSManagedObjectContext+StoreMad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectContext+StoreMad.h"; sourceTree = "<group>"; };
+		DB0DE55515B9CE1A007F382F /* NSManagedObjectContext+StoreMad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectContext+StoreMad.m"; sourceTree = "<group>"; };
+		DB1F446B16D94D530017B23D /* SMCollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMCollectionViewDataSource.h; sourceTree = "<group>"; };
+		DB1F446C16D94D530017B23D /* SMCollectionViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMCollectionViewDataSource.m; sourceTree = "<group>"; };
+		DB7273D41781D39E00CE5D7E /* SMDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMDataSource.h; sourceTree = "<group>"; };
+		DB7273D51781D39E00CE5D7E /* SMDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMDataSource.m; sourceTree = "<group>"; };
+		DB7BF647161E2E0400EAAE5E /* SMTableViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMTableViewDataSource.h; sourceTree = "<group>"; };
+		DB7BF648161E2E0400EAAE5E /* SMTableViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SMTableViewDataSource.m; sourceTree = "<group>"; };
+		DB83D02016F516F000D6A980 /* StoreMad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoreMad.h; sourceTree = "<group>"; };
+		DB9A837C16165FE000910CEB /* StoreMadObjectTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoreMadObjectTests.m; sourceTree = "<group>"; };
+		DB9A837F1616609A00910CEB /* Employee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Employee.h; sourceTree = "<group>"; };
+		DB9A83801616609A00910CEB /* Employee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Employee.m; sourceTree = "<group>"; };
+		DB9D043815DC082D0035FC30 /* StoreMadBaseTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoreMadBaseTest.h; sourceTree = "<group>"; };
+		DB9D043915DC082D0035FC30 /* StoreMadBaseTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoreMadBaseTest.m; sourceTree = "<group>"; };
+		DB9D043D15DC0B290035FC30 /* StoreMadTests.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = StoreMadTests.xcdatamodel; sourceTree = "<group>"; };
+		DB9D044015DC0DD70035FC30 /* StoreMadContextTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoreMadContextTests.m; sourceTree = "<group>"; };
+		DBBF6013177F9B22008694F1 /* Department.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Department.h; sourceTree = "<group>"; };
+		DBBF6014177F9B22008694F1 /* Department.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Department.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		DB0DE49D15B9BB5F007F382F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DB0DE4E915B9BDD4007F382F /* CoreData.framework in Frameworks */,
+				DB0DE4A415B9BB5F007F382F /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		DB0DE4AC15B9BB5F007F382F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				88C3B13A18CF9F20007E89A0 /* XCTest.framework in Frameworks */,
+				88C3B13818CF9F16007E89A0 /* UIKit.framework in Frameworks */,
+				DB0DE4B515B9BB5F007F382F /* Foundation.framework in Frameworks */,
+				DB9D044215DC0E300035FC30 /* CoreData.framework in Frameworks */,
+				DB0DE4B815B9BB5F007F382F /* libStoreMad.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		DB0DE49515B9BB5F007F382F = {
+			isa = PBXGroup;
+			children = (
+				DB0DE4A515B9BB5F007F382F /* StoreMad */,
+				DB0DE4B915B9BB5F007F382F /* StoreMadTests */,
+				DB0DE4A215B9BB5F007F382F /* Frameworks */,
+				DB0DE4A115B9BB5F007F382F /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		DB0DE4A115B9BB5F007F382F /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				DB0DE4A015B9BB5F007F382F /* libStoreMad.a */,
+				DB0DE4B015B9BB5F007F382F /* StoreMadTests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		DB0DE4A215B9BB5F007F382F /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				88C3B13918CF9F20007E89A0 /* XCTest.framework */,
+				88C3B13718CF9F16007E89A0 /* UIKit.framework */,
+				DB0DE4E815B9BDD4007F382F /* CoreData.framework */,
+				DB0DE4A315B9BB5F007F382F /* Foundation.framework */,
+				DB0DE4B315B9BB5F007F382F /* UIKit.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		DB0DE4A515B9BB5F007F382F /* StoreMad */ = {
+			isa = PBXGroup;
+			children = (
+				DB9C002217B6FC0300F6042D /* Data Source */,
+				DB0DE55015B9CCEE007F382F /* NSManagedObject+StoreMad.h */,
+				DB0DE55115B9CCEF007F382F /* NSManagedObject+StoreMad.m */,
+				DB0DE55415B9CE1A007F382F /* NSManagedObjectContext+StoreMad.h */,
+				DB0DE55515B9CE1A007F382F /* NSManagedObjectContext+StoreMad.m */,
+				889D834818D27546006EE54D /* SMContextObserverController.h */,
+				889D834918D27546006EE54D /* SMContextObserverController.m */,
+				DB0DE4E415B9BDC6007F382F /* SMStoreController.h */,
+				DB0DE4E515B9BDC6007F382F /* SMStoreController.m */,
+				DB83D02016F516F000D6A980 /* StoreMad.h */,
+				DB0DE4A615B9BB5F007F382F /* Supporting Files */,
+			);
+			path = StoreMad;
+			sourceTree = "<group>";
+		};
+		DB0DE4A615B9BB5F007F382F /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				DB0DE4A715B9BB5F007F382F /* StoreMad-Prefix.pch */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		DB0DE4B915B9BB5F007F382F /* StoreMadTests */ = {
+			isa = PBXGroup;
+			children = (
+				889D835818D27F45006EE54D /* SMContextObserverControllerTests.m */,
+				88EDD9C7180E21B80085463D /* SMStoreControllerTests.m */,
+				DB9D043815DC082D0035FC30 /* StoreMadBaseTest.h */,
+				DB9D043915DC082D0035FC30 /* StoreMadBaseTest.m */,
+				DB9D044015DC0DD70035FC30 /* StoreMadContextTests.m */,
+				DB9A837C16165FE000910CEB /* StoreMadObjectTests.m */,
+				DB9D043C15DC0B290035FC30 /* StoreMadTests.xcdatamodeld */,
+				DB0DE4BA15B9BB5F007F382F /* Supporting Files */,
+				DB9A837E1616607000910CEB /* Test Classes */,
+			);
+			path = StoreMadTests;
+			sourceTree = "<group>";
+		};
+		DB0DE4BA15B9BB5F007F382F /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				DB0DE4BB15B9BB5F007F382F /* StoreMadTests-Info.plist */,
+				DB0DE4BC15B9BB60007F382F /* InfoPlist.strings */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		DB9A837E1616607000910CEB /* Test Classes */ = {
+			isa = PBXGroup;
+			children = (
+				DBBF6013177F9B22008694F1 /* Department.h */,
+				DBBF6014177F9B22008694F1 /* Department.m */,
+				DB9A837F1616609A00910CEB /* Employee.h */,
+				DB9A83801616609A00910CEB /* Employee.m */,
+			);
+			name = "Test Classes";
+			sourceTree = "<group>";
+		};
+		DB9C002217B6FC0300F6042D /* Data Source */ = {
+			isa = PBXGroup;
+			children = (
+				DB1F446B16D94D530017B23D /* SMCollectionViewDataSource.h */,
+				DB1F446C16D94D530017B23D /* SMCollectionViewDataSource.m */,
+				DB7273D41781D39E00CE5D7E /* SMDataSource.h */,
+				DB7273D51781D39E00CE5D7E /* SMDataSource.m */,
+				DB7BF647161E2E0400EAAE5E /* SMTableViewDataSource.h */,
+				DB7BF648161E2E0400EAAE5E /* SMTableViewDataSource.m */,
+			);
+			name = "Data Source";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		DB0DE49F15B9BB5F007F382F /* StoreMad */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = DB0DE4C415B9BB60007F382F /* Build configuration list for PBXNativeTarget "StoreMad" */;
+			buildPhases = (
+				DB0DE49C15B9BB5F007F382F /* Sources */,
+				DB0DE49D15B9BB5F007F382F /* Frameworks */,
+				889B8B041888CFE10099C1A3 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = StoreMad;
+			productName = StoreMad;
+			productReference = DB0DE4A015B9BB5F007F382F /* libStoreMad.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		DB0DE4AF15B9BB5F007F382F /* StoreMadTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = DB0DE4C715B9BB60007F382F /* Build configuration list for PBXNativeTarget "StoreMadTests" */;
+			buildPhases = (
+				DB0DE4AB15B9BB5F007F382F /* Sources */,
+				DB0DE4AC15B9BB5F007F382F /* Frameworks */,
+				DB0DE4AD15B9BB5F007F382F /* Resources */,
+				DB0DE4AE15B9BB5F007F382F /* ShellScript */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				DB0DE4B715B9BB5F007F382F /* PBXTargetDependency */,
+			);
+			name = StoreMadTests;
+			productName = StoreMadTests;
+			productReference = DB0DE4B015B9BB5F007F382F /* StoreMadTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		DB0DE49715B9BB5F007F382F /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastTestingUpgradeCheck = 0510;
+				LastUpgradeCheck = 0600;
+				ORGANIZATIONNAME = eGraphs;
+			};
+			buildConfigurationList = DB0DE49A15B9BB5F007F382F /* Build configuration list for PBXProject "StoreMad" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = DB0DE49515B9BB5F007F382F;
+			productRefGroup = DB0DE4A115B9BB5F007F382F /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				DB0DE49F15B9BB5F007F382F /* StoreMad */,
+				DB0DE4AF15B9BB5F007F382F /* StoreMadTests */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		DB0DE4AD15B9BB5F007F382F /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DB0DE4BE15B9BB60007F382F /* InfoPlist.strings in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		DB0DE4AE15B9BB5F007F382F /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		DB0DE49C15B9BB5F007F382F /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DB0DE4E715B9BDC6007F382F /* SMStoreController.m in Sources */,
+				889D834A18D27546006EE54D /* SMContextObserverController.m in Sources */,
+				DB0DE55315B9CCEF007F382F /* NSManagedObject+StoreMad.m in Sources */,
+				DB0DE55715B9CE1B007F382F /* NSManagedObjectContext+StoreMad.m in Sources */,
+				DB7BF64A161E2E0400EAAE5E /* SMTableViewDataSource.m in Sources */,
+				DB1F446E16D94D530017B23D /* SMCollectionViewDataSource.m in Sources */,
+				DB7273D71781D39E00CE5D7E /* SMDataSource.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		DB0DE4AB15B9BB5F007F382F /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DB9D043A15DC082D0035FC30 /* StoreMadBaseTest.m in Sources */,
+				889D835918D27F45006EE54D /* SMContextObserverControllerTests.m in Sources */,
+				DB9D043E15DC0B290035FC30 /* StoreMadTests.xcdatamodeld in Sources */,
+				DB9D044115DC0DD70035FC30 /* StoreMadContextTests.m in Sources */,
+				DB9A837D16165FE000910CEB /* StoreMadObjectTests.m in Sources */,
+				DB9A83811616609A00910CEB /* Employee.m in Sources */,
+				DBBF6015177F9B22008694F1 /* Department.m in Sources */,
+				88EDD9C8180E21B80085463D /* SMStoreControllerTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		DB0DE4B715B9BB5F007F382F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = DB0DE49F15B9BB5F007F382F /* StoreMad */;
+			targetProxy = DB0DE4B615B9BB5F007F382F /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		DB0DE4BC15B9BB60007F382F /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				DB0DE4BD15B9BB60007F382F /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		DB0DE4C215B9BB60007F382F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		DB0DE4C315B9BB60007F382F /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = YES;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		DB0DE4C515B9BB60007F382F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = YES;
+				DSTROOT = /tmp/StoreMad.dst;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMad/StoreMad-Prefix.pch";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SKIP_INSTALL = YES;
+			};
+			name = Debug;
+		};
+		DB0DE4C615B9BB60007F382F /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = YES;
+				DSTROOT = /tmp/StoreMad.dst;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMad/StoreMad-Prefix.pch";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SKIP_INSTALL = YES;
+			};
+			name = Release;
+		};
+		DB0DE4C815B9BB60007F382F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)/Developer/Library/Frameworks",
+					"$(inherited)",
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
+				);
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMad/StoreMad-Prefix.pch";
+				INFOPLIST_FILE = "StoreMadTests/StoreMadTests-Info.plist";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		DB0DE4C915B9BB60007F382F /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(SDKROOT)/Developer/Library/Frameworks",
+					"$(inherited)",
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
+				);
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMad/StoreMad-Prefix.pch";
+				INFOPLIST_FILE = "StoreMadTests/StoreMadTests-Info.plist";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		DB0DE49A15B9BB5F007F382F /* Build configuration list for PBXProject "StoreMad" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DB0DE4C215B9BB60007F382F /* Debug */,
+				DB0DE4C315B9BB60007F382F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		DB0DE4C415B9BB60007F382F /* Build configuration list for PBXNativeTarget "StoreMad" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DB0DE4C515B9BB60007F382F /* Debug */,
+				DB0DE4C615B9BB60007F382F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		DB0DE4C715B9BB60007F382F /* Build configuration list for PBXNativeTarget "StoreMadTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DB0DE4C815B9BB60007F382F /* Debug */,
+				DB0DE4C915B9BB60007F382F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+
+/* Begin XCVersionGroup section */
+		DB9D043C15DC0B290035FC30 /* StoreMadTests.xcdatamodeld */ = {
+			isa = XCVersionGroup;
+			children = (
+				DB9D043D15DC0B290035FC30 /* StoreMadTests.xcdatamodel */,
+			);
+			currentVersion = DB9D043D15DC0B290035FC30 /* StoreMadTests.xcdatamodel */;
+			path = StoreMadTests.xcdatamodeld;
+			sourceTree = "<group>";
+			versionGroupType = wrapper.xcdatamodel;
+		};
+/* End XCVersionGroup section */
+	};
+	rootObject = DB0DE49715B9BB5F007F382F /* Project object */;
+}
diff --git a/StoreMad/NSManagedObject+StoreMad.h b/StoreMad/NSManagedObject+StoreMad.h
new file mode 100644
index 0000000..7987144
--- /dev/null
+++ b/StoreMad/NSManagedObject+StoreMad.h
@@ -0,0 +1,64 @@
+//
+//  NSManagedObject+StoreMad.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// FAD = "From Apple Docs"
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+@interface NSManagedObject (StoreMad)
+
+/**
+ Shortcut to the objects URI.
+ 
+ FAD: "An NSURL object containing a URI that provides an archiveable reference to the
+ object which the receiver represents."
+ */
+@property (nonatomic, readonly) NSURL *stm_objectURI;
+
+/**
+ Sometimes CoreData will fault a particular instance, while there is still
+ the same object in the store.  This also checks to see if there is a clone.
+ 
+ FAD: "The method (isDeleted) returns YES if Core Data will ask the persistent store to delete
+ the object during the next save operation. It may return NO at other times,
+ particularly after the object has been deleted. The immediacy with which
+ it will stop returning YES depends on where the object is in the process of being deleted."
+ */
+@property (nonatomic, readonly) BOOL stm_hasBeenDeleted;
+
+/**
+ Checks the objectID to see if it is permanent.
+ 
+ FAD: "New objects inserted into a managed object context are assigned a temporary ID
+ which is replaced with a permanent one once the object gets saved to a persistent store."
+ */
+@property (nonatomic, readonly) BOOL stm_hasBeenSaved;
+
+/**
+ Inserts an object of the same type as the calling class name into the context.
+ */
++ (id)stm_createInContext:(NSManagedObjectContext *)context;
+
+@end
diff --git a/StoreMad/NSManagedObject+StoreMad.m b/StoreMad/NSManagedObject+StoreMad.m
new file mode 100644
index 0000000..ce07899
--- /dev/null
+++ b/StoreMad/NSManagedObject+StoreMad.m
@@ -0,0 +1,59 @@
+//
+//  NSManagedObject+StoreMad.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "NSManagedObject+StoreMad.h"
+#import "NSManagedObjectContext+StoreMad.h"
+
+@implementation NSManagedObject (StoreMad)
+
+- (NSURL *)stm_objectURI
+{
+    return self.objectID.URIRepresentation;
+}
+
+- (BOOL)stm_hasBeenDeleted
+{
+    NSManagedObjectID *objectID           = [self objectID];
+    NSManagedObject   *managedObjectClone = [[self managedObjectContext] existingObjectWithID:objectID
+                                                                                        error:NULL];
+    
+    if (!managedObjectClone || [self isDeleted]) {
+        return YES;
+    } else {
+        return NO;
+    }
+}
+
+- (BOOL)stm_hasBeenSaved
+{
+    return !self.objectID.isTemporaryID;
+}
+
++ (id)stm_createInContext:(NSManagedObjectContext *)context
+{
+    return [context stm_insertNewObjectForEntityNamed:[self description]];
+}
+
+@end
diff --git a/StoreMad/NSManagedObjectContext+StoreMad.h b/StoreMad/NSManagedObjectContext+StoreMad.h
new file mode 100644
index 0000000..ff82ad0
--- /dev/null
+++ b/StoreMad/NSManagedObjectContext+StoreMad.h
@@ -0,0 +1,161 @@
+//
+//  NSManagedObjectContext+StoreMad.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+/**
+ 
+ !!!
+ With any of these methods, you have to respect the NSManagedObjectContext internal queues. It's 
+ recommended that you wrap a bunch of context work in a performBlock, or performBlockAndWait. Methods
+ that provide their own blocks specifically say so in the method name. For example, `queueBlockSave`
+ will queue a block save on the context.
+ !!!
+ 
+ */
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+@interface NSManagedObjectContext (StoreMad)
+
+/**
+ Creates a new managed object context based on the current contexts persistent store.
+ When you save with the thread safe copy, it will merge the changes on the main 
+ thread as long as the copy you created the thread safe copy from is still around.
+ 
+ Note: You have to allocate the threadSafeCopy on the thread you want to use it with.
+ */
+- (NSManagedObjectContext *)stm_threadSafeCopy;
+
+/**
+ Standard save, but handles any errors with some (hopefully) usefull logging for you
+ */
+- (void)stm_save;
+
+/**
+ Adds performBlock wrapped save. Use this when you are outside of a performBlock to save right from
+ the main thread.
+ */
+- (void)stm_queueBlockSave;
+
+/**
+ Adds a performBlock wrapped save and waits for it to finish. Use this to block the calling thread
+ until the save is finished.
+ */
+- (void)stm_queueBlockSaveAndWait;
+
+/**
+ If a parent context is present, queue a performBlock wrapped save on the parent context. This is
+ useful if you are calling save from a background thread onto the main context.
+ */
+- (void)stm_queueBlockSaveOnParentContext;
+
+/**
+ Returns the NSManagedObject for the corresponding URI. If the object cannot be fetched, or does 
+ not exist, or cannot be faulted, this will return nil.
+ */
+- (NSManagedObject *)stm_objectForURI:(NSURL *)objectURI;
+
+/**
+ Deletes the object at the given URI.
+ */
+- (void)stm_deleteObjectAtURI:(NSURL *)objectURI;
+
+/**
+ Deletes and array of NSManagedObjects
+ */
+- (void)stm_deleteObjects:(NSArray *)objects;
+
+/**
+ Handy wrapper around executeFetchRequest that handles errors nicely.
+ */
+- (NSArray *)stm_executeFetchRequest:(NSFetchRequest *)request;
+
+/**
+ Executes the fetch request and returns the first object of the result. Fetch limit is set to 1 for
+ faster fetching.
+ */
+- (NSManagedObject *)stm_executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request;
+
+/**
+ Handy wrapper around countForFetchRequest that handles errors nicely.
+ */
+- (NSUInteger)stm_countForFetchRequest:(NSFetchRequest *)request;
+
+/**
+ Handy wrapper around countForFetchRequest
+ */
+- (NSUInteger)stm_countForObjectClass:(Class)objectClass;
+
+/**
+ This will fetch a list of all properties of a given entity. For example, if you have a twitter app
+ and you wanted all tweetId (Integer 64) property values on your Tweet object, you could use this method.
+ 
+ NSFetchRequest *tweetFetch = [self findAllFetchRequestForObjectNamed:@"Tweet"];
+ NSArray *result = [context allValuesForProperty:@"tweetId" withRequest:tweetFetch];
+ 
+ <result = [1, 5, 25, 123, 82349, 29292, … ] >
+ 
+ NOTE: Fetched properties will only include properties of objects that have been saved.
+ */
+- (NSArray *)stm_allValuesForProperty:(NSString *)propertyName
+                          withRequest:(NSFetchRequest *)request;
+
+/**
+ Returns a fetch request for the object name. Returns nil if context has no object registered with
+ the given name.
+ */
+- (NSFetchRequest *)stm_fetchRequestForObjectNamed:(NSString *)objectName;
+
+/**
+ Returns a fetch request that will find all of the objects of the given name. Adds a predicate that
+ always returns YES for all objects. Fast way of fetching all objects for the given objectName.
+ 
+ NOTE: this includes a predicate with 1==1, which does nothing. However, NSFetchedResultsController
+ requires a predicate for it's fetch request, so use this instead of fetchRequestForObjectNamed with
+ no predicate.
+ */
+- (NSFetchRequest *)stm_findAllFetchRequestForObjectNamed:(NSString *)objectName;
+
+/**
+ Returns a fetch request for the object matching the provided class name.
+ */
+- (NSFetchRequest *)stm_fetchRequestForObjectClass:(Class)objectClass;
+
+/**
+ Returns a fetch request that will find all of the objects of the given name. Adds a predicate that
+ always returns YES for all objects. Fast way of fetching all objects for the given objectName.
+ 
+ NOTE: this includes a predicate with 1==1, which does nothing. However, NSFetchedResultsController
+ requires a predicate for it's fetch request, so use this instead of fetchRequestForObjectNamed with
+ no predicate.
+ */
+- (NSFetchRequest *)stm_findAllFetchRequestForObjectClass:(Class)objectClass;
+
+/**
+ Inserts a new object for the entity name in the given context, returns said object if successful.
+ */
+- (NSManagedObject *)stm_insertNewObjectForEntityNamed:(NSString *)entityName;
+
+@end
diff --git a/StoreMad/NSManagedObjectContext+StoreMad.m b/StoreMad/NSManagedObjectContext+StoreMad.m
new file mode 100644
index 0000000..24c585f
--- /dev/null
+++ b/StoreMad/NSManagedObjectContext+StoreMad.m
@@ -0,0 +1,244 @@
+//
+//  NSManagedObjectContext+StoreMad.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "NSManagedObjectContext+StoreMad.h"
+#import "StoreMad.h"
+
+@implementation NSManagedObjectContext (StoreMad)
+
+- (void)handleErrors:(NSError *)error
+{
+    // Forget where I snagged this from
+    if (error) {
+        NSDictionary *userInfo = [error userInfo];
+        for (NSArray *detailedError in [userInfo allValues]) {
+            if ([detailedError isKindOfClass:[NSArray class]]) {
+                for (NSError *e in detailedError) {
+                    if ([e respondsToSelector:@selector(userInfo)]) {
+                        NSLog(@"Error Details: %@", [e userInfo]);
+                    }
+                    else {
+                        NSLog(@"Error Details: %@", e);
+                    }
+                }
+            }
+            else {
+                NSLog(@"Error: %@", detailedError);
+            }
+        }
+        NSLog(@"Error Domain: %@", [error domain]);
+        NSLog(@"Recovery Suggestion: %@", [error localizedRecoverySuggestion]);
+    }
+}
+
+#pragma mark - Thread
+
+- (NSManagedObjectContext *)stm_threadSafeCopy
+{    
+    //
+    // Create new context with default concurrency type
+    //
+    NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
+    [newContext setParentContext:self];
+    
+    //
+    // Optimization.  No undos in background thread.
+    //
+    [newContext setUndoManager:nil];
+    
+    return newContext;
+}
+
+#pragma mark - Save
+
+- (void)stm_save
+{
+    NSError *error;
+    [self save:&error];
+    [self handleErrors:error];
+}
+
+- (void)stm_queueBlockSave
+{
+    [self performBlock:^{
+        [self stm_save];
+    }];
+}
+
+- (void)stm_queueBlockSaveAndWait
+{
+    [self performBlockAndWait:^{
+        [self stm_save];
+    }];
+}
+
+- (void)stm_queueBlockSaveOnParentContext
+{
+    [self.parentContext performBlock:^{
+        [self.parentContext stm_save];
+    }];
+}
+
+#pragma mark - URI Helpers
+
+- (NSManagedObject *)stm_objectForURI:(NSURL *)objectURI
+{
+    NSManagedObjectID *objectID = [[self persistentStoreCoordinator] managedObjectIDForURIRepresentation:objectURI];
+    if (!objectID) return nil;
+    
+    // If the object cannot be fetched, or does not exist, or cannot be faulted, existingObjectWithID returns nil
+    NSError *error;
+    NSManagedObject *object = [self existingObjectWithID:objectID
+                                                   error:&error];
+    
+    [self handleErrors:error];
+    
+    return object;
+}
+
+#pragma mark - Delete
+
+- (void)stm_deleteObjects:(NSArray *)objects
+{
+    for (NSManagedObject *object in objects) {
+        [self deleteObject:object];
+    }
+}
+
+- (void)stm_deleteObjectAtURI:(NSURL *)objectURI
+{
+    NSManagedObject *object = [self stm_objectForURI:objectURI];
+    if (!object) return;
+    [self deleteObject:object];
+}
+
+#pragma mark - Fetching
+     
+- (NSArray *)stm_executeFetchRequest:(NSFetchRequest *)request
+{    
+    NSError *error;
+    NSArray *results = [self executeFetchRequest:request error:&error];
+
+    [self handleErrors:error];
+
+    return results;
+}
+
+- (NSManagedObject *)stm_executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request
+{
+    [request setFetchLimit:1];
+    NSArray *results = [self stm_executeFetchRequest:request];
+    if (results.count < 1) return nil;
+    return [results objectAtIndex:0];
+}
+
+- (NSUInteger)stm_countForFetchRequest:(NSFetchRequest *)request
+{
+    // Optimization?  I'd imagine it doesn't include these when counting, but
+    // should test.
+    request.includesPropertyValues = NO;
+        
+    NSError *error;
+    NSUInteger count = [self countForFetchRequest:request error:&error];
+    
+    [self handleErrors:error];
+    
+    return count;
+}
+
+- (NSUInteger)stm_countForObjectClass:(Class)objectClass
+{
+    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass(objectClass)];
+    return [self stm_countForFetchRequest:request];
+}
+
+- (NSArray *)stm_allValuesForProperty:(NSString *)propertyName
+                          withRequest:(NSFetchRequest *)request
+{
+    // This could be really slow.  Use carefully.
+    NSDictionary *properties = request.entity.propertiesByName;
+    NSPropertyDescription *property = [properties objectForKey:propertyName];
+    if (!property) return nil;
+    
+    [request setPropertiesToFetch:@[property]];
+    [request setResultType:NSDictionaryResultType];
+    NSArray *results = [self stm_executeFetchRequest:request];
+    
+    NSMutableArray *propertyValuesList = [NSMutableArray arrayWithCapacity:results.count];
+    for (NSManagedObject *object in results) {
+        [propertyValuesList addObject:[object valueForKey:propertyName]];
+    }
+    
+    return propertyValuesList;
+}
+
+#pragma mark - Fetch Requests
+
+- (NSFetchRequest *)stm_fetchRequestForObjectNamed:(NSString *)objectName
+{
+    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:objectName 
+                                                         inManagedObjectContext:self];
+    
+    // Fetch request must have an entity
+    if (!entityDescription) return nil;
+    
+    NSFetchRequest *request = [[NSFetchRequest alloc] init];
+    [request setEntity:entityDescription];
+    
+    return request;
+}
+
+- (NSFetchRequest *)stm_findAllFetchRequestForObjectNamed:(NSString *)objectName
+{
+    NSFetchRequest *request = [self stm_fetchRequestForObjectNamed:objectName];
+    [request setPredicate:[NSPredicate predicateWithFormat:@"1 = 1"]];
+    return request;  
+}
+
+- (NSFetchRequest *)stm_fetchRequestForObjectClass:(Class)objectClass;
+{
+    return [self stm_fetchRequestForObjectNamed:NSStringFromClass(objectClass)];
+}
+
+- (NSFetchRequest *)stm_findAllFetchRequestForObjectClass:(Class)objectClass
+{
+    return [self stm_findAllFetchRequestForObjectNamed:NSStringFromClass(objectClass)];
+}
+
+#pragma mark - Create
+
+- (NSManagedObject *)stm_insertNewObjectForEntityNamed:(NSString *)entityName
+{
+    // If entity is nil, initWithEntity will cause a crash. So make sure to bail.
+    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
+                                              inManagedObjectContext:self];
+    if (!entity) return nil;
+    
+    NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:entity
+                                       insertIntoManagedObjectContext:self];
+    return object;
+}
+
+@end
diff --git a/StoreMad/SMCollectionViewDataSource.h b/StoreMad/SMCollectionViewDataSource.h
new file mode 100644
index 0000000..359b86e
--- /dev/null
+++ b/StoreMad/SMCollectionViewDataSource.h
@@ -0,0 +1,38 @@
+//
+//  SMCollectionViewDataSource.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 2/23/13.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "SMDataSource.h"
+
+@interface SMCollectionViewDataSource : SMDataSource
+
+- (void)setupWithCollectionView:(UICollectionView *)collectionView
+                   fetchRequest:(NSFetchRequest *)fetchRequest
+                        context:(NSManagedObjectContext *)context
+             sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                      cacheName:(NSString *)cacheName;
+
+@end
diff --git a/StoreMad/SMCollectionViewDataSource.m b/StoreMad/SMCollectionViewDataSource.m
new file mode 100644
index 0000000..cecfe3b
--- /dev/null
+++ b/StoreMad/SMCollectionViewDataSource.m
@@ -0,0 +1,227 @@
+//
+//  SMCollectionViewDataSource.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 2/23/13.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "SMCollectionViewDataSource.h"
+
+@interface SMCollectionViewDataSource ()
+
+@property (nonatomic, strong) NSMutableArray *objectChanges;
+
+@property (nonatomic, strong) NSMutableArray *sectionChanges;
+
+@property (nonatomic, weak) UICollectionView *collectionView;
+
+@end
+
+@implementation SMCollectionViewDataSource
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        _objectChanges = [NSMutableArray array];
+        _sectionChanges = [NSMutableArray array];
+    }
+    return self;
+}
+
+- (void)setupWithCollectionView:(UICollectionView *)collectionView
+                   fetchRequest:(NSFetchRequest *)fetchRequest
+                        context:(NSManagedObjectContext *)context
+             sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                      cacheName:(NSString *)cacheName
+{    
+    // Build controller
+    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
+                                                                        managedObjectContext:context
+                                                                          sectionNameKeyPath:sectionNameKeyPath
+                                                                                   cacheName:cacheName];
+    
+    // Respond to changes here
+    self.fetchedResultsController.delegate = self;
+    
+    // Hold onto this to work with when changes happen
+    self.collectionView = collectionView;
+}
+
+#pragma mark - Change
+
+- (void)controller:(NSFetchedResultsController *)controller
+  didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
+           atIndex:(NSUInteger)sectionIndex
+     forChangeType:(NSFetchedResultsChangeType)type
+{
+    NSMutableDictionary *change = [NSMutableDictionary new];
+    
+    switch(type) {
+        case NSFetchedResultsChangeInsert:
+            change[@(type)] = @(sectionIndex);
+            break;
+        case NSFetchedResultsChangeDelete:
+            change[@(type)] = @(sectionIndex);
+            break;
+        case NSFetchedResultsChangeUpdate:
+            change[@(type)] = @(sectionIndex);
+            break;
+        case NSFetchedResultsChangeMove:
+            // Not handled
+            break;
+    }
+    
+    [self.sectionChanges addObject:change];
+}
+
+- (void)controller:(NSFetchedResultsController *)controller
+   didChangeObject:(id)anObject
+       atIndexPath:(NSIndexPath *)indexPath
+     forChangeType:(NSFetchedResultsChangeType)type
+      newIndexPath:(NSIndexPath *)newIndexPath
+{
+    NSMutableDictionary *change = [NSMutableDictionary new];
+    
+    switch(type) {
+        case NSFetchedResultsChangeInsert:
+            change[@(type)] = newIndexPath;
+            break;
+        case NSFetchedResultsChangeDelete:
+            change[@(type)] = indexPath;
+            break;
+        case NSFetchedResultsChangeUpdate:
+            change[@(type)] = indexPath;
+            break;
+        case NSFetchedResultsChangeMove:
+            change[@(type)] = @[indexPath, newIndexPath];
+            break;
+    }
+    
+    [self.objectChanges addObject:change];
+}
+
+- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
+{    
+    if ([self.sectionChanges count] > 0) {
+        [self.collectionView performBatchUpdates:^{
+            for (NSDictionary *change in self.sectionChanges) {
+                [change enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id sectionIndex, BOOL *stop) {
+                    NSFetchedResultsChangeType type = [key unsignedIntegerValue];
+                    switch (type) {
+                        case NSFetchedResultsChangeInsert:
+                            [self.collectionView insertSections:[NSIndexSet indexSetWithIndex:[sectionIndex unsignedIntegerValue]]];
+                            break;
+                        case NSFetchedResultsChangeDelete:
+                            [self.collectionView deleteSections:[NSIndexSet indexSetWithIndex:[sectionIndex unsignedIntegerValue]]];
+                            break;
+                        case NSFetchedResultsChangeUpdate:
+                            [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:[sectionIndex unsignedIntegerValue]]];
+                            break;
+                        case NSFetchedResultsChangeMove:
+                            [self.collectionView moveSection:[sectionIndex[0] unsignedIntegerValue]
+                                                   toSection:[sectionIndex[1] unsignedIntegerValue]];
+                            break;
+                    }
+                }];
+            }
+        } completion:nil];
+    }
+    
+    if ([self.objectChanges count] > 0 && [self.sectionChanges count] == 0) {
+        if ([self shouldReloadCollectionViewToPreventKnownIssue]) {
+            // This is to prevent a bug in UICollectionView from occurring.
+            // The bug presents itself when inserting the first object or deleting the last object in a collection view.
+            // http://stackoverflow.com/questions/12611292/uicollectionview-assertion-failure
+            // This code should be removed once the bug has been fixed, it is tracked in OpenRadar
+            // http://openradar.appspot.com/12954582
+            [self.collectionView reloadData];
+        } else {
+            [self.collectionView performBatchUpdates:^{
+                for (NSDictionary *change in _objectChanges) {
+                    [change enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id indexPath, BOOL *stop) {
+                        NSFetchedResultsChangeType type = [key unsignedIntegerValue];
+                        switch (type) {
+                            case NSFetchedResultsChangeInsert:
+                                [self.collectionView insertItemsAtIndexPaths:@[indexPath]];
+                                break;
+                            case NSFetchedResultsChangeDelete:
+                                [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
+                                break;
+                            case NSFetchedResultsChangeUpdate:
+                                // If you call reload here, you can run into a Core Data crash,
+                                // where you see [__NSArrayM insertObject:atIndex:]: object cannot be nil.
+                                // To be honest, I'm not sure what this is, could be a bug.
+                                // [self.collectionView     :@[indexPath]];
+
+                                // Instead, use reload here.
+                                [self.dataSourceDelegate configureCell:[self.collectionView cellForItemAtIndexPath:indexPath]
+                                                           atIndexPath:indexPath];
+                                break;
+                            case NSFetchedResultsChangeMove:
+                                [self.collectionView moveItemAtIndexPath:indexPath[0] toIndexPath:indexPath[1]];
+                                break;
+                        }
+                    }];
+                }
+            } completion:nil];
+        }
+        
+        [self.sectionChanges removeAllObjects];
+        [self.objectChanges removeAllObjects];
+    }
+}
+
+- (BOOL)shouldReloadCollectionViewToPreventKnownIssue
+{
+    __block BOOL shouldReload = NO;
+    for (NSDictionary *change in self.objectChanges) {
+        [change enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
+            NSFetchedResultsChangeType type = [key unsignedIntegerValue];
+            NSIndexPath *indexPath = obj;
+            switch (type) {
+                case NSFetchedResultsChangeInsert:
+                    if ([self.collectionView numberOfItemsInSection:indexPath.section] == 0) {
+                        shouldReload = YES;
+                    } else {
+                        shouldReload = NO;
+                    }
+                    break;
+                case NSFetchedResultsChangeDelete:
+                    if ([self.collectionView numberOfItemsInSection:indexPath.section] == 1) {
+                        shouldReload = YES;
+                    } else {
+                        shouldReload = NO;
+                    }
+                    break;
+                case NSFetchedResultsChangeUpdate:
+                    shouldReload = NO;
+                    break;
+                case NSFetchedResultsChangeMove:
+                    shouldReload = NO;
+                    break;
+            }
+        }];
+    }
+    return shouldReload;
+}
+
+@end
diff --git a/StoreMad/SMContextObserverController.h b/StoreMad/SMContextObserverController.h
new file mode 100644
index 0000000..2e60a19
--- /dev/null
+++ b/StoreMad/SMContextObserverController.h
@@ -0,0 +1,94 @@
+//
+//  SMContextObserverController.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 3/13/14.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+@interface SMContextObserverController : NSObject
+
++ (instancetype)defaultController;
+
+/**
+ Returns an opaque class of SMContextObserver. The workBlock will be executed
+ every time the context fires a notification of the notificationType. For instance, 
+ you could set a predicate to observe a specific object change in a given context
+ every time the context saves, firing a NSManagedObjectContextDidSaveNotification.
+ 
+ Optionally, you can pass in an NSOperationQueue to run the workBlock on. This is
+ useful if you have a long running task. If nil, the workBlock will be executed on
+ whatever thread the context fires the NSNotifiation. Most likely this is the main thread.
+ 
+ @param context The context to observe
+ @param predicate The predicate used to filter
+ @param notificationName The NSManagedObjectContext notifications. Valid values
+ include NSManagedObjectContextDidSaveNotification, NSManagedObjectContextWillSaveNotification,
+ and NSManagedObjectContextObjectsDidChangeNotification.
+ @param queue The NSOperationQueue to run the workBlock on. If nil, the workBlock will
+ be run on the main thread.
+ @param workBlock The work block to run on the updated, inserted, and deleted objects
+ involved in the notification.
+ */
+- (id)addContextObserverForContext:(NSManagedObjectContext *)context
+                         predicate:(NSPredicate *)predicate
+           contextNotificationType:(NSString *)notificationType
+                             queue:(NSOperationQueue *)queue
+                         workBlock:(void (^)(NSSet *updateObjects,
+                                             NSSet *insertedOjects,
+                                             NSSet *deletedObjects))workBlock;
+
+/**
+ Returns an opaque class of SMContextObserver. The workBlock will be executed
+ every time the context fires a notification of type NSManagedObjectContextObjectsDidChangeNotification.
+ 
+ @param context The context to observe
+ @param workBlock The work block to run on the updated, inserted, and deleted objects
+ involved in the notification.
+ */
+- (id)addContextObserverForChangesToObject:(NSManagedObject *)object
+                                 workBlock:(void (^)(NSManagedObject *object))workBlock;
+
+/**
+ Returns an opaque class of SMContextObserver. The workBlock will be executed
+ every time the context fires a notification of type NSManagedObjectContextObjectsDidChangeNotification.
+ 
+ Optionally, you can pass in an NSOperationQueue to run the workBlock on. This is
+ useful if you have a long running task. If nil, the workBlock will be executed on
+ whatever thread the context fires the NSNotifiation. Most likely this is the main thread.
+ 
+ @param context The context to observe
+ @param queue Optional. The NSOperationQueue to run the workBlock on.
+ @param workBlock The work block to run on the updated, inserted, and deleted objects
+ involved in the notification.
+ */
+- (id)addContextObserverForChangesToObject:(NSManagedObject *)object
+                                     queue:(NSOperationQueue *)queue
+                                 workBlock:(void (^)(NSManagedObject *object))workBlock;
+
+/**
+ Removes the observer from recieving any further notifications.
+ */
+- (void)removeContextObserver:(id)observer;
+
+@end
diff --git a/StoreMad/SMContextObserverController.m b/StoreMad/SMContextObserverController.m
new file mode 100644
index 0000000..604c580
--- /dev/null
+++ b/StoreMad/SMContextObserverController.m
@@ -0,0 +1,263 @@
+//
+//  SMContextObserverController.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 3/13/14.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "SMContextObserverController.h"
+
+#import "NSManagedObject+StoreMad.h"
+
+#pragma mark - SMContextObserver
+
+typedef void (^SMContextObserverBlock)(NSSet *updateObjects, NSSet *insertedOjects, NSSet *deletedObjects);
+
+@interface SMContextObserver : NSObject
+
+@property (nonatomic, strong) NSManagedObjectContext *context;
+
+@property (nonatomic, strong) NSPredicate *predicate;
+
+@property (nonatomic, strong) NSString *notificationType;
+
+@property (nonatomic, strong) NSOperationQueue *queue;
+
+@property (nonatomic, copy) SMContextObserverBlock workBlock;
+
+@end
+
+@implementation SMContextObserver
+
+- (void)dealloc
+{
+    [self stopObservingNotifications];
+}
+
+#pragma mark - Notifications
+
+- (void)startObservingNotifications
+{
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(notificationDidFire:)
+                                                 name:self.notificationType
+                                               object:self.context];
+}
+
+- (void)stopObservingNotifications
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                    name:self.notificationType
+                                                  object:self.context];
+}
+
+- (void)notificationDidFire:(NSNotification *)notification
+{
+    if (_queue) {
+        __weak SMContextObserver *weakSelf = self;
+        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
+            __strong SMContextObserver *strongSelf = weakSelf;
+            [strongSelf processContextNotification:notification];
+        }];
+        [_queue addOperation:op];
+    } else {
+        [self processContextNotification:notification];
+    }
+}
+
+- (void)processContextNotification:(NSNotification *)notification
+{
+    // Bail if no work block
+    if (!self.workBlock) return;
+
+    //
+    // Grab objects from notification.  These are standard keys, as defined by docs
+    //
+    NSSet *updatedObjects  = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
+    NSSet *insertedObjects = [[notification userInfo] objectForKey:NSInsertedObjectsKey];
+    NSSet *deletedObjects  = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
+    
+    //
+    // Filter sets using predicate
+    //
+    if (!self.predicate) self.predicate = [NSPredicate predicateWithFormat:@"1 = 1"];
+    NSSet *updatedObjectsFiltered  = [updatedObjects filteredSetUsingPredicate:self.predicate];
+    NSSet *insertedObjectsFiltered = [insertedObjects filteredSetUsingPredicate:self.predicate];
+    NSSet *deletedObjectsFiltered  = [deletedObjects filteredSetUsingPredicate:self.predicate];
+    
+    //
+    // Bail if no changes
+    //
+    if (updatedObjectsFiltered.count == 0
+        && insertedObjectsFiltered.count == 0
+        && deletedObjectsFiltered.count == 0) return;
+    
+    //
+    // Perform work
+    //
+    self.workBlock(updatedObjectsFiltered, insertedObjectsFiltered, deletedObjectsFiltered);
+}
+
+@end
+
+#pragma mark - SMContextObserverController
+
+@interface SMContextObserverController ()
+
+@property (nonatomic, strong) NSMutableArray *observers;
+
+@end
+
+@implementation SMContextObserverController
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        _observers = [NSMutableArray array];
+    }
+    return self;
+}
+
+#pragma mark - Singleton
+
++ (instancetype)defaultController
+{
+    static SMContextObserverController *_defaultController = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        _defaultController = [[self alloc] init];
+    });
+    return _defaultController;
+}
+
+#pragma mark - API
+
+- (id)addContextObserverForContext:(NSManagedObjectContext *)context
+                         predicate:(NSPredicate *)predicate
+           contextNotificationType:(NSString *)notificationType
+                             queue:(NSOperationQueue *)queue
+                         workBlock:(void (^)(NSSet *updateObjects,
+                                             NSSet *insertedOjects,
+                                             NSSet *deletedObjects))workBlock
+{
+    //
+    // Validate context
+    //
+    NSAssert(context, @"Tried to add an observer to a nil NSManagedObjectContext!");
+    if (!context) return nil;
+    
+    //
+    // Validate notification type
+    //
+    NSArray *validNotifications = @[NSManagedObjectContextDidSaveNotification,
+                                    NSManagedObjectContextWillSaveNotification,
+                                    NSManagedObjectContextObjectsDidChangeNotification];
+    BOOL valid = [validNotifications containsObject:notificationType];
+    NSAssert(valid, @"Notification type must be one of the following: NSManagedObjectContextDidSaveNotification, NSManagedObjectContextWillSaveNotification, NSManagedObjectContextObjectsDidChangeNotification");
+    if (!valid) return nil;
+    
+    //
+    // Build observer
+    //
+    SMContextObserver *observer = [SMContextObserver new];
+    observer.context = context;
+    observer.predicate = predicate;
+    observer.notificationType = notificationType;
+    observer.queue = queue;
+    observer.workBlock = workBlock;
+    
+    //
+    // Turn on the observer
+    //
+    [observer startObservingNotifications];
+    
+    //
+    // Keep track of observer
+    //
+    @synchronized (_observers) {
+        [_observers addObject:observer];
+    }
+    
+    return observer;
+}
+
+- (id)addContextObserverForChangesToObject:(NSManagedObject *)object
+                                 workBlock:(void (^)(NSManagedObject *object))workBlock
+{
+    return [self addContextObserverForChangesToObject:object
+                                                queue:nil
+                                            workBlock:workBlock];
+}
+
+- (id)addContextObserverForChangesToObject:(NSManagedObject *)object
+                                     queue:(NSOperationQueue *)queue
+                                 workBlock:(void (^)(NSManagedObject *object))workBlock
+{
+    NSAssert(object.stm_hasBeenSaved, @"Object must be saved first to observe. Right now it only has a temporary objectID");
+    
+    //
+    // Search for the object we pushed in
+    //
+    NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"objectID == %@", object.objectID];;
+    
+    //
+    // Wrap the work block.
+    //
+    SMContextObserverBlock newWorkBlock = ^(NSSet *updateObjects,
+                                            NSSet *insertedOjects,
+                                            NSSet *deletedObjects) {
+        NSManagedObject *fetchedObject;
+        
+        if (updateObjects.count > 0) {
+            fetchedObject = [updateObjects anyObject];
+        } else if (insertedOjects.count > 0) {
+            fetchedObject = [insertedOjects anyObject];
+        } else if (deletedObjects.count > 0) {
+            fetchedObject = [deletedObjects anyObject];
+        }
+        
+        if (workBlock) {
+            workBlock(fetchedObject);
+        }
+    };
+    
+    //
+    // Build the observer
+    //
+    id observer = [self addContextObserverForContext:object.managedObjectContext
+                                           predicate:predicate
+                             contextNotificationType:NSManagedObjectContextObjectsDidChangeNotification
+                                               queue:queue
+                                           workBlock:newWorkBlock];
+    
+    return observer;
+}
+
+- (void)removeContextObserver:(SMContextObserver *)observer
+{
+    [observer stopObservingNotifications];
+    @synchronized (_observers) {
+        [_observers removeObject:observer];
+    }
+}
+
+@end
diff --git a/StoreMad/SMDataSource.h b/StoreMad/SMDataSource.h
new file mode 100644
index 0000000..a0b2f33
--- /dev/null
+++ b/StoreMad/SMDataSource.h
@@ -0,0 +1,74 @@
+//
+//  SMDataSource.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+@protocol SMDataSourceDelegate;
+
+@interface SMDataSource : NSObject <NSFetchedResultsControllerDelegate>
+
+@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
+
+@property (nonatomic, weak) id <SMDataSourceDelegate> dataSourceDelegate;
+
+- (void)setupWithFetchRequest:(NSFetchRequest *)fetchRequest
+                      context:(NSManagedObjectContext *)context
+           sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                    cacheName:(NSString *)cacheName;
+
+- (void)performFetch;
+
+- (void)performFetchWithNewFetchRequest:(NSFetchRequest *)fetchRequest;
+
+- (id)objectAtIndexPath:(NSIndexPath *)index;
+
+- (NSInteger)numberOfSections;
+
+- (NSInteger)numberOfItemsInSection:(NSInteger)section;
+
+- (NSString *)titleForHeaderInSection:(NSInteger)section;
+
+- (NSArray *)sectionIndexTitles;
+
+- (NSInteger)sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
+
+- (BOOL)isEmpty;
+
+@end
+
+@protocol SMDataSourceDelegate <NSObject>
+
+- (void)dataSource:(SMDataSource *)dataSource
+           isEmpty:(BOOL)empty;
+
+- (void)configureCell:(id)cell
+          atIndexPath:(NSIndexPath *)indexPath;
+
+@optional
+
+- (void)fetchResultsDidChange;
+
+@end
diff --git a/StoreMad/SMDataSource.m b/StoreMad/SMDataSource.m
new file mode 100644
index 0000000..2ecc396
--- /dev/null
+++ b/StoreMad/SMDataSource.m
@@ -0,0 +1,146 @@
+//
+//  SMDataSource.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "SMDataSource.h"
+#import "SMStoreController.h"
+
+@implementation SMDataSource
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)setupWithFetchRequest:(NSFetchRequest *)fetchRequest
+                      context:(NSManagedObjectContext *)context
+           sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                    cacheName:(NSString *)cacheName
+{
+    // Build controller
+    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
+                                                                        managedObjectContext:context
+                                                                          sectionNameKeyPath:sectionNameKeyPath
+                                                                                   cacheName:cacheName];
+    
+    // Respond to changes here
+    self.fetchedResultsController.delegate = self;
+
+    // Respond to a reset of the store controller
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(storeControllerDidReset:)
+                                                 name:kSMStoreControllerDidReset
+                                               object:nil];
+}
+
+#pragma mark - Reset
+
+- (void)storeControllerDidReset:(NSNotification *)notification
+{
+    SMStoreController *controller = notification.object;
+    if (![controller.managedObjectContext isEqual:self.fetchedResultsController.managedObjectContext]) {
+        return;
+    }
+    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchedResultsController.fetchRequest
+                                                                        managedObjectContext:self.fetchedResultsController.managedObjectContext
+                                                                          sectionNameKeyPath:self.fetchedResultsController.sectionNameKeyPath
+                                                                                   cacheName:self.fetchedResultsController.cacheName];
+    self.fetchedResultsController.delegate = self;
+    [self.fetchedResultsController performFetch:nil];
+}
+
+#pragma mark - Fetching
+
+- (void)performFetch
+{
+    [self.fetchedResultsController performFetch:nil];
+}
+
+- (void)performFetchWithNewFetchRequest:(NSFetchRequest *)fetchRequest
+{
+    [NSFetchedResultsController deleteCacheWithName:self.fetchedResultsController.cacheName];
+    
+    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
+                                                                        managedObjectContext:self.fetchedResultsController.managedObjectContext
+                                                                          sectionNameKeyPath:self.fetchedResultsController.sectionNameKeyPath
+                                                                                   cacheName:self.fetchedResultsController.cacheName];
+    
+    // Respond to changes here
+    self.fetchedResultsController.delegate = self;
+
+    // Auto resend the fetch
+    [self performFetch];
+}
+
+#pragma mark - Helper
+
+- (id)objectAtIndexPath:(NSIndexPath *)index
+{
+    return [self.fetchedResultsController objectAtIndexPath:index];
+}
+
+#pragma mark - UICollectionView data source helpers
+
+- (NSInteger)numberOfSections
+{
+    //
+    // Report if empty
+    //
+    BOOL empty = (self.fetchedResultsController.fetchedObjects.count == 0);
+    [self.dataSourceDelegate dataSource:self isEmpty:empty];
+    
+    return self.fetchedResultsController.sections.count;
+}
+
+- (NSInteger)numberOfItemsInSection:(NSInteger)section
+{
+    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
+
+    [self.dataSourceDelegate dataSource:self isEmpty:self.isEmpty];
+
+    return [sectionInfo numberOfObjects];
+}
+
+- (NSString *)titleForHeaderInSection:(NSInteger)section
+{
+    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
+    return [sectionInfo name];
+}
+
+- (NSArray *)sectionIndexTitles
+{
+    return [self.fetchedResultsController sectionIndexTitles];
+}
+
+- (NSInteger)sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
+{
+    return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
+}
+
+- (BOOL)isEmpty
+{
+    return (self.fetchedResultsController.fetchedObjects.count < 1);
+}
+
+@end
diff --git a/StoreMad/SMStoreController.h b/StoreMad/SMStoreController.h
new file mode 100644
index 0000000..90b7567
--- /dev/null
+++ b/StoreMad/SMStoreController.h
@@ -0,0 +1,76 @@
+//
+//  SMStoreController.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+extern NSString * const kSMStoreControllerDidReset;
+
+@interface SMStoreController : NSObject
+
+/**
+ The URL of the sqlite store, as set when initialized.
+ */
+@property (nonatomic, copy, readonly) NSURL *storeURL;
+
+/**
+ The URL of the model URL, as set when initialized.
+ */
+@property (nonatomic, copy, readonly) NSURL *modelURL;
+
+/**
+ Initialized with NSMainQueueConcurrencyType.  Meant as the main thread store.
+ */
+@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
+@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
+@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+
+/**
+ Set this to YES if you want the internal managedObjectContext to save when the
+ app moves to the background. Set to NO, if otherwise.
+ */
+@property (nonatomic, assign) BOOL saveOnAppStateChange;
+
++ (SMStoreController *)storeControllerWithStoreURL:(NSURL *)storeURL 
+                                       andModelURL:(NSURL *)modelURL;
+
+/**
+ Delete's the local store and rebuilds it. This will nuke any data you have and
+ give you a fresh sqlite store. So yeah, be careful.
+ */
+- (void)reset DEPRECATED_MSG_ATTRIBUTE("Use resetStore: instead.");
+
+/**
+ Delete's the local store and rebuilds it. This will nuke any data you have and
+ give you a fresh sqlite store. So yeah, be careful.
+ */
+- (BOOL)resetStore:(NSError **)error;
+
+/**
+ This will delete the sqlite store on file. So yeah, be careful.
+ */
+- (void)deleteStore;
+
+@end
diff --git a/StoreMad/SMStoreController.m b/StoreMad/SMStoreController.m
new file mode 100644
index 0000000..60ce506
--- /dev/null
+++ b/StoreMad/SMStoreController.m
@@ -0,0 +1,306 @@
+//
+//  SMStoreController.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 7/20/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy 
+// of this software and associated documentation files (the "Software"), to deal 
+// in the Software without restriction, including without limitation the rights 
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+// of the Software, and to permit persons to whom the Software is furnished to do so, 
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included 
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "SMStoreController.h"
+
+#import <UIKit/UIApplication.h>
+#import "NSManagedObjectContext+StoreMad.h"
+
+NSString * const kSMStoreControllerDidReset = @"kSMStoreControllerDidReset";
+
+@interface SMStoreController ()
+
+@property (nonatomic, copy, readwrite) NSURL *storeURL;
+@property (nonatomic, copy, readwrite) NSURL *modelURL;
+
+@property (nonatomic, strong, readwrite) NSManagedObjectContext *managedObjectContext;
+@property (nonatomic, strong, readwrite) NSManagedObjectModel *managedObjectModel;
+@property (nonatomic, strong, readwrite) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+
+@end
+
+@implementation SMStoreController
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
++ (SMStoreController *)storeControllerWithStoreURL:(NSURL *)storeURL 
+                                       andModelURL:(NSURL *)modelURL
+{
+    NSParameterAssert(storeURL);
+    NSParameterAssert(modelURL);
+    
+    SMStoreController *controller = [self new];
+    
+    controller.storeURL = storeURL;
+    controller.modelURL = modelURL;
+    
+    // Force lazy load
+    [controller managedObjectContext];
+    
+    return controller;
+}
+
+
+#pragma mark
+
+- (void)reset
+{
+    @synchronized(self) {
+        // Nil local variables
+        _managedObjectContext = nil;
+        _managedObjectModel = nil;
+        _persistentStoreCoordinator = nil;
+        
+        // Delete SQlite
+        [self deleteStore];
+        
+        // Rebuild
+        [self managedObjectContext];
+    }
+}
+
+- (void)deleteStore 
+{	
+    @synchronized(self) {
+        // Ensure we are on the main thread
+        NSAssert([[NSThread currentThread] isEqual:[NSThread mainThread]], @"Delete operation must occur on the main thread");
+        
+        NSFileManager *fileManager = [NSFileManager defaultManager];
+        if (self.storeURL) {
+            [fileManager removeItemAtURL:self.storeURL error:NULL];
+        }
+    }
+}
+
+- (BOOL)resetStore:(NSError **)error
+{
+    // Ensure we are on the main thread
+    NSAssert([[NSThread currentThread] isEqual:[NSThread mainThread]],
+             @"Resetting the store must occur on the main thread");
+    
+    NSError *internalError;
+    if (error != NULL) {
+        *error = internalError;
+    }
+    
+    //
+    // Reset the managed object context
+    //
+    [_managedObjectContext reset];
+    
+	//
+	// Remove all persistent stores
+	//
+	for (NSPersistentStore *store in _persistentStoreCoordinator.persistentStores) {
+		[_persistentStoreCoordinator removePersistentStore:store
+		                                             error:&internalError];
+		if (internalError != nil) {
+			return NO;
+		}
+	}
+
+	//
+	// Delete the underlying SQLite store
+	//
+    if ([[NSFileManager defaultManager] fileExistsAtPath:self.storeURL.path]) {
+        [[NSFileManager defaultManager] removeItemAtURL:self.storeURL
+                                                  error:&internalError];
+    }
+	if (internalError != nil) {
+		return NO;
+	}
+    
+    //
+    // Rebuild store
+    //
+    [self addPersistentStoreToCoordinator:&internalError
+             deleteSQLiteOnMigrationError:YES];
+    
+    if (internalError != nil) {
+        return NO;
+    }
+    
+    //
+    // Send update that the store was just reset, and listeners should purge any NSManagedObjects
+    // they are holding onto.
+    //
+    [[NSNotificationCenter defaultCenter] postNotificationName:kSMStoreControllerDidReset
+                                                        object:self];
+
+	return YES;
+}
+
+#pragma mark -
+
+- (void)setSaveOnAppStateChange:(BOOL)saveOnAppStateChange
+{
+    _saveOnAppStateChange = saveOnAppStateChange;
+    
+    if (!saveOnAppStateChange) {
+        [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                        name:UIApplicationDidEnterBackgroundNotification
+                                                      object:nil];
+        
+        [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                        name:UIApplicationWillTerminateNotification
+                                                      object:nil];
+    } else {
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(saveContext)
+                                                     name:UIApplicationDidEnterBackgroundNotification
+                                                   object:nil];
+        
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(saveContext)
+                                                     name:UIApplicationWillTerminateNotification
+                                                   object:nil];
+    }
+}
+
+#pragma mark - CoreData Stack
+
+- (void)saveContext
+{
+    [self.managedObjectContext stm_queueBlockSaveAndWait];
+}
+
+- (NSManagedObjectContext *)managedObjectContext 
+{
+    if (_managedObjectContext) {
+        return _managedObjectContext;
+    }
+    
+    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
+    if (coordinator) {
+        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
+        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
+    }
+    
+    return _managedObjectContext;
+}
+
+- (NSManagedObjectModel *)managedObjectModel
+{
+    if (_managedObjectModel) {
+        return _managedObjectModel;
+    }
+    
+    NSAssert(_modelURL, @"ModelURL was nil!  Could not find resource");
+    
+    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:self.modelURL];
+    return _managedObjectModel;
+}
+
+- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
+{
+    if (_persistentStoreCoordinator != nil) {
+        return _persistentStoreCoordinator;
+    }
+    
+    NSError *error = nil;
+    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
+    
+    [self addPersistentStoreToCoordinator:&error
+             deleteSQLiteOnMigrationError:YES];
+    
+    if (error) {
+        return nil;
+    }
+    
+    return _persistentStoreCoordinator;
+}
+
+- (BOOL)addPersistentStoreToCoordinator:(NSError **)error
+           deleteSQLiteOnMigrationError:(BOOL)deleteSQLite
+{
+    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
+                                                   configuration:nil
+                                                             URL:self.storeURL
+                                                         options:nil
+                                                           error:error])
+    {
+        /*
+         Replace this implementation with code to handle the error appropriately.
+         
+         
+         Typical reasons for an error here include:
+         * The persistent store is not accessible;
+         * The schema for the persistent store is incompatible with current managed object model.
+         Check the error message to determine what the actual problem was.
+         
+         
+         If the persistent store is not accessible, there is typically something wrong with the file path. 
+         Often, a file URL is pointing into the application's resources directory instead of a writeable directory.
+         
+         If you encounter schema incompatibility errors during development, you can reduce their frequency by:
+         * Simply deleting the existing store:
+         [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]
+         
+         * Performing automatic lightweight migration by passing the following dictionary as the options parameter:
+         [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
+         
+         Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.
+         
+         */
+        
+        NSLog(@"The model used to open the store is incompatable with the one used to create the store! Performing lightweight migration.");
+        
+        NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
+                                  NSInferMappingModelAutomaticallyOption       : @(YES)};
+        
+        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
+                                                       configuration:nil
+                                                                 URL:self.storeURL
+                                                             options:options
+                                                               error:error]) {
+            
+            //
+            // This deletes the store at the given URL if there is a migration error. This should
+            // allow you to add a persistent store again, no matter what migration errors you have.
+            //
+            if (deleteSQLite
+                && [[NSFileManager defaultManager] fileExistsAtPath:self.storeURL.path]) {
+                [[NSFileManager defaultManager] removeItemAtURL:self.storeURL error:nil];
+            }
+            
+            //
+            // If you still can't add a persistent store after all this, throw an error.
+            //
+            if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
+                                                           configuration:nil
+                                                                     URL:self.storeURL
+                                                                 options:options
+                                                                   error:error]) {
+                return NO;
+            }
+        }
+    }
+    return YES;
+}
+
+@end
diff --git a/StoreMad/SMTableViewDataSource.h b/StoreMad/SMTableViewDataSource.h
new file mode 100644
index 0000000..a221b02
--- /dev/null
+++ b/StoreMad/SMTableViewDataSource.h
@@ -0,0 +1,37 @@
+//
+//  SMTableViewDataSource.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 10/4/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import "SMDataSource.h"
+
+@interface SMTableViewDataSource : SMDataSource
+
+- (void)setupWithTableView:(UITableView *)tableView
+              fetchRequest:(NSFetchRequest *)fetchRequest
+                   context:(NSManagedObjectContext *)context
+        sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                 cacheName:(NSString *)cacheName;
+
+@end
diff --git a/StoreMad/SMTableViewDataSource.m b/StoreMad/SMTableViewDataSource.m
new file mode 100644
index 0000000..bd61cfa
--- /dev/null
+++ b/StoreMad/SMTableViewDataSource.m
@@ -0,0 +1,129 @@
+//
+//  SMTableViewDataSource.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 10/4/12.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#import "SMTableViewDataSource.h"
+
+@interface  SMTableViewDataSource ()
+
+@property (nonatomic, weak) UITableView *tableView;
+
+@end
+
+@implementation SMTableViewDataSource
+
+- (void)setupWithTableView:(UITableView *)tableView
+              fetchRequest:(NSFetchRequest *)fetchRequest
+                   context:(NSManagedObjectContext *)context
+        sectionNameKeyPath:(NSString *)sectionNameKeyPath
+                 cacheName:(NSString *)cacheName
+{
+    self.tableView = tableView;
+    
+    // Normal setup
+    [self setupWithFetchRequest:fetchRequest
+                        context:context
+             sectionNameKeyPath:sectionNameKeyPath
+                      cacheName:cacheName];
+}
+
+#pragma mark - NSFetchedResultsControllerDelegate
+
+- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
+{
+    [self.tableView beginUpdates];
+    
+    // Update sections
+    for (NSInteger i = self.tableView.numberOfSections; i < controller.sections.count; i++) {
+        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:i]
+                      withRowAnimation:UITableViewRowAnimationAutomatic];
+    }
+}
+
+- (void)controller:(NSFetchedResultsController *)controller
+   didChangeObject:(id)anObject
+       atIndexPath:(NSIndexPath *)indexPath
+     forChangeType:(NSFetchedResultsChangeType)type
+      newIndexPath:(NSIndexPath *)newIndexPath
+{
+    switch(type) {
+        case NSFetchedResultsChangeInsert:
+            [self.tableView insertRowsAtIndexPaths:@[newIndexPath]
+                                  withRowAnimation:UITableViewRowAnimationAutomatic];
+            break;
+        case NSFetchedResultsChangeDelete:
+            [self.tableView deleteRowsAtIndexPaths:@[indexPath]
+                                  withRowAnimation:UITableViewRowAnimationAutomatic];
+            break;
+        case NSFetchedResultsChangeUpdate:
+            // If you call reload here, you can run into a Core Data crash,
+            // where you see [__NSArrayM insertObject:atIndex:]: object cannot be nil.
+            // To be honest, I'm not sure what this is, could be a bug.
+//            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
+            
+            // Instead, you can just re-configure the cell at the index path, which
+            // does the same thing.
+            [self.dataSourceDelegate configureCell:[self.tableView cellForRowAtIndexPath:indexPath]
+                                       atIndexPath:indexPath];
+            break;
+        case NSFetchedResultsChangeMove:
+            [self.tableView moveRowAtIndexPath:indexPath
+                                   toIndexPath:newIndexPath];
+            break;
+    }
+}
+
+- (void)controller:(NSFetchedResultsController *)controller
+  didChangeSection:(id)sectionInfo
+           atIndex:(NSUInteger)sectionIndex
+     forChangeType:(NSFetchedResultsChangeType)type
+{
+    switch(type) {
+        case NSFetchedResultsChangeInsert:
+            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
+                          withRowAnimation:UITableViewRowAnimationAutomatic];
+            break;
+        case NSFetchedResultsChangeDelete:
+            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
+                          withRowAnimation:UITableViewRowAnimationAutomatic];
+            break;
+        case NSFetchedResultsChangeMove:
+            break;
+        case NSFetchedResultsChangeUpdate:
+            break;
+        default:
+            break;
+    }
+}
+
+- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
+{
+    [self.tableView endUpdates];
+    
+    if ([self.dataSourceDelegate respondsToSelector:@selector(fetchResultsDidChange)]) {
+        [self.dataSourceDelegate performSelector:@selector(fetchResultsDidChange)];
+    }
+}
+
+@end
diff --git a/StoreMad/StoreMad-Prefix.pch b/StoreMad/StoreMad-Prefix.pch
new file mode 100644
index 0000000..872f7fd
--- /dev/null
+++ b/StoreMad/StoreMad-Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'StoreMad' target in the 'StoreMad' project
+//
+
+#ifdef __OBJC__
+    #import <Foundation/Foundation.h>
+#endif
diff --git a/StoreMad/StoreMad.h b/StoreMad/StoreMad.h
new file mode 100644
index 0000000..4e5cb8e
--- /dev/null
+++ b/StoreMad/StoreMad.h
@@ -0,0 +1,37 @@
+//
+//  StoreMad.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 3/16/13.
+//  Copyright (c) 2012 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#ifndef StoreMad_StoreMad_h
+#define StoreMad_StoreMad_h
+
+#import "SMStoreController.h"
+#import "SMContextObserverController.h"
+#import "SMDataSource.h"
+#import "SMTableViewDataSource.h"
+#import "SMCollectionViewDataSource.h"
+#import "NSManagedObject+StoreMad.h"
+#import "NSManagedObjectContext+StoreMad.h"
+
+#endif
diff --git a/StoreMadApp.xcodeproj/project.pbxproj b/StoreMadApp.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..c30218b
--- /dev/null
+++ b/StoreMadApp.xcodeproj/project.pbxproj
@@ -0,0 +1,513 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		88D00A9F18D3EA61003F7512 /* MyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D00A9E18D3EA61003F7512 /* MyViewController.m */; };
+		DB7273CA1781CFCC00CE5D7E /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273C91781CFCC00CE5D7E /* RootViewController.m */; };
+		DB7273CC1781CFE400CE5D7E /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DB7273CB1781CFE400CE5D7E /* MainStoryboard.storyboard */; };
+		DB7273D01781D07600CE5D7E /* StoreMadApp.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DB7273CE1781D07600CE5D7E /* StoreMadApp.xcdatamodeld */; };
+		DB7273DC1781DC8000CE5D7E /* Employee.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273DB1781DC8000CE5D7E /* Employee.m */; };
+		DB7273E11781DCAF00CE5D7E /* EmployeeController.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273E01781DCAF00CE5D7E /* EmployeeController.m */; };
+		DB7273E51781DDC000CE5D7E /* EmployeeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273E41781DDC000CE5D7E /* EmployeeTableViewController.m */; };
+		DB7273EA178B22E700CE5D7E /* EmployeeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273E9178B22E700CE5D7E /* EmployeeTableViewCell.m */; };
+		DB7273EE178B2C0400CE5D7E /* EmployeeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7273ED178B2C0400CE5D7E /* EmployeeViewController.m */; };
+		DB7273F0178B2FF900CE5D7E /* EmployeeViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DB7273EF178B2FF900CE5D7E /* EmployeeViewController.storyboard */; };
+		DBBF5FE5177F7A0B008694F1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBBF5FE4177F7A0B008694F1 /* UIKit.framework */; };
+		DBBF5FE7177F7A0B008694F1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBBF5FE6177F7A0B008694F1 /* Foundation.framework */; };
+		DBBF5FE9177F7A0B008694F1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBBF5FE8177F7A0B008694F1 /* CoreGraphics.framework */; };
+		DBBF5FEF177F7A0B008694F1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DBBF5FED177F7A0B008694F1 /* InfoPlist.strings */; };
+		DBBF5FF1177F7A0B008694F1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DBBF5FF0177F7A0B008694F1 /* main.m */; };
+		DBBF5FF5177F7A0B008694F1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DBBF5FF4177F7A0B008694F1 /* AppDelegate.m */; };
+		DBBF5FF7177F7A0B008694F1 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DBBF5FF6177F7A0B008694F1 /* Default.png */; };
+		DBBF5FF9177F7A0B008694F1 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DBBF5FF8177F7A0B008694F1 /* Default@2x.png */; };
+		DBBF5FFB177F7A0B008694F1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DBBF5FFA177F7A0B008694F1 /* Default-568h@2x.png */; };
+		DBBF600B177F7A40008694F1 /* libStoreMad.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DBBF6008177F7A34008694F1 /* libStoreMad.a */; };
+		DBBF600F177F7A9E008694F1 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBBF600E177F7A9E008694F1 /* CoreData.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		DBBF6007177F7A34008694F1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = DB0DE4A015B9BB5F007F382F;
+			remoteInfo = StoreMad;
+		};
+		DBBF6009177F7A34008694F1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = DB0DE4B015B9BB5F007F382F;
+			remoteInfo = StoreMadTests;
+		};
+		DBBF600C177F7A44008694F1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = DB0DE49F15B9BB5F007F382F;
+			remoteInfo = StoreMad;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		88D00A9D18D3EA61003F7512 /* MyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyViewController.h; sourceTree = "<group>"; };
+		88D00A9E18D3EA61003F7512 /* MyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyViewController.m; sourceTree = "<group>"; };
+		DB7273C81781CFCC00CE5D7E /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = "<group>"; };
+		DB7273C91781CFCC00CE5D7E /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = "<group>"; };
+		DB7273CB1781CFE400CE5D7E /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = "<group>"; };
+		DB7273CF1781D07600CE5D7E /* StoreMadApp.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = StoreMadApp.xcdatamodel; sourceTree = "<group>"; };
+		DB7273D81781DBAA00CE5D7E /* CommonMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommonMacros.h; sourceTree = "<group>"; };
+		DB7273DA1781DC8000CE5D7E /* Employee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Employee.h; sourceTree = "<group>"; };
+		DB7273DB1781DC8000CE5D7E /* Employee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Employee.m; sourceTree = "<group>"; };
+		DB7273DF1781DCAF00CE5D7E /* EmployeeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmployeeController.h; sourceTree = "<group>"; };
+		DB7273E01781DCAF00CE5D7E /* EmployeeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmployeeController.m; sourceTree = "<group>"; };
+		DB7273E31781DDC000CE5D7E /* EmployeeTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmployeeTableViewController.h; sourceTree = "<group>"; };
+		DB7273E41781DDC000CE5D7E /* EmployeeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmployeeTableViewController.m; sourceTree = "<group>"; };
+		DB7273E8178B22E700CE5D7E /* EmployeeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmployeeTableViewCell.h; sourceTree = "<group>"; };
+		DB7273E9178B22E700CE5D7E /* EmployeeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmployeeTableViewCell.m; sourceTree = "<group>"; };
+		DB7273EC178B2C0400CE5D7E /* EmployeeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmployeeViewController.h; sourceTree = "<group>"; };
+		DB7273ED178B2C0400CE5D7E /* EmployeeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmployeeViewController.m; sourceTree = "<group>"; };
+		DB7273EF178B2FF900CE5D7E /* EmployeeViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = EmployeeViewController.storyboard; sourceTree = "<group>"; };
+		DBBF5FE1177F7A0B008694F1 /* StoreMadApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StoreMadApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		DBBF5FE4177F7A0B008694F1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		DBBF5FE6177F7A0B008694F1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		DBBF5FE8177F7A0B008694F1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		DBBF5FEC177F7A0B008694F1 /* StoreMadApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "StoreMadApp-Info.plist"; sourceTree = "<group>"; };
+		DBBF5FEE177F7A0B008694F1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DBBF5FF0177F7A0B008694F1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		DBBF5FF2177F7A0B008694F1 /* StoreMadApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StoreMadApp-Prefix.pch"; sourceTree = "<group>"; };
+		DBBF5FF3177F7A0B008694F1 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		DBBF5FF4177F7A0B008694F1 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		DBBF5FF6177F7A0B008694F1 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+		DBBF5FF8177F7A0B008694F1 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+		DBBF5FFA177F7A0B008694F1 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+		DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = StoreMad.xcodeproj; sourceTree = "<group>"; };
+		DBBF600E177F7A9E008694F1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		DBBF5FDE177F7A0B008694F1 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DBBF600B177F7A40008694F1 /* libStoreMad.a in Frameworks */,
+				DBBF5FE5177F7A0B008694F1 /* UIKit.framework in Frameworks */,
+				DBBF5FE7177F7A0B008694F1 /* Foundation.framework in Frameworks */,
+				DBBF5FE9177F7A0B008694F1 /* CoreGraphics.framework in Frameworks */,
+				DBBF600F177F7A9E008694F1 /* CoreData.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		88D00A9B18D3EA4C003F7512 /* Documentation */ = {
+			isa = PBXGroup;
+			children = (
+				88D00A9D18D3EA61003F7512 /* MyViewController.h */,
+				88D00A9E18D3EA61003F7512 /* MyViewController.m */,
+			);
+			name = Documentation;
+			sourceTree = "<group>";
+		};
+		DB7273C61781CFB800CE5D7E /* Root */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273C81781CFCC00CE5D7E /* RootViewController.h */,
+				DB7273C91781CFCC00CE5D7E /* RootViewController.m */,
+			);
+			name = Root;
+			sourceTree = "<group>";
+		};
+		DB7273CD1781D06100CE5D7E /* Core Data */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273CE1781D07600CE5D7E /* StoreMadApp.xcdatamodeld */,
+			);
+			name = "Core Data";
+			sourceTree = "<group>";
+		};
+		DB7273D91781DC1C00CE5D7E /* Employee */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273E7178B22CE00CE5D7E /* Cell */,
+				DB7273DE1781DC9D00CE5D7E /* Controller */,
+				DB7273DD1781DC9800CE5D7E /* Model */,
+				DB7273E61781DDC500CE5D7E /* Table View */,
+				DB7273EB178B2BF000CE5D7E /* View Controller */,
+			);
+			name = Employee;
+			sourceTree = "<group>";
+		};
+		DB7273DD1781DC9800CE5D7E /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273DA1781DC8000CE5D7E /* Employee.h */,
+				DB7273DB1781DC8000CE5D7E /* Employee.m */,
+			);
+			name = Model;
+			sourceTree = "<group>";
+		};
+		DB7273DE1781DC9D00CE5D7E /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273DF1781DCAF00CE5D7E /* EmployeeController.h */,
+				DB7273E01781DCAF00CE5D7E /* EmployeeController.m */,
+			);
+			name = Controller;
+			sourceTree = "<group>";
+		};
+		DB7273E61781DDC500CE5D7E /* Table View */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273E31781DDC000CE5D7E /* EmployeeTableViewController.h */,
+				DB7273E41781DDC000CE5D7E /* EmployeeTableViewController.m */,
+			);
+			name = "Table View";
+			sourceTree = "<group>";
+		};
+		DB7273E7178B22CE00CE5D7E /* Cell */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273E8178B22E700CE5D7E /* EmployeeTableViewCell.h */,
+				DB7273E9178B22E700CE5D7E /* EmployeeTableViewCell.m */,
+			);
+			name = Cell;
+			sourceTree = "<group>";
+		};
+		DB7273EB178B2BF000CE5D7E /* View Controller */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273EC178B2C0400CE5D7E /* EmployeeViewController.h */,
+				DB7273ED178B2C0400CE5D7E /* EmployeeViewController.m */,
+				DB7273EF178B2FF900CE5D7E /* EmployeeViewController.storyboard */,
+			);
+			name = "View Controller";
+			sourceTree = "<group>";
+		};
+		DBBF5FD8177F7A0B008694F1 = {
+			isa = PBXGroup;
+			children = (
+				DBBF5FE3177F7A0B008694F1 /* Frameworks */,
+				DBBF5FE2177F7A0B008694F1 /* Products */,
+				DBBF5FEA177F7A0B008694F1 /* StoreMadApp */,
+				DBBF6001177F7A24008694F1 /* Vendors */,
+			);
+			sourceTree = "<group>";
+		};
+		DBBF5FE2177F7A0B008694F1 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				DBBF5FE1177F7A0B008694F1 /* StoreMadApp.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		DBBF5FE3177F7A0B008694F1 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				DBBF600E177F7A9E008694F1 /* CoreData.framework */,
+				DBBF5FE4177F7A0B008694F1 /* UIKit.framework */,
+				DBBF5FE6177F7A0B008694F1 /* Foundation.framework */,
+				DBBF5FE8177F7A0B008694F1 /* CoreGraphics.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		DBBF5FEA177F7A0B008694F1 /* StoreMadApp */ = {
+			isa = PBXGroup;
+			children = (
+				88D00A9B18D3EA4C003F7512 /* Documentation */,
+				DBBF5FF3177F7A0B008694F1 /* AppDelegate.h */,
+				DBBF5FF4177F7A0B008694F1 /* AppDelegate.m */,
+				DB7273CD1781D06100CE5D7E /* Core Data */,
+				DB7273D91781DC1C00CE5D7E /* Employee */,
+				DB7273CB1781CFE400CE5D7E /* MainStoryboard.storyboard */,
+				DB7273C61781CFB800CE5D7E /* Root */,
+				DBBF5FEB177F7A0B008694F1 /* Supporting Files */,
+			);
+			path = StoreMadApp;
+			sourceTree = "<group>";
+		};
+		DBBF5FEB177F7A0B008694F1 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				DB7273D81781DBAA00CE5D7E /* CommonMacros.h */,
+				DBBF5FEC177F7A0B008694F1 /* StoreMadApp-Info.plist */,
+				DBBF5FED177F7A0B008694F1 /* InfoPlist.strings */,
+				DBBF5FF0177F7A0B008694F1 /* main.m */,
+				DBBF5FF2177F7A0B008694F1 /* StoreMadApp-Prefix.pch */,
+				DBBF5FF6177F7A0B008694F1 /* Default.png */,
+				DBBF5FF8177F7A0B008694F1 /* Default@2x.png */,
+				DBBF5FFA177F7A0B008694F1 /* Default-568h@2x.png */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		DBBF6001177F7A24008694F1 /* Vendors */ = {
+			isa = PBXGroup;
+			children = (
+				DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */,
+			);
+			name = Vendors;
+			sourceTree = "<group>";
+		};
+		DBBF6003177F7A34008694F1 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				DBBF6008177F7A34008694F1 /* libStoreMad.a */,
+				DBBF600A177F7A34008694F1 /* StoreMadTests.octest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		DBBF5FE0177F7A0B008694F1 /* StoreMadApp */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = DBBF5FFE177F7A0B008694F1 /* Build configuration list for PBXNativeTarget "StoreMadApp" */;
+			buildPhases = (
+				DBBF5FDD177F7A0B008694F1 /* Sources */,
+				DBBF5FDE177F7A0B008694F1 /* Frameworks */,
+				DBBF5FDF177F7A0B008694F1 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				DBBF600D177F7A44008694F1 /* PBXTargetDependency */,
+			);
+			name = StoreMadApp;
+			productName = StoreMadApp;
+			productReference = DBBF5FE1177F7A0B008694F1 /* StoreMadApp.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		DBBF5FD9177F7A0B008694F1 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0460;
+				ORGANIZATIONNAME = Burgess;
+			};
+			buildConfigurationList = DBBF5FDC177F7A0B008694F1 /* Build configuration list for PBXProject "StoreMadApp" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = DBBF5FD8177F7A0B008694F1;
+			productRefGroup = DBBF5FE2177F7A0B008694F1 /* Products */;
+			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = DBBF6003177F7A34008694F1 /* Products */;
+					ProjectRef = DBBF6002177F7A34008694F1 /* StoreMad.xcodeproj */;
+				},
+			);
+			projectRoot = "";
+			targets = (
+				DBBF5FE0177F7A0B008694F1 /* StoreMadApp */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+		DBBF6008177F7A34008694F1 /* libStoreMad.a */ = {
+			isa = PBXReferenceProxy;
+			fileType = archive.ar;
+			path = libStoreMad.a;
+			remoteRef = DBBF6007177F7A34008694F1 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		DBBF600A177F7A34008694F1 /* StoreMadTests.octest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			name = StoreMadTests.octest;
+			path = StoreMadTests.xctest;
+			remoteRef = DBBF6009177F7A34008694F1 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+		DBBF5FDF177F7A0B008694F1 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DBBF5FEF177F7A0B008694F1 /* InfoPlist.strings in Resources */,
+				DBBF5FF7177F7A0B008694F1 /* Default.png in Resources */,
+				DBBF5FF9177F7A0B008694F1 /* Default@2x.png in Resources */,
+				DBBF5FFB177F7A0B008694F1 /* Default-568h@2x.png in Resources */,
+				DB7273CC1781CFE400CE5D7E /* MainStoryboard.storyboard in Resources */,
+				DB7273F0178B2FF900CE5D7E /* EmployeeViewController.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		DBBF5FDD177F7A0B008694F1 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				DBBF5FF1177F7A0B008694F1 /* main.m in Sources */,
+				DBBF5FF5177F7A0B008694F1 /* AppDelegate.m in Sources */,
+				DB7273CA1781CFCC00CE5D7E /* RootViewController.m in Sources */,
+				DB7273D01781D07600CE5D7E /* StoreMadApp.xcdatamodeld in Sources */,
+				88D00A9F18D3EA61003F7512 /* MyViewController.m in Sources */,
+				DB7273DC1781DC8000CE5D7E /* Employee.m in Sources */,
+				DB7273E11781DCAF00CE5D7E /* EmployeeController.m in Sources */,
+				DB7273E51781DDC000CE5D7E /* EmployeeTableViewController.m in Sources */,
+				DB7273EA178B22E700CE5D7E /* EmployeeTableViewCell.m in Sources */,
+				DB7273EE178B2C0400CE5D7E /* EmployeeViewController.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		DBBF600D177F7A44008694F1 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = StoreMad;
+			targetProxy = DBBF600C177F7A44008694F1 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		DBBF5FED177F7A0B008694F1 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				DBBF5FEE177F7A0B008694F1 /* en */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		DBBF5FFC177F7A0B008694F1 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		DBBF5FFD177F7A0B008694F1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		DBBF5FFF177F7A0B008694F1 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMadApp/StoreMadApp-Prefix.pch";
+				INFOPLIST_FILE = "StoreMadApp/StoreMadApp-Info.plist";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		DBBF6000177F7A0B008694F1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "StoreMadApp/StoreMadApp-Prefix.pch";
+				INFOPLIST_FILE = "StoreMadApp/StoreMadApp-Info.plist";
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		DBBF5FDC177F7A0B008694F1 /* Build configuration list for PBXProject "StoreMadApp" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DBBF5FFC177F7A0B008694F1 /* Debug */,
+				DBBF5FFD177F7A0B008694F1 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		DBBF5FFE177F7A0B008694F1 /* Build configuration list for PBXNativeTarget "StoreMadApp" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				DBBF5FFF177F7A0B008694F1 /* Debug */,
+				DBBF6000177F7A0B008694F1 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+
+/* Begin XCVersionGroup section */
+		DB7273CE1781D07600CE5D7E /* StoreMadApp.xcdatamodeld */ = {
+			isa = XCVersionGroup;
+			children = (
+				DB7273CF1781D07600CE5D7E /* StoreMadApp.xcdatamodel */,
+			);
+			currentVersion = DB7273CF1781D07600CE5D7E /* StoreMadApp.xcdatamodel */;
+			path = StoreMadApp.xcdatamodeld;
+			sourceTree = "<group>";
+			versionGroupType = wrapper.xcdatamodel;
+		};
+/* End XCVersionGroup section */
+	};
+	rootObject = DBBF5FD9177F7A0B008694F1 /* Project object */;
+}
diff --git a/StoreMadApp/AppDelegate.h b/StoreMadApp/AppDelegate.h
new file mode 100644
index 0000000..d6e79ee
--- /dev/null
+++ b/StoreMadApp/AppDelegate.h
@@ -0,0 +1,20 @@
+//
+//  AppDelegate.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 6/29/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "CommonMacros.h"
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@property (nonatomic, strong) SMStoreController *storeController;
+
++ (AppDelegate *)sharedInstance;
+
+@end
diff --git a/StoreMadApp/AppDelegate.m b/StoreMadApp/AppDelegate.m
new file mode 100644
index 0000000..ecad65b
--- /dev/null
+++ b/StoreMadApp/AppDelegate.m
@@ -0,0 +1,53 @@
+//
+//  AppDelegate.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 6/29/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
++ (AppDelegate *)sharedInstance
+{
+    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
+        return [[UIApplication sharedApplication] delegate];
+    });
+}
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+    return YES;
+}
+
+#pragma mark - StoreMad
+
+- (SMStoreController *)storeController
+{
+    if (_storeController) return _storeController;
+
+    // sqlite
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    NSURL *applicationDocDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
+    NSURL *storeURL = [applicationDocDirectory URLByAppendingPathComponent:@"StoreMadApp.sqlite"];
+
+    // momd
+    NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"StoreMadApp" withExtension:@"momd"];
+    
+    // controller
+    SMStoreController *newStoreController = [SMStoreController storeControllerWithStoreURL:storeURL
+                                                                               andModelURL:modelURL];
+    
+    //
+    // Context saves when app changes state
+    //
+    [newStoreController setSaveOnAppStateChange:YES];
+  
+    _storeController = newStoreController;
+  
+    return _storeController;
+}
+
+@end
diff --git a/StoreMadApp/CommonMacros.h b/StoreMadApp/CommonMacros.h
new file mode 100644
index 0000000..cf5dc4f
--- /dev/null
+++ b/StoreMadApp/CommonMacros.h
@@ -0,0 +1,20 @@
+//
+//  CommonMacros.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#ifndef StoreMadApp_CommonMacros_h
+#define StoreMadApp_CommonMacros_h
+
+#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \
+static dispatch_once_t pred = 0; \
+__strong static id _sharedObject = nil; \
+dispatch_once(&pred, ^{ \
+_sharedObject = block(); \
+}); \
+return _sharedObject; \
+
+#endif
diff --git a/StoreMadApp/Default-568h@2x.png b/StoreMadApp/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/StoreMadApp/Default-568h@2x.png
Binary files differ
diff --git a/StoreMadApp/Default.png b/StoreMadApp/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/StoreMadApp/Default.png
Binary files differ
diff --git a/StoreMadApp/Default@2x.png b/StoreMadApp/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/StoreMadApp/Default@2x.png
Binary files differ
diff --git a/StoreMadApp/Employee.h b/StoreMadApp/Employee.h
new file mode 100644
index 0000000..b81b072
--- /dev/null
+++ b/StoreMadApp/Employee.h
@@ -0,0 +1,22 @@
+//
+//  Employee.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+
+@interface Employee : NSManagedObject
+
+@property (nonatomic, retain) NSString * firstName;
+@property (nonatomic, retain) NSString * lastName;
+@property (nonatomic, retain) NSDate * hireDate;
+@property (nonatomic, retain) NSDate * fireDate;
+
+@property (nonatomic, readonly) BOOL isFired;
+
+@end
diff --git a/StoreMadApp/Employee.m b/StoreMadApp/Employee.m
new file mode 100644
index 0000000..7498fd1
--- /dev/null
+++ b/StoreMadApp/Employee.m
@@ -0,0 +1,24 @@
+//
+//  Employee.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "Employee.h"
+
+
+@implementation Employee
+
+@dynamic firstName;
+@dynamic lastName;
+@dynamic hireDate;
+@dynamic fireDate;
+
+- (BOOL)isFired
+{
+    return (self.fireDate != nil);
+}
+
+@end
diff --git a/StoreMadApp/EmployeeController.h b/StoreMadApp/EmployeeController.h
new file mode 100644
index 0000000..9440fb5
--- /dev/null
+++ b/StoreMadApp/EmployeeController.h
@@ -0,0 +1,22 @@
+//
+//  EmployeeController.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class Employee;
+
+@interface EmployeeController : NSObject
+
++ (NSFetchRequest *)allEmployeesSortedFetchRequestInContext:(NSManagedObjectContext *)context;
+
++ (void)fireEmployee:(Employee *)employee
+          completion:(void (^)(void))completion;
+
++ (void)hireEmployee:(Employee *)employee
+          completion:(void (^)(void))completion;
+@end
diff --git a/StoreMadApp/EmployeeController.m b/StoreMadApp/EmployeeController.m
new file mode 100644
index 0000000..66b9af8
--- /dev/null
+++ b/StoreMadApp/EmployeeController.m
@@ -0,0 +1,56 @@
+//
+//  EmployeeController.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "EmployeeController.h"
+#import "Employee.h"
+
+@implementation EmployeeController
+
+#pragma mark - Core Data
+
++ (NSFetchRequest *)allEmployeesSortedFetchRequestInContext:(NSManagedObjectContext *)context
+{
+    // Request
+    NSFetchRequest *fetchRequest = [context fetchRequestForObjectClass:[Employee class]];
+    
+    // Sort
+    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"hireDate" ascending:NO]];
+    
+    return fetchRequest;
+}
+
+#pragma mark - Actions
+
++ (void)fireEmployee:(Employee *)employee
+          completion:(void (^)(void))completion
+{
+    NSManagedObjectContext *context = employee.managedObjectContext;
+    [context performBlockAndWait:^{
+        employee.fireDate = [NSDate date];
+        [context save];
+        if (completion) completion ();
+    }];
+}
+
++ (void)hireEmployee:(Employee *)employee
+          completion:(void (^)(void))completion
+{
+    if (!employee.isFired) {
+        if (completion) completion();
+        return;
+    }
+    NSManagedObjectContext *context = employee.managedObjectContext;
+    [context performBlockAndWait:^{
+        employee.fireDate = nil;
+        employee.hireDate = [NSDate date];
+        [context save];
+        if (completion) completion ();
+    }];
+}
+
+@end
diff --git a/StoreMadApp/EmployeeTableViewCell.h b/StoreMadApp/EmployeeTableViewCell.h
new file mode 100644
index 0000000..7262212
--- /dev/null
+++ b/StoreMadApp/EmployeeTableViewCell.h
@@ -0,0 +1,17 @@
+//
+//  EmployeeTableViewCell.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/8/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface EmployeeTableViewCell : UITableViewCell
+
+@property (nonatomic, weak) IBOutlet UILabel *firstNameLabel;
+@property (nonatomic, weak) IBOutlet UILabel *lastNameLabel;
+@property (nonatomic, weak) IBOutlet UILabel *hireDateLabel;
+
+@end
diff --git a/StoreMadApp/EmployeeTableViewCell.m b/StoreMadApp/EmployeeTableViewCell.m
new file mode 100644
index 0000000..9e0b17a
--- /dev/null
+++ b/StoreMadApp/EmployeeTableViewCell.m
@@ -0,0 +1,29 @@
+//
+//  EmployeeTableViewCell.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/8/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "EmployeeTableViewCell.h"
+
+@implementation EmployeeTableViewCell
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        // Initialization code
+    }
+    return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end
diff --git a/StoreMadApp/EmployeeTableViewController.h b/StoreMadApp/EmployeeTableViewController.h
new file mode 100644
index 0000000..a4016ed
--- /dev/null
+++ b/StoreMadApp/EmployeeTableViewController.h
@@ -0,0 +1,16 @@
+//
+//  EmployeeTableViewController.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>\
+
+@interface EmployeeTableViewController : UITableViewController
+
+@property (nonatomic, strong) SMStoreController *storeController;
+@property (nonatomic, strong) SMTableViewDataSource *storeMadDataSource;
+
+@end
diff --git a/StoreMadApp/EmployeeTableViewController.m b/StoreMadApp/EmployeeTableViewController.m
new file mode 100644
index 0000000..f1c8aa0
--- /dev/null
+++ b/StoreMadApp/EmployeeTableViewController.m
@@ -0,0 +1,156 @@
+//
+//  EmployeeTableViewController.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "EmployeeTableViewController.h"
+
+#import "Employee.h"
+#import "EmployeeController.h"
+#import "EmployeeTableViewCell.h"
+#import "EmployeeViewController.h"
+
+@interface EmployeeTableViewController () <SMDataSourceDelegate>
+
+@end
+
+@implementation EmployeeTableViewController
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    
+    self.tableView.delegate = self;
+    
+    [self buildDataSource];
+}
+
+#pragma mark - IBAction
+
+- (IBAction)createEmployees:(id)sender
+{
+    NSManagedObjectContext *context = self.storeController.managedObjectContext;
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
+        
+        NSArray *firstNames = @[@"Poison", @"Clark", @"Bruce", @"Peter", @"Wonder"];
+        NSArray *lastNames = @[@"Ivy", @"Kent", @"Wayne", @"Parker", @"Woman"];
+        
+        [context performBlock:^{
+            // Create a lot of employees
+            [firstNames enumerateObjectsUsingBlock:^(NSString *firstName, NSUInteger idx, BOOL *stop) {
+                Employee *employee = (Employee *)[context insertNewObjectForEntityNamed:NSStringFromClass([Employee class])];
+                employee.hireDate  = [NSDate date];
+                employee.firstName = firstName;
+                employee.lastName  = [lastNames objectAtIndex:idx];
+            }];
+            
+            // save
+            [context save];
+        }];
+    });
+}
+
+- (IBAction)reset:(id)sender
+{
+    [self.storeController reset];
+    [self buildDataSource];
+    [self.tableView reloadData];
+}
+
+#pragma mark - Store Mad
+
+- (void)buildDataSource
+{
+    self.storeMadDataSource = [SMTableViewDataSource new];
+    
+    NSManagedObjectContext *context = self.storeController.managedObjectContext;
+    NSFetchRequest *allEmployeesFetch = [EmployeeController allEmployeesSortedFetchRequestInContext:context];
+    
+    [self.storeMadDataSource setupWithTableView:self.tableView
+                                   fetchRequest:allEmployeesFetch
+                                        context:context
+                             sectionNameKeyPath:nil
+                                      cacheName:nil];
+    
+    self.storeMadDataSource.dataSourceDelegate = self;
+
+    
+    [self.storeMadDataSource performFetch];
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+    return self.storeMadDataSource.numberOfSections;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    return [self.storeMadDataSource numberOfItemsInSection:section];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    static NSString *CellIdentifier = @"EmployeeTableViewCell";
+    
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
+                                                            forIndexPath:indexPath];
+    
+    [self configureCell:cell atIndexPath:indexPath];
+    
+    return cell;
+}
+
+#pragma mark - SMTableViewController
+
+- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
+{
+    EmployeeTableViewCell *employeeCell = (EmployeeTableViewCell *)cell;
+    
+    Employee *employee = [self.storeMadDataSource objectAtIndexPath:indexPath];
+    
+    employeeCell.firstNameLabel.text = employee.firstName;
+    employeeCell.lastNameLabel.text = employee.lastName;
+    employeeCell.hireDateLabel.text = [employee.hireDate description];
+    
+    if (employee.isFired) {
+        employeeCell.backgroundColor = [UIColor redColor];
+    } else {
+        employeeCell.backgroundColor = [UIColor whiteColor];
+    }
+}
+
+- (void)dataSource:(SMDataSource *)dataSource
+           isEmpty:(BOOL)empty
+{
+    NSLog(@"empty!");
+}
+
+#pragma mark - Table view delegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    Employee *employee = [self.storeMadDataSource objectAtIndexPath:indexPath];
+    
+    EmployeeViewController *employeeVC = [EmployeeViewController newEmployeeViewControllerFromStorybaord];
+    employeeVC.employee = employee;
+    
+    [self.navigationController pushViewController:employeeVC animated:YES];
+}
+
+- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSLog(@"did end editing");
+}
+
+//- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
+//       toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
+//{
+//    
+//}
+
+@end
diff --git a/StoreMadApp/EmployeeViewController.h b/StoreMadApp/EmployeeViewController.h
new file mode 100644
index 0000000..d42883c
--- /dev/null
+++ b/StoreMadApp/EmployeeViewController.h
@@ -0,0 +1,21 @@
+//
+//  EmployeeViewController.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/8/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class Employee;
+
+@interface EmployeeViewController : UIViewController
+
+@property (nonatomic, strong) Employee *employee;
+
++ (EmployeeViewController *)newEmployeeViewControllerFromStorybaord;
+
+- (void)configureWithEmployee:(Employee *)employee;
+
+@end
diff --git a/StoreMadApp/EmployeeViewController.m b/StoreMadApp/EmployeeViewController.m
new file mode 100644
index 0000000..40dd7cf
--- /dev/null
+++ b/StoreMadApp/EmployeeViewController.m
@@ -0,0 +1,131 @@
+//
+//  EmployeeViewController.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/8/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "EmployeeViewController.h"
+
+#import "Employee.h"
+#import "EmployeeController.h"
+
+#import <StoreMad/SMContextObserverController.h>
+
+@interface EmployeeViewController ()
+
+@property (nonatomic, weak) IBOutlet UILabel *firstNameLabel;
+@property (nonatomic, weak) IBOutlet UILabel *lastNameLabel;
+@property (nonatomic, weak) IBOutlet UILabel *hireDateLabel;
+@property (nonatomic, weak) IBOutlet UILabel *fireDateLabel;
+
+@property (nonatomic, weak) IBOutlet UILabel *longRunningLabel;
+@property (nonatomic, weak) IBOutlet UIActivityIndicatorView *activity;
+
+@property (nonatomic, strong) id observer;
+@property (nonatomic, strong) id longObserver;
+
+@property (nonatomic, strong) NSOperationQueue *asyncQueue;
+
+@end
+
+@implementation EmployeeViewController
+
+- (void)dealloc
+{
+    [[SMContextObserverController defaultController] removeContextObserver:self.observer];
+    [[SMContextObserverController defaultController] removeContextObserver:self.longObserver];
+}
+
++ (EmployeeViewController *)newEmployeeViewControllerFromStorybaord
+{
+    UIStoryboard *employeeStoryboard = [UIStoryboard storyboardWithName:[self description]
+                                                                 bundle:nil];
+    
+    EmployeeViewController *employeeVC = [employeeStoryboard instantiateViewControllerWithIdentifier:[self description]];
+    
+    return employeeVC;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    [self configureWithEmployee:_employee];
+    self.longRunningLabel.hidden = YES;
+    [self.activity stopAnimating];
+    
+    //
+    // Long running job observer
+    //
+    _asyncQueue = [[NSOperationQueue alloc] init];
+    __weak EmployeeViewController *weakSelf = self;
+    self.longObserver = [[SMContextObserverController defaultController] addContextObserverForChangesToObject:_employee
+                                                                                                        queue:_asyncQueue
+                                                                                                   workBlock:^(NSManagedObject *object) {
+                                                                                                       [weakSelf startLongRunningTask];
+                                                                                                   }];
+}
+
+- (void)configureWithEmployee:(Employee *)employee
+{
+    self.firstNameLabel.text = employee.firstName;
+    self.lastNameLabel.text = employee.lastName;
+    self.hireDateLabel.text = employee.hireDate.description;
+    _fireDateLabel.hidden = !employee.isFired;
+
+    [self performSelectorInBackground:@selector(createObserver) withObject:nil];
+
+    self.employee = employee;
+}
+
+- (void)createObserver
+{
+    if (!_observer) {
+        __weak EmployeeViewController *weakSelf = self;
+        self.observer = [[SMContextObserverController defaultController] addContextObserverForChangesToObject:_employee
+                                                                                                    workBlock:^(NSManagedObject *object) {
+                                                                                                        [weakSelf configureWithEmployee:weakSelf.employee];
+                                                                                                    }];
+    }
+}
+
+#pragma mark - IBAction
+
+- (IBAction)fireEmployee:(id)sender
+{
+    [EmployeeController fireEmployee:self.employee
+                          completion:^{
+                              NSLog(@"FIRED!");
+                          }];
+}
+
+- (IBAction)hireEmployee:(id)sender
+{
+    [EmployeeController hireEmployee:self.employee
+                          completion:^{
+                              NSLog(@"Hired!");
+                          }];
+}
+
+#pragma mark -
+
+- (void)startLongRunningTask
+{
+    dispatch_async(dispatch_get_main_queue(), ^{
+        self.longRunningLabel.hidden = NO;
+        [self.activity startAnimating];
+    });
+    
+    //
+    // Sleep the current thread to demo passing in NSOperationQueue to observer
+    //
+    sleep(3);
+    
+    dispatch_async(dispatch_get_main_queue(), ^{
+        self.longRunningLabel.hidden = YES;
+        [self.activity stopAnimating];
+    });
+}
+
+@end
diff --git a/StoreMadApp/EmployeeViewController.storyboard b/StoreMadApp/EmployeeViewController.storyboard
new file mode 100644
index 0000000..a777540
--- /dev/null
+++ b/StoreMadApp/EmployeeViewController.storyboard
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVersion="12F45" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="zKh-bw-ubP">
+    <dependencies>
+        <deployment defaultVersion="1552" identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
+    </dependencies>
+    <scenes>
+        <!--Employee View Controller-->
+        <scene sceneID="hqq-ch-xgm">
+            <objects>
+                <viewController storyboardIdentifier="EmployeeViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="zKh-bw-ubP" customClass="EmployeeViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="kl4-L3-zzS">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                        <subviews>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="First" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ggb-lu-EhH">
+                                <rect key="frame" x="20" y="89" width="280" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Last" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0AX-We-ksU">
+                                <rect key="frame" x="20" y="118" width="280" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Hire Date" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="QiG-tP-Cyz">
+                                <rect key="frame" x="20" y="147" width="280" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="uQc-vB-qEu">
+                                <rect key="frame" x="20" y="452" width="280" height="44"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                <state key="normal" title="Fire!">
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <connections>
+                                    <action selector="fireEmployee:" destination="zKh-bw-ubP" eventType="touchUpInside" id="T2V-tG-g3A"/>
+                                </connections>
+                            </button>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="FIRED!" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="8JR-Eo-Hzj">
+                                <rect key="frame" x="20" y="265" width="280" height="38"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
+                                <color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="0GZ-jb-jQ8">
+                                <rect key="frame" x="20" y="504" width="280" height="44"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                <state key="normal" title="Hire!">
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <connections>
+                                    <action selector="hireEmployee:" destination="zKh-bw-ubP" eventType="touchUpInside" id="ROJ-5i-giv"/>
+                                </connections>
+                            </button>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Running…" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="wCK-06-UpP">
+                                <rect key="frame" x="20" y="311" width="280" height="38"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" id="qb8-Zb-OQf">
+                                <rect key="frame" x="150" y="357" width="20" height="20"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                            </activityIndicatorView>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                    </view>
+                    <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
+                    <connections>
+                        <outlet property="activity" destination="qb8-Zb-OQf" id="fCB-V9-DxK"/>
+                        <outlet property="fireDateLabel" destination="8JR-Eo-Hzj" id="US5-eF-3az"/>
+                        <outlet property="firstNameLabel" destination="ggb-lu-EhH" id="uEN-Mn-Gav"/>
+                        <outlet property="hireDateLabel" destination="QiG-tP-Cyz" id="34b-qo-0zZ"/>
+                        <outlet property="lastNameLabel" destination="0AX-We-ksU" id="Icj-XY-CfI"/>
+                        <outlet property="longRunningLabel" destination="wCK-06-UpP" id="qbr-hR-9kq"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="HUY-zC-hio" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="175" y="45"/>
+        </scene>
+    </scenes>
+    <simulatedMetricsContainer key="defaultSimulatedMetrics">
+        <simulatedStatusBarMetrics key="statusBar"/>
+        <simulatedOrientationMetrics key="orientation"/>
+        <simulatedScreenMetrics key="destination" type="retina4"/>
+    </simulatedMetricsContainer>
+</document>
diff --git a/StoreMadApp/MainStoryboard.storyboard b/StoreMadApp/MainStoryboard.storyboard
new file mode 100644
index 0000000..6a5499b
--- /dev/null
+++ b/StoreMadApp/MainStoryboard.storyboard
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVersion="12F45" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="1ij-Hl-uHW">
+    <dependencies>
+        <deployment defaultVersion="1552" identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
+    </dependencies>
+    <scenes>
+        <!--Root View Controller - Employees-->
+        <scene sceneID="9gu-sF-cHj">
+            <objects>
+                <tableViewController storyboardIdentifier="RootViewController" id="kTC-PH-1mn" customClass="RootViewController" sceneMemberID="viewController">
+                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="120" sectionHeaderHeight="22" sectionFooterHeight="22" id="szW-ik-Ebv">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                        <prototypes>
+                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="EmployeeTableViewCell" rowHeight="120" id="1RV-mA-jNc" customClass="EmployeeTableViewCell">
+                                <rect key="frame" x="0.0" y="86" width="320" height="120"/>
+                                <autoresizingMask key="autoresizingMask"/>
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="1RV-mA-jNc" id="rGB-Oh-ZGz">
+                                    <rect key="frame" x="0.0" y="0.0" width="287" height="119"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                    <subviews>
+                                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="First" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ckf-Vx-f25">
+                                            <rect key="frame" x="20" y="20" width="260" height="21"/>
+                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                            <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                        </label>
+                                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Last" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="kjE-M6-Bho">
+                                            <rect key="frame" x="20" y="49" width="260" height="21"/>
+                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                            <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                        </label>
+                                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Date" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bS0-mk-AiV">
+                                            <rect key="frame" x="20" y="78" width="260" height="21"/>
+                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                            <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                        </label>
+                                    </subviews>
+                                </tableViewCellContentView>
+                                <connections>
+                                    <outlet property="firstNameLabel" destination="ckf-Vx-f25" id="uTa-2q-Bb3"/>
+                                    <outlet property="hireDateLabel" destination="bS0-mk-AiV" id="SGw-WG-0gn"/>
+                                    <outlet property="lastNameLabel" destination="kjE-M6-Bho" id="Lw7-YA-2l0"/>
+                                </connections>
+                            </tableViewCell>
+                        </prototypes>
+                    </tableView>
+                    <navigationItem key="navigationItem" title="Employees" id="MvK-gI-quA">
+                        <barButtonItem key="leftBarButtonItem" title="Create" id="L2H-2x-BW5">
+                            <connections>
+                                <action selector="createEmployees:" destination="kTC-PH-1mn" id="syR-PI-blX"/>
+                            </connections>
+                        </barButtonItem>
+                        <barButtonItem key="rightBarButtonItem" title="Clear" id="GDi-Hq-46H">
+                            <connections>
+                                <action selector="reset:" destination="kTC-PH-1mn" id="3uU-jA-3NQ"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
+                </tableViewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="lgv-2k-4C9" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="376" y="21"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="swC-27-jyE">
+            <objects>
+                <navigationController definesPresentationContext="YES" id="1ij-Hl-uHW" sceneMemberID="viewController">
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="V3x-QZ-q2L">
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="kTC-PH-1mn" kind="relationship" relationship="rootViewController" id="rzI-nb-fbX"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="kpg-aW-MFJ" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-158" y="21"/>
+        </scene>
+    </scenes>
+    <simulatedMetricsContainer key="defaultSimulatedMetrics">
+        <simulatedStatusBarMetrics key="statusBar"/>
+        <simulatedOrientationMetrics key="orientation"/>
+        <simulatedScreenMetrics key="destination" type="retina4"/>
+    </simulatedMetricsContainer>
+</document>
diff --git a/StoreMadApp/MyViewController.h b/StoreMadApp/MyViewController.h
new file mode 100644
index 0000000..a1f05a0
--- /dev/null
+++ b/StoreMadApp/MyViewController.h
@@ -0,0 +1,13 @@
+//
+//  MyViewController.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 3/14/14.
+//  Copyright (c) 2014 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface MyViewController : UIViewController
+
+@end
diff --git a/StoreMadApp/MyViewController.m b/StoreMadApp/MyViewController.m
new file mode 100644
index 0000000..24d22cb
--- /dev/null
+++ b/StoreMadApp/MyViewController.m
@@ -0,0 +1,40 @@
+//
+//  MyViewController.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 3/14/14.
+//  Copyright (c) 2014 Burgess. All rights reserved.
+//
+
+#import "MyViewController.h"
+
+#import <StoreMad/StoreMad.h>
+
+#import "Employee.h"
+
+@interface MyViewController ()
+
+@property (nonatomic, strong) id observer;
+
+@property (nonatomic, weak) IBOutlet UILabel *employmentStatusLabel;
+
+@end
+
+@implementation MyViewController
+
+- (void)dealloc
+{
+	[[SMContextObserverController defaultController] removeContextObserver:self.observer];
+}
+
+- (void)viewDidLoad
+{
+	[super viewDidLoad];
+}
+
+- (void)configureWithEmployee:(Employee *)employee
+{
+    _employmentStatusLabel.text = employee.isFired ? @"Fired" : @"Hired";
+}
+
+@end
diff --git a/StoreMadApp/RootViewController.h b/StoreMadApp/RootViewController.h
new file mode 100644
index 0000000..6f3b1ca
--- /dev/null
+++ b/StoreMadApp/RootViewController.h
@@ -0,0 +1,14 @@
+//
+//  RootViewController.h
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "EmployeeTableViewController.h"
+
+@interface RootViewController : EmployeeTableViewController
+
+@end
diff --git a/StoreMadApp/RootViewController.m b/StoreMadApp/RootViewController.m
new file mode 100644
index 0000000..7661ac6
--- /dev/null
+++ b/StoreMadApp/RootViewController.m
@@ -0,0 +1,22 @@
+//
+//  RootViewController.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 7/1/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import "RootViewController.h"
+
+#import "Employee.h"
+#import "EmployeeController.h"
+
+@implementation RootViewController
+
+- (void)awakeFromNib
+{
+    [super awakeFromNib];
+    self.storeController = [[AppDelegate sharedInstance] storeController];
+}
+
+@end
diff --git a/StoreMadApp/StoreMadApp-Info.plist b/StoreMadApp/StoreMadApp-Info.plist
new file mode 100644
index 0000000..ba989ae
--- /dev/null
+++ b/StoreMadApp/StoreMadApp-Info.plist
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>burgess.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIMainStoryboardFile</key>
+	<string>MainStoryboard</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>
diff --git a/StoreMadApp/StoreMadApp-Prefix.pch b/StoreMadApp/StoreMadApp-Prefix.pch
new file mode 100644
index 0000000..aafad44
--- /dev/null
+++ b/StoreMadApp/StoreMadApp-Prefix.pch
@@ -0,0 +1,17 @@
+//
+// Prefix header for all source files of the 'StoreMadApp' target in the 'StoreMadApp' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iOS SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+    #import <UIKit/UIKit.h>
+    #import <Foundation/Foundation.h>
+    #import <CoreData/CoreData.h>
+    #import <StoreMad/StoreMad.h>
+    #import "AppDelegate.h"
+#endif
\ No newline at end of file
diff --git a/StoreMadApp/StoreMadApp.xcdatamodeld/StoreMadApp.xcdatamodel/contents b/StoreMadApp/StoreMadApp.xcdatamodeld/StoreMadApp.xcdatamodel/contents
new file mode 100644
index 0000000..46bb399
--- /dev/null
+++ b/StoreMadApp/StoreMadApp.xcdatamodeld/StoreMadApp.xcdatamodel/contents
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="5063" systemVersion="12F45" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
+    <entity name="Employee" representedClassName="Employee" syncable="YES">
+        <attribute name="fireDate" optional="YES" attributeType="Date" syncable="YES"/>
+        <attribute name="firstName" optional="YES" attributeType="String" syncable="YES"/>
+        <attribute name="hireDate" optional="YES" attributeType="Date" syncable="YES"/>
+        <attribute name="lastName" optional="YES" attributeType="String" syncable="YES"/>
+    </entity>
+    <elements>
+        <element name="Employee" positionX="160" positionY="192" width="128" height="105"/>
+    </elements>
+</model>
\ No newline at end of file
diff --git a/StoreMadApp/en.lproj/InfoPlist.strings b/StoreMadApp/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/StoreMadApp/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/StoreMadApp/main.m b/StoreMadApp/main.m
new file mode 100644
index 0000000..84f092e
--- /dev/null
+++ b/StoreMadApp/main.m
@@ -0,0 +1,18 @@
+//
+//  main.m
+//  StoreMadApp
+//
+//  Created by Andrew Smith on 6/29/13.
+//  Copyright (c) 2013 Burgess. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}
diff --git a/StoreMadTests/Department.h b/StoreMadTests/Department.h
new file mode 100644
index 0000000..bd9a32a
--- /dev/null
+++ b/StoreMadTests/Department.h
@@ -0,0 +1,18 @@
+//
+//  Department.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 6/29/13.
+//  Copyright (c) 2013 eGraphs. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+
+@interface Department : NSManagedObject
+
+@property (nonatomic, retain) NSNumber * departmentId;
+@property (nonatomic, retain) NSString * name;
+
+@end
diff --git a/StoreMadTests/Department.m b/StoreMadTests/Department.m
new file mode 100644
index 0000000..cdb08d2
--- /dev/null
+++ b/StoreMadTests/Department.m
@@ -0,0 +1,17 @@
+//
+//  Department.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 6/29/13.
+//  Copyright (c) 2013 eGraphs. All rights reserved.
+//
+
+#import "Department.h"
+
+
+@implementation Department
+
+@dynamic departmentId;
+@dynamic name;
+
+@end
diff --git a/StoreMadTests/Employee.h b/StoreMadTests/Employee.h
new file mode 100644
index 0000000..308c72b
--- /dev/null
+++ b/StoreMadTests/Employee.h
@@ -0,0 +1,19 @@
+//
+//  Employee.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 9/28/12.
+//  Copyright (c) 2012 eGraphs. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <CoreData/CoreData.h>
+
+
+@interface Employee : NSManagedObject
+
+@property (nonatomic, retain) NSNumber * employeeId;
+@property (nonatomic, retain) NSString * firstName;
+@property (nonatomic, retain) NSString * lastName;
+
+@end
diff --git a/StoreMadTests/Employee.m b/StoreMadTests/Employee.m
new file mode 100644
index 0000000..3dff3d2
--- /dev/null
+++ b/StoreMadTests/Employee.m
@@ -0,0 +1,18 @@
+//
+//  Employee.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 9/28/12.
+//  Copyright (c) 2012 eGraphs. All rights reserved.
+//
+
+#import "Employee.h"
+
+
+@implementation Employee
+
+@dynamic employeeId;
+@dynamic firstName;
+@dynamic lastName;
+
+@end
diff --git a/StoreMadTests/SMContextObserverControllerTests.m b/StoreMadTests/SMContextObserverControllerTests.m
new file mode 100644
index 0000000..113fb60
--- /dev/null
+++ b/StoreMadTests/SMContextObserverControllerTests.m
@@ -0,0 +1,166 @@
+//
+//  SMContextObserverControllerTests.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 3/13/14.
+//  Copyright (c) 2014 eGraphs. All rights reserved.
+//
+
+#import "StoreMadBaseTest.h"
+
+#import "SMContextObserverController.h"
+
+#import "Employee.h"
+
+@interface SMContextObserverControllerTests : StoreMadBaseTest
+
+@property (nonatomic, readonly) SMContextObserverController *controller;
+
+@end
+
+@implementation SMContextObserverControllerTests
+
+- (void)setUp
+{
+    [super setUp];
+}
+
+- (void)tearDown
+{
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+    [super tearDown];
+}
+
+- (SMContextObserverController *)controller
+{
+    return [SMContextObserverController defaultController];
+}
+
+- (void)testFilterWorkBlock
+{
+    NSEntityDescription *employeeEntity = [NSEntityDescription entityForName:@"Employee"
+                                                      inManagedObjectContext:self.testContext];
+    
+    __block BOOL wasNotified = NO;
+    [self.controller addContextObserverForContext:self.testContext
+                                        predicate:[NSPredicate predicateWithFormat:@"entity == %@", employeeEntity]
+                          contextNotificationType:NSManagedObjectContextDidSaveNotification
+                                            queue:nil
+                                        workBlock:^(NSSet *updateObjects, NSSet *insertedOjects, NSSet *deletedObjects) {
+                                            wasNotified = YES;
+                                        }];
+    
+    [self.testContext stm_insertNewObjectForEntityNamed:@"Employee"];
+    [self.testContext stm_queueBlockSaveAndWait];
+    
+    XCTAssertTrue(wasNotified, @"Work block should run");
+    
+    wasNotified = NO;
+    
+    [self.testContext stm_insertNewObjectForEntityNamed:@"Department"];
+    [self.testContext stm_queueBlockSaveAndWait];
+    
+    XCTAssertFalse(wasNotified, @"Work block should not run");
+}
+
+- (void)testSetNotificationName
+{
+    XCTAssertThrows([self.controller addContextObserverForContext:self.testContext
+                                                        predicate:nil
+                                          contextNotificationType:@"burrito"
+                                                            queue:nil
+                                                        workBlock:nil],
+                    @"Setting invalid notification should assert");
+    
+    XCTAssertNoThrow([self.controller addContextObserverForContext:self.testContext
+                                                        predicate:nil
+                                          contextNotificationType:NSManagedObjectContextWillSaveNotification
+                                                            queue:nil
+                                                        workBlock:nil],
+                    @"Setting invalid notification should not assert");
+    
+    XCTAssertNoThrow([self.controller addContextObserverForContext:self.testContext
+                                                         predicate:nil
+                                           contextNotificationType:NSManagedObjectContextDidSaveNotification
+                                                             queue:nil
+                                                         workBlock:nil],
+                     @"Setting invalid notification should assert");
+    
+    XCTAssertNoThrow([self.controller addContextObserverForContext:self.testContext
+                                                         predicate:nil
+                                           contextNotificationType:NSManagedObjectContextObjectsDidChangeNotification
+                                                             queue:nil
+                                                         workBlock:nil],
+                     @"Setting invalid notification should assert");
+}
+
+- (void)testNilContext
+{
+    XCTAssertThrows([self.controller addContextObserverForContext:nil
+                                                        predicate:nil
+                                          contextNotificationType:NSManagedObjectContextDidSaveNotification
+                                                            queue:nil
+                                                        workBlock:nil],
+                    @"Observing a nil context should assert");
+}
+
+- (void)testStopObserver
+{
+    NSEntityDescription *employeeEntity = [NSEntityDescription entityForName:@"Employee"
+                                                      inManagedObjectContext:self.testContext];
+
+    
+    __block BOOL wasNotified = NO;
+    id observer = [self.controller addContextObserverForContext:self.testContext
+                                                      predicate:[NSPredicate predicateWithFormat:@"entity == %@", employeeEntity]
+                                        contextNotificationType:NSManagedObjectContextDidSaveNotification
+                                                          queue:nil
+                                                      workBlock:^(NSSet *updateObjects,
+                                                                  NSSet *insertedOjects,
+                                                                  NSSet *deletedObjects) {
+                                                          wasNotified = YES;
+                                                      }];
+    
+    
+    [self.testContext stm_insertNewObjectForEntityNamed:@"Employee"];
+    [self.testContext stm_queueBlockSaveAndWait];
+    
+    XCTAssertTrue(wasNotified, @"Work block should run");
+    
+    [self.controller removeContextObserver:observer];
+    
+    wasNotified = NO;
+    
+    [self.testContext stm_insertNewObjectForEntityNamed:@"Department"];
+    [self.testContext stm_queueBlockSaveAndWait];
+    
+    XCTAssertFalse(wasNotified, @"Work block should not run");
+    
+    [self.controller removeContextObserver:observer];
+}
+
+- (void)testObserveSpecificObject
+{
+    Employee *employee = [Employee stm_createInContext:self.testContext];
+    [employee.managedObjectContext stm_save];
+    
+    __block NSManagedObject *updatedObject;
+    void(^workBlock)(NSManagedObject *object) = ^(NSManagedObject *object) {
+        updatedObject = object;
+    };
+    
+    id observer = [self.controller addContextObserverForChangesToObject:employee
+                                                              workBlock:workBlock];
+    
+    [self.testContext performBlockAndWait:^{
+        employee.firstName = @"Bob";
+        [self.testContext stm_save];
+    }];
+    
+    XCTAssertEqual(updatedObject, employee, @"Updated object should be employee");
+    
+    [self.controller removeContextObserver:observer];
+}
+
+
+@end
diff --git a/StoreMadTests/SMStoreControllerTests.m b/StoreMadTests/SMStoreControllerTests.m
new file mode 100644
index 0000000..864db2b
--- /dev/null
+++ b/StoreMadTests/SMStoreControllerTests.m
@@ -0,0 +1,94 @@
+//
+//  SMStoreControllerTests.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 10/15/13.
+//  Copyright (c) 2013 eGraphs. All rights reserved.
+//
+
+#import <XCTest/XCTest.h>
+#import "StoreMadBaseTest.h"
+
+#import "Employee.h"
+
+@interface SMStoreControllerTests : StoreMadBaseTest
+
+@end
+
+@implementation SMStoreControllerTests
+
+- (void)setUp
+{
+    [super setUp];
+    // Put setup code here; it will be run once, before the first test case.
+}
+
+- (void)tearDown
+{
+    // Put teardown code here; it will be run once, after the last test case.
+    [super tearDown];
+}
+
+- (void)testDeleteStore
+{
+    [self.storeController.managedObjectContext stm_save];
+    
+    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];
+
+    XCTAssertTrue(exists, @"Store should exist at URL before delete store");
+    
+    [self.storeController deleteStore];
+    
+    exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];
+
+    XCTAssertFalse(exists, @"Store should not exist at URL after delete store");
+}
+
+- (void)testResetStore
+{
+    [Employee stm_createInContext:self.testContext];
+    [self.storeController.managedObjectContext stm_save];
+    
+    NSError *error;
+    BOOL reset = [self.storeController resetStore:&error];
+    XCTAssertTrue(reset, @"Store should be reset");
+    
+    
+    NSFetchRequest *employeeFetch = [self.testContext stm_fetchRequestForObjectClass:[Employee class]];
+    NSArray *fetchedEmployees = [self.testContext stm_executeFetchRequest:employeeFetch];
+
+    XCTAssertNil(error, @"Should not have an error after reset");
+    XCTAssertEqual(fetchedEmployees.count, 0, @"Should not have any employees after a reset");
+    
+    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];
+    XCTAssertTrue(exists, @"Store should exist at URL after reset");
+}
+
+- (void)testResetStoreSendsNotification {
+	[self expectationForNotification:kSMStoreControllerDidReset
+	                          object:self.storeController
+	                         handler:nil];
+    
+    BOOL reset = [self.storeController resetStore:nil];
+    XCTAssertTrue(reset, @"Store should be reset");
+    
+    [self waitForExpectationsWithTimeout:1.0
+                                 handler:nil];
+}
+
+- (void)testResetStoreShouldHaveSameManagedObjectContext
+{
+    [Employee stm_createInContext:self.testContext];
+    [self.storeController.managedObjectContext stm_save];
+    
+    NSManagedObjectContext *context = self.storeController.managedObjectContext;
+    
+    NSError *error;
+    [self.storeController resetStore:&error];
+
+    XCTAssertEqualObjects(context,
+                          self.storeController.managedObjectContext,
+                          @"Should have the same managed object context after reset");
+}
+
+@end
diff --git a/StoreMadTests/StoreMadBaseTest.h b/StoreMadTests/StoreMadBaseTest.h
new file mode 100644
index 0000000..8db1473
--- /dev/null
+++ b/StoreMadTests/StoreMadBaseTest.h
@@ -0,0 +1,20 @@
+//
+//  StoreMadBaseTest.h
+//  StoreMad
+//
+//  Created by Andrew Smith on 8/15/12.
+//  Copyright (c) 2012 Andrew B. Smith. All rights reserved.
+//
+
+#import <XCTest/XCTest.h>
+
+#import "SMStoreController.h"
+#import "NSManagedObject+StoreMad.h"
+#import "NSManagedObjectContext+StoreMad.h"
+
+@interface StoreMadBaseTest : XCTestCase
+
+@property (nonatomic, strong) SMStoreController *storeController;
+@property (nonatomic, readonly) NSManagedObjectContext *testContext;
+
+@end
diff --git a/StoreMadTests/StoreMadBaseTest.m b/StoreMadTests/StoreMadBaseTest.m
new file mode 100644
index 0000000..78fcc79
--- /dev/null
+++ b/StoreMadTests/StoreMadBaseTest.m
@@ -0,0 +1,36 @@
+//
+//  StoreMadBaseTest.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 8/15/12.
+//  Copyright (c) 2012 Andrew B. Smith. All rights reserved.
+//
+
+#import "StoreMadBaseTest.h"
+
+//extern void __gcov_flush(void);
+
+@implementation StoreMadBaseTest
+
+- (void)setUp
+{
+    NSURL *storeURL = [[[NSBundle bundleForClass:[self class]] bundleURL] URLByAppendingPathComponent:@"StoreMadTests.sqlite"];
+    NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"StoreMadTests" withExtension:@"momd"];
+
+    self.storeController = [SMStoreController storeControllerWithStoreURL:storeURL
+                                                              andModelURL:modelURL];
+}
+
+- (void)tearDown
+{
+    [self.storeController resetStore:nil];
+    _storeController = nil;
+//    __gcov_flush();
+}
+
+- (NSManagedObjectContext *)testContext
+{
+    return self.storeController.managedObjectContext;
+}
+
+@end
diff --git a/StoreMadTests/StoreMadContextTests.m b/StoreMadTests/StoreMadContextTests.m
new file mode 100644
index 0000000..d5b0949
--- /dev/null
+++ b/StoreMadTests/StoreMadContextTests.m
@@ -0,0 +1,146 @@
+//
+//  StoreMadContextTests.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 8/15/12.
+//  Copyright (c) 2012 Andrew B. Smith. All rights reserved.
+//
+
+#import "Department.h"
+#import "Employee.h"
+
+#import "StoreMadBaseTest.h"
+
+@interface StoreMadContextTests : StoreMadBaseTest
+
+@end
+
+@implementation StoreMadContextTests
+
+- (void)testObjectForURI
+{    
+    NSManagedObject *employee        = [Employee stm_createInContext:self.testContext];
+    NSManagedObject *fetchedEmployee = [self.testContext stm_objectForURI:employee.stm_objectURI];
+    XCTAssertEqualObjects(employee, fetchedEmployee, @"Should be the same NSManagedObject!");
+}
+
+- (void)testObjectForNilURI
+{
+    NSManagedObject *object = [self.testContext stm_objectForURI:nil];
+    XCTAssertNil(object, @"Object should be nil!");
+}
+
+- (void)testDeleteObjectAtURI
+{
+    NSManagedObject *employee = [Employee stm_createInContext:self.testContext];
+    [self.testContext stm_deleteObjectAtURI:employee.stm_objectURI];
+    XCTAssertTrue([employee stm_hasBeenDeleted], @"Object should be deleted");
+}
+
+- (void)testDeleteObject
+{
+    NSManagedObject *employee = [Employee stm_createInContext:self.testContext];
+    [self.testContext stm_save];
+    [self.testContext deleteObject:employee];
+    XCTAssertTrue([employee stm_hasBeenDeleted], @"Object should be deleted");
+}
+
+- (void)testDeleteObjects
+{
+    NSManagedObject *employee1 = [Employee stm_createInContext:self.testContext];
+    NSManagedObject *employee2 = [Employee stm_createInContext:self.testContext];
+    NSManagedObject *employee3 = [Employee stm_createInContext:self.testContext];
+
+    [self.testContext stm_deleteObjects:@[employee1, employee2, employee3]];
+
+    XCTAssertTrue([employee1 stm_hasBeenDeleted], @"Object should be deleted");
+    XCTAssertTrue([employee2 stm_hasBeenDeleted], @"Object should be deleted");
+    XCTAssertTrue([employee3 stm_hasBeenDeleted], @"Object should be deleted");
+}
+
+- (void)testExecuteFetchRequest
+{
+    Employee *employee1 = [Employee stm_createInContext:self.testContext];
+    Employee *employee2 = [Employee stm_createInContext:self.testContext];
+
+    employee1.firstName = @"Kevin";
+    employee1.lastName = @"Bacon";
+    
+    employee2.firstName = @"David";
+    employee2.lastName = @"Bowie";
+
+    NSFetchRequest *baconFetch = [self.testContext stm_fetchRequestForObjectClass:[Employee class]];
+    baconFetch.predicate = [NSPredicate predicateWithFormat:@"lastName == %@", @"Bacon"];
+    
+    NSArray *fetchedBacons = [self.testContext stm_executeFetchRequest:baconFetch];
+    
+    XCTAssertEqual(fetchedBacons.count, 1U, @"Context should execute fetch request and return all the correct objects");
+    
+    if (fetchedBacons.count < 1) return;
+    NSManagedObject *fetchedBacon = [fetchedBacons objectAtIndex:0];
+    
+    BOOL same = ([employee1.objectID isEqual:fetchedBacon.objectID]);
+    XCTAssertTrue(same, @"Context should execute fetch request and return the correct object");
+}
+
+- (void)testExecuteFetchForFirstObject
+{
+    Employee *employee1 = [Employee stm_createInContext:self.testContext];
+    Employee *employee2 = [Employee stm_createInContext:self.testContext];
+    
+    employee1.firstName = @"Kevin";
+    employee1.lastName = @"Bacon";
+    
+    employee2.firstName = @"Zazzle";
+    employee2.lastName = @"Zeesleson";
+    
+    NSFetchRequest *baconFetch = [self.testContext stm_fetchRequestForObjectClass:[Employee class]];
+    [baconFetch setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]]];
+    
+    NSManagedObject *fetchedBacon = [self.testContext stm_executeFetchRequestAndReturnFirstObject:baconFetch];
+    
+    XCTAssertEqualObjects(employee1, fetchedBacon, @"Should fetch the correct employee");
+}
+
+- (void)testCountForFetchRequest
+{
+    [Employee stm_createInContext:self.testContext];
+    [Employee stm_createInContext:self.testContext];
+    
+    // create some extra stuff
+    [Department stm_createInContext:self.testContext];
+    
+    NSFetchRequest *employeeFetch = [self.testContext stm_fetchRequestForObjectClass:[Employee class]];
+    NSUInteger count = [self.testContext stm_countForFetchRequest:employeeFetch];
+
+    XCTAssertEqual(count, 2U, @"Context should count the correct number of objects");
+}
+
+- (void)testAllValuesForPropertyFetchRequest
+{
+    Employee *employee1 = [Employee stm_createInContext:self.testContext];
+    Employee *employee2 = [Employee stm_createInContext:self.testContext];
+    Employee *employee3 = [Employee stm_createInContext:self.testContext];
+
+    employee1.employeeId = @(1);
+    employee2.employeeId = @(2);
+    employee3.employeeId = @(42);
+    
+    // Need to save to persist properties.
+    [self.testContext stm_save];
+    
+    NSFetchRequest *employeeFetch = [self.testContext stm_findAllFetchRequestForObjectClass:[Employee class]];
+
+    NSArray *fetchedProperties = [self.testContext stm_allValuesForProperty:@"employeeId"
+                                                            withRequest:employeeFetch];
+
+    
+    BOOL hasAllIds = ([fetchedProperties containsObject:@(1)]
+                      && [fetchedProperties containsObject:@(2)]
+                      && [fetchedProperties containsObject:@(42)]);
+    
+    XCTAssertEqual(fetchedProperties.count, 3U, @"Should have 3 properties");
+    XCTAssertTrue(hasAllIds, @"Should fetch all the ids that were previously set");
+}
+
+@end
diff --git a/StoreMadTests/StoreMadObjectTests.m b/StoreMadTests/StoreMadObjectTests.m
new file mode 100644
index 0000000..7ef665a
--- /dev/null
+++ b/StoreMadTests/StoreMadObjectTests.m
@@ -0,0 +1,57 @@
+//
+//  StoreMadObjectTests.m
+//  StoreMad
+//
+//  Created by Andrew Smith on 9/28/12.
+//  Copyright (c) 2012 eGraphs. All rights reserved.
+//
+
+#import "StoreMadBaseTest.h"
+#import "Employee.h"
+
+@interface StoreMadObjectTests : StoreMadBaseTest
+
+@end
+
+@implementation StoreMadObjectTests
+
+- (void)testHasBeenDeleted
+{
+    Employee *object = [Employee stm_createInContext:self.testContext];
+    
+    XCTAssertFalse([object stm_hasBeenDeleted], @"Object should not be deleted");
+    
+    [self.testContext stm_queueBlockSave];
+    
+    XCTAssertFalse([object stm_hasBeenDeleted], @"Object should not be deleted");
+    
+    [self.testContext deleteObject:object];
+    
+    XCTAssertTrue([object stm_hasBeenDeleted], @"Object should be deleted");
+}
+
+- (void)testHasBeenSaved
+{
+    Employee *object = [Employee stm_createInContext:self.testContext];
+    
+    XCTAssertFalse([object stm_hasBeenSaved], @"Object should not be saved");
+    
+    [self.testContext save:nil];
+
+    XCTAssertTrue([object stm_hasBeenSaved], @"Object should be saved");
+}
+
+- (void)testCreateInContext
+{
+    Employee *object = [Employee stm_createInContext:self.testContext];
+
+    XCTAssertTrue([object isInserted], @"Object should be inserted");
+    XCTAssertFalse([object stm_hasBeenSaved], @"Object should not be saved");
+}
+
+- (void)testExecuteFetchRequest
+{
+    
+}
+
+@end
diff --git a/StoreMadTests/StoreMadTests-Info.plist b/StoreMadTests/StoreMadTests-Info.plist
new file mode 100644
index 0000000..4daf19f
--- /dev/null
+++ b/StoreMadTests/StoreMadTests-Info.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>Andrew-B.-Smith.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/StoreMadTests/StoreMadTests.xcdatamodeld/.xccurrentversion b/StoreMadTests/StoreMadTests.xcdatamodeld/.xccurrentversion
new file mode 100644
index 0000000..7bdb1ee
--- /dev/null
+++ b/StoreMadTests/StoreMadTests.xcdatamodeld/.xccurrentversion
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>_XCCurrentVersionName</key>
+	<string>StoreMadTests.xcdatamodel</string>
+</dict>
+</plist>
diff --git a/StoreMadTests/StoreMadTests.xcdatamodeld/StoreMadTests.xcdatamodel/contents b/StoreMadTests/StoreMadTests.xcdatamodeld/StoreMadTests.xcdatamodel/contents
new file mode 100644
index 0000000..4027361
--- /dev/null
+++ b/StoreMadTests/StoreMadTests.xcdatamodeld/StoreMadTests.xcdatamodel/contents
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="2061" systemVersion="12E55" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
+    <entity name="Department" representedClassName="Department" syncable="YES">
+        <attribute name="departmentId" optional="YES" attributeType="Integer 64" defaultValueString="0" syncable="YES"/>
+        <attribute name="name" optional="YES" attributeType="String" syncable="YES"/>
+    </entity>
+    <entity name="Employee" representedClassName="Employee" syncable="YES">
+        <attribute name="employeeId" optional="YES" attributeType="Integer 64" defaultValueString="0" syncable="YES"/>
+        <attribute name="firstName" optional="YES" attributeType="String" syncable="YES"/>
+        <attribute name="lastName" optional="YES" attributeType="String" syncable="YES"/>
+    </entity>
+    <elements>
+        <element name="Department" positionX="160" positionY="192" width="128" height="75"/>
+        <element name="Employee" positionX="0" positionY="0" width="128" height="90"/>
+    </elements>
+</model>
\ No newline at end of file
diff --git a/StoreMadTests/en.lproj/InfoPlist.strings b/StoreMadTests/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/StoreMadTests/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
