Commits

Jens Nerup  committed c518c65

Changed prefix for all classes and did some cleanup in the project files.

  • Participants
  • Parent commits 6452afd
  • Branches develop, feature/workshop-part2

Comments (0)

Files changed (26)

File Client/Task.xcodeproj/project.pbxproj

 
 /* Begin PBXBuildFile section */
 		A20F8F1A68FD42A4AE2870B5 /* libPods-Task.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 041AA58B611F4D319C8214EF /* libPods-Task.a */; };
-		B42302CA16F9B2BD0064313C /* PROTaskAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302C916F9B2BD0064313C /* PROTaskAPIClient.m */; };
-		B42302CE16F9C9BF0064313C /* PRONewTaskViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302CD16F9C9BF0064313C /* PRONewTaskViewController.m */; };
+		B42302CA16F9B2BD0064313C /* WKSTaskAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302C916F9B2BD0064313C /* WKSTaskAPIClient.m */; };
+		B42302CE16F9C9BF0064313C /* WKSNewTaskViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302CD16F9C9BF0064313C /* WKSNewTaskViewController.m */; };
 		B42302D016F9D2D10064313C /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B42302CF16F9D2D10064313C /* CoreLocation.framework */; };
-		B42302D316F9D2FE0064313C /* PROTask.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302D216F9D2FE0064313C /* PROTask.m */; };
+		B42302D316F9D2FE0064313C /* WKSTask.m in Sources */ = {isa = PBXBuildFile; fileRef = B42302D216F9D2FE0064313C /* WKSTask.m */; };
 		B42302D516F9D5B90064313C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B42302D416F9D5B90064313C /* SystemConfiguration.framework */; };
 		B42302D716F9D5BF0064313C /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B42302D616F9D5BF0064313C /* MobileCoreServices.framework */; };
 		B42302DA16F9FCBA0064313C /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = B42302D816F9FCBA0064313C /* Icon.png */; };
 		B49B90A416F669490085FB01 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B49B90A316F669490085FB01 /* CoreGraphics.framework */; };
 		B49B90AA16F669490085FB01 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B49B90A816F669490085FB01 /* InfoPlist.strings */; };
 		B49B90AC16F669490085FB01 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90AB16F669490085FB01 /* main.m */; };
-		B49B90B016F669490085FB01 /* PROAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90AF16F669490085FB01 /* PROAppDelegate.m */; };
+		B49B90B016F669490085FB01 /* WKSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90AF16F669490085FB01 /* WKSAppDelegate.m */; };
 		B49B90B216F669490085FB01 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = B49B90B116F669490085FB01 /* Default.png */; };
 		B49B90B416F669490085FB01 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B49B90B316F669490085FB01 /* Default@2x.png */; };
 		B49B90B616F669490085FB01 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B49B90B516F669490085FB01 /* Default-568h@2x.png */; };
 		B49B90B916F669490085FB01 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B49B90B716F669490085FB01 /* MainStoryboard.storyboard */; };
-		B49B90BC16F669490085FB01 /* PROTaskTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90BB16F669490085FB01 /* PROTaskTableViewController.m */; };
+		B49B90BC16F669490085FB01 /* WKSTaskTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90BB16F669490085FB01 /* WKSTaskTableViewController.m */; };
 		B49B90C416F6694A0085FB01 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B49B90C316F6694A0085FB01 /* SenTestingKit.framework */; };
 		B49B90C516F6694A0085FB01 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B49B909F16F669490085FB01 /* UIKit.framework */; };
 		B49B90C616F6694A0085FB01 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B49B90A116F669490085FB01 /* Foundation.framework */; };
 		B49B90CE16F6694A0085FB01 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B49B90CC16F6694A0085FB01 /* InfoPlist.strings */; };
