diff --git a/ApptentiveConnect/source/Apptentive.h b/ApptentiveConnect/source/Apptentive.h
index 29c725e7c..0e4b8ca9d 100644
--- a/ApptentiveConnect/source/Apptentive.h
+++ b/ApptentiveConnect/source/Apptentive.h
@@ -9,12 +9,13 @@
 
 #import <UIKit/UIKit.h>
 
-#define kApptentiveVersionString @"3.1.0"
+#define kApptentiveVersionString @"3.1.1"
 #define kApptentivePlatformString @"iOS"
 
 NS_ASSUME_NONNULL_BEGIN
 
-@protocol ApptentiveDelegate, ApptentiveStyle;
+@protocol ApptentiveDelegate
+, ApptentiveStyle;
 
 /** Notification sent when Message Center unread messages count changes. */
 extern NSString *const ApptentiveMessageCenterUnreadCountChangedNotification;
diff --git a/ApptentiveConnect/source/ApptentiveStyleSheet.h b/ApptentiveConnect/source/ApptentiveStyleSheet.h
index f15065b9c..ea3c5b885 100644
--- a/ApptentiveConnect/source/ApptentiveStyleSheet.h
+++ b/ApptentiveConnect/source/ApptentiveStyleSheet.h
@@ -81,7 +81,7 @@ The secondary text color to use in the Apptentive UI. Defaults to #8E8E93.
 /// The color to use for the background of collection views and grouped table views.
 @property (strong, nonatomic) UIColor *collectionBackgroundColor;
 
-/// The color used for text field placeholder text. The recommended color is the value for `primaryColor` with an alpha value of around 0.22. 
+/// The color used for text field placeholder text. The recommended color is the value for `primaryColor` with an alpha value of around 0.22.
 @property (strong, nonatomic) UIColor *placeholderColor;
 
 /// A global multiplier applied to all font sizes other than those with explicit overrides.
diff --git a/ApptentiveConnect/source/ApptentiveStyleSheet.m b/ApptentiveConnect/source/ApptentiveStyleSheet.m
index 7caa581ef..f52885864 100644
--- a/ApptentiveConnect/source/ApptentiveStyleSheet.m
+++ b/ApptentiveConnect/source/ApptentiveStyleSheet.m
@@ -334,8 +334,6 @@ - (instancetype)init {
 
 		_fontDescriptorOverrides = [NSMutableDictionary dictionary];
 		_colorOverrides = [NSMutableDictionary dictionary];
-
-		[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
 	}
 	return self;
 }
@@ -361,12 +359,12 @@ - (UIColor *)appearanceColorForClass:(Class)klass property:(SEL)propertySelector
 	return defaultColor;
 }
 
