 	}
     
     var vote: Vote? {
-        willSet {
-            
-        }
         didSet {
-            print("Vote: \(vote)", terminator: "\n")
+			if vote != oldValue && oldValue != nil {
+				let db = VoteDB()
+				db.sample = VoteDB.hashKeyGenerator(event, sample: identifier)
+				db.user = VoteDB.rangeKeyGenerator(UIDevice.currentDevice().identifierForVendor!)
+				db.vote = NSNumber(integer: vote?.rawValue ?? 0)
+				AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper().save(db).continueWithSuccessBlock { task in
+					let upDelta = oldValue == .Up ? -1 : self.vote == .Up ? 1 : 0
+					let downDelta = oldValue == .Down ? -1 : self.vote == .Down ? 1 : 0
+					self.updateRating(upDelta: upDelta, downDelta: downDelta)
+					return nil
+				}
+			}
         }
     }
 

    
    //MARK - Internal Dynamo Vote
    
    private class VoteDB: AWSDynamoDBObjectModel, AWSDynamoDBModeling
    {
        var sample: NSData?
        var user: NSData?

			updateInput.updateExpression = "SET ups=if_not_exists(ups,:zero)+:up, downs=if_not_exists(downs,:zero)+:down"
            updateInput.expressionAttributeValues = [":up" : up, ":down" : down, ":zero" : wrapValue(0)!]
			updateInput.returnValues = .UpdatedNew
			AWSDynamoDB.defaultDynamoDB().updateItem(updateInput).continueWithSuccessBlock { (task) in
				if let result = task.result as? AWSDynamoDBUpdateItemOutput {
                    let rate = [Int(result.attributes["ups"]?.N ?? "0") ?? 0, Int(result.attributes["downs"]?.N ?? "0") ?? 0]
                    dispatch_async(dispatch_get_main_queue()) {