-		B49B90D116F6694A0085FB01 /* TaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90D016F6694A0085FB01 /* TaskTests.m */; };
+		B49B90D116F6694A0085FB01 /* WKSTaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B49B90D016F6694A0085FB01 /* WKSTaskTests.m */; };
 		E7B400134C7D4A22A5EE4819 /* libPods-TaskTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EB89C78E5FD4955B2FA37F9 /* libPods-TaskTests.a */; };
 /* End PBXBuildFile section */
 
 		1EB89C78E5FD4955B2FA37F9 /* libPods-TaskTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TaskTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		43F4766AD7E342CC985D161B /* Pods-TaskTests.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TaskTests.xcconfig"; path = "Pods/Pods-TaskTests.xcconfig"; sourceTree = SOURCE_ROOT; };
 		B2CDB48EAA524C3FA74790C3 /* Pods-Task.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Task.xcconfig"; path = "Pods/Pods-Task.xcconfig"; sourceTree = SOURCE_ROOT; };
-		B42302C816F9B2BD0064313C /* PROTaskAPIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PROTaskAPIClient.h; sourceTree = "<group>"; };
-		B42302C916F9B2BD0064313C /* PROTaskAPIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PROTaskAPIClient.m; sourceTree = "<group>"; };
+		B42302C816F9B2BD0064313C /* WKSTaskAPIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSTaskAPIClient.h; sourceTree = "<group>"; };
+		B42302C916F9B2BD0064313C /* WKSTaskAPIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKSTaskAPIClient.m; sourceTree = "<group>"; };
 		B42302CB16F9C56A0064313C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainStoryboard.storyboard; sourceTree = "<group>"; };
-		B42302CC16F9C9BF0064313C /* PRONewTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PRONewTaskViewController.h; sourceTree = "<group>"; };
-		B42302CD16F9C9BF0064313C /* PRONewTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PRONewTaskViewController.m; sourceTree = "<group>"; };
+		B42302CC16F9C9BF0064313C /* WKSNewTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSNewTaskViewController.h; sourceTree = "<group>"; };
+		B42302CD16F9C9BF0064313C /* WKSNewTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKSNewTaskViewController.m; sourceTree = "<group>"; };
 		B42302CF16F9D2D10064313C /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
-		B42302D116F9D2FE0064313C /* PROTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PROTask.h; sourceTree = "<group>"; };
-		B42302D216F9D2FE0064313C /* PROTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PROTask.m; sourceTree = "<group>"; };
+		B42302D116F9D2FE0064313C /* WKSTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSTask.h; sourceTree = "<group>"; };
+		B42302D216F9D2FE0064313C /* WKSTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKSTask.m; sourceTree = "<group>"; };
 		B42302D416F9D5B90064313C /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
 		B42302D616F9D5BF0064313C /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
 		B42302D816F9FCBA0064313C /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
 		B49B90A916F669490085FB01 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		B49B90AB16F669490085FB01 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 		B49B90AD16F669490085FB01 /* Task-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Task-Prefix.pch"; sourceTree = "<group>"; };
-		B49B90AE16F669490085FB01 /* PROAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PROAppDelegate.h; sourceTree = "<group>"; };
-		B49B90AF16F669490085FB01 /* PROAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PROAppDelegate.m; sourceTree = "<group>"; };
+		B49B90AE16F669490085FB01 /* WKSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKSAppDelegate.h; sourceTree = "<group>"; };
+		B49B90AF16F669490085FB01 /* WKSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKSAppDelegate.m; sourceTree = "<group>"; };
 		B49B90B116F669490085FB01 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
 		B49B90B316F669490085FB01 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
 		B49B90B516F669490085FB01 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
-		B49B90BA16F669490085FB01 /* PROTaskTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PROTaskTableViewController.h; sourceTree = "<group>"; };
-		B49B90BB16F669490085FB01 /* PROTaskTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PROTaskTableViewController.m; sourceTree = "<group>"; };
+		B49B90BA16F669490085FB01 /* WKSTaskTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKSTaskTableViewController.h; sourceTree = "<group>"; };
+		B49B90BB16F669490085FB01 /* WKSTaskTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKSTaskTableViewController.m; sourceTree = "<group>"; };
 		B49B90C216F6694A0085FB01 /* TaskTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TaskTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		B49B90C316F6694A0085FB01 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
 		B49B90CB16F6694A0085FB01 /* TaskTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TaskTests-Info.plist"; sourceTree = "<group>"; };
 		B49B90CD16F6694A0085FB01 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		B49B90D016F6694A0085FB01 /* TaskTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TaskTests.m; sourceTree = "<group>"; };
+		B49B90D016F6694A0085FB01 /* WKSTaskTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKSTaskTests.m; sourceTree = "<group>"; };
 		B49B90DA16F66B5B0085FB01 /* Podfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Podfile; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 		B49B90A516F669490085FB01 /* Task */ = {
 			isa = PBXGroup;
 			children = (
-				B49B90AE16F669490085FB01 /* PROAppDelegate.h */,
-				B49B90AF16F669490085FB01 /* PROAppDelegate.m */,
-				B42302C816F9B2BD0064313C /* PROTaskAPIClient.h */,
-				B42302C916F9B2BD0064313C /* PROTaskAPIClient.m */,
-				B49B90BA16F669490085FB01 /* PROTaskTableViewController.h */,
-				B49B90BB16F669490085FB01 /* PROTaskTableViewController.m */,
-				B42302CC16F9C9BF0064313C /* PRONewTaskViewController.h */,
-				B42302CD16F9C9BF0064313C /* PRONewTaskViewController.m */,
-				B42302D116F9D2FE0064313C /* PROTask.h */,
-				B42302D216F9D2FE0064313C /* PROTask.m */,
+				B49B90AE16F669490085FB01 /* WKSAppDelegate.h */,
+				B49B90AF16F669490085FB01 /* WKSAppDelegate.m */,
+				B42302C816F9B2BD0064313C /* WKSTaskAPIClient.h */,
+				B42302C916F9B2BD0064313C /* WKSTaskAPIClient.m */,
+				B49B90BA16F669490085FB01 /* WKSTaskTableViewController.h */,
+				B49B90BB16F669490085FB01 /* WKSTaskTableViewController.m */,
+				B42302CC16F9C9BF0064313C /* WKSNewTaskViewController.h */,
+				B42302CD16F9C9BF0064313C /* WKSNewTaskViewController.m */,
+				B42302D116F9D2FE0064313C /* WKSTask.h */,
+				B42302D216F9D2FE0064313C /* WKSTask.m */,
 				B49B90B716F669490085FB01 /* MainStoryboard.storyboard */,
 				B49B90A616F669490085FB01 /* Supporting Files */,
 			);
 		B49B90C916F6694A0085FB01 /* TaskTests */ = {
 			isa = PBXGroup;
 			children = (
-				B49B90D016F6694A0085FB01 /* TaskTests.m */,
+				B49B90D016F6694A0085FB01 /* WKSTaskTests.m */,
 				B49B90CA16F6694A0085FB01 /* Supporting Files */,
 			);
 			path = TaskTests;
 		B49B909416F669490085FB01 /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				CLASSPREFIX = PRO;
+				CLASSPREFIX = WKS;
 				LastUpgradeCheck = 0460;
-				ORGANIZATIONNAME = PROSA;
+				ORGANIZATIONNAME = Workshop;
 			};
 			buildConfigurationList = B49B909716F669490085FB01 /* Build configuration list for PBXProject "Task" */;
 			compatibilityVersion = "Xcode 3.2";
 			buildActionMask = 2147483647;
 			files = (
 				B49B90AC16F669490085FB01 /* main.m in Sources */,
-				B49B90B016F669490085FB01 /* PROAppDelegate.m in Sources */,
-				B49B90BC16F669490085FB01 /* PROTaskTableViewController.m in Sources */,
-				B42302CA16F9B2BD0064313C /* PROTaskAPIClient.m in Sources */,
-				B42302CE16F9C9BF0064313C /* PRONewTaskViewController.m in Sources */,
-				B42302D316F9D2FE0064313C /* PROTask.m in Sources */,
+				B49B90B016F669490085FB01 /* WKSAppDelegate.m in Sources */,
+				B49B90BC16F669490085FB01 /* WKSTaskTableViewController.m in Sources */,
+				B42302CA16F9B2BD0064313C /* WKSTaskAPIClient.m in Sources */,
+				B42302CE16F9C9BF0064313C /* WKSNewTaskViewController.m in Sources */,
+				B42302D316F9D2FE0064313C /* WKSTask.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				B49B90D116F6694A0085FB01 /* TaskTests.m in Sources */,
+				B49B90D116F6694A0085FB01 /* WKSTaskTests.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

File Client/Task/Base.lproj/MainStoryboard.storyboard

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12D78" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="lmR-WP-fue">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="lmR-WP-fue">
     <dependencies>
         <development version="4600" identifier="xcode"/>
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
         <!--Task Table View Controller - Tasks-->
         <scene sceneID="EUN-Vv-dQH">
             <objects>
-                <tableViewController id="OOx-5k-NWf" customClass="PROTaskTableViewController" sceneMemberID="viewController">
+                <tableViewController id="OOx-5k-NWf" customClass="WKSTaskTableViewController" sceneMemberID="viewController">
                     <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="wil-Yz-Dn2">
                         <rect key="frame" x="0.0" y="64" width="320" height="504"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
         <!--New Task View Controller - New Task-->
         <scene sceneID="XTv-h9-FC9">
             <objects>
-                <tableViewController id="v5r-KL-2RP" customClass="PRONewTaskViewController" sceneMemberID="viewController">
+                <tableViewController id="v5r-KL-2RP" customClass="WKSNewTaskViewController" sceneMemberID="viewController">
                     <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="whY-Yg-yYF">
                         <rect key="frame" x="0.0" y="64" width="320" height="504"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
         <class className="NSLayoutConstraint" superclassName="NSObject">
             <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
         </class>
-        <class className="PRONewTaskViewController" superclassName="UITableViewController">
-            <source key="sourceIdentifier" type="project" relativePath="./Classes/PRONewTaskViewController.h"/>
-            <relationships>
-                <relationship kind="action" name="cancel:"/>
-                <relationship kind="action" name="save:"/>
-                <relationship kind="outlet" name="nameTextField" candidateClass="UITextField"/>
-                <relationship kind="outlet" name="noteTextField" candidateClass="UITextField"/>
-            </relationships>
-        </class>
-        <class className="PROTaskTableViewController" superclassName="UITableViewController">
-            <source key="sourceIdentifier" type="project" relativePath="./Classes/PROTaskTableViewController.h"/>
-            <relationships>
-                <relationship kind="action" name="didCancel:" candidateClass="UIStoryboardSegue"/>
-            </relationships>
-        </class>
-        <class className="UIStoryboardSegue" superclassName="NSObject">
-            <source key="sourceIdentifier" type="project" relativePath="./Classes/UIStoryboardSegue.h"/>
-        </class>
     </classes>
     <simulatedMetricsContainer key="defaultSimulatedMetrics">
         <simulatedStatusBarMetrics key="statusBar"/>

File Client/Task/PROAppDelegate.h

-#import <UIKit/UIKit.h>
-
-@interface PROAppDelegate : UIResponder <UIApplicationDelegate>
-
-@property(strong, nonatomic) UIWindow *window;
-
-@end

File Client/Task/PROAppDelegate.m

-#import "PROAppDelegate.h"
-
-#import "AFNetworkActivityIndicatorManager.h"
-#import "AFHTTPRequestOperationLogger.h"
-
-@implementation PROAppDelegate
-
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-    // Override point for customization after application launch.
-    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
-    [[AFHTTPRequestOperationLogger sharedLogger] startLogging];
-    [[AFHTTPRequestOperationLogger sharedLogger] setLevel:AFLoggerLevelDebug];
-    return YES;
-}
-
-- (void)applicationWillResignActive:(UIApplication *)application {
-    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
-    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
-}
-
-- (void)applicationDidEnterBackground:(UIApplication *)application {
-    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
-    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
-}
-
-- (void)applicationWillEnterForeground:(UIApplication *)application {
-    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
-}
-
-- (void)applicationDidBecomeActive:(UIApplication *)application {
-    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
-}
-
-- (void)applicationWillTerminate:(UIApplication *)application {
-    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
-    [[AFHTTPRequestOperationLogger sharedLogger] stopLogging];
-}
-
-@end

File Client/Task/PRONewTaskViewController.h

-#import <UIKit/UIKit.h>
-#import <CoreLocation/CoreLocation.h>
-
-@protocol PRONewTaskViewControllerDelegate;
-@class PROTask;
-
-@interface PRONewTaskViewController : UITableViewController <CLLocationManagerDelegate>
-
-@property(nonatomic, weak) id <PRONewTaskViewControllerDelegate> delegate;
-
-@property(weak, nonatomic) IBOutlet UITextField *nameTextField;
-@property(weak, nonatomic) IBOutlet UITextField *noteTextField;
-
-/*!
-    @param sender
- */
-- (IBAction)cancel:(id)sender;
-
-/*!
-    @param sender
- */
-- (IBAction)save:(id)sender;
-
-@end
-
-
-@protocol PRONewTaskViewControllerDelegate <NSObject>
-
-@optional // Only optional on iOS 6 when implementing the unwind method - see below.
-/*!
-    You can avoid using this in iOS as model view disposal an be achieved by creating an unwind method
-    that returns an IBAction and takes an UIStoryboardSegue as the argument. The method must be created
-    in the parent controller.
-    @param controller
- */
-- (void)newTaskViewControllerDidCancel:(PRONewTaskViewController *)controller;
-
-@required
-/*!
-    @param controller
-    @param task
- */
-- (void)newTaskViewController:(PRONewTaskViewController *)controller didAddTask:(PROTask *)task;
-
-@end

File Client/Task/PRONewTaskViewController.m

-#import "PRONewTaskViewController.h"
-#import "PROTask.h"
-
-@interface PRONewTaskViewController ()
-@property(nonatomic, strong) CLLocationManager *locationManager;
-@property(nonatomic, strong) CLLocation *currentLocation;
-@end
-
-@implementation PRONewTaskViewController
-
-- (id)initWithStyle:(UITableViewStyle)style {
-    self = [super initWithStyle:style];
-    if (self) {
-        // Custom initialization
-    }
-    return self;
-}
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-
-    // Start the location manager.
-    _locationManager = [[CLLocationManager alloc] init];
-    [[self locationManager] setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
-    [[self locationManager] setDelegate:self];
-    [[self locationManager] startUpdatingLocation];
-
-    // Start off by using the current location but the first time the application starts
-    // the current location is nil because the user has to accept that CoreLocation is used.
-    [self setCurrentLocation:[[self locationManager] location]];
-}
-
-- (void)didReceiveMemoryWarning {
-    [super didReceiveMemoryWarning];
-    // Dispose of any resources that can be recreated.
-}
-
-- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
-    if (indexPath.section == 0)
-        [self.nameTextField becomeFirstResponder];
-}
-
-#pragma mark -
-#pragma mark CLLocationManagerDelegate
-
-- (void)locationManager:(CLLocationManager *)manager
-    didUpdateToLocation:(CLLocation *)newLocation
-           fromLocation:(CLLocation *)oldLocation {
-    // If it's a relatively recent event, turn off updates to save power
-    NSDate *eventDate = newLocation.timestamp;
-    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
-    // Because the location manager object sometimes returns cached events then we'll have to check the timestamp
-    // of any location events we'll receive. (It can take several seconds to obtain a rough location fix, so the
-    // old data simply serves as a way to reflect the last known location.) This logic throws away any events that
-    // are more than fifteen seconds old under the assumption that fairly recent events are likely to be good
-    if (fabs(howRecent) < 15.0) {
-        [self setCurrentLocation:newLocation];
-        [[self locationManager] stopUpdatingLocation];
-    }
-}
-
-- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
-    if ([error domain] == kCLErrorDomain) {
-        // We handle CoreLocation-related errors here
-        switch ([error code]) {
-            // "Don't Allow" on two successive app launches is the same as saying "never allow". The user
-            // can reset this for all apps by going to Settings > General > Reset > Reset Location Warnings.
-            case kCLErrorDenied:
-                NSLog(@"Application is not allowed to use the location service: %@", [error localizedDescription]);
-                [[self locationManager] stopUpdatingLocation];
-                break;
-            case kCLErrorLocationUnknown:
-                NSLog(@"The location service couldn't provide a location: %@", [error localizedDescription]);
-                break;
-            case kCLErrorNetwork:
-                NSLog(@"The location service encountered a network error: %@", [error localizedDescription]);
-                break;
-            case kCLErrorRegionMonitoringSetupDelayed:
-                NSLog(@"The region monitoring is delayed: %@", [error localizedDescription]);
-                break;
-            default:
-                break;
-        }
-    } else {
-        // We should handle all non-CoreLocation errors here
-    }
-}
-
-
-#pragma mark - Interface Builder Actions
-
-- (IBAction)cancel:(id)sender {
-    [self.delegate newTaskViewControllerDidCancel:self];
-}
-
-- (IBAction)save:(id)sender {
-    PROTask *task = [[PROTask alloc] init];
-    [task setName:[[self nameTextField] text]];
-    [task setNote:[[self noteTextField] text]];
-    if ([self currentLocation]) {
-        [task setLatitude:[NSNumber numberWithDouble:[[self currentLocation] coordinate].latitude]];
-        [task setLongitude:[NSNumber numberWithDouble:[[self currentLocation] coordinate].longitude]];
-    }
-    [[self delegate] newTaskViewController:self didAddTask:task];
-}
-
-@end