-- (void)didBecomeActive:(NSNotification *)notification {
+- (void)inheritDefaultColors {
 	_primaryColor = self.primaryColor ?: [self appearanceColorForClass:[UILabel class] property:@selector(textColor) default:[UIColor blackColor]];
 	_separatorColor = self.separatorColor ?: [self appearanceColorForClass:[UITableView class] property:@selector(separatorColor) default:[UIColor colorWithRed:199.0 / 255.0 green:200.0 / 255.0 blue:204.0 / 255.0 alpha:1.0]];
 	_backgroundColor = self.backgroundColor ?: [self appearanceColorForClass:[UITableViewCell class] property:@selector(backgroundColor) default:[UIColor whiteColor]];
 	_collectionBackgroundColor = self.collectionBackgroundColor ?: [self appearanceColorForClass:[UITableView class] property:@selector(backgroundColor) default:[UIColor groupTableViewBackgroundColor]];
-	_placeholderColor = self.placeholderColor ?: [UIColor colorWithRed:0 green:0 blue:25.0/255.0 alpha:56.0/255.0];
+	_placeholderColor = self.placeholderColor ?: [UIColor colorWithRed:0 green:0 blue:25.0 / 255.0 alpha:56.0 / 255.0];
 }
 
 - (void)setFontDescriptor:(UIFontDescriptor *)fontDescriptor forStyle:(NSString *)textStyle {
@@ -452,6 +450,11 @@ - (UIColor *)interpolateAtPoint:(CGFloat)interpolation between:(UIColor *)color1
 }
 
 - (UIColor *)colorForStyle:(NSString *)style {
+	static dispatch_once_t onceToken;
+	dispatch_once(&onceToken, ^{
+		[self inheritDefaultColors];
+	});
+
 	UIColor *result = self.colorOverrides[style];
 
 	if (result) {
diff --git a/ApptentiveConnect/source/Message Center/Controllers/ApptentiveMessageCenterViewController.m b/ApptentiveConnect/source/Message Center/Controllers/ApptentiveMessageCenterViewController.m
index abec4e230..801885db5 100644
--- a/ApptentiveConnect/source/Message Center/Controllers/ApptentiveMessageCenterViewController.m	
+++ b/ApptentiveConnect/source/Message Center/Controllers/ApptentiveMessageCenterViewController.m	
@@ -837,7 +837,7 @@ - (IBAction)showWho:(id)sender {
 	self.profileView.skipButton.hidden = NO;
 	self.profileView.titleLabel.text = self.interaction.profileEditTitle;
 
-	NSDictionary *placeholderAttributes = @{ NSForegroundColorAttributeName: [[Apptentive sharedConnection].styleSheet colorForStyle:ApptentiveColorTextInputPlaceholder] };
+	NSDictionary *placeholderAttributes = @{NSForegroundColorAttributeName: [[Apptentive sharedConnection].styleSheet colorForStyle:ApptentiveColorTextInputPlaceholder]};
 	self.profileView.nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.interaction.profileEditNamePlaceholder attributes:placeholderAttributes];
 	self.profileView.emailField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.interaction.profileEditEmailPlaceholder attributes:placeholderAttributes];
 
@@ -1171,7 +1171,7 @@ - (void)scrollToFooterView:(NSNotification *)notification {
 	CGFloat verticalOffset = CGRectGetMaxY(self.rectOfLastMessage) + footerSpace;
 	CGFloat toolbarHeight = self.navigationController.toolbarHidden ? 0 : CGRectGetHeight(self.navigationController.toolbar.bounds);
 
-	CGFloat iOS7FudgeFactor =  isIOS7 && self.view.window == nil ? topContentInset : 0;
+	CGFloat iOS7FudgeFactor = isIOS7 && self.view.window == nil ? topContentInset : 0;
 	CGFloat heightOfVisibleView = fmin(CGRectGetMinY(localKeyboardRect), CGRectGetHeight(self.view.bounds) - toolbarHeight - iOS7FudgeFactor);
 	CGFloat verticalOffsetMaximum = fmax(-64, self.tableView.contentSize.height - heightOfVisibleView);
 
diff --git a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyCollectionViewLayout.m b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyCollectionViewLayout.m
index 3c13d8eba..7c1545ef7 100644
--- a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyCollectionViewLayout.m	
+++ b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyCollectionViewLayout.m	
@@ -54,7 +54,7 @@ - (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(N
 		layoutAttributes.backgroundColor = [(id<ApptentiveCollectionViewDataSource>)self.collectionView.dataSource backgroundColor];
 	}
 
-	layoutAttributes.frame = UIEdgeInsetsInsetRect(CGRectMake(origin.x, origin.y, size.width, size.height), self.sectionInset	);
+	layoutAttributes.frame = UIEdgeInsetsInsetRect(CGRectMake(origin.x, origin.y, size.width, size.height), self.sectionInset);
 	layoutAttributes.zIndex = -1;
 
 	return layoutAttributes;
diff --git a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewController.m b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewController.m
index 55280cfb8..d99c6806b 100644
--- a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewController.m	
+++ b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewController.m	
@@ -47,7 +47,7 @@ @interface ApptentiveSurveyViewController ()
 @property (strong, nonatomic) NSIndexPath *editingIndexPath;
 
 @property (readonly, nonatomic) CGFloat lineHeightOfQuestionFont;
-@property (assign, nonatomic) BOOL shouldRemoveToolbarInset;
+@property (assign, nonatomic) CGFloat iOS9ToolbarInset;
 
 @end
 
@@ -191,6 +191,7 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell
 
 			cell.textView.text = [self.viewModel textOfAnswerAtIndexPath:indexPath];
 			cell.placeholderLabel.attributedText = [self.viewModel placeholderTextOfAnswerAtIndexPath:indexPath];
+			cell.placeholderLabel.hidden = cell.textView.text.length > 0;
 			cell.textView.delegate = self;
 			cell.textView.tag = [self.viewModel textFieldTagForIndexPath:indexPath];
 			cell.textView.accessibilityLabel = cell.placeholderLabel.text;
@@ -455,38 +456,7 @@ - (void)textFieldDidEndEditing:(UITextField *)textField {
 - (void)viewModelValidationChanged:(ApptentiveSurveyViewModel *)viewModel isValid:(BOOL)valid {
 	[self.collectionViewLayout invalidateLayout];
 
-	CGFloat bottomContentInset = self.collectionView.contentInset.bottom;
-	CGFloat bottomContentOffset = self.collectionView.contentSize.height - CGRectGetHeight(self.collectionView.bounds) + bottomContentInset;
-	CGFloat toolbarAdjustment = (valid ? -1 : 1) * CGRectGetHeight(self.navigationController.toolbar.bounds);
-
-	[UIView animateWithDuration:0.2 animations:^{
-		if ( bottomContentInset == 0 && self.collectionView.contentOffset.y >= bottomContentOffset - toolbarAdjustment) {
-			self.collectionView.contentOffset = CGPointMake(0, bottomContentOffset + toolbarAdjustment);
-		} else if (bottomContentInset != 0) {
-			UIEdgeInsets insets = self.collectionView.contentInset;
-			CGPoint contentOffset = self.collectionView.contentOffset;
-
-			if (valid && !self.navigationController.toolbarHidden) {
-				insets.bottom -= toolbarAdjustment;
-			}
-
-			self.collectionView.contentInset = insets;
-			self.collectionView.contentOffset = contentOffset;
-		}
-	}];
-
-	CGPoint contentOffset = self.collectionView.contentOffset;
-	[self.navigationController setToolbarHidden:valid animated:YES];
-
-	// Work around a bug in iOS 9, where if the toolbar is hidden with the keyboard covering it,
-	// the CV's contentInset property is not adjusted accordingly.
-	if (valid && bottomContentInset != 0) {
-		self.shouldRemoveToolbarInset = YES;
-	} else {
-		self.shouldRemoveToolbarInset = NO;
-	}
-
-	self.collectionView.contentOffset = contentOffset;
+	[self setToolbarHidden:valid];
 
 	for (UICollectionViewCell *cell in self.collectionView.visibleCells) {
 		if ([cell isKindOfClass:[ApptentiveSurveyOtherCell class]]) {
@@ -512,11 +482,12 @@ - (void)adjustForKeyboard:(NSNotification *)notification {
 		self.collectionView.contentInset = UIEdgeInsetsMake(self.collectionView.contentInset.top, self.collectionView.contentInset.left, CGRectGetHeight(self.collectionView.bounds) - keyboardRect.origin.y, self.collectionView.contentInset.right);
 
 		[self.collectionViewLayout invalidateLayout];
-	} else if (self.shouldRemoveToolbarInset) {
+	} else if (self.iOS9ToolbarInset != 0) {
+		// Remove any additional inset we added for hiding the toolbar when the keyboard was visible.
 		UIEdgeInsets contentInset = self.collectionView.contentInset;
-		contentInset.bottom -= 44;
+		contentInset.bottom += self.iOS9ToolbarInset;
 		self.collectionView.contentInset = contentInset;
-		self.shouldRemoveToolbarInset = NO;
+		self.iOS9ToolbarInset = 0;
 	}
 
 	CGFloat duration = ((NSNumber *)notification.userInfo[UIKeyboardAnimationDurationUserInfoKey]).doubleValue;
@@ -530,7 +501,48 @@ - (void)adjustForKeyboard:(NSNotification *)notification {
 	}];
 }
 
-#pragma mark - Private 
+#pragma mark - Private
+
+// If the survey is scrolled all the way to the bottom, we want to scroll down as the toolbar animates in
+// (and scroll up when it animates out, if necessary).
+// There are a lot of pecularities related to OS version and keyboard visibility we have to deal with as well.
+- (void)setToolbarHidden:(BOOL)hidden {
+	CGFloat bottomContentInset = self.collectionView.contentInset.bottom;
+	BOOL keyboardVisible = bottomContentInset > 0;
+	CGFloat bottomContentOffset = self.collectionView.contentSize.height - CGRectGetHeight(self.collectionView.bounds) + bottomContentInset;
+	CGFloat toolbarAdjustment = (hidden ? -1 : 1) * CGRectGetHeight(self.navigationController.toolbar.bounds);
+	BOOL scrolledAllTheWayDown = self.collectionView.contentOffset.y >= bottomContentOffset - toolbarAdjustment;
+
+	[UIView animateWithDuration:0.2 animations:^{
+		if (!keyboardVisible && scrolledAllTheWayDown) {
+			self.collectionView.contentOffset = CGPointMake(0, bottomContentOffset + toolbarAdjustment);
+		} else if (keyboardVisible && hidden) {
+			// If we're hiding the toolbar with the keyboard visible, we need to add in a bit more bottom inset to keep things from moving around.
+			UIEdgeInsets insets = self.collectionView.contentInset;
+			CGPoint contentOffset = self.collectionView.contentOffset;
+
+			insets.bottom -= toolbarAdjustment;
+
+			// On iOS9, we need to remember to remove that inset once the keyboard is dismissed.
+			self.iOS9ToolbarInset = toolbarAdjustment;
+
+			self.collectionView.contentInset = insets;
+			self.collectionView.contentOffset = contentOffset;
+		}
+	}];
+
+	// iOS 7 resets the contentOffset to CGPointZero when the toolbar animation takes place.
+	// So we have to save off the content offset and set it back after changing toolbar visibility.
+	// Once we drop iOS 7, all of the following but the call to -setToolbarHidden:animated: can be removed.
+	CGPoint contentOffset = self.collectionView.contentOffset;
+	[self.navigationController setToolbarHidden:hidden animated:YES];
+
+	if (hidden && !keyboardVisible && scrolledAllTheWayDown) {
+		contentOffset.y += toolbarAdjustment;
+	}
+
+	self.collectionView.contentOffset = contentOffset;
+}
 
 - (void)maybeAnimateOtherSizeChangeAtIndexPath:(NSIndexPath *)indexPath {
 	if ([self.viewModel typeOfAnswerAtIndexPath:indexPath] == ApptentiveSurveyAnswerTypeOther) {
diff --git a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.h b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.h
index 228eea893..370dc823c 100644
--- a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.h	
+++ b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.h	
@@ -12,7 +12,8 @@
 
 @class ApptentiveSurvey, ApptentiveInteraction;
 
-@protocol ATSurveyViewModelDelegate, ApptentiveStyle;
+@protocol ATSurveyViewModelDelegate
+, ApptentiveStyle;
 
 
 @interface ApptentiveSurveyViewModel : NSObject
diff --git a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.m b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.m
index bd75d3aec..8ab317af8 100644
--- a/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.m	
+++ b/ApptentiveConnect/source/Surveys/View Controllers/ApptentiveSurveyViewModel.m	
@@ -132,7 +132,7 @@ - (NSAttributedString *)placeholderTextOfAnswerAtIndexPath:(NSIndexPath *)indexP
 		placeholder = [self answerAtIndexPath:indexPath].placeholder ?: @"";
 	}
 
-	return [[NSAttributedString alloc] initWithString:placeholder attributes:@{ NSForegroundColorAttributeName: [self.styleSheet colorForStyle:ApptentiveColorTextInputPlaceholder] }];
+	return [[NSAttributedString alloc] initWithString:placeholder attributes:@{NSForegroundColorAttributeName: [self.styleSheet colorForStyle:ApptentiveColorTextInputPlaceholder]}];
 }
 
 - (NSString *)textOfChoiceAtIndexPath:(NSIndexPath *)indexPath {
@@ -302,7 +302,7 @@ - (BOOL)validate:(BOOL)isSubmit {
 		self.invalidQuestionIndexes = redToGreenQuestionIndexes;
 
 		NSMutableSet *redToGreenAnswerIndexPaths = [self.invalidAnswerIndexPaths mutableCopy];
-		[self.invalidAnswerIndexPaths enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
+		[self.invalidAnswerIndexPaths enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL *_Nonnull stop) {
 			if (![previousInvalidAnswerIndexPaths containsObject:obj]) {
 				[redToGreenAnswerIndexPaths removeObject:obj];
 			}
@@ -427,7 +427,7 @@ - (NSDictionary *)responseDictionaryForAnswerAtIndexPath:(NSIndexPath *)indexPat
 			response[@"value"] = [self trimmedTextAtIndexPath:indexPath] ?: @"";
 		}
 	}
-	
+
 	return response;
 }
 
diff --git a/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.h b/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.h
index 68497e3c9..1e6cc8500 100644
--- a/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.h
+++ b/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.h
@@ -8,6 +8,7 @@
 
 #import "ApptentiveSurveyChoiceCell.h"
 
+
 @interface ApptentiveSurveyOtherCell : ApptentiveSurveyChoiceCell
 
 @property (strong, nonatomic) IBOutlet UITextField *textField;
diff --git a/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.m b/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.m
index 0975216e4..44fb7f5cd 100644
--- a/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.m
+++ b/ApptentiveConnect/source/Surveys/Views/ApptentiveSurveyOtherCell.m
@@ -8,6 +8,7 @@
 
 #import "ApptentiveSurveyOtherCell.h"
 
+
 @implementation ApptentiveSurveyOtherCell
 
 - (void)awakeFromNib {
diff --git a/ApptentiveConnect/tests/ApptentiveStyleSheetTests.m b/ApptentiveConnect/tests/ApptentiveStyleSheetTests.m
index 92fd4df89..6e559dd2f 100644
--- a/ApptentiveConnect/tests/ApptentiveStyleSheetTests.m
+++ b/ApptentiveConnect/tests/ApptentiveStyleSheetTests.m
@@ -30,11 +30,6 @@ - (void)testUIAppearanceDefaults {
 	[UITableView appearance].separatorColor = [UIColor redColor];
 	[UITableView appearanceWhenContainedIn:[ApptentiveNavigationController class], nil].backgroundColor = [UIColor greenColor];
 
-	XCTAssertNotEqualObjects([self.styleSheet colorForStyle:ApptentiveColorSeparator], [UIColor redColor]);
-	XCTAssertNotEqualObjects([self.styleSheet colorForStyle:ApptentiveColorCollectionBackground], [UIColor greenColor]);
-
-	[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
-
 	XCTAssertEqualObjects([self.styleSheet colorForStyle:ApptentiveColorSeparator], [UIColor redColor]);
 	XCTAssertEqualObjects([self.styleSheet colorForStyle:ApptentiveColorCollectionBackground], [UIColor greenColor]);
 }
diff --git a/ApptentiveConnect/tests/ApptentiveSurveyTests.m b/ApptentiveConnect/tests/ApptentiveSurveyTests.m
index d9d97ad79..b40149ef2 100644
--- a/ApptentiveConnect/tests/ApptentiveSurveyTests.m
+++ b/ApptentiveConnect/tests/ApptentiveSurveyTests.m
@@ -44,11 +44,6 @@ - (void)setUp {
 		self.answeredQuestions = [NSMutableSet set];
 		self.deselectedIndexPaths = [NSMutableSet set];
 
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wundeclared-selector"
-		[self.viewModel.styleSheet performSelector:@selector(didBecomeActive:) withObject:nil];
-#pragma clang diagnostic pop
-
 		[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(answeredQuestion:) name:ATSurveyDidAnswerQuestionNotification object:nil];
 		[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didHide:) name:ATSurveyDidHideWindowNotification object:nil];
 	}
@@ -187,13 +182,14 @@ - (void)testAnswers {
 	[self.viewModel setText:@" Foo " forAnswerAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:7]];
 	[self.viewModel setText:@" Bar\n" forAnswerAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:9]];
 
-	NSDictionary *answer = @{ @"id": @"56d49499c719925f3300000b", @"value": @"Other Text" };
-	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f3300000b"], @[ answer ]);
-	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000011"], @[ @{ @"id": @"56d49499c719925f33000012" }]);
-	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000019"], @[ @{ @"id": @"56d49499c719925f3300001a" }] );
+	NSDictionary *answer = @{ @"id": @"56d49499c719925f3300000b",
+		@"value": @"Other Text" };
+	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f3300000b"], @[answer]);
+	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000011"], @[@{ @"id": @"56d49499c719925f33000012" }]);
+	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000019"], @[@{ @"id": @"56d49499c719925f3300001a" }]);
 
-	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f3300001f"], @[ @{ @"value": @"Foo" } ]);
-	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000021"], @[ @{ @"value": @"Bar" } ]);
+	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f3300001f"], @[@{ @"value": @"Foo" }]);
+	XCTAssertEqualObjects(self.viewModel.answers[@"56d49499c719925f33000021"], @[@{ @"value": @"Bar" }]);
 }
 
 - (void)testMetrics {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9e8f23ae5..cd27b2e41 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+2016-06-21 frankus v3.1.1
+-------------------------
+Version 3.1.1 fixes an issue where surveys could crash if the Apptentive
+singleton was instantiated after the app became active. It also improves the
+scrolling behavior in surveys.
+
 2016-06-08 frankus v3.1.0
 -------------------------
 Version 3.1.0 adds the ability to include a freeform "Other" choice for single-
diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj
index 10addca02..27032bcd2 100644
--- a/Demo/Demo.xcodeproj/project.pbxproj
+++ b/Demo/Demo.xcodeproj/project.pbxproj
@@ -13,7 +13,6 @@
 		014B260D1CD16F72009BE289 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 019958D31CD13A320044A185 /* Defaults.plist */; };
 		014B26111CD27D67009BE289 /* CustomDataCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014B26101CD27D67009BE289 /* CustomDataCell.swift */; };
 		014B26131CD2994B009BE289 /* ConnectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 014B26121CD2994B009BE289 /* ConnectionViewController.swift */; };
-		018C24C71CD3F90B00AC8276 /* Mocks in Resources */ = {isa = PBXBuildFile; fileRef = 018C24C61CD3F90B00AC8276 /* Mocks */; };
 		019959021CD15DFA0044A185 /* EventsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 019959011CD15DFA0044A185 /* EventsViewController.swift */; };
 		019959041CD15E180044A185 /* InteractionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 019959031CD15E180044A185 /* InteractionsViewController.swift */; };
 		019959061CD15E2A0044A185 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 019959051CD15E2A0044A185 /* MessagesViewController.swift */; };
@@ -77,7 +76,6 @@
 		014B26101CD27D67009BE289 /* CustomDataCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomDataCell.swift; sourceTree = "<group>"; };
 		014B26121CD2994B009BE289 /* ConnectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionViewController.swift; sourceTree = "<group>"; };
 		018C24C51CD3F82500AC8276 /* iOSDemoUITests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOSDemoUITests-Bridging-Header.h"; sourceTree = "<group>"; };
-		018C24C61CD3F90B00AC8276 /* Mocks */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Mocks; sourceTree = "<group>"; };
 		019958CE1CD1375A0044A185 /* Apptentive.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Apptentive.h; path = ../../ApptentiveConnect/source/Apptentive.h; sourceTree = "<group>"; };
 		019958CF1CD137640044A185 /* Apptentive_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Apptentive_Private.h; path = ../../ApptentiveConnect/source/Apptentive_Private.h; sourceTree = "<group>"; };
 		019958D01CD137CA0044A185 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
@@ -188,7 +186,6 @@
 		01FA581E1CD03B7800CF132B /* iOSDemoUITests */ = {
 			isa = PBXGroup;
 			children = (
-				018C24C61CD3F90B00AC8276 /* Mocks */,
 				01FA581F1CD03B7800CF132B /* iOSDemoUITests.swift */,
 				01FA58211CD03B7800CF132B /* Info.plist */,
 				018C24C51CD3F82500AC8276 /* iOSDemoUITests-Bridging-Header.h */,
@@ -321,7 +318,6 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				018C24C71CD3F90B00AC8276 /* Mocks in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Demo/iOSDemo/AppDelegate.h b/Demo/iOSDemo/AppDelegate.h
deleted file mode 100644
index fd6386118..000000000
--- a/Demo/iOSDemo/AppDelegate.h
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-//  AppDelegate.h
-//  iOSDemo
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@interface AppDelegate : UIResponder <UIApplicationDelegate>
-
-@property (strong, nonatomic) UIWindow *window;
-
-
-@end
-
diff --git a/Demo/iOSDemo/AppDelegate.m b/Demo/iOSDemo/AppDelegate.m
deleted file mode 100644
index 73ab9e4c5..000000000
--- a/Demo/iOSDemo/AppDelegate.m
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-//  AppDelegate.m
-//  iOSDemo
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. All rights reserved.
-//
-
-#import "AppDelegate.h"
-
-@interface AppDelegate ()
-
-@end
-
-@implementation AppDelegate
-
-
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-	// Override point for customization after application launch.
-	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:.
-}
-
-@end
diff --git a/Demo/iOSDemo/AppDelegate.swift b/Demo/iOSDemo/AppDelegate.swift
index 5ccce22cb..b39cf8353 100644
--- a/Demo/iOSDemo/AppDelegate.swift
+++ b/Demo/iOSDemo/AppDelegate.swift
@@ -23,8 +23,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
 		if let APIKey = NSUserDefaults.standardUserDefaults().stringForKey(APIKeyKey) {
 			self.connectWithAPIKey(APIKey)
-		} else {
-			print("\(Apptentive.sharedConnection())")
 		}
 
 		return true
diff --git a/Demo/iOSDemo/ViewController.h b/Demo/iOSDemo/ViewController.h
deleted file mode 100644
index c569260bd..000000000
--- a/Demo/iOSDemo/ViewController.h
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-//  ViewController.h
-//  iOSDemo
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@interface ViewController : UIViewController
-
-
-@end
-
diff --git a/Demo/iOSDemo/ViewController.m b/Demo/iOSDemo/ViewController.m
deleted file mode 100644
index 45e3177ac..000000000
--- a/Demo/iOSDemo/ViewController.m
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-//  ViewController.m
-//  iOSDemo
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. All rights reserved.
-//
-
-#import "ViewController.h"
-
-@interface ViewController ()
-
-@end
-
-@implementation ViewController
-
-- (void)viewDidLoad {
-	[super viewDidLoad];
-	// Do any additional setup after loading the view, typically from a nib.
-}
-
-- (void)didReceiveMemoryWarning {
-	[super didReceiveMemoryWarning];
-	// Dispose of any resources that can be recreated.
-}
-
-@end
diff --git a/Demo/iOSDemo/main.m b/Demo/iOSDemo/main.m
deleted file mode 100644
index c1806a530..000000000
--- a/Demo/iOSDemo/main.m
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-//  main.m
-//  iOSDemo
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. 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/Demo/iOSDemoUITests/Mocks/Configuration b/Demo/iOSDemoUITests/Mocks/Configuration
deleted file mode 100644
index 8d291b84b..000000000
--- a/Demo/iOSDemoUITests/Mocks/Configuration
+++ /dev/null
@@ -1,23 +0,0 @@
-GET
-/conversation/configuration
-200
-Server: nginx
-Date: Fri, 29 Apr 2016 20:06:34 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-Cache-Control: private, max-age=0
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "494f362b53a211d92adc47bcb944fdd1"
-X-Content-Type-Options: nosniff
-X-Request-Id: 1d0f36867b3052eb8f6f3e494622b9a5
-X-Runtime: 0.025183
-X-Rack-Cache: miss
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"support_display_name":"Hannah","support_display_email":"andrew.crocker+testing@apptentive.com","hide_branding":false,"message_center":{"title":"Message Center","fg_poll":10,"bg_poll":300,"email_required":false,"notification_popup":{"enabled":false}},"support_image_url":"https://secure.gravatar.com/avatar/bf88244ab725b275faf1f47119a1cb7b?d=mm\u0026r=pg\u0026s=80","app_display_name":"Apptentive Test App","message_center_enabled":true,"metrics_enabled":true}
diff --git a/Demo/iOSDemoUITests/Mocks/Conversation b/Demo/iOSDemoUITests/Mocks/Conversation
deleted file mode 100644
index 5f0cabc46..000000000
--- a/Demo/iOSDemoUITests/Mocks/Conversation
+++ /dev/null
@@ -1,23 +0,0 @@
-GET
-/conversation
-200
-Server: nginx
-Date: Fri, 29 Apr 2016 20:06:44 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "08a787222d1701dc7633a2d0f866f66d"
-Cache-Control: must-revalidate, private, max-age=0
-X-Content-Type-Options: nosniff
-X-Request-Id: 937d958ba03af44c592d45cd6e5004a3
-X-Runtime: 0.022543
-X-Rack-Cache: miss
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"items":[],"has_more":false}
diff --git a/Demo/iOSDemoUITests/Mocks/CreateConversation b/Demo/iOSDemoUITests/Mocks/CreateConversation
deleted file mode 100644
index 8e88cedd5..000000000
--- a/Demo/iOSDemoUITests/Mocks/CreateConversation
+++ /dev/null
@@ -1,23 +0,0 @@
-POST
-/conversation
-201
-Server: nginx
-Date: Fri, 22 Jan 2016 23:26:42 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "f953010bd08548e3c050f37debb9a0a3"
-Cache-Control: max-age=0, private, must-revalidate
-X-Content-Type-Options: nosniff
-X-Request-Id: f3c3d12e37e73f91725695042fbf951b
-X-Runtime: 0.129775
-X-Rack-Cache: invalidate, pass
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"token":"684e328223b288d56c3dabeeff0ec5a46cea6e791a415d8ccc9f79241d42dfe1","state":"new","id":"56a2bab28c2d4404d50000e8","device_id":"56a2bab28c2d4404d50000e7","person_id":"56a2bab28c2d4404d50000e9","sdk":{"version":"2.1.0","programming_language":"Objective-C","author_name":"Apptentive, Inc.","author_email":null,"platform":"iOS","distribution":"source","distribution_version":null},"app_release":{"version":"1.0","build_number":"3","identifier":null,"target_sdk_version":null}}
\ No newline at end of file
diff --git a/Demo/iOSDemoUITests/Mocks/Devices b/Demo/iOSDemoUITests/Mocks/Devices
deleted file mode 100644
index 9628830cc..000000000
--- a/Demo/iOSDemoUITests/Mocks/Devices
+++ /dev/null
@@ -1,23 +0,0 @@
-PUT
-/devices
-201
-Server: nginx
-Date: Fri, 22 Jan 2016 23:26:42 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "8b85bf2e4abfd7489dbe7082afffd80b"
-Cache-Control: max-age=0, private, must-revalidate
-X-Content-Type-Options: nosniff
-X-Request-Id: 1461fcd300ce8dc65dd854d8cd225051
-X-Runtime: 0.059404
-X-Rack-Cache: invalidate, pass
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"id":"56a2bab28c2d4404d50000e7","os_name":"iPhone OS","os_version":"8.1","os_build":"15C50","os_api_level":null,"manufacturer":null,"model":"iOS Simulator","board":null,"product":null,"brand":null,"cpu":null,"hardware":"x86_64","device":null,"carrier":null,"current_carrier":null,"uuid":"c39bcc06-4005-44c7-9720-56f45c3a6080","network_type":null,"build_type":null,"build_id":null,"bootloader_version":null,"radio_version":null,"custom_data":null,"locale_country_code":"US","locale_language_code":"en","locale_raw":"en_US"}
diff --git a/Demo/iOSDemoUITests/Mocks/Events b/Demo/iOSDemoUITests/Mocks/Events
deleted file mode 100644
index f05ef7a59..000000000
--- a/Demo/iOSDemoUITests/Mocks/Events
+++ /dev/null
@@ -1,23 +0,0 @@
-POST
-/events
-201
-Server: nginx
-Date: Fri, 22 Jan 2016 23:26:42 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "99914b932bd37a50b983c5e7c90ae93b"
-Cache-Control: max-age=0, private, must-revalidate
-X-Content-Type-Options: nosniff
-X-Request-Id: d2130ef1e6a439a1e6afefdbaa919a1a
-X-Runtime: 0.069380
-X-Rack-Cache: invalidate, pass
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{}
\ No newline at end of file
diff --git a/Demo/iOSDemoUITests/Mocks/Interactions b/Demo/iOSDemoUITests/Mocks/Interactions
deleted file mode 100644
index 43881b197..000000000
--- a/Demo/iOSDemoUITests/Mocks/Interactions
+++ /dev/null
@@ -1,23 +0,0 @@
-GET
-/interactions
-200
-Server: nginx
-Date: Fri, 29 Apr 2016 20:06:35 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-Cache-Control: private, max-age=0
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "a6e4ce1825434ba03f66372cfbf2e552"
-X-Content-Type-Options: nosniff
-X-Request-Id: 426b7befbd3fa94c2df2d52d36ecb426
-X-Runtime: 1.528811
-X-Rack-Cache: miss
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"interactions":[{"id":"52aa562668e275e7d00006db","type":"UpgradeMessage","version":1,"configuration":{"show_app_icon":true,"show_powered_by":true,"body":"<html><head><style>\nbody {\n  font-family: \"Helvetica Neue\", Helvetica;\n  color: #4d4d4d;\n  font-size: .875em;\n  line-height: 1.36em;\n  -webkit-text-size-adjust:none;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  color: #000000;\n  line-height: 1.25em;\n  text-align: center;\n}\n\nh1 {font-size: 22px;}\nh2 {font-size: 18px;}\nh3 {font-size: 16px;}\nh4 {font-size: 14px;}\nh5, h6 {font-size: 12px;}\nh6 {font-weight: normal;}\n\nblockquote {\n  margin: 1em 1.75em;\n  font-style: italic;\n}\n\nul, ol {\n  padding-left: 1.75em;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n  empty-cells: show;\n}\n\ntable caption {\n  padding: 1em 0;\n  text-align: center;\n}\n\ntable td,\ntable th {\n  border-left: 1px solid #cbcbcb;\n  border-width: 0 0 0 1px;\n  font-size: inherit;\n  margin: 0;\n  padding: .25em .5em;\n\n}\ntable td:first-child,\ntable th:first-child {\n  border-left-width: 0;\n}\ntable th:first-child {\n  border-radius: 4px 0 0 4px;\n}\ntable th:last-child {\n  border-radius: 0 4px 4px 0;\n}\n\ntable thead {\n  background: #E5E5E5;\n  color: #000;\n  text-align: left;\n  vertical-align: bottom;\n}\n\ntable td {\n  background-color: transparent;\n  border-bottom: 1px solid #E5E5E5;\n}\n</style></head><body><p>\n\tThanks for updating!\n</p></body></html>"}},{"id":"54d50f69cd68dc00c30001dd","type":"TextModal","version":1,"configuration":{"actions":[{"id":"54d50f70cd68dc65d400008d","action":"dismiss","label":"Dismiss"},{"id":"54d50f70cd68dc65d400008e","action":"interaction","label":"See Apptentive","invokes":[{"interaction_id":"56b24833c21f96e6700000a8","criteria":{}}]}],"title":"Message Title","body":"Message content.","name":"Test Note 3"}},{"id":"54dac421a7e9cd0578000006","type":"TextModal","version":1,"configuration":{"actions":[{"id":"54dac42ea7e9cd0578000008","action":"dismiss","label":"Dismiss 1"},{"id":"54dac42ea7e9cd0578000009","action":"interaction","label":"Survey 2","invokes":[{"interaction_id":"55f885a722570e5b79000002","criteria":{}}]},{"id":"54dac42ea7e9cd057800000a","action":"interaction","label":"Call 3","invokes":[{"interaction_id":"56b24834c21f96e6700000ab","criteria":{}}]},{"id":"55f8868e273db600f900002c","action":"interaction","label":"Survey","invokes":[{"interaction_id":"55f885a722570e5b79000002","criteria":{}}]}],"title":"Message Title","body":"Message content.","name":"Button Order Note"}},{"id":"55bffcd3e1c388521a000bd2","type":"AppStoreRating","version":1,"configuration":{"method":"app_store"}},{"id":"55bffcd3e1c388521a000bce","type":"EnjoymentDialog","version":1,"configuration":{"title":"Do you love Apptentive Test App?","yes_text":"Yes","no_text":"No"}},{"id":"55bffcd3e1c388521a000bd0","type":"RatingDialog","version":1,"configuration":{"title":"Thank You","body":"We're so happy to hear that you love Apptentive Test App! It'd be really helpful if you rated us. Thanks so much for spending some time with us.","rate_text":"Rate","remind_text":"Remind Me Later","decline_text":"No Thanks"}},{"id":"55bffcd3e1c388521a000bd4","type":"MessageCenter","version":2,"configuration":{"title":"Message Center","branding":"Powered by Apptentive","composer":{"title":"New Message","hint_text":"Please leave detailed feedback","send_button":"Send","send_start":"Sending...","send_ok":"Sent","send_fail":"Failed","close_text":"Close","close_confirm_body":"Are you sure you want to discard this message?","close_discard_button":"Discard","close_cancel_button":"Cancel"},"greeting":{"title":"Hello!","body":"We'd love to get feedback from you on our app. The more details you can provide, the better.","image_url":"https://secure.gravatar.com/avatar/bf88244ab725b275faf1f47119a1cb7b?d=mm&r=pg&s=300"},"status":{"body":"We will respond to your message soon."},"automated_message":{"body":"TEST CONTEXT MESSAGE TEXT Save button?????"},"error_messages":{"http_error_body":"It looks like we're having trouble sending your message. We've saved it and will try sending it again soon.","network_error_body":"It looks like you aren't connected to the Internet right now. We've saved your message and will try again when we detect a connection."},"profile":{"request":true,"require":true,"initial":{"title":"Who are we speaking with?","name_hint":"Name","email_hint":"Email (required)","email_explanation":"So we're able to reply","skip_button":"Skip","save_button":"Next"},"edit":{"title":"Profile","name_hint":"Name","email_hint":"Email","email_explanation":"So we're able to reply","skip_button":"Cancel","save_button":"Save"}}}},{"id":"55c2826335878be4ab000dac","type":"MessageCenter","version":2,"configuration":{"title":"Message Center","branding":"Powered by Apptentive","composer":{"title":"New Message","hint_text":"Please leave detailed feedback","send_button":"Send","send_start":"Sending...","send_ok":"Sent","send_fail":"Failed","close_text":"Close","close_confirm_body":"Are you sure you want to discard this message?","close_discard_button":"Discard","close_cancel_button":"Cancel"},"greeting":{"title":"Hello!","body":"We'd love to get feedback from you on our app. The more details you can provide, the better.","image_url":"https://secure.gravatar.com/avatar/bf88244ab725b275faf1f47119a1cb7b?d=mm&r=pg&s=300"},"status":{"body":"We will respond to your message soon."},"automated_message":{},"error_messages":{"http_error_body":"It looks like we're having trouble sending your message. We've saved it and will try sending it again soon.","network_error_body":"It looks like you aren't connected to the Internet right now. We've saved your message and will try again when we detect a connection."},"profile":{"request":true,"require":true,"initial":{"title":"Who are we speaking with?","name_hint":"Name","email_hint":"Email (required)","email_explanation":"So we're able to reply","skip_button":"Skip","save_button":"Next"},"edit":{"title":"Profile","name_hint":"Name","email_hint":"Email","email_explanation":"So we're able to reply","skip_button":"Cancel","save_button":"Save"}}}},{"id":"55ce4915968896cb8b00001c","type":"Survey","version":1,"configuration":{"questions":[{"id":"55ce4915968896cb8b000019","answer_choices":[{"id":"55ce4915968896cb8b00000a","value":"Unimportant"},{"id":"55ce4915968896cb8b00000b","value":"Not Important"},{"id":"55ce4915968896cb8b00000c","value":"Somewhat Important"},{"id":"55ce4915968896cb8b00000d","value":"Important"},{"id":"55ce4915968896cb8b00000e","value":"Very Important"}],"instructions":"select one","randomize":false,"value":"The game is well designed and it keeps me motivated","type":"multichoice","required":true},{"id":"55ce4915968896cb8b00001a","answer_choices":[{"id":"55ce4915968896cb8b00000f","value":"Unimportant"},{"id":"55ce4915968896cb8b000010","value":"Not Important"},{"id":"55ce4915968896cb8b000011","value":"Somewhat Important"},{"id":"55ce4915968896cb8b000012","value":"Important"},{"id":"55ce4915968896cb8b000013","value":"Very Important"}],"instructions":"select one","randomize":false,"value":"The game runs seamlessly without crashing","type":"multichoice","required":true},{"id":"55ce4915968896cb8b00001b","answer_choices":[{"id":"55ce4915968896cb8b000014","value":"Unimportant"},{"id":"55ce4915968896cb8b000015","value":"Not Important"},{"id":"55ce4915968896cb8b000016","value":"Somewhat Important"},{"id":"55ce4915968896cb8b000017","value":"Important"},{"id":"55ce4915968896cb8b000018","value":"Very Important"}],"instructions":"select one","randomize":false,"value":"The game has amazing graphics and animations","type":"multichoice","required":true}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Example Survey: In-Game Elements","name":"Survey","description":"Hey there all star gamer! How Important are the following game elements to you?","multiple_responses":true,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"55f87f79273db6574700003b","type":"Survey","version":1,"configuration":{"questions":[{"id":"55f87f79273db6574700003a","answer_choices":[{"id":"55f87f79273db65747000038","value":"Yes"},{"id":"55f87f79273db65747000039","value":"No"}],"instructions":"select one","randomize":false,"value":"Would you see a movie with George Wendt eating beans?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Bean Survey 2","name":"Survey","description":"Would you like to take a survey!?","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"55f87fdb22570e6fb9000005","type":"Survey","version":1,"configuration":{"questions":[{"id":"55f87fdb22570e6fb9000002","answer_choices":[{"id":"55f87fdb22570e6fb9000003","value":"0"},{"id":"55f87fdb22570e6fb9000004","value":"1"}],"instructions":"select one","randomize":false,"value":"How many times would you see a movie with George Wendt eating beans?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Bean Survey 3","name":"Survey","description":"Would you like to take a survey!?","multiple_responses":true,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"55fb3bb9273db67b7200002a","type":"Survey","version":1,"configuration":{"questions":[{"id":"55fb3bb9273db67b72000029","randomize":false,"multiline":false,"value":"sdf","type":"singleline","required":false,"freeform_hint":"Please provide a response"}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"sdf","name":"Survey","description":"sdf","multiple_responses":false,"show_success_message":false,"view_period":86400.0,"required":false}},{"id":"5627db62753934f808000001","type":"Survey","version":1,"configuration":{"questions":[{"id":"5627db63753934f808000002","answer_choices":[{"id":"5627db63753934f808000003","value":"Yes"},{"id":"5627db63753934f808000004","value":"No"}],"instructions":"select one","randomize":false,"value":"Does this work?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Testing Locale","name":"Survey","description":"Would you like to take a survey!?","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"565e35545aaa413abc00001c","type":"Survey","version":1,"configuration":{"questions":[{"id":"565e35545aaa413abc00001b","answer_choices":[{"id":"565e35545aaa413abc000019","value":"Yes"},{"id":"565e35545aaa413abc00001a","value":"No"}],"instructions":"select one","randomize":false,"value":"Is this on?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Triggered from event_1","name":"Survey","description":"Intro","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"5668cbee5aaa41283f000005","type":"TextModal","version":1,"configuration":{"actions":[{"id":"5668cbee5aaa41283f000004","action":"dismiss","label":"Thanks!"}],"title":"You're awesome!","name":"Targeted note"}},{"id":"56bb9149701b764ba3000007","type":"Survey","version":1,"configuration":{"questions":[{"id":"56bb914a701b764ba3000008","randomize":false,"multiline":false,"value":"Short Text Question","type":"singleline","required":true,"freeform_hint":"Please provide a response"},{"id":"56bb914a701b764ba3000009","randomize":false,"multiline":true,"value":"Long Text Question","type":"singleline","required":false,"freeform_hint":"Please leave detailed feedback"},{"id":"56bb914a701b764ba300000a","answer_choices":[{"id":"56bb914a701b764ba300000b","value":"Answer"},{"id":"56bb914a701b764ba300000c","value":"Answer"},{"id":"56bb914a701b764ba300000d","value":"Answer"},{"id":"56bb914a701b764ba300000e","value":"Answer"}],"instructions":"select one","randomize":false,"value":"Single Select","type":"multichoice","required":true},{"id":"56bb914a701b764ba300000f","answer_choices":[{"id":"56bb914a701b764ba3000010","value":"Answer"},{"id":"56bb914a701b764ba3000011","value":"Answer"},{"id":"56bb914a701b764ba3000012","value":"Our new service will call your favorite rentals to get any missing details and schedule viewings for you."},{"id":"56bb914a701b764ba3000013","value":"Answer"}],"instructions":"select at least 1","randomize":false,"value":"Multi Select","type":"multiselect","required":true,"min_selections":1,"max_selections":4},{"id":"56bb914a701b764ba3000014","answer_choices":[{"id":"56bb914a701b764ba3000015","value":"Answer"},{"id":"56bb914a701b764ba3000016","value":"Answer"},{"id":"56bb914a701b764ba3000017","value":"Our new service will call your favorite rentals to get any missing details and schedule viewings for you."},{"id":"56bb914a701b764ba3000018","value":"Answer"}],"instructions":"select between 2 and 3","randomize":false,"value":"Multi Select","type":"multiselect","required":true,"min_selections":2,"max_selections":3}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Crocker Survey","name":"Survey Title","description":"Please answer all the questions, and we'll use your responses for really good things.","multiple_responses":true,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you for your response!"}},{"id":"56d49498c719925f33000007","type":"Survey","version":1,"configuration":{"questions":[{"id":"56d49499c719925f33000008","answer_choices":[{"id":"56d49499c719925f33000009","value":"A"},{"id":"56d49499c719925f3300000a","value":"B"}],"instructions":"select one","randomize":false,"value":"Multichoice Optional","type":"multichoice","required":false},{"id":"56d49499c719925f3300000b","answer_choices":[{"id":"56d49499c719925f3300000c","value":"A"},{"id":"56d49499c719925f3300000d","value":"B"}],"instructions":"select one","randomize":false,"value":"Multichoice Required","type":"multichoice","required":true},{"id":"56d49499c719925f3300000e","answer_choices":[{"id":"56d49499c719925f3300000f","value":"A"},{"id":"56d49499c719925f33000010","value":"B"}],"instructions":"select all that apply","randomize":false,"value":"Multiselect Optional","type":"multiselect","required":false,"min_selections":0,"max_selections":2},{"id":"56d49499c719925f33000011","answer_choices":[{"id":"56d49499c719925f33000012","value":"A"},{"id":"56d49499c719925f33000013","value":"B"}],"instructions":"select at least 1","randomize":false,"value":"MultiSelect Required","type":"multiselect","required":true,"min_selections":1,"max_selections":2},{"id":"56d49499c719925f33000014","answer_choices":[{"id":"56d49499c719925f33000015","value":"A"},{"id":"56d49499c719925f33000016","value":"B"},{"id":"56d49499c719925f33000017","value":"C"},{"id":"56d49499c719925f33000018","value":"D"}],"instructions":"select between 1 and 3","randomize":false,"value":"Multiselect Optional With Limits","type":"multiselect","required":false,"min_selections":1,"max_selections":3},{"id":"56d49499c719925f33000019","answer_choices":[{"id":"56d49499c719925f3300001a","value":"A"},{"id":"56d49499c719925f3300001b","value":"B"},{"id":"56d49499c719925f3300001c","value":"C"},{"id":"56d49499c719925f3300001d","value":"D"}],"instructions":"select between 1 and 3","randomize":false,"value":"Multiselect Required With Limits","type":"multiselect","required":true,"min_selections":1,"max_selections":3},{"id":"56d49499c719925f3300001e","randomize":false,"multiline":false,"value":"Singleline Short Optional","type":"singleline","required":false,"freeform_hint":"Please provide a response"},{"id":"56d49499c719925f3300001f","randomize":false,"multiline":false,"value":"Singleline Short Required","type":"singleline","required":true,"freeform_hint":"Please provide a response"},{"id":"56d49499c719925f33000020","randomize":false,"multiline":true,"value":"Singleline Long Optional","type":"singleline","required":false,"freeform_hint":"Please leave detailed feedback"},{"id":"56d49499c719925f33000021","randomize":false,"multiline":true,"value":"Singleline Long Required","type":"singleline","required":true,"freeform_hint":"Please leave detailed feedback"}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"All Combos Survey","name":"Every Question Type","description":"Please help us see how each question is formatted when returning a survey response to the server.","multiple_responses":true,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"56d898e878927163ba000002","type":"TextModal","version":1,"configuration":{"actions":[{"id":"56d898e878927163ba000001","action":"dismiss","label":"Dismiss"}],"title":"Space Event","body":"Test event name with spaces.","name":"Event Space"}},{"id":"56da1563c719922509000007","type":"TextModal","version":1,"configuration":{"actions":[{"id":"56da1563c719922509000006","action":"dismiss","label":"Dismiss"}],"title":"Kevin","body":"Spacey?","name":"Spacey Note"}},{"id":"56e0b0a07892718804000006","type":"Survey","version":1,"configuration":{"questions":[{"id":"56e0b0a17892718804000007","answer_choices":[{"id":"56e0b0a17892718804000008","value":"Seitan gentrify next level mumblecore, photo booth cornhole tofu dreamcatcher brunch biodiesel pop-up meditation squid. Drinking vinegar chambray hashtag, tattooed irony banjo cold-pressed celiac sustainable asymmetrical kinfolk godard pop-up marfa viral."},{"id":"56e0b0a17892718804000009","value":"Before they sold out ennui umami, offal cold-pressed selfies bitters truffaut everyday carry tattooed. Single-origin coffee iPhone selvage, mumblecore taxidermy retro man braid before they sold out locavore waistcoat you probably haven't heard of them twee master cleanse shabby chic."}],"instructions":"select one","randomize":false,"value":"Chia waistcoat tofu, art party synth chambray gastropub migas sartorial. Mlkshk fingerstache pour-over, quinoa fap you probably haven't heard of them schlitz. Lo-fi vice photo booth wolf, salvia kogi before they sold out narwhal pinterest kale chips drinking vinegar aesthetic semiotics locavore taxidermy.","type":"multichoice","required":false},{"id":"56e0b0a1789271880400000a","answer_choices":[{"id":"56e0b0a1789271880400000b","value":"Intelligentsia 90's leggings stumptown chillwave bitters. Sriracha meh pabst, VHS master cleanse direct trade chambray mlkshk post-ironic vegan. Chambray VHS street art fanny pack, cold-pressed beard artisan."},{"id":"56e0b0a1789271880400000c","value":"Mumblecore +1 venmo fashion axe, franzen iPhone lo-fi PBR&B man braid flannel put a bird on it 8-bit drinking vinegar. Microdosing pickled deep v distillery pug yr franzen bushwick, taxidermy fap pop-up twee 8-bit."}],"instructions":"select all that apply","randomize":false,"value":"Distillery leggings gluten-free, tofu kinfolk trust fund ramps pop-up four dollar toast organic try-hard bicycle rights fashion axe viral. IPhone seitan chillwave actually chartreuse, shabby chic marfa.","type":"multiselect","required":false,"min_selections":0,"max_selections":2},{"id":"56e0b0a1789271880400000d","randomize":false,"multiline":false,"value":"Godard listicle four loko, four dollar toast gentrify lomo cred wolf fanny pack food truck iPhone. Master cleanse pork belly truffaut pickled cray. Kinfolk cray irony drinking vinegar, 3 wolf moon VHS godard chicharrones umami. Brunch forage typewriter, stumptown tofu shoreditch semiotics bitters messenger bag ugh +1 sustainable. Fashion axe occupy +1 wolf, umami small batch leggings lumbersexual DIY kickstarter swag blog.","type":"singleline","required":false,"freeform_hint":"Please provide a response"}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Long Text Surveys","name":"Thundercats twee literally to chia fashion axe butcher authentic vinyl locavore.","description":"Mumblecore sustainable fixie man bun synth. Intelligentsia organic truffaut shoreditch, readymade cornhole affogato four loko semiotics. Meggings mixtape dreamcatcher, synth ugh lumbersexual four dollar toast small batch bicycle rights. Schlitz iPhone locavore biodiesel keffiyeh, twee stumptown leggings squid paleo normcore organic thundercats green juice.","multiple_responses":true,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Tacos before they sold out paleo pinterest kale chips church-key. Next level."}},{"id":"56f1ad90c719924d8000000c","type":"Survey","version":1,"configuration":{"questions":[{"id":"56f1ad90c719924d8000000a","answer_choices":[{"id":"56f1ad90c719924d80000001","value":"Short lists"},{"id":"56f1ad90c719924d80000002","value":"Long lists"},{"id":"56f1ad90c719924d80000003","value":"Grocery"},{"id":"56f1ad90c719924d80000004","value":"To Do"},{"id":"56f1ad90c719924d80000005","value":"Reminders"},{"id":"56f1ad90c719924d80000006","value":"Other"}],"instructions":"select all that apply","randomize":false,"value":"What types of lists do you create the most?","type":"multiselect","required":false,"min_selections":0,"max_selections":6},{"id":"56f1ad90c719924d8000000b","answer_choices":[{"id":"56f1ad90c719924d80000007","value":"Very organized"},{"id":"56f1ad90c719924d80000008","value":"Somewhat organized"},{"id":"56f1ad90c719924d80000009","value":"Not organized"}],"instructions":"select one","randomize":false,"value":"How organized do you feel you are because of your lists?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"On making lists","name":"Survey","description":"We'd love to get your feedback on your list making habits.","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"56f2cf79c71992c0ca000004","type":"Survey","version":1,"configuration":{"questions":[{"id":"56f2cf79c71992c0ca000003","randomize":false,"multiline":false,"value":"What?","type":"singleline","required":false,"freeform_hint":"Please provide a response"},{"id":"56f2cffec71992c0ca000007","randomize":false,"multiline":true,"value":"Who?","type":"singleline","required":false,"freeform_hint":"Please leave detailed feedback"}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"Test placeholder text","name":"Survey","description":"Hello","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"57041af1c71992264c000004","type":"Survey","version":1,"configuration":{"questions":[{"id":"57041af1c71992264c000003","answer_choices":[{"id":"57041af1c71992264c000001","value":"Yes"},{"id":"57041af1c71992264c000002","value":"No"}],"instructions":"select one","randomize":false,"value":"Hello. Is it me you're looking for?","type":"multichoice","required":false}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"TSNH","name":"Test Survey Title","description":"Yo!","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"56b24833c21f96e6700000a8","type":"NavigateToLink","version":1,"configuration":{"target":"new","url":"http://www.apptentive.com"}},{"id":"55f885a722570e5b79000002","type":"Survey","version":1,"configuration":{"questions":[{"id":"55f885a722570e5b79000001","randomize":false,"multiline":false,"value":"Yolo","type":"singleline","required":false,"freeform_hint":"Please provide a response"}],"submit_text":"Submit","required_text":"Required","validation_error":"There are issues with your response.","title":"09.15.15","name":"Survey","description":"My intro","multiple_responses":false,"show_success_message":true,"view_period":86400.0,"required":false,"success_message":"Thank you!"}},{"id":"56b24834c21f96e6700000ab","type":"NavigateToLink","version":1,"configuration":{"target":"new","url":"tel:123"}}],"targets":{"local#app#init":[{"interaction_id":"52aa562668e275e7d00006db","criteria":{"code_point/com.apptentive#app#launch/invokes/version":{"$eq":1},"application/version":{"$eq":{"_type":"version","version":"1.3"}}}}],"local#app#event_3":[{"interaction_id":"55ce4915968896cb8b00001c","criteria":{"$and":[{"code_point/local#app#event_1/invokes/total":{"$gte":1}},{"code_point/local#app#event_2/invokes/total":{"$gte":1}},{"code_point/local#app#event_3/invokes/total":{"$gte":1}},{"$or":[{"interactions/55ce4915968896cb8b00001c/invokes/total":{"$eq":0}},{"interactions/55ce4915968896cb8b00001c/last_invoked_at/total":{"$before":-864.0}}]}],"current_time":{"$gte":{"_type":"datetime","sec":1439582065.0}}}},{"interaction_id":"54d50f69cd68dc00c30001dd","criteria":{"interactions/54d50f69cd68dc00c30001dd/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1423249242.0}}}}],"local#app#event_5":[{"interaction_id":"55f87fdb22570e6fb9000005","criteria":{"current_time":{"$gte":{"_type":"datetime","sec":1442348888.0}},"$and":[{"$or":[{"interactions/55f87fdb22570e6fb9000005/invokes/total":{"$eq":0}},{"interactions/55f87fdb22570e6fb9000005/last_invoked_at/total":{"$before":-10.0}}]}]}},{"interaction_id":"54dac421a7e9cd0578000006","criteria":{"interactions/54dac421a7e9cd0578000006/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1423623182.0}}}}],"com.apptentive#RatingDialog#rate":[{"interaction_id":"55bffcd3e1c388521a000bd2","criteria":{}}],"local#app#event_4":[{"interaction_id":"55f87fdb22570e6fb9000005","criteria":{"current_time":{"$gte":{"_type":"datetime","sec":1442348888.0}},"$and":[{"$or":[{"interactions/55f87fdb22570e6fb9000005/invokes/total":{"$eq":0}},{"interactions/55f87fdb22570e6fb9000005/last_invoked_at/total":{"$before":-10.0}}]}]}},{"interaction_id":"565e35545aaa413abc00001c","criteria":{"interactions/565e35545aaa413abc00001c/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1449014578.0}}}},{"interaction_id":"55f87f79273db6574700003b","criteria":{"interactions/55f87f79273db6574700003b/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1442348888.0}},"$and":[{"$or":[{"interactions/55f87f79273db6574700003b/invokes/total":{"$eq":0}},{"interactions/55f87f79273db6574700003b/last_invoked_at/total":{"$before":-10.0}}]}]}},{"interaction_id":"55bffcd3e1c388521a000bd0","criteria":{"code_point/com.apptentive#RatingDialog#rate/invokes/total":{"$eq":0},"code_point/com.apptentive#RatingDialog#decline/invokes/total":{"$eq":0},"interactions/55bffcd3e1c388521a000bd0/invokes/version":{"$gt":0,"$lte":1},"$and":[{"$or":[{"code_point/com.apptentive#RatingDialog#remind/invokes/total":{"$eq":0}},{"code_point/com.apptentive#RatingDialog#remind/last_invoked_at/total":{"$before":-604800.0}}]}]}},{"interaction_id":"55bffcd3e1c388521a000bce","criteria":{"$or":[{"$and":[{"code_point/com.apptentive#EnjoymentDialog#yes/invokes/total":{"$eq":true}},{"device/carrier":{"$eq":"t-mobile"}},{"device/os_name":{"$eq":"iOS"}},{"device/custom_data/device_bool":{"$eq":"9"}},{"person/custom_data/Custom Key":{"$eq":"8879"}}]},{"$and":[{"person/custom_data/Custom Person Data":{"$eq":"999"}},{"person/custom_data/Custom Key2":{"$eq":"k"}}]}],"code_point/com.apptentive#app#launch/invokes/version":{"$gte":9},"interactions/55bffcd3e1c388521a000bce/invokes/version":{"$eq":0},"time_at_install/version":{"$before":-86400},"$and":[{"$or":[{"interactions/55bffcd3e1c388521a000bce/last_invoked_at/total":{"$before":-604800}},{"interactions/55bffcd3e1c388521a000bce/invokes/total":{"$eq":0}}]}]}}],"local#app#tracked_exercise":[{"interaction_id":"55bffcd3e1c388521a000bd0","criteria":{"code_point/com.apptentive#RatingDialog#rate/invokes/total":{"$eq":0},"code_point/com.apptentive#RatingDialog#decline/invokes/total":{"$eq":0},"interactions/55bffcd3e1c388521a000bd0/invokes/version":{"$gt":0,"$lte":1},"$and":[{"$or":[{"code_point/com.apptentive#RatingDialog#remind/invokes/total":{"$eq":0}},{"code_point/com.apptentive#RatingDialog#remind/last_invoked_at/total":{"$before":-604800.0}}]}]}},{"interaction_id":"55bffcd3e1c388521a000bce","criteria":{"$or":[{"$and":[{"code_point/com.apptentive#EnjoymentDialog#yes/invokes/total":{"$eq":true}},{"device/carrier":{"$eq":"t-mobile"}},{"device/os_name":{"$eq":"iOS"}},{"device/custom_data/device_bool":{"$eq":"9"}},{"person/custom_data/Custom Key":{"$eq":"8879"}}]},{"$and":[{"person/custom_data/Custom Person Data":{"$eq":"999"}},{"person/custom_data/Custom Key2":{"$eq":"k"}}]}],"code_point/com.apptentive#app#launch/invokes/version":{"$gte":9},"interactions/55bffcd3e1c388521a000bce/invokes/version":{"$eq":0},"time_at_install/version":{"$before":-86400},"$and":[{"$or":[{"interactions/55bffcd3e1c388521a000bce/last_invoked_at/total":{"$before":-604800}},{"interactions/55bffcd3e1c388521a000bce/invokes/total":{"$eq":0}}]}]}}],"com.apptentive#EnjoymentDialog#yes":[{"interaction_id":"55bffcd3e1c388521a000bd0","criteria":{}}],"com.apptentive#EnjoymentDialog#no":[{"interaction_id":"55bffcd3e1c388521a000bd4","criteria":{}}],"com.apptentive#app#show_message_center":[{"interaction_id":"55c2826335878be4ab000dac","criteria":{}}],"local#app#Event_1":[{"interaction_id":"56e0b0a07892718804000006","criteria":{"current_time":{"$gte":{"_type":"datetime","sec":1456524496.0}}}},{"interaction_id":"55fb3bb9273db67b7200002a","criteria":{"interactions/55fb3bb9273db67b7200002a/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1442528176.0}}}}],"local#app#event_2":[{"interaction_id":"5668cbee5aaa41283f000005","criteria":{"$and":[{"code_point/local#app#event_1/invokes/version":{"$gt":5}}],"interactions/5668cbee5aaa41283f000005/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1449708503.0}}}},{"interaction_id":"5627db62753934f808000001","criteria":{"$and":[{"device/locale_country_code":{"$eq":"US"}},{"device/locale_language_code":{"$eq":"en"}},{"$or":[{"interactions/5627db62753934f808000001/invokes/total":{"$eq":0}},{"interactions/5627db62753934f808000001/last_invoked_at/total":{"$before":-10.0}}]}],"interactions/5627db62753934f808000001/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1442348888.0}}}}],"local#app#showSurvey":[{"interaction_id":"56bb9149701b764ba3000007","criteria":{"current_time":{"$gte":{"_type":"datetime","sec":1455041320.0}}}}],"local#app#event_1":[{"interaction_id":"56d49498c719925f33000007","criteria":{"current_time":{"$gte":{"_type":"datetime","sec":1456520042.0}}}}],"local#app#view-jet-details":[{"interaction_id":"56d898e878927163ba000002","criteria":{"interactions/56d898e878927163ba000002/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1457035479.0}}}},{"interaction_id":"56da1563c719922509000007","criteria":{"$and":[{"code_point/local#app#event space/last_invoked_at/total":{"$before":-604800}}],"interactions/56da1563c719922509000007/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1457132875.0}}}}],"local#app#Event 1":[{"interaction_id":"56f1ad90c719924d8000000c","criteria":{"interactions/56f1ad90c719924d8000000c/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1458678881.0}}}}],"local#app#freeform_survey":[{"interaction_id":"56f2cf79c71992c0ca000004","criteria":{"interactions/56f2cf79c71992c0ca000004/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1458753379.0}}}}],"local#app#coffee":[{"interaction_id":"57041af1c71992264c000004","criteria":{"interactions/57041af1c71992264c000004/invokes/total":{"$eq":0},"current_time":{"$gte":{"_type":"datetime","sec":1459886709.0}}}}]}}
\ No newline at end of file
diff --git a/Demo/iOSDemoUITests/Mocks/Messages b/Demo/iOSDemoUITests/Mocks/Messages
deleted file mode 100644
index 61544c1d4..000000000
--- a/Demo/iOSDemoUITests/Mocks/Messages
+++ /dev/null
@@ -1,23 +0,0 @@
-POST
-/messages
-201
-Server: nginx
-Date: Fri, 29 Apr 2016 20:07:02 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "913caecc292781e4eb5879d282beb6d2"
-Cache-Control: max-age=0, private, must-revalidate
-X-Content-Type-Options: nosniff
-X-Request-Id: 8f810928cdf3364c30a42db9b0c1cb3b
-X-Runtime: 2.200330
-X-Rack-Cache: invalidate, pass
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"id":"5723bee4faf7b989c8000289","created_at":1461960420.33956}
diff --git a/Demo/iOSDemoUITests/Mocks/People b/Demo/iOSDemoUITests/Mocks/People
deleted file mode 100644
index 2eac1b424..000000000
--- a/Demo/iOSDemoUITests/Mocks/People
+++ /dev/null
@@ -1,23 +0,0 @@
-PUT
-/people
-201
-Server: nginx
-Date: Fri, 22 Jan 2016 23:26:42 GMT
-Content-Type: application/json; charset=utf-8
-Transfer-Encoding: chunked
-Connection: keep-alive
-Strict-Transport-Security: max-age=31536000
-Vary: Authorization,Origin,Accept-Encoding
-Access-Control-Allow-Origin: *
-Access-Control-Request-Method: GET,PUT,POST,OPTIONS
-X-UA-Compatible: IE=Edge,chrome=1
-ETag: "db9274de00756e3cbbcf5063425ce960"
-Cache-Control: max-age=0, private, must-revalidate
-X-Content-Type-Options: nosniff
-X-Request-Id: 595fe9f2acd89fc9a093e60fd2eccc93
-X-Runtime: 0.062018
-X-Rack-Cache: invalidate, pass
-Content-Encoding: gzip
-X-Frame-Options: SAMEORIGIN
-
-{"id":"56a2bab28c2d4404d50000e9","name":null,"facebook_id":null,"email":null,"phone_number":null,"address":null,"birthday":null,"custom_data":{}}
diff --git a/Demo/iOSDemoUITests/iOSDemoUITests-Bridging-Header.h b/Demo/iOSDemoUITests/iOSDemoUITests-Bridging-Header.h
index 11e97120d..1841291d4 100644
--- a/Demo/iOSDemoUITests/iOSDemoUITests-Bridging-Header.h
+++ b/Demo/iOSDemoUITests/iOSDemoUITests-Bridging-Header.h
@@ -9,7 +9,6 @@
 #ifndef iOSDemoUITests_Bridging_Header_h
 #define iOSDemoUITests_Bridging_Header_h
 
-#import <Mocktail/Mocktail.h>
 #import "Apptentive_Private.h"
 
 #endif /* iOSDemoUITests_Bridging_Header_h */
diff --git a/Demo/iOSDemoUITests/iOSDemoUITests.m b/Demo/iOSDemoUITests/iOSDemoUITests.m
deleted file mode 100644
index 4cfd38c99..000000000
--- a/Demo/iOSDemoUITests/iOSDemoUITests.m
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-//  iOSDemoUITests.m
-//  iOSDemoUITests
-//
-//  Created by Frank Schmitt on 5/4/16.
-//  Copyright © 2016 Apptentive, Inc. All rights reserved.
-//
-
-#import <XCTest/XCTest.h>
-
-@interface iOSDemoUITests : XCTestCase
-
-@end
-
-@implementation iOSDemoUITests
-
-- (void)setUp {
-    [super setUp];
-    
-    // Put setup code here. This method is called before the invocation of each test method in the class.
-    
-    // In UI tests it is usually best to stop immediately when a failure occurs.
-    self.continueAfterFailure = NO;
-    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
-    [[[XCUIApplication alloc] init] launch];
-    
-    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
-}
-
-- (void)tearDown {
-    // Put teardown code here. This method is called after the invocation of each test method in the class.
-    [super tearDown];
-}
-
-- (void)testExample {
-    // Use recording to get started writing UI tests.
-    // Use XCTAssert and related functions to verify your tests produce the correct results.
-}
-
-@end
diff --git a/apptentive-ios.podspec b/apptentive-ios.podspec
index 6346785e7..74e561bbf 100644
--- a/apptentive-ios.podspec
+++ b/apptentive-ios.podspec
@@ -1,7 +1,7 @@
 Pod::Spec.new do |s|
   s.name     = 'apptentive-ios'
   s.module_name = 'Apptentive'
-  s.version  = '3.1.0'
+  s.version  = '3.1.1'
   s.license  = 'BSD'
   s.summary  = 'Apptentive Customer Communications SDK.'
   s.homepage = 'https://www.apptentive.com/'