diff --git a/GAI.h b/GAI.h
new file mode 100644
index 0000000..fa394a5
--- /dev/null
+++ b/GAI.h
@@ -0,0 +1,187 @@
+/*!
+ @header    GAI.h
+ @abstract  Google Analytics iOS SDK Header
+ @version   3.0
+ @copyright Copyright 2013 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+#import "GAILogger.h"
+#import "GAITracker.h"
+#import "GAITrackedViewController.h"
+
+
+typedef NS_ENUM(NSUInteger, GAIDispatchResult) {
+  kGAIDispatchNoData,
+  kGAIDispatchGood,
+  kGAIDispatchError
+};
+
+/*! Google Analytics product string.  */
+extern NSString *const kGAIProduct;
+
+/*! Google Analytics version string.  */
+extern NSString *const kGAIVersion;
+
+/*!
+ NSError objects returned by the Google Analytics SDK may have this error domain
+ to indicate that the error originated in the Google Analytics SDK.
+ */
+extern NSString *const kGAIErrorDomain;
+
+/*! Google Analytics error codes.  */
+typedef enum {
+  // This error code indicates that there was no error. Never used.
+  kGAINoError = 0,
+
+  // This error code indicates that there was a database-related error.
+  kGAIDatabaseError,
+
+  // This error code indicates that there was a network-related error.
+  kGAINetworkError,
+} GAIErrorCode;
+
+/*!
+ Google Analytics iOS top-level class. Provides facilities to create trackers
+ and set behaviorial flags.
+ */
+@interface GAI : NSObject
+
+/*!
+ For convenience, this class exposes a default tracker instance.
+ This is initialized to `nil` and will be set to the first tracker that is
+ instantiated in trackerWithTrackingId:. It may be overridden as desired.
+
+ The GAITrackedViewController class will, by default, use this tracker instance.
+ */
+@property(nonatomic, assign) id<GAITracker> defaultTracker;
+
+/*!
+ The GAILogger to use.
+ */
+@property(nonatomic, retain) id<GAILogger> logger;
+
+/*!
+ When this is true, no tracking information will be gathered; tracking calls
+ will effectively become no-ops. When set to true, all tracking information that
+ has not yet been submitted. The value of this flag will be persisted
+ automatically by the SDK.  Developers can optionally use this flag to implement
+ an opt-out setting in the app to allows users to opt out of Google Analytics
+ tracking.
+
+ This is set to `NO` the first time the Google Analytics SDK is used on a
+ device, and is persisted thereafter.
+ */
+@property(nonatomic, assign) BOOL optOut;
+
+/*!
+ If this value is positive, tracking information will be automatically
+ dispatched every dispatchInterval seconds. Otherwise, tracking information must
+ be sent manually by calling dispatch.
+
+ By default, this is set to `120`, which indicates tracking information should
+ be dispatched automatically every 120 seconds.
+ */
+@property(nonatomic, assign) NSTimeInterval dispatchInterval;
+
+/*!
+ When set to true, the SDK will record the currently registered uncaught
+ exception handler, and then register an uncaught exception handler which tracks
+ the exceptions that occurred using defaultTracker. If defaultTracker is not
+ `nil`, this function will track the exception on the tracker and attempt to
+ dispatch any outstanding tracking information for 5 seconds. It will then call
+ the previously registered exception handler, if any. When set back to false,
+ the previously registered uncaught exception handler will be restored.
+ */
+@property(nonatomic, assign) BOOL trackUncaughtExceptions;
+
+/*!
+ When this is 'YES', no tracking information will be sent. Defaults to 'NO'.
+ */
+@property(nonatomic, assign) BOOL dryRun;
+
+/*! Get the shared instance of the Google Analytics for iOS class. */
++ (GAI *)sharedInstance;
+
+/*!
+ Creates or retrieves a GAITracker implementation with the specified name and
+ tracking ID. If the tracker for the specified name does not already exist, then
+ it will be created and returned; otherwise, the existing tracker will be
+ returned. If the existing tracker for the respective name has a different
+ tracking ID, that tracking ID is not changed by this method. If defaultTracker
+ is not set, it will be set to the tracker instance returned here.
+
+ @param name The name of this tracker. Must not be `nil` or empty.
+
+ @param trackingID The tracking ID to use for this tracker.  It should be of
+ the form `UA-xxxxx-y`.
+
+ @return A GAITracker associated with the specified name. The tracker
+ can be used to send tracking data to Google Analytics. The first time this
+ method is called with a particular name, the tracker for that name will be
+ returned, and subsequent calls with the same name will return the same
+ instance. It is not necessary to retain the tracker because the tracker will be
+ retained internally by the library.
+
+ If an error occurs or the name is not valid, this method will return
+ `nil`.
+ */
+- (id<GAITracker>)trackerWithName:(NSString *)name
+                       trackingId:(NSString *)trackingId;
+
+/*!
+ Creates or retrieves a GAITracker implementation with name equal to
+ the specified tracking ID. If the tracker for the respective name does not
+ already exist, it is created, has it's tracking ID set to |trackingId|,
+ and is returned; otherwise, the existing tracker is returned. If the existing
+ tracker for the respective name has a different tracking ID, that tracking ID
+ is not changed by this method. If defaultTracker is not set, it is set to the
+ tracker instance returned here.
+
+ @param trackingID The tracking ID to use for this tracker.  It should be of
+ the form `UA-xxxxx-y`. The name of the tracker will be the same as trackingID.
+
+ @return A GAITracker associated with the specified trackingID. The tracker
+ can be used to send tracking data to Google Analytics. The first time this
+ method is called with a particular trackingID, the tracker for the respective
+ name will be returned, and subsequent calls with the same trackingID
+ will return the same instance. It is not necessary to retain the tracker
+ because the tracker will be retained internally by the library.
+
+ If an error occurs or the trackingId is not valid, this method will return
+ `nil`.
+ */
+- (id<GAITracker>)trackerWithTrackingId:(NSString *)trackingId;
+
+/*!
+ Remove a tracker from the trackers dictionary. If it is the default tracker,
+ clears the default tracker as well.
+
+ @param name The name of the tracker.
+ */
+- (void)removeTrackerByName:(NSString *)name;
+
+/*!
+ Dispatches any pending tracking information.
+
+ Note that this does not have any effect on dispatchInterval, and can be used in
+ conjunction with periodic dispatch. */
+- (void)dispatch;
+
+/*!
+ Dispatches the next tracking beacon in the queue, calling completionHandler when
+ the tracking beacon has either been sent (returning kGAIDispatchGood) or an error has resulted
+ (returning kGAIDispatchError).  If there is no network connection or there is no data to send,
+ kGAIDispatchNoData is returned.
+
+ Calling this method with a nil completionHandler is the same as calling the dispatch
+ above.
+
+ This method can be used for background data fetching in iOS 7.0 or later.
+
+ It would be wise to call this when application is exiting to initiate the
+ submission of any unsubmitted tracking information. Note that this does not
+ have any effect on dispatchInterval, and can be used in conjunction with
+ periodic dispatch. */
+- (void)dispatchWithCompletionHandler:(void (^)(GAIDispatchResult))completionHandler;
+@end
diff --git a/GAIDictionaryBuilder.h b/GAIDictionaryBuilder.h
new file mode 100644
index 0000000..7cf55e5
--- /dev/null
+++ b/GAIDictionaryBuilder.h
@@ -0,0 +1,214 @@
+/*!
+ @header    GAIDictionaryBuilder.h
+ @abstract  Google Analytics iOS SDK Hit Format Header
+ @copyright Copyright 2013 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+#import "GAIEcommerceProduct.h"
+#import "GAIEcommerceProductAction.h"
+#import "GAIEcommercePromotion.h"
+
+/*!
+ * Helper class to build a dictionary of hit parameters and values.
+ * <br>
+ * Examples:
+ * <code>
+ * id<GAITracker> t = // get a tracker.
+ * [t send:[[[GAIDictionaryBuilder createEventWithCategory:@"EventCategory"
+ *                                                  action:@"EventAction"
+ *                                                   label:nil
+ *                                                   value:nil]
+ *     set:@"dimension1" forKey:[GAIFields customDimensionForIndex:1]] build]];
+ * </code>
+ * This will send an event hit type with the specified parameters
+ * and a custom dimension parameter.
+ * <br>
+ * If you want to send a parameter with all hits, set it on GAITracker directly.
+ * <code>
+ * [t set:kGAIScreenName value:@"Home"];
+ * [t send:[[GAIDictionaryBuilder createSocialWithNetwork:@"Google+"
+ *                                                 action:@"PlusOne"
+ *                                                 target:@"SOME_URL"] build]];
+ * [t send:[[GAIDictionaryBuilder createSocialWithNetwork:@"Google+"
+ *                                                 action:@"Share"
+ *                                                 target:@"SOME_POST"] build]];
+ * [t send:[[GAIDictionaryBuilder createSocialWithNetwork:@"Google+"
+ *                                                 action:@"HangOut"
+ *                                                 target:@"SOME_CIRCLE"]
+ *     build]];
+ * </code>
+ * You can override a value set on the tracker by adding it to the dictionary.
+ * <code>
+ * [t set:kGAIScreenName value:@"Home"];
+ * [t send:...];
+ * [t send[[[GAIDictionaryBuilder createEventWithCategory:@"click"
+ *                                                 action:@"popup"
+ *                                                  label:nil
+ *                                                  value:nil]
+ *     set:@"popup title" forKey:kGAIScreenName] build]];
+ * </code>
+ * The values set via [GAIDictionaryBuilder set] or
+ * [GAIDictionaryBuilder setAll] will override any existing values in the
+ * GAIDictionaryBuilder object (i.e. initialized by
+ * [GAIDictionaryBuilder createXYZ]). e.g.
+ * <code>
+ * GAIDictionaryBuilder *m =
+ *     GAIDictionaryBuilder createTimingWithCategory:@"category"
+ *                                          interval:@0
+ *                                              name:@"name"
+ *                                             label:nil];
+ * [t send:[m.set:@"10" forKey:kGAITimingVar] build];
+ * [t send:[m.set:@"20" forKey:kGAITimingVar] build];
+ * </code>
+ */
+@interface GAIDictionaryBuilder : NSObject
+
+- (GAIDictionaryBuilder *)set:(NSString *)value
+                       forKey:(NSString *)key;
+
+/*!
+ * Copies all the name-value pairs from params into this object, ignoring any
+ * keys that are not NSString and any values that are neither NSString or
+ * NSNull.
+ */
+- (GAIDictionaryBuilder *)setAll:(NSDictionary *)params;
+
+/*!
+ * Returns the value for the input parameter paramName, or nil if paramName
+ * is not present.
+ */
+- (NSString *)get:(NSString *)paramName;
+
+/*!
+ * Return an NSMutableDictionary object with all the parameters set in this
+ */
+- (NSMutableDictionary *)build;
+
+/*!
+ * Parses and translates utm campaign parameters to analytics campaign param
+ * and returns them as a map.
+ *
+ * @param params url containing utm campaign parameters.
+ *
+ * Valid campaign parameters are:
+ * <ul>
+ * <li>utm_id</li>
+ * <li>utm_campaign</li>
+ * <li>utm_content</li>
+ * <li>utm_medium</li>
+ * <li>utm_source</li>
+ * <li>utm_term</li>
+ * <li>dclid</li>
+ * <li>gclid</li>
+ * <li>gmob_t</li>
+ * </ul>
+ * <p>
+ * Example:
+ * http://my.site.com/index.html?utm_campaign=wow&utm_source=source
+ * utm_campaign=wow&utm_source=source.
+ * <p>
+ * For more information on auto-tagging, see
+ * http://support.google.com/googleanalytics/bin/answer.py?hl=en&answer=55590
+ * <p>
+ * For more information on manual tagging, see
+ * http://support.google.com/googleanalytics/bin/answer.py?hl=en&answer=55518
+ */
+- (GAIDictionaryBuilder *)setCampaignParametersFromUrl:(NSString *)urlString;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to an appview
+ hit.
+
+ Note that using this method will not set the screen name for followon hits.  To
+ do that you need to call set:kGAIDescription value:<screenName> on the
+ GAITracker instance.
+
+ This method is deprecated.  Use createScreenView instead.
+ */
++ (GAIDictionaryBuilder *)createAppView;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to a screenview
+ hit.
+
+ Note that using this method will not set the screen name for followon hits.  To
+ do that you need to call set:kGAIDescription value:<screenName> on the
+ GAITracker instance.
+ */
++ (GAIDictionaryBuilder *)createScreenView;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to an event hit.
+ */
++ (GAIDictionaryBuilder *)createEventWithCategory:(NSString *)category
+                                           action:(NSString *)action
+                                            label:(NSString *)label
+                                            value:(NSNumber *)value;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to an exception
+ hit.
+ */
++ (GAIDictionaryBuilder *)createExceptionWithDescription:(NSString *)description
+                                               withFatal:(NSNumber *)fatal;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to an item hit.
+ */
++ (GAIDictionaryBuilder *)createItemWithTransactionId:(NSString *)transactionId
+                                                 name:(NSString *)name
+                                                  sku:(NSString *)sku
+                                             category:(NSString *)category
+                                                price:(NSNumber *)price
+                                             quantity:(NSNumber *)quantity
+                                         currencyCode:(NSString *)currencyCode;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to a social hit.
+ */
++ (GAIDictionaryBuilder *)createSocialWithNetwork:(NSString *)network
+                                           action:(NSString *)action
+                                           target:(NSString *)target;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to a timing hit.
+ */
++ (GAIDictionaryBuilder *)createTimingWithCategory:(NSString *)category
+                                          interval:(NSNumber *)intervalMillis
+                                              name:(NSString *)name
+                                             label:(NSString *)label;
+
+/*!
+ Returns a GAIDictionaryBuilder object with parameters specific to a transaction
+ hit.
+ */
++ (GAIDictionaryBuilder *)createTransactionWithId:(NSString *)transactionId
+                                      affiliation:(NSString *)affiliation
+                                          revenue:(NSNumber *)revenue
+                                              tax:(NSNumber *)tax
+                                         shipping:(NSNumber *)shipping
+                                     currencyCode:(NSString *)currencyCode;
+
+/*!
+ Set the product action field for this hit.
+ */
+- (GAIDictionaryBuilder *)setProductAction:(GAIEcommerceProductAction *)productAction;
+
+/*!
+ Adds a product to this hit.
+ */
+- (GAIDictionaryBuilder *)addProduct:(GAIEcommerceProduct *)product;
+
+/*!
+ Add a product impression to this hit.
+ */
+- (GAIDictionaryBuilder *)addProductImpression:(GAIEcommerceProduct *)product
+                                impressionList:(NSString *)name;
+
+/*!
+ Add a promotion to this hit.
+ */
+- (GAIDictionaryBuilder *)addPromotion:(GAIEcommercePromotion *)promotion;
+@end
diff --git a/GAIEcommerceFields.h b/GAIEcommerceFields.h
new file mode 100644
index 0000000..0db87b4
--- /dev/null
+++ b/GAIEcommerceFields.h
@@ -0,0 +1,123 @@
+/*!
+ @header    GAIEcommerceFields.h
+ @abstract  Google Analytics iOS SDK Ecommerce Hit Format Header
+ @copyright Copyright 2014 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+/*!
+ This class provides several fields and methods useful as wire format parameters for
+ Enhanced Ecommerce. See the online developer guides for Enhanced Ecommerce for details
+ on how to use the Enhanced Ecommerce features.
+ */
+
+// Enhanced Ecommerce Product fields
+extern NSString *const kGAIProductId;
+extern NSString *const kGAIProductName;
+extern NSString *const kGAIProductBrand;
+extern NSString *const kGAIProductCategory;
+extern NSString *const kGAIProductVariant;
+extern NSString *const kGAIProductPrice;
+extern NSString *const kGAIProductQuantity;
+extern NSString *const kGAIProductCouponCode;
+extern NSString *const kGAIProductPosition;
+
+extern NSString *const kGAIProductAction;
+
+// product action values
+extern NSString *const kGAIPADetail;
+extern NSString *const kGAIPAClick;
+extern NSString *const kGAIPAAdd;
+extern NSString *const kGAIPARemove;
+extern NSString *const kGAIPACheckout;
+extern NSString *const kGAIPACheckoutOption;
+extern NSString *const kGAIPAPurchase;
+extern NSString *const kGAIPARefund;
+
+// product action fields
+// used for 'purchase' and 'refund' actions
+extern NSString *const kGAIPATransactionId;
+extern NSString *const kGAIPAAffiliation;
+extern NSString *const kGAIPARevenue;
+extern NSString *const kGAIPATax;
+extern NSString *const kGAIPAShipping;
+extern NSString *const kGAIPACouponCode;
+// used for 'checkout' action
+extern NSString *const kGAICheckoutStep;
+extern NSString *const kGAICheckoutOption;
+// used for 'detail' and 'click' actions
+extern NSString *const kGAIProductActionList;
+extern NSString *const kGAIProductListSource;
+
+// Enhanced Ecommerce Impressions fields
+extern NSString *const kGAIImpressionName;
+extern NSString *const kGAIImpressionProduct;
+extern NSString *const kGAIImpressionProductId;
+extern NSString *const kGAIImpressionProductName;
+extern NSString *const kGAIImpressionProductBrand;
+extern NSString *const kGAIImpressionProductCategory;
+extern NSString *const kGAIImpressionProductVariant;
+extern NSString *const kGAIImpressionProductPosition;
+extern NSString *const kGAIImpressionProductPrice;
+
+// Enhanced Ecommerce Promotions fields
+extern NSString *const kGAIPromotionId;
+extern NSString *const kGAIPromotionName;
+extern NSString *const kGAIPromotionCreative;
+extern NSString *const kGAIPromotionPosition;
+
+// Promotion actions
+extern NSString *const kGAIPromotionAction;
+extern NSString *const kGAIPromotionView;
+extern NSString *const kGAIPromotionClick;
+
+@interface GAIEcommerceFields : NSObject
+
+/*!
+ Generates an enhanced ecommerce product field.  Note that field names generated by
+ customDimensionForIndex and customMetricForIndex can be used as suffixes.
+
+ @param index the index of the product
+ @param suffix the product field suffix (such as kGAIProductPrice).
+
+ @return an NSString representing the product field parameter
+ */
++ (NSString *)productFieldForIndex:(NSUInteger)index suffix:(NSString *)suffix;
+
+/*!
+ Genrates an enhanced ecommerce impression list field name with an index.  The return value of
+ this method should also be used as input to the productImpressionForList method below.
+
+ @param index the index of the impression list
+
+ @return an NSString representing the impression list parameter
+ */
++ (NSString *)impressionListForIndex:(NSUInteger)index;
+
+/*!
+ Generates an enhanced ecommerce product impression field with the impression list, product index
+ and product suffix as parameters.  The output of the method impressionListForIndex above should be
+ used as the input list for this method.  The output of customDimensionForIndex and
+ customMetricForIndex can be used as suffixes.
+
+ @param list the impression list for this product impression
+ @param index the index of this product in the impression list
+ @param suffix the product impression suffix for this field
+
+ @return an NSString representing this product impression field parameter
+ */
++ (NSString *)productImpressionForList:(NSString *)list
+                                 index:(NSUInteger)index
+                                suffix:(NSString *)Suffix;
+
+/*!
+ Generates an enhanced ecommerce promotion field with an index and suffix.
+
+ @param index the index of the promotion
+ @param suffix the promotion suffix (such as kGAIPromotionId)
+
+ @return an NSString representing this promotion field paramter
+ */
++ (NSString *)promotionForIndex:(NSUInteger)index suffix:(NSString *)suffix;
+@end
diff --git a/GAIEcommerceProduct.h b/GAIEcommerceProduct.h
new file mode 100644
index 0000000..029f763
--- /dev/null
+++ b/GAIEcommerceProduct.h
@@ -0,0 +1,102 @@
+/*!
+ @header    GAIEcommerceProduct.h
+ @abstract  Google Analytics iOS SDK Hit Format Header
+ @copyright Copyright 2014 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+/*!
+ * Class to construct product related information for a Google Analytics beacon. Use this class to
+ * report information about products sold by merchants or impressions of products seen by users.
+ * Instances of this class can be associated with both Product Actions and Product
+ * Impression Lists.
+ * <br>
+ * Typical usage:
+ * <code>
+ * [tracker set:kGAIScreenName value:@"MyScreen"];
+ * GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createScreenView];
+ * GAIEcommerceProduct *product = [[GAIEcommerceProduct alloc] init];
+ * [product setId:@""PID-1234""];
+ * [product setName:@"Space Monkeys!"];
+ * [product setPrice:@100];
+ * [product setQuantity:@2];
+ * [builder addProductImpression:product impressionList:@"listName"];
+ * [tracker send:[builder build]];
+ * </code>
+ */
+@interface GAIEcommerceProduct : NSObject
+
+/*!
+ Sets the id that is used to identify a product in GA reports.
+ */
+- (GAIEcommerceProduct *)setId:(NSString *)productId;
+
+/*!
+ Sets the name that is used to indentify the product in GA reports.
+ */
+- (GAIEcommerceProduct *)setName:(NSString *)productName;
+
+/*!
+ Sets the brand associated with the product in GA reports.
+ */
+- (GAIEcommerceProduct *)setBrand:(NSString *)productBrand;
+
+/*!
+ Sets the category associated with the product in GA reports.
+ */
+- (GAIEcommerceProduct *)setCategory:(NSString *)productCategory;
+
+/*!
+ Sets the variant of the product.
+ */
+- (GAIEcommerceProduct *)setVariant:(NSString *)productVariant;
+
+/*!
+ Sets the price of the product.
+ */
+- (GAIEcommerceProduct *)setPrice:(NSNumber *)productPrice;
+
+/*!
+ Sets the quantity of the product.  This field is usually not used with product impressions.
+ */
+- (GAIEcommerceProduct *)setQuantity:(NSNumber *)productQuantity;
+
+/*!
+ Sets the coupon code associated with the product.  This field is usually not used with product
+ impressions.
+ */
+- (GAIEcommerceProduct *)setCouponCode:(NSString *)productCouponCode;
+
+/*!
+ Sets the position of the product on the screen/product impression list, etc.
+ */
+- (GAIEcommerceProduct *)setPosition:(NSNumber *)productPosition;
+
+/*!
+ Sets the custom dimension associated with this product.
+ */
+- (GAIEcommerceProduct *)setCustomDimension:(NSUInteger)index value:(NSString *)value;
+
+/*!
+ Sets the custom metric associated with this product.
+ */
+- (GAIEcommerceProduct *)setCustomMetric:(NSUInteger)index value:(NSNumber *)value;
+
+/*!
+ Builds an NSDictionary of fields stored in this instance suitable for a product action.  The
+ index parameter is the index of this product in the product action list.
+ <br>
+ Normally, users will have no need to call this method.
+ */
+- (NSDictionary *)buildWithIndex:(NSUInteger)index;
+
+/*!
+ Builds an NSDictionary of fields stored in this instance suitable for an impression list.  The
+ lIndex parameter is the index of the product impression list while the index parameter is the
+ index of this product in that impression list.
+ <br>
+ Normally, users will have no need to call this method.
+ */
+- (NSDictionary *)buildWithListIndex:(NSUInteger)lIndex index:(NSUInteger)index;
+@end
diff --git a/GAIEcommerceProductAction.h b/GAIEcommerceProductAction.h
new file mode 100644
index 0000000..e3da1c1
--- /dev/null
+++ b/GAIEcommerceProductAction.h
@@ -0,0 +1,107 @@
+/*!
+ @header    GAIProductAction.h
+ @abstract  Google Analytics iOS SDK Hit Format Header
+ @copyright Copyright 2014 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+/*!
+ * Class to construct transaction/checkout or other product interaction related information for a
+ * Google Analytics hit. Use this class to report information about products sold, viewed or
+ * refunded. This class is intended to be used with GAIDictionaryBuilder.
+ * <br>
+ * Typical usage:
+ * <code>
+ * [tracker set:kGAIScreenName value:@"MyScreen"];
+ * GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createScreenView];
+ * GAIEcommerceProductAction *action = [[GAIEcommerceProductAction alloc] init];
+ * [action setAction:kGAIPAPurchase];
+ * [action setTransactionId:@"TT-1234"];
+ * [action setRevenue:@3.14];
+ * [action setCouponCode:@"EXTRA100"];
+ * [builder setProductAction:action];
+ * GAIEcommerceProduct *product = [[GAIEcommerceProduct alloc] init];
+ * [product setId:@""PID-1234""];
+ * [product setName:@"Space Monkeys!"];
+ * [product setPrice:@100];
+ * [product setQuantity:@2];
+ * [builder addProduct:product];
+ * [tracker send:[builder build]];
+ * </code>
+ */
+@interface GAIEcommerceProductAction : NSObject
+
+/*!
+ Sets the product action field for this product action. Valid values can be found in
+ GAIEcommerceFields.h under "product action values".
+ */
+- (GAIEcommerceProductAction *)setAction:(NSString *)productAction;
+
+/*!
+ The unique id associated with the transaction.  This value is used for kGAIPAPurchase and
+ kGAIPARefund product actions.
+ */
+- (GAIEcommerceProductAction *)setTransactionId:(NSString *)transactionId;
+
+/*!
+ Sets the transaction's affiliation value.  This value is used for kGAIPAPurchase and
+ kGAIPARefund product actions.
+ */
+- (GAIEcommerceProductAction *)setAffiliation:(NSString *)affiliation;
+
+/*!
+ Sets the transaction's total revenue.  This value is used for kGAIPAPurchase and kGAIPARefund
+ product actions.
+ */
+- (GAIEcommerceProductAction *)setRevenue:(NSNumber *)revenue;
+
+/*!
+ Sets the transaction's total tax.  This value is used for kGAIPAPurchase and kGAIPARefund
+ product actions.
+ */
+- (GAIEcommerceProductAction *)setTax:(NSNumber *)tax;
+
+/*!
+ Sets the transaction's total shipping costs.  This value is used for kGAIPAPurchase and
+ kGAIPARefund product actions.
+ */
+- (GAIEcommerceProductAction *)setShipping:(NSNumber *)shipping;
+
+/*!
+ Sets the coupon code used in this transaction.  This value is used for kGAIPAPurchase and
+ kGAIPARefund product actions.
+ */
+- (GAIEcommerceProductAction *)setCouponCode:(NSString *)couponCode;
+
+/*!
+ Sets the checkout process's progress.  This value is used for kGAICheckout and
+ kGAICheckoutOptions product actions.
+ */
+- (GAIEcommerceProductAction *)setCheckoutStep:(NSNumber *)checkoutStep;
+
+/*!
+ Sets the option associated with the checkout.  This value is used for kGAICheckout and
+ kGAICheckoutOptions product actions.
+ */
+- (GAIEcommerceProductAction *)setCheckoutOption:(NSString *)checkoutOption;
+
+/*!
+ Sets the list name associated with the products in Google Analytics beacons.  This value is
+ used in kGAIPADetail and kGAIPAClick product actions.
+ */
+- (GAIEcommerceProductAction *)setProductActionList:(NSString *)productActionList;
+
+/*!
+ Sets the list source name associated with the products in Google Analytics beacons.  This value
+ is used in kGAIPADetail and kGAIPAClick product actions.
+ */
+- (GAIEcommerceProductAction *)setProductListSource:(NSString *)productListSource;
+
+/*!
+ Builds an NSDictionary of fields stored in this instance representing this product action.
+ <br>
+ Normally, users will have no need to call this method.
+ */
+- (NSDictionary *)build;
+@end
diff --git a/GAIEcommercePromotion.h b/GAIEcommercePromotion.h
new file mode 100644
index 0000000..c7bf25a
--- /dev/null
+++ b/GAIEcommercePromotion.h
@@ -0,0 +1,54 @@
+/*!
+ @header    GAIEcommercePromotion.h
+ @abstract  Google Analytics iOS SDK Hit Format Header
+ @copyright Copyright 2014 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+/*!
+ * Class to construct promotion related fields for Google Analytics hits. The fields from this class
+ * can be used to represent internal promotions that run within an app, such as banners, banner ads
+ * etc.
+ *
+ * Typical usage:
+ * <code>
+ * GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createScreenView];
+ * GAIEcommercePromotion *promotion = [[GAIEcommercePromotion alloc] init];
+ * [promotion setId:@"PROMO-ID1234"];
+ * [promotion setName:@"Home screen banner"];
+ * [builder set:kGAIPromotionClick forKey:kGAIPromotionAction];
+ * [builder addPromotion:promotion];
+ * [tracker send:builder.build]];
+ * </code>
+ */
+@interface GAIEcommercePromotion : NSObject
+
+/*!
+ Sets the id that is used to identify a promotion in GA reports.
+ */
+- (GAIEcommercePromotion *)setId:(NSString *)pid;
+
+/*!
+ Sets the name that is used to identify a promotion in GA reports.
+ */
+- (GAIEcommercePromotion *)setName:(NSString *)name;
+
+/*!
+ Sets the name of the creative associated with the promotion.
+ */
+- (GAIEcommercePromotion *)setCreative:(NSString *)creative;
+
+/*!
+ Sets the position of the promotion.
+ */
+- (GAIEcommercePromotion *)setPosition:(NSString *)position;
+
+/*!
+ Builds an NSDictionary of fields stored in this instance.  The index parameter is the
+ index of this promotion in that promotion list.
+ <br>
+ Normally, users will have no need to call this method.
+ */
+- (NSDictionary *)buildWithIndex:(NSUInteger)index;
+@end
diff --git a/GAIFields.h b/GAIFields.h
new file mode 100644
index 0000000..adbd1fd
--- /dev/null
+++ b/GAIFields.h
@@ -0,0 +1,129 @@
+/*!
+ @header    GAIFields.h
+ @abstract  Google Analytics iOS SDK Hit Format Header
+ @copyright Copyright 2013 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+/*!
+ These fields can be used for the wire format parameter names required by
+ the |GAITracker| get, set and send methods as well as the set methods in the
+ |GAIDictionaryBuilder| class.
+ */
+extern NSString *const kGAIUseSecure;
+
+extern NSString *const kGAIHitType;
+extern NSString *const kGAITrackingId;
+extern NSString *const kGAIClientId;
+extern NSString *const kGAIAnonymizeIp;
+extern NSString *const kGAISessionControl;
+extern NSString *const kGAIScreenResolution;
+extern NSString *const kGAIViewportSize;
+extern NSString *const kGAIEncoding;
+extern NSString *const kGAIScreenColors;
+extern NSString *const kGAILanguage;
+extern NSString *const kGAIJavaEnabled;
+extern NSString *const kGAIFlashVersion;
+extern NSString *const kGAINonInteraction;
+extern NSString *const kGAIReferrer;
+extern NSString *const kGAILocation;
+extern NSString *const kGAIHostname;
+extern NSString *const kGAIPage;
+extern NSString *const kGAIDescription;  // synonym for kGAIScreenName
+extern NSString *const kGAIScreenName;   // synonym for kGAIDescription
+extern NSString *const kGAITitle;
+extern NSString *const kGAIAdMobHitId;
+extern NSString *const kGAIAppName;
+extern NSString *const kGAIAppVersion;
+extern NSString *const kGAIAppId;
+extern NSString *const kGAIAppInstallerId;
+extern NSString *const kGAIUserId;
+
+extern NSString *const kGAIEventCategory;
+extern NSString *const kGAIEventAction;
+extern NSString *const kGAIEventLabel;
+extern NSString *const kGAIEventValue;
+
+extern NSString *const kGAISocialNetwork;
+extern NSString *const kGAISocialAction;
+extern NSString *const kGAISocialTarget;
+
+extern NSString *const kGAITransactionId;
+extern NSString *const kGAITransactionAffiliation;
+extern NSString *const kGAITransactionRevenue;
+extern NSString *const kGAITransactionShipping;
+extern NSString *const kGAITransactionTax;
+extern NSString *const kGAICurrencyCode;
+
+extern NSString *const kGAIItemPrice;
+extern NSString *const kGAIItemQuantity;
+extern NSString *const kGAIItemSku;
+extern NSString *const kGAIItemName;
+extern NSString *const kGAIItemCategory;
+
+extern NSString *const kGAICampaignSource;
+extern NSString *const kGAICampaignMedium;
+extern NSString *const kGAICampaignName;
+extern NSString *const kGAICampaignKeyword;
+extern NSString *const kGAICampaignContent;
+extern NSString *const kGAICampaignId;
+
+extern NSString *const kGAITimingCategory;
+extern NSString *const kGAITimingVar;
+extern NSString *const kGAITimingValue;
+extern NSString *const kGAITimingLabel;
+
+extern NSString *const kGAIExDescription;
+extern NSString *const kGAIExFatal;
+
+extern NSString *const kGAISampleRate;
+
+extern NSString *const kGAIIdfa;
+extern NSString *const kGAIAdTargetingEnabled;
+
+// hit types
+extern NSString *const kGAIAppView;  // deprecated, use kGAIScreenView instead
+extern NSString *const kGAIScreenView;
+extern NSString *const kGAIEvent;
+extern NSString *const kGAISocial;
+extern NSString *const kGAITransaction;
+extern NSString *const kGAIItem;
+extern NSString *const kGAIException;
+extern NSString *const kGAITiming;
+
+/*!
+ This class provides several fields and methods useful as wire format parameter
+ names.  The methods are used for wire format parameter names that are indexed.
+ */
+
+@interface GAIFields : NSObject
+
+/*!
+ Generates the correct parameter name for a content group with an index.
+
+ @param index the index of the content group.
+
+ @return an NSString representing the content group parameter for the index.
+ */
++ (NSString *)contentGroupForIndex:(NSUInteger)index;
+
+/*!
+ Generates the correct parameter name for a custon dimension with an index.
+
+ @param index the index of the custom dimension.
+
+ @return an NSString representing the custom dimension parameter for the index.
+ */
++ (NSString *)customDimensionForIndex:(NSUInteger)index;
+
+/*!
+ Generates the correct parameter name for a custom metric with an index.
+
+ @param index the index of the custom metric.
+
+ @return an NSString representing the custom metric parameter for the index.
+ */
++ (NSString *)customMetricForIndex:(NSUInteger)index;
+
+@end
diff --git a/GAILogger.h b/GAILogger.h
new file mode 100644
index 0000000..06291f2
--- /dev/null
+++ b/GAILogger.h
@@ -0,0 +1,49 @@
+/*!
+ @header    GAILogger.h
+ @abstract  Google Analytics iOS SDK Source
+ @copyright Copyright 2011 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+
+typedef NS_ENUM(NSUInteger, GAILogLevel) {
+  kGAILogLevelNone = 0,
+  kGAILogLevelError = 1,
+  kGAILogLevelWarning = 2,
+  kGAILogLevelInfo = 3,
+  kGAILogLevelVerbose = 4
+};
+
+/*!
+ Protocol to be used for logging debug and informational messages from the SDK.
+ Implementations of this protocol can be provided to the |GAI| class,
+ to be used as the logger by the SDK.  See the |logger| property in GAI.h.
+ */
+@protocol GAILogger<NSObject>
+@required
+
+/*!
+ Only messages of |logLevel| and below are logged.
+ */
+@property (nonatomic, assign) GAILogLevel logLevel;
+
+/*!
+ Logs message with log level |kGAILogLevelVerbose|.
+ */
+- (void)verbose:(NSString *)message;
+
+/*!
+ Logs message with log level |kGAILogLevelInfo|.
+ */
+- (void)info:(NSString *)message;
+
+/*!
+ Logs message with log level |kGAILogLevelWarning|.
+ */
+- (void)warning:(NSString *)message;
+
+/*!
+ Logs message with log level |kGAILogLevelError|.
+ */
+- (void)error:(NSString *)message;
+@end
diff --git a/GAITrackedViewController.h b/GAITrackedViewController.h
new file mode 100644
index 0000000..5cbabdd
--- /dev/null
+++ b/GAITrackedViewController.h
@@ -0,0 +1,34 @@
+/*!
+ @header    GAITrackedViewController.h
+ @abstract  Google Analytics for iOS Tracked View Controller Header
+ @version   2.0
+ @copyright Copyright 2012 Google Inc. All rights reserved.
+ */
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+@protocol GAITracker;
+
+/*!
+ Extends UIViewController to generate Google Analytics appview calls
+ whenever the view appears; this is done by overriding the `viewDidAppear:`
+ method. The screen name must be set for any tracking calls to be made.
+
+ By default, this will use [GAI defaultTracker] for tracking calls, but one can
+ override this by setting the tracker property.
+ */
+@interface GAITrackedViewController : UIViewController
+
+/*!
+ The tracker on which view tracking calls are be made, or `nil`, in which case
+ [GAI defaultTracker] will be used.
+ */
+@property(nonatomic, assign) id<GAITracker> tracker;
+/*!
+ The screen name, for purposes of Google Analytics tracking. If this is `nil`,
+ no tracking calls will be made.
+ */
+@property(nonatomic, copy)   NSString *screenName;
+
+@end
diff --git a/GAITracker.h b/GAITracker.h
new file mode 100644
index 0000000..605a2e4
--- /dev/null
+++ b/GAITracker.h
@@ -0,0 +1,58 @@
+/*!
+ @header    GAITracker.h
+ @abstract  Google Analytics iOS SDK Tracker Header
+ @version   3.0
+ @copyright Copyright 2013 Google Inc. All rights reserved.
+*/
+
+#import <Foundation/Foundation.h>
+
+/*!
+ Google Analytics tracking interface. Obtain instances of this interface from
+ [GAI trackerWithTrackingId:] to track screens, events, transactions, timing,
+ and exceptions. The implementation of this interface is thread-safe, and no
+ calls are expected to block or take a long time.  All network and disk activity
+ will take place in the background.
+ */
+@protocol GAITracker<NSObject>
+
+/*!
+ Name of this tracker.
+ */
+@property(nonatomic, readonly) NSString *name;
+
+/*!
+ Allow collection of IDFA and related fields if set to true.  Default is false.
+ */
+@property(nonatomic) BOOL allowIDFACollection;
+
+/*!
+ Set a tracking parameter.
+
+ @param parameterName The parameter name.
+
+ @param value The value to set for the parameter. If this is nil, the
+ value for the parameter will be cleared.
+ */
+- (void)set:(NSString *)parameterName
+      value:(NSString *)value;
+
+/*!
+ Get a tracking parameter.
+
+ @param parameterName The parameter name.
+
+ @returns The parameter value, or nil if no value for the given parameter is
+ set.
+ */
+- (NSString *)get:(NSString *)parameterName;
+
+/*!
+ Queue tracking information with the given parameter values.
+
+ @param parameters A map from parameter names to parameter values which will be
+ set just for this piece of tracking information, or nil for none.
+ */
+- (void)send:(NSDictionary *)parameters;
+
+@end
diff --git a/libGoogleAnalyticsServices.a b/libGoogleAnalyticsServices.a
new file mode 100644
index 0000000..8d5c90d
--- /dev/null
+++ b/libGoogleAnalyticsServices.a
Binary files differ