File Client/Task/PROTask.h

-#import <Foundation/Foundation.h>
-
-@interface PROTask : NSObject
-
-@property(nonatomic, strong) NSNumber *identifier;
-@property(nonatomic, strong) NSString *name;
-@property(nonatomic, strong) NSString *note;
-@property(nonatomic, strong) NSString *owner;
-@property(nonatomic, strong) NSNumber *latitude;
-@property(nonatomic, strong) NSNumber *longitude;
-@property(nonatomic, strong) NSDate *lastModified;
-@property(nonatomic, strong) NSDate *created;
-
-/*!
-    Get all tasks.
-    @param sender
- */
-+ (void)tasksWithBlock:(void (^)(NSArray *, NSError *))block;
-
-/*!
-    Save the given task.
-    @param sender
- */
-- (void)saveTaskWithBlock:(void (^)(PROTask *, NSError *))block;
-
-/*!
-    Designated initializer.
-    @param attributes
- */
-- (id)initWithAttributes:(NSDictionary *)attributes;
-@end

File Client/Task/PROTask.m

-#import "PROTask.h"
-#import "PROTaskAPIClient.h"
-
-@interface PROTask ()
-
-@end
-
-@implementation PROTask
-
-+ (void)tasksWithBlock:(void (^)(NSArray *tasks, NSError *error))block {
-    [[PROTaskAPIClient sharedClient] getPath:@"tasks" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) {
-        NSArray *postsFromResponse = (NSArray *) JSON;
-        NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]];
-        for (NSDictionary *attributes in postsFromResponse) {
-            PROTask *task = [[PROTask alloc] initWithAttributes:attributes];
-            [mutablePosts addObject:task];
-        }
-
-        if (block) {
-            block([NSArray arrayWithArray:mutablePosts], nil);
-        }
-    }                                failure:^(AFHTTPRequestOperation *operation, NSError *error) {
-        if (block) {
-            block([NSArray array], error);
-        }
-    }];
-}
-
-- (void)saveTaskWithBlock:(void (^)(PROTask *task, NSError *error))block {
-    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
-
-    if ([self identifier])
-        [params setObject:[self identifier] forKey:@"id"];
-    if ([self name])
-        [params setObject:[self name] forKey:@"name"];
-    if ([self note])
-        [params setObject:[self note] forKey:@"note"];
-    if ([self owner])
-        [params setObject:[self owner] forKey:@"owner"];
-    if ([self latitude])
-        [params setObject:[self latitude] forKey:@"latitude"];
-    if ([self longitude])
-        [params setObject:[self longitude] forKey:@"longitude"];
-
-    [[PROTaskAPIClient sharedClient] putPath:@"tasks" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
-        if (block) {
-            block(self, nil);
-        }
-    }                                failure:^(AFHTTPRequestOperation *operation, NSError *error) {
-        NSLog(@"The new task couldn't be saved because of the following error %@", [error localizedDescription]);
-        if (block) {
-            block([NSArray array], error);
-        }
-    }];
-}
-
-- (id)initWithAttributes:(NSDictionary *)attributes {
-    self = [super init];
-    if (!self) {
-        return nil;
-    }
-    _identifier = [NSNumber numberWithInt:[[attributes valueForKeyPath:@"id"] integerValue]];
-    _name = [attributes valueForKeyPath:@"name"];
-    _note = [attributes valueForKeyPath:@"note"];
-    _owner = [attributes valueForKeyPath:@"owner"];
-    _latitude = [NSNumber numberWithDouble:[[attributes valueForKeyPath:@"latitude"] doubleValue]];
-    _longitude = [NSNumber numberWithDouble:[[attributes valueForKeyPath:@"longitude"] doubleValue]];
-
-    NSNumber *lastModifiedDate = (NSNumber *) [attributes valueForKey:@"lastModified"];
-    if (lastModifiedDate) {
-        _lastModified = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval) [lastModifiedDate longLongValue] / 1000];
-    }
-
-    NSNumber *createdDate = (NSNumber *) [attributes valueForKey:@"created"];
-    if (createdDate) {
-        _created = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval) [createdDate longLongValue] / 1000];
-    }
-
-    return self;
-}
-
-@end

File Client/Task/PROTaskAPIClient.h

-#import "AFHTTPClient.h"
-
-@interface PROTaskAPIClient : AFHTTPClient
-
-+ (PROTaskAPIClient *)sharedClient;
-
-
-@end

File Client/Task/PROTaskAPIClient.m

-#import "PROTaskAPIClient.h"
-#import "AFJSONRequestOperation.h"
-
-@implementation PROTaskAPIClient
-
-+ (PROTaskAPIClient *)sharedClient {
-    static dispatch_once_t predicate;
-    static PROTaskAPIClient *sharedInstance = nil;
-
-    dispatch_once(&predicate, ^{
-        sharedInstance = [[self alloc] initWithBaseURL:
-                [NSURL URLWithString:@"http://localhost:9094/"]];
-    });
-    return sharedInstance;
-}
-
-- (id)initWithBaseURL:(NSURL *)baseURL {
-    self = [super initWithBaseURL:baseURL];
-    if (self) {
-        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
-        // Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
-        [self setDefaultHeader:@"Accept" value:@"application/json"];
-        // Accept-Charset HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
-        [self setDefaultHeader:@"Accept-Charset" value:@"utf-8"];
-        // Accept-Encoding HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
-        [self setDefaultHeader:@"Accept-Encoding" value:@"compress, gzip"];
-        // 
-        [self setParameterEncoding:AFJSONParameterEncoding];
-    }
-    return self;
-}
-
-
-@end

File Client/Task/PROTaskTableViewController.h

-#import <UIKit/UIKit.h>
-#import "PRONewTaskViewController.h"
-
-@interface PROTaskTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource, PRONewTaskViewControllerDelegate>
-
-@end

File Client/Task/PROTaskTableViewController.m

-#import "PROTaskTableViewController.h"
-#import "PROTask.h"
-
-@interface PROTaskTableViewController ()
-- (void)reload:(id)sender;
-@end
-
-@implementation PROTaskTableViewController {
-@private
-    NSArray *_tasks;
-}
-
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-
-    [self setRefreshControl:[[UIRefreshControl alloc] init]];
-
-    [[self refreshControl] addTarget:self action:@selector(reload:) forControlEvents:UIControlEventValueChanged];
-
-
-    if (!_tasks) {
-        [[self refreshControl] beginRefreshing];
-        __weak PROTaskTableViewController *tableViewController = self;
-        [PROTask tasksWithBlock:^(NSArray *tasks, NSError *error) {
-            if (error) {
-                [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
-            } else {
-                _tasks = tasks;
-                [[tableViewController tableView] reloadData];
-            }
-            [[tableViewController refreshControl] endRefreshing];
-            self.navigationItem.rightBarButtonItem.enabled = YES;
-        }];
-    }
-
-    // Do any additional setup after loading the view, typically from a nib.
-}
-
-- (void)didReceiveMemoryWarning {
-    [super didReceiveMemoryWarning];
-    // Dispose of any resources that can be recreated.
-}
-
-- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
-    if ([segue.identifier isEqualToString:@"NewTaskSegue"]) {
-        UINavigationController *navigationController = segue.destinationViewController;
-        PRONewTaskViewController *newTaskViewController = [[navigationController viewControllers] objectAtIndex:0];
-        newTaskViewController.delegate = self;
-    }
-}
-
-- (void)reload:(id)sender {
-    [[[self navigationItem] rightBarButtonItem] setEnabled:NO];
-
-    __weak PROTaskTableViewController *controller = self;
-
-    [PROTask tasksWithBlock:^(NSArray *tasks, NSError *error) {
-        if (error) {
-            [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
-        } else {
-            _tasks = tasks;
-            [[controller tableView] reloadData];
-        }
-        [[controller refreshControl] endRefreshing];
-        self.navigationItem.rightBarButtonItem.enabled = YES;
-    }];
-}
-
-#pragma mark - UITableViewDataSource
-
-- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
-    return [_tasks count];
-}
-
-- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
-    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TaskCellIdentifier"];
-    cell.textLabel.text = [[_tasks objectAtIndex:indexPath.row] name];
-    return cell;
-}
-
-#pragma mark - UITableViewDelegate
-
-- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
-    [tableView deselectRowAtIndexPath:indexPath animated:YES];
-}
-
-#pragma mark - Unwind Segue for modal view
--(IBAction)didCancel:(UIStoryboardSegue *)segue {
-    // Do nothing
-}
-
-#pragma mark - PRONewTaskViewController Delegate Methods
-
-- (void)newTaskViewControllerDidCancel:(PRONewTaskViewController *)controller {
-    [self dismissViewControllerAnimated:YES completion:nil];
-}
-
-- (void)newTaskViewController:(PRONewTaskViewController *)controller didAddTask:(PROTask *)task {
-    __weak PROTaskTableViewController *tableViewController = self;
-    [task saveTaskWithBlock:^(PROTask *task, NSError *error) {
-        [tableViewController reload:nil];
-        [tableViewController dismissViewControllerAnimated:YES completion:nil];
-    }];
-}
-
-@end

File Client/Task/Task-Info.plist

 		<string>Icon@2x.png</string>
 	</array>
 	<key>CFBundleIdentifier</key>
-	<string>dk.prosa.workshop.${PRODUCT_NAME:rfc1034identifier}</string>
+	<string>dk.somedomain.workshop.${PRODUCT_NAME:rfc1034identifier}</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
+	<string>1.0.0</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.0</string>
+	<string>1</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>UIMainStoryboardFile</key>

File Client/Task/WKSAppDelegate.h

+#import <UIKit/UIKit.h>
+
+@interface WKSAppDelegate : UIResponder <UIApplicationDelegate>
+
+@property(strong, nonatomic) UIWindow *window;
+
+@end

File Client/Task/WKSAppDelegate.m

+#import "WKSAppDelegate.h"
+
+#import "AFNetworkActivityIndicatorManager.h"
+#import "AFHTTPRequestOperationLogger.h"
+
+@implementation WKSAppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+    // Override point for customization after application launch.
+    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
+    [[AFHTTPRequestOperationLogger sharedLogger] startLogging];
+    [[AFHTTPRequestOperationLogger sharedLogger] setLevel:AFLoggerLevelDebug];
+    return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
+    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+    [[AFHTTPRequestOperationLogger sharedLogger] stopLogging];
+}
+
+@end

File Client/Task/WKSNewTaskViewController.h

+#import <UIKit/UIKit.h>
+#import <CoreLocation/CoreLocation.h>
+
+@protocol PRONewTaskViewControllerDelegate;
+@class WKSTask;
+
+@interface WKSNewTaskViewController : UITableViewController <CLLocationManagerDelegate>
+
+@property(nonatomic, weak) id <PRONewTaskViewControllerDelegate> delegate;
+
+@property(weak, nonatomic) IBOutlet UITextField *nameTextField;
+@property(weak, nonatomic) IBOutlet UITextField *noteTextField;
+
+/*!
+    @param sender
+ */
+- (IBAction)cancel:(id)sender;
+
+/*!
+    @param sender
+ */
+- (IBAction)save:(id)sender;
+
+@end
+
+
+@protocol PRONewTaskViewControllerDelegate <NSObject>
+
+@optional // Only optional on iOS 6 when implementing the unwind method - see below.
+/*!
+    You can avoid using this in iOS as model view disposal an be achieved by creating an unwind method
+    that returns an IBAction and takes an UIStoryboardSegue as the argument. The method must be created
+    in the parent controller.
+    @param controller
+ */
+- (void)newTaskViewControllerDidCancel:(WKSNewTaskViewController *)controller;
+
+@required
+/*!
+    @param controller
+    @param task
+ */
+- (void)newTaskViewController:(WKSNewTaskViewController *)controller didAddTask:(WKSTask *)task;
+
+@end

File Client/Task/WKSNewTaskViewController.m

+#import "WKSNewTaskViewController.h"
+#import "WKSTask.h"
+
+@interface WKSNewTaskViewController ()
+@property(nonatomic, strong) CLLocationManager *locationManager;
+@property(nonatomic, strong) CLLocation *currentLocation;
+@end
+
+@implementation WKSNewTaskViewController
+
+- (id)initWithStyle:(UITableViewStyle)style {
+    self = [super initWithStyle:style];
+    if (self) {
+        // Custom initialization
+    }
+    return self;
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+
+    // Start the location manager.
+    _locationManager = [[CLLocationManager alloc] init];
+    [[self locationManager] setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
+    [[self locationManager] setDelegate:self];
+    [[self locationManager] startUpdatingLocation];
+
+    // Start off by using the current location but the first time the application starts
+    // the current location is nil because the user has to accept that CoreLocation is used.
+    [self setCurrentLocation:[[self locationManager] location]];
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (indexPath.section == 0)
+        [self.nameTextField becomeFirstResponder];
+}
+
+#pragma mark -
+#pragma mark CLLocationManagerDelegate
+
+- (void)locationManager:(CLLocationManager *)manager
+    didUpdateToLocation:(CLLocation *)newLocation
+           fromLocation:(CLLocation *)oldLocation {
+    // If it's a relatively recent event, turn off updates to save power
+    NSDate *eventDate = newLocation.timestamp;
+    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
+    // Because the location manager object sometimes returns cached events then we'll have to check the timestamp
+    // of any location events we'll receive. (It can take several seconds to obtain a rough location fix, so the
+    // old data simply serves as a way to reflect the last known location.) This logic throws away any events that
+    // are more than fifteen seconds old under the assumption that fairly recent events are likely to be good
+    if (fabs(howRecent) < 15.0) {
+        [self setCurrentLocation:newLocation];
+        [[self locationManager] stopUpdatingLocation];
+    }
+}
+
+- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
+    if ([error domain] == kCLErrorDomain) {
+        // We handle CoreLocation-related errors here
+        switch ([error code]) {
+            // "Don't Allow" on two successive app launches is the same as saying "never allow". The user
+            // can reset this for all apps by going to Settings > General > Reset > Reset Location Warnings.
+            case kCLErrorDenied:
+                NSLog(@"Application is not allowed to use the location service: %@", [error localizedDescription]);
+                [[self locationManager] stopUpdatingLocation];
+                break;
+            case kCLErrorLocationUnknown:
+                NSLog(@"The location service couldn't provide a location: %@", [error localizedDescription]);
+                break;
+            case kCLErrorNetwork:
+                NSLog(@"The location service encountered a network error: %@", [error localizedDescription]);
+                break;
+            case kCLErrorRegionMonitoringSetupDelayed:
+                NSLog(@"The region monitoring is delayed: %@", [error localizedDescription]);
+                break;
+            default:
+                break;
+        }
+    } else {
+        // We should handle all non-CoreLocation errors here
+    }
+}
+
+
+#pragma mark - Interface Builder Actions
+
+- (IBAction)cancel:(id)sender {
+    [self.delegate newTaskViewControllerDidCancel:self];
+}
+
+- (IBAction)save:(id)sender {
+    WKSTask *task = [[WKSTask alloc] init];
+    [task setName:[[self nameTextField] text]];
+    [task setNote:[[self noteTextField] text]];
+    if ([self currentLocation]) {
+        [task setLatitude:[NSNumber numberWithDouble:[[self currentLocation] coordinate].latitude]];
+        [task setLongitude:[NSNumber numberWithDouble:[[self currentLocation] coordinate].longitude]];
+    }
+    [[self delegate] newTaskViewController:self didAddTask:task];
+}
+
+@end

File Client/Task/WKSTask.h

+#import <Foundation/Foundation.h>
+
+@interface WKSTask : NSObject
+
+@property(nonatomic, strong) NSNumber *identifier;
+@property(nonatomic, strong) NSString *name;
+@property(nonatomic, strong) NSString *note;
+@property(nonatomic, strong) NSString *owner;
+@property(nonatomic, strong) NSNumber *latitude;
+@property(nonatomic, strong) NSNumber *longitude;
+@property(nonatomic, strong) NSDate *lastModified;
+@property(nonatomic, strong) NSDate *created;
+
+/*!
+    Get all tasks.
+    @param sender
+ */
++ (void)tasksWithBlock:(void (^)(NSArray *, NSError *))block;
+
+/*!
+    Save the given task.
+    @param sender
+ */
+- (void)saveTaskWithBlock:(void (^)(WKSTask *, NSError *))block;
+
+/*!
+    Designated initializer.
+    @param attributes
+ */
+- (id)initWithAttributes:(NSDictionary *)attributes;
+@end

File Client/Task/WKSTask.m

+#import "WKSTask.h"
+#import "WKSTaskAPIClient.h"
+
+@interface WKSTask ()
+
+@end
+
+@implementation WKSTask
+
++ (void)tasksWithBlock:(void (^)(NSArray *tasks, NSError *error))block {
+    [[WKSTaskAPIClient sharedClient] getPath:@"tasks" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) {
+        NSArray *postsFromResponse = (NSArray *) JSON;
+        NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]];
+        for (NSDictionary *attributes in postsFromResponse) {
+            WKSTask *task = [[WKSTask alloc] initWithAttributes:attributes];
+            [mutablePosts addObject:task];
+        }
+
+        if (block) {
+            block([NSArray arrayWithArray:mutablePosts], nil);
+        }
+    }                                failure:^(AFHTTPRequestOperation *operation, NSError *error) {
+        if (block) {
+            block([NSArray array], error);
+        }
+    }];
+}
+
+- (void)saveTaskWithBlock:(void (^)(WKSTask *task, NSError *error))block {
+    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
+
+    if ([self identifier])
+        [params setObject:[self identifier] forKey:@"id"];
+    if ([self name])
+        [params setObject:[self name] forKey:@"name"];
+    if ([self note])
+        [params setObject:[self note] forKey:@"note"];
+    if ([self owner])
+        [params setObject:[self owner] forKey:@"owner"];
+    if ([self latitude])
+        [params setObject:[self latitude] forKey:@"latitude"];
+    if ([self longitude])
+        [params setObject:[self longitude] forKey:@"longitude"];
+
+    [[WKSTaskAPIClient sharedClient] putPath:@"tasks" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
+        if (block) {
+            block(self, nil);
+        }
+    }                                failure:^(AFHTTPRequestOperation *operation, NSError *error) {
+        NSLog(@"The new task couldn't be saved because of the following error %@", [error localizedDescription]);
+        if (block) {
+            block([NSArray array], error);
+        }
+    }];
+}
+
+- (id)initWithAttributes:(NSDictionary *)attributes {
+    self = [super init];
+    if (!self) {
+        return nil;
+    }
+    _identifier = [NSNumber numberWithInt:[[attributes valueForKeyPath:@"id"] integerValue]];
+    _name = [attributes valueForKeyPath:@"name"];
+    _note = [attributes valueForKeyPath:@"note"];
+    _owner = [attributes valueForKeyPath:@"owner"];
+    _latitude = [NSNumber numberWithDouble:[[attributes valueForKeyPath:@"latitude"] doubleValue]];
+    _longitude = [NSNumber numberWithDouble:[[attributes valueForKeyPath:@"longitude"] doubleValue]];
+
+    NSNumber *lastModifiedDate = (NSNumber *) [attributes valueForKey:@"lastModified"];
+    if (lastModifiedDate) {
+        _lastModified = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval) [lastModifiedDate longLongValue] / 1000];
+    }
+
+    NSNumber *createdDate = (NSNumber *) [attributes valueForKey:@"created"];
+    if (createdDate) {
+        _created = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval) [createdDate longLongValue] / 1000];
+    }
+
+    return self;
+}
+
+@end

File Client/Task/WKSTaskAPIClient.h

+#import "AFHTTPClient.h"
+
+@interface WKSTaskAPIClient : AFHTTPClient
+
++ (WKSTaskAPIClient *)sharedClient;
+
+
+@end

File Client/Task/WKSTaskAPIClient.m

+#import "WKSTaskAPIClient.h"
+#import "AFJSONRequestOperation.h"
+
+@implementation WKSTaskAPIClient
+
++ (WKSTaskAPIClient *)sharedClient {
+    static dispatch_once_t predicate;
+    static WKSTaskAPIClient *sharedInstance = nil;
+
+    dispatch_once(&predicate, ^{
+        sharedInstance = [[self alloc] initWithBaseURL:
+                [NSURL URLWithString:@"http://localhost:9094/"]];
+    });
+    return sharedInstance;
+}
+
+- (id)initWithBaseURL:(NSURL *)baseURL {
+    self = [super initWithBaseURL:baseURL];
+    if (self) {
+        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
+        // Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
+        [self setDefaultHeader:@"Accept" value:@"application/json"];
+        // Accept-Charset HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
+        [self setDefaultHeader:@"Accept-Charset" value:@"utf-8"];
+        // Accept-Encoding HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
+        [self setDefaultHeader:@"Accept-Encoding" value:@"compress, gzip"];
+        // 
+        [self setParameterEncoding:AFJSONParameterEncoding];
+    }
+    return self;
+}
+
+
+@end

File Client/Task/WKSTaskTableViewController.h

+#import <UIKit/UIKit.h>
+#import "WKSNewTaskViewController.h"
+
+@interface WKSTaskTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource, PRONewTaskViewControllerDelegate>
+
+@end

File Client/Task/WKSTaskTableViewController.m

+#import "WKSTaskTableViewController.h"
+#import "WKSTask.h"
+
+@interface WKSTaskTableViewController ()
+- (void)reload:(id)sender;
+@end
+
+@implementation WKSTaskTableViewController {
+@private
+    NSArray *_tasks;
+}
+
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+
+    [self setRefreshControl:[[UIRefreshControl alloc] init]];
+
+    [[self refreshControl] addTarget:self action:@selector(reload:) forControlEvents:UIControlEventValueChanged];
+
+
+    if (!_tasks) {
+        [[self refreshControl] beginRefreshing];
+        __weak WKSTaskTableViewController *tableViewController = self;
+        [WKSTask tasksWithBlock:^(NSArray *tasks, NSError *error) {
+            if (error) {
+                [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
+            } else {
+                _tasks = tasks;
+                [[tableViewController tableView] reloadData];
+            }
+            [[tableViewController refreshControl] endRefreshing];
+            self.navigationItem.rightBarButtonItem.enabled = YES;
+        }];
+    }
+
+    // Do any additional setup after loading the view, typically from a nib.
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    if ([segue.identifier isEqualToString:@"NewTaskSegue"]) {
+        UINavigationController *navigationController = segue.destinationViewController;
+        WKSNewTaskViewController *newTaskViewController = [[navigationController viewControllers] objectAtIndex:0];
+        newTaskViewController.delegate = self;
+    }
+}
+
+- (void)reload:(id)sender {
+    [[[self navigationItem] rightBarButtonItem] setEnabled:NO];
+
+    __weak WKSTaskTableViewController *controller = self;
+
+    [WKSTask tasksWithBlock:^(NSArray *tasks, NSError *error) {
+        if (error) {
+            [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
+        } else {
+            _tasks = tasks;
+            [[controller tableView] reloadData];
+        }
+        [[controller refreshControl] endRefreshing];
+        self.navigationItem.rightBarButtonItem.enabled = YES;
+    }];
+}
+
+#pragma mark - UITableViewDataSource
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return [_tasks count];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TaskCellIdentifier"];
+    cell.textLabel.text = [[_tasks objectAtIndex:indexPath.row] name];
+    return cell;
+}
+
+#pragma mark - UITableViewDelegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+}
+
+#pragma mark - Unwind Segue for modal view
+-(IBAction)didCancel:(UIStoryboardSegue *)segue {
+    // Do nothing
+}
+
+#pragma mark - PRONewTaskViewController Delegate Methods
+
+- (void)newTaskViewControllerDidCancel:(WKSNewTaskViewController *)controller {
+    [self dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void)newTaskViewController:(WKSNewTaskViewController *)controller didAddTask:(WKSTask *)task {
+    __weak WKSTaskTableViewController *tableViewController = self;
+    [task saveTaskWithBlock:^(WKSTask *task, NSError *error) {
+        [tableViewController reload:nil];
+        [tableViewController dismissViewControllerAnimated:YES completion:nil];
+    }];
+}
+
+@end

File Client/Task/main.m

 
 #import <UIKit/UIKit.h>
 
-#import "PROAppDelegate.h"
+#import "WKSAppDelegate.h"
 
 int main(int argc, char *argv[])
 {
     @autoreleasepool {
-        return UIApplicationMain(argc, argv, nil, NSStringFromClass([PROAppDelegate class]));
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([WKSAppDelegate class]));
     }
 }

File Client/TaskTests/TaskTests.m

-#import <SenTestingKit/SenTestingKit.h>
-
-#define HC_SHORTHAND
-#import "OCHamcrest.h"
-
-@interface TaskTests : SenTestCase
-@end
-
-@implementation TaskTests
-
-- (void)setUp
-{
-    [super setUp];
-    
-    // Set-up code here.
-}
-
-- (void)tearDown
-{
-    // Tear-down code here.
-    
-    [super tearDown];
-}
-
-- (void)testExample
-{
-    STFail(@"Unit tests are not implemented yet in TaskTests");
-}
-
-@end

File Client/TaskTests/WKSTaskTests.m

+#import <SenTestingKit/SenTestingKit.h>
+
+#define HC_SHORTHAND
+#import "OCHamcrest.h"
+
+@interface WKSTaskTests : SenTestCase
+@end
+
+@implementation WKSTaskTests
+
+- (void)setUp
+{
+    [super setUp];
+    
+    // Set-up code here.
+}
+
+- (void)tearDown
+{
+    // Tear-down code here.
+    
+    [super tearDown];
+}
+
+- (void)testExample
+{
+    STFail(@"Unit tests are not implemented yet in TaskTests");
+}
+
+@end