You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by mr...@apache.org on 2016/09/02 17:06:24 UTC

[01/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Repository: usergrid-dotnet
Updated Branches:
  refs/heads/master [created] 94c0483cc


http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/UserSettings.resx
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/UserSettings.resx b/samples/messageeTutorial/Messagee/UserSettings.resx
new file mode 100644
index 0000000..85d1d78
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/UserSettings.resx
@@ -0,0 +1,137 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/UserSettings.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/UserSettings.vb b/samples/messageeTutorial/Messagee/UserSettings.vb
new file mode 100644
index 0000000..52c7f8a
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/UserSettings.vb
@@ -0,0 +1,96 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+Imports Usergrid.Sdk.Model
+
+Public Class UserSettings
+    Private userName As String
+
+   
+    Private Sub UserSettings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+        Me.userName = MessageeMainWindow.Users.Items(MessageeMainWindow.Users.SelectedIndex).ToString
+        userNameLabel.Text = Me.userName
+        Dim user As UsergridUser = Globals.client.GetUser(Of UsergridUser)(userName)
+        uuidLabel.Text = user.Uuid
+        PopulateUsersAndFollowingLists(userName)
+        btnAddFollowing.Enabled = False
+        btnDeleteFollowing.Enabled = False
+    End Sub
+
+    Private Sub PopulateUsersAndFollowingLists(userName As String)
+        unconnectedUsers.Items.Clear()
+        followingList.Items.Clear()
+
+        Dim following As IList(Of UsergridEntity) = Utils.GetFollowers(userName)
+        Dim followersList As IList(Of UsergridEntity) = Utils.GetFollowed(userName)
+
+        Dim allUsers As UsergridCollection(Of UsergridUser) = Globals.client.GetEntities(Of UsergridUser)("users")
+        Dim i As Integer = 0
+        While i < allUsers.Count 
+            If Not EntityInIList(allUsers(i), following) And allUsers(i).UserName <> userName Then
+                unconnectedUsers.Items.Add(allUsers(i).UserName)
+            End If
+            i = i + 1
+        End While
+        i = 0
+
+        While i < following.Count
+            Dim dc As UsergridUser = Globals.client.GetUser(Of UsergridUser)(following(i).Uuid)
+            followingList.Items.Add(dc.UserName)
+            i = i + 1
+        End While
+    End Sub
+    Private Function EntityInIList(entity As UsergridEntity, ilist As IList) As Boolean
+        Dim i As Integer = 0
+        While i < ilist.Count
+            Dim ilistEntity As UsergridEntity = ilist(i)
+            If ilistEntity.Name = entity.Name Then
+                Return True
+            End If
+            i = i + 1
+        End While
+        Return False
+    End Function
+
+    Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
+        Me.Close()
+        Globals.mainWindow.UpdateFollowersAndFollowing()
+        Globals.mainWindow.UpdateYourFeed()
+    End Sub
+
+    Private Sub btnAddFollowing_Click(sender As Object, e As EventArgs) Handles btnAddFollowing.Click
+        Utils.FollowUser(Me.userName, unconnectedUsers.Items(unconnectedUsers.SelectedIndex).ToString)
+        Utils.AddFollower(Me.userName, unconnectedUsers.Items(unconnectedUsers.SelectedIndex).ToString)
+        btnAddFollowing.Enabled = False
+        PopulateUsersAndFollowingLists(Me.userName)
+    End Sub
+
+    Private Sub unconnectedUsers_SelectedIndexChanged(sender As Object, e As EventArgs) Handles unconnectedUsers.SelectedIndexChanged
+        btnAddFollowing.Enabled = True
+    End Sub
+
+    Private Sub followingList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles followingList.SelectedIndexChanged
+        btnDeleteFollowing.Enabled = True
+    End Sub
+
+    Private Sub btnDeleteFollowing_Click(sender As Object, e As EventArgs) Handles btnDeleteFollowing.Click
+        Dim delUserName = followingList.Items(followingList.SelectedIndex).ToString()
+        Utils.DeleteFollowUser(Me.userName, delUserName)
+        Utils.DeleteFollower(Me.userName, delUserName)
+        btnDeleteFollowing.Enabled = False
+        PopulateUsersAndFollowingLists(Me.userName)
+    End Sub
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Utils.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Utils.vb b/samples/messageeTutorial/Messagee/Utils.vb
new file mode 100644
index 0000000..3a42ea2
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Utils.vb
@@ -0,0 +1,82 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+Imports Usergrid.Sdk.Model
+
+Public Class Utils
+
+    Public Shared Function GetFollowers(userName As String) As IList
+        Dim conn As Connection = New Connection()
+        conn.ConnectorIdentifier = userName
+        conn.ConnectorCollectionName = "users"
+        conn.ConnectionName = "following"
+        Return Globals.client.GetConnections(conn)
+    End Function
+
+    Public Shared Function GetFollowed(userName As String) As IList
+        Dim conn As Connection = New Connection()
+        conn.ConnectorIdentifier = userName
+        conn.ConnectorCollectionName = "users"
+        conn.ConnectionName = "followed"
+        Return Globals.client.GetConnections(conn)
+    End Function
+
+    Public Shared Sub FollowUser(follower As String, followed As String)
+        Dim conn As Connection = New Connection()
+        conn.ConnecteeCollectionName = "users"
+        conn.ConnectorCollectionName = "users"
+
+        conn.ConnectorIdentifier = follower
+        conn.ConnecteeIdentifier = followed
+        conn.ConnectionName = "following"
+        Globals.client.CreateConnection(conn)
+    End Sub
+
+    Public Shared Sub AddFollower(follower As String, followed As String)
+        Dim conn As Connection = New Connection()
+        conn.ConnecteeCollectionName = "users"
+        conn.ConnectorCollectionName = "users"
+
+        conn.ConnectorIdentifier = followed
+        conn.ConnecteeIdentifier = follower
+        conn.ConnectionName = "followed"
+        Globals.client.CreateConnection(conn)
+    End Sub
+
+    Public Shared Sub DeleteFollowUser(follower As String, followed As String)
+        Dim conn As Connection = New Connection()
+        conn.ConnecteeCollectionName = "users"
+        conn.ConnectorCollectionName = "users"
+
+        conn.ConnectorIdentifier = follower
+        conn.ConnecteeIdentifier = followed
+        conn.ConnectionName = "following"
+        Dim clist As IList = Globals.client.GetConnections(conn)
+        Globals.client.DeleteConnection(conn)
+    End Sub
+
+    Public Shared Sub DeleteFollower(follower As String, followed As String)
+        Dim conn As Connection = New Connection()
+        conn.ConnecteeCollectionName = "users"
+        conn.ConnectorCollectionName = "users"
+
+        conn.ConnectorIdentifier = followed
+        conn.ConnecteeIdentifier = follower
+        conn.ConnectionName = "followed"
+        Globals.client.DeleteConnection(conn)
+    End Sub
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/README.md
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/README.md b/samples/messageeTutorial/README.md
new file mode 100644
index 0000000..7a8bbf3
--- /dev/null
+++ b/samples/messageeTutorial/README.md
@@ -0,0 +1,15 @@
+usergrid-sample-.net-messagee
+=============================
+Directions for use
+
+1. Sign up for a free Apigee App Services account
+2. In the organization that is created for you, create a user and give that user administrative privileges
+3. Create an app in the organization
+4. In the app, create as many test users as you like
+5. Clone the following branch for the Usergrid sdk: https://github.com/apigee/usergrid-.net-sdk and build it
+6. Clone this repository.  Open the Messagee solution file in the top level folder.  Add references to the .dll files located in the UsergridSdk\bin\debug folder to the project
+7. Build Messagee
+8. Run the solution.  On the main screen choose the Settings menu item and input the admin user credentials, the org name and the application name
+
+At this point, the users for that app should be populated.  Choosing a particular user and then choosing the User Settings menu option will allow you to control who that user is following
+Connect a few users and do some posts.  Posts are automatically routed to users who are connected as followers

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/App.xaml
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/App.xaml b/samples/notifications/Usergrid.Notifications/App.xaml
new file mode 100644
index 0000000..486a2fd
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/App.xaml
@@ -0,0 +1,27 @@
+\ufeff<Application
+    x:Class="Usergrid.Notifications.App"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="using:Usergrid.Notifications">
+<!--
+    /*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+    -->
+</Application>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/App.xaml.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/App.xaml.cs b/samples/notifications/Usergrid.Notifications/App.xaml.cs
new file mode 100644
index 0000000..eb079fb
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/App.xaml.cs
@@ -0,0 +1,150 @@
+\ufeff/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.ApplicationModel;
+using Windows.ApplicationModel.Activation;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Media.Animation;
+using Windows.UI.Xaml.Navigation;
+
+// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=391641
+
+namespace Usergrid.Notifications
+{
+    /// <summary>
+    /// Provides application-specific behavior to supplement the default Application class.
+    /// </summary>
+    public sealed partial class App : Application
+    {
+        private TransitionCollection transitions;
+
+        /// <summary>
+        /// Initializes the singleton application object.  This is the first line of authored code
+        /// executed, and as such is the logical equivalent of main() or WinMain().
+        /// </summary>
+        public App()
+        {
+            this.InitializeComponent();
+            this.Suspending += this.OnSuspending;
+        }
+
+        /// <summary>
+        /// Invoked when the application is launched normally by the end user.  Other entry points
+        /// will be used when the application is launched to open a specific file, to display
+        /// search results, and so forth.
+        /// </summary>
+        /// <param name="e">Details about the launch request and process.</param>
+        protected override void OnLaunched(LaunchActivatedEventArgs e)
+        {
+#if DEBUG
+            if (System.Diagnostics.Debugger.IsAttached)
+            {
+                this.DebugSettings.EnableFrameRateCounter = true;
+            }
+#endif
+
+            Frame rootFrame = Window.Current.Content as Frame;
+
+            // Do not repeat app initialization when the Window already has content,
+            // just ensure that the window is active
+            if (rootFrame == null)
+            {
+                // Create a Frame to act as the navigation context and navigate to the first page
+                rootFrame = new Frame();
+
+                // TODO: change this value to a cache size that is appropriate for your application
+                rootFrame.CacheSize = 1;
+
+                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
+                {
+                    // TODO: Load state from previously suspended application
+                }
+
+                // Place the frame in the current Window
+                Window.Current.Content = rootFrame;
+            }
+
+            if (rootFrame.Content == null)
+            {
+                // Removes the turnstile navigation for startup.
+                if (rootFrame.ContentTransitions != null)
+                {
+                    this.transitions = new TransitionCollection();
+                    foreach (var c in rootFrame.ContentTransitions)
+                    {
+                        this.transitions.Add(c);
+                    }
+                }
+
+                rootFrame.ContentTransitions = null;
+                rootFrame.Navigated += this.RootFrame_FirstNavigated;
+
+                // When the navigation stack isn't restored navigate to the first page,
+                // configuring the new page by passing required information as a navigation
+                // parameter
+                if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
+                {
+                    throw new Exception("Failed to create initial page");
+                }
+            }
+
+            // Ensure the current window is active
+            Window.Current.Activate();
+        }
+
+        /// <summary>
+        /// Restores the content transitions after the app has launched.
+        /// </summary>
+        /// <param name="sender">The object where the handler is attached.</param>
+        /// <param name="e">Details about the navigation event.</param>
+        private void RootFrame_FirstNavigated(object sender, NavigationEventArgs e)
+        {
+            var rootFrame = sender as Frame;
+            rootFrame.ContentTransitions = this.transitions ?? new TransitionCollection() { new NavigationThemeTransition() };
+            rootFrame.Navigated -= this.RootFrame_FirstNavigated;
+        }
+
+        /// <summary>
+        /// Invoked when application execution is being suspended.  Application state is saved
+        /// without knowing whether the application will be terminated or resumed with the contents
+        /// of memory still intact.
+        /// </summary>
+        /// <param name="sender">The source of the suspend request.</param>
+        /// <param name="e">Details about the suspend request.</param>
+        private void OnSuspending(object sender, SuspendingEventArgs e)
+        {
+            var deferral = e.SuspendingOperation.GetDeferral();
+
+            // TODO: Save application state and stop any background activity
+            deferral.Complete();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/Logo.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/Logo.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/Logo.scale-240.png
new file mode 100644
index 0000000..76921ca
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/Logo.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/SmallLogo.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/SmallLogo.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/SmallLogo.scale-240.png
new file mode 100644
index 0000000..3166301
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/SmallLogo.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/SplashScreen.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/SplashScreen.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/SplashScreen.scale-240.png
new file mode 100644
index 0000000..33f26b3
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/SplashScreen.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/Square71x71Logo.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/Square71x71Logo.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/Square71x71Logo.scale-240.png
new file mode 100644
index 0000000..cfa54be
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/Square71x71Logo.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/StoreLogo.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/StoreLogo.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/StoreLogo.scale-240.png
new file mode 100644
index 0000000..47e084b
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/StoreLogo.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Assets/WideLogo.scale-240.png
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Assets/WideLogo.scale-240.png b/samples/notifications/Usergrid.Notifications/Assets/WideLogo.scale-240.png
new file mode 100644
index 0000000..6249d29
Binary files /dev/null and b/samples/notifications/Usergrid.Notifications/Assets/WideLogo.scale-240.png differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/BackgroundTask.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/BackgroundTask.cs b/samples/notifications/Usergrid.Notifications/BackgroundTask.cs
new file mode 100644
index 0000000..1096ca8
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/BackgroundTask.cs
@@ -0,0 +1,57 @@
+\ufeffusing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.ApplicationModel.Background;
+
+namespace Usergrid.Notifications
+{
+    public sealed class ExampleBackgroundTask : IBackgroundTask
+    {
+        private static BackgroundTaskRegistration task;
+        public void Run(IBackgroundTaskInstance taskInstance)
+        {
+            var test = "";
+
+        }
+        public static void Register()
+        {
+             
+            foreach (var iter in BackgroundTaskRegistration.AllTasks)
+            {
+                IBackgroundTaskRegistration mytask = iter.Value;
+                if (mytask.Name == "ExampleBackgroundTask")
+                {
+
+                    mytask.Unregister(true);
+                    break;
+                }
+            }
+
+           
+            var builder = new BackgroundTaskBuilder();
+            PushNotificationTrigger trigger = new PushNotificationTrigger();
+            builder.SetTrigger(trigger);
+            builder.Name = "ExampleBackgroundTask";
+            builder.TaskEntryPoint = "Usergrid.Notifications.ExampleBackgroundTask";
+
+            ExampleBackgroundTask.task = builder.Register();
+            task.Progress += task_Progress;
+
+            task.Completed += task_Completed;
+
+        }
+
+        static void task_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
+        {
+
+            var test = "done";
+        }
+
+        static void task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
+        {
+            var test = "done";
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Client/EntityResponse.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Client/EntityResponse.cs b/samples/notifications/Usergrid.Notifications/Client/EntityResponse.cs
new file mode 100644
index 0000000..0be267a
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Client/EntityResponse.cs
@@ -0,0 +1,80 @@
+\ufeff/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Usergrid.Notifications.Client
+{
+    public class EntityResponse : JObject
+    {
+        private HttpResponseMessage response;
+
+        private EntityResponse(HttpResponseMessage response, JObject jObject)
+            : base()
+        {
+            this.response = response;
+            parseResponse(jObject);
+        }
+
+        private void parseResponse(JObject jobject)
+        {
+            foreach (var kv in jobject)
+            {
+                this[kv.Key] = kv.Value;
+            }
+        }
+
+        public HttpStatusCode Status
+        {
+            get { return this.response.StatusCode; }
+        }
+
+        public static async Task<EntityResponse> Parse(HttpResponseMessage httpResponseMessage)
+        {
+            JObject jobject;
+            
+            using (var stream = await httpResponseMessage.Content.ReadAsStreamAsync())
+            {
+                using (var reader = new StreamReader(stream, Encoding.UTF8))
+                {
+                    jobject = JObject.Parse(reader.ReadToEnd());
+                }
+            }
+            
+            return new EntityResponse(httpResponseMessage, jobject); 
+        }
+
+        public bool StatusIsOk
+        {
+            get
+            {
+                return this.Status == HttpStatusCode.OK;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Client/IUsergridClient.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Client/IUsergridClient.cs b/samples/notifications/Usergrid.Notifications/Client/IUsergridClient.cs
new file mode 100644
index 0000000..5efbb9b
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Client/IUsergridClient.cs
@@ -0,0 +1,123 @@
+\ufeff/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+
+using Newtonsoft.Json.Linq;
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Windows.Networking.PushNotifications;
+namespace Usergrid.Notifications.Client
+{
+    /// <summary>
+    /// encapsulates usergrid calls, use UsergridFactory
+    /// </summary>
+    public interface IUsergridClient
+    {
+        /// <summary>
+        /// Authenticate your calls
+        /// </summary>
+        /// <param name="user"></param>
+        /// <param name="password"></param>
+        /// <param name="isManagement"></param>
+        /// <returns></returns>
+        Task Authenticate(string user, string password, bool isManagement);
+        /// <summary>
+        /// Send a message 
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="url"></param>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj);
+        /// <summary>
+        /// Send a message
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="url"></param>
+        /// <param name="obj"></param>
+        /// <param name="useManagementUrl"></param>
+        /// <returns></returns>
+        Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj, bool useManagementUrl);
+        /// <summary>
+        /// Reference the push client, you should call register before using
+        /// </summary>
+        IPushClient Push { get; }
+
+        Exception LastException { get; }
+
+    }
+
+    /// <summary>
+    /// Only show http calls
+    /// </summary>
+    public interface IUsergridHttpClient
+    {
+        /// <summary>
+        /// Send Http call async
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="url"></param>
+        /// <param name="obj"></param>
+        /// <param name="useManagementUrl">use management endpoint</param>
+        /// <returns></returns>
+        Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj, bool useManagementUrl);
+        /// <summary>
+        /// send Http call async
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="url"></param>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj);
+    }
+
+    /// <summary>
+    /// Push client, call register
+    /// </summary>
+    public interface IPushClient
+    {
+        /// <summary>
+        /// the notifier you are currently using
+        /// </summary>
+        string Notifier { get; set; }
+        
+        /// <summary>
+        /// Device id in usergrid
+        /// </summary>
+        Guid DeviceId { get; set; }
+        /// <summary>
+        /// send a toast
+        /// </summary>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        Task<bool> SendToast(string message);
+        Task<bool> SendRaw(string message);
+        /// <summary>
+        /// Send a badge update
+        /// </summary>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        Task<bool> SendBadge<T>(T message);
+
+        Exception LastException { get; }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Client/PushClient.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Client/PushClient.cs b/samples/notifications/Usergrid.Notifications/Client/PushClient.cs
new file mode 100644
index 0000000..7ccb391
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Client/PushClient.cs
@@ -0,0 +1,185 @@
+\ufeff/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.Networking.PushNotifications;
+using Windows.Storage;
+
+namespace Usergrid.Notifications.Client
+{
+    public class PushClient : IPushClient
+    {
+        const string DEVICE_KEY = "currentDeviceId";
+        private IUsergridHttpClient usergrid;
+        private ApplicationDataContainer settings;
+        private PushNotificationChannel channel;
+        private string userId;
+
+        public PushClient(IUsergridHttpClient usergrid,string userId, string notifier)
+        {
+            this.usergrid = usergrid;
+            this.settings = ApplicationData.Current.LocalSettings;
+            this.Notifier = notifier;
+            this.userId = userId;
+            this.init().ContinueWith(t =>
+                  {
+                      LastException = t.Exception;
+                  }  
+                );
+        }
+
+
+        public async Task<bool> SendToast(string message)
+        {
+            if (DeviceId == null)
+            {
+                throw new Exception("Please call PushClient.RegisterDevice first.");
+            }
+            var jsonObject = new JObject();
+            var payloads = new JObject();
+            var payload = new JObject();
+            payload.Add("toast", new JValue(message));
+            payloads.Add(Notifier, payload);
+            jsonObject.Add("payloads", payloads);
+            jsonObject.Add("debug", true);
+            var jsonResponse = await usergrid.SendAsync(HttpMethod.Post, String.Format("users/{1}/devices/{0}/notifications", this.DeviceId,userId), jsonObject);
+            return jsonResponse.StatusIsOk;
+        }
+
+        public async Task<bool> SendBadge<T>(T message)
+        {
+            if (DeviceId == null)
+            {
+                throw new Exception("Please call PushClient.RegisterDevice first.");
+            }
+            var jsonObject = new JObject();
+            var payloads = new JObject();
+            var payload = new JObject();
+            payload.Add("badge", new JValue(message));
+            payloads.Add(Notifier, payload);
+            jsonObject.Add("payloads", payloads);
+            jsonObject.Add("debug", true);
+            var jsonResponse = await usergrid.SendAsync(HttpMethod.Post, String.Format("users/{1}/devices/{0}/notifications", this.DeviceId,userId), jsonObject);
+            return jsonResponse.StatusIsOk;
+        }
+
+
+        public async Task<bool> SendRaw(string message)
+        {
+            if (DeviceId == null)
+            {
+                throw new Exception("Please call PushClient.RegisterDevice first.");
+            }
+            var jsonObject = new JObject();
+            var payloads = new JObject();
+            var payload = new JObject();
+            payload.Add("raw", message);
+            payloads.Add(Notifier, payload);
+            jsonObject.Add("payloads", payloads);
+            jsonObject.Add("debug", true);
+            var jsonResponse = await usergrid.SendAsync(HttpMethod.Post, String.Format("users/{1}/devices/{0}/notifications", this.DeviceId, userId), jsonObject);
+            return jsonResponse.StatusIsOk;
+        }
+
+        private async Task init()
+        {
+            channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync().AsTask<PushNotificationChannel>();
+            channel.PushNotificationReceived += channel_PushNotificationReceived;
+            ExampleBackgroundTask.Register();
+
+            if (settings.Values[DEVICE_KEY] == null)
+            {
+                Guid uuid = await registerDevice(true);
+                settings.Values.Add(DEVICE_KEY, uuid);
+                this.DeviceId = uuid;
+            }
+            else
+            {
+                object tempId;
+                settings.Values.TryGetValue(DEVICE_KEY, out tempId);
+                this.DeviceId = Guid.Parse(tempId.ToString());
+                var device = await GetDevice(DeviceId);
+                if (device == null)
+                {
+                    Guid uuid = await registerDevice(true);
+                    settings.Values[DEVICE_KEY] = uuid;
+                    this.DeviceId = uuid;
+                }
+                else
+                {
+                    await registerDevice(false);
+                }
+            }
+        }
+
+        void channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)
+        {
+            var test = "test";
+            if (args.NotificationType == PushNotificationType.Raw)
+            {
+
+            }
+        }
+
+       
+        private async Task<JToken> GetDevice(Guid deviceId)
+        {
+            var jsonResponse = await usergrid.SendAsync(HttpMethod.Get, "users/"+userId+"/devices/" + deviceId, null);
+
+            if (jsonResponse.StatusIsOk)
+            {
+                var body = jsonResponse.GetValue("entities");
+                return body != null &&  body.Value<JArray>().Count > 0 ? body.Value<JArray>()[0] : null;
+            }
+            else { return null; }
+        }
+
+        private async Task<Guid> registerDevice(bool isNew)
+        {
+            JObject obj = new JObject();
+            obj.Add(Notifier + ".notifier.id", new JValue(channel.Uri));
+            var jsonResponse = await usergrid.SendAsync(
+                (isNew ? HttpMethod.Post : HttpMethod.Put), 
+                "users/"+userId+"/devices/" +   (isNew ? "" : this.DeviceId.ToString()), 
+                obj
+                );
+            
+            if (jsonResponse.StatusIsOk)
+            {
+                var entity = jsonResponse.GetValue("entities").Value<JArray>()[0];
+                var uuid = Guid.Parse(entity.Value<String>("uuid"));
+                return uuid;
+            }
+            else { 
+                return Guid.Empty; 
+            }
+        }
+
+        public string Notifier { get; set; }
+        public Guid DeviceId { get; set; }
+        public Exception LastException { get; set; }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Client/Usergrid.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Client/Usergrid.cs b/samples/notifications/Usergrid.Notifications/Client/Usergrid.cs
new file mode 100644
index 0000000..977eb8b
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Client/Usergrid.cs
@@ -0,0 +1,122 @@
+\ufeff/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+
+using System;
+using System.Threading.Tasks;
+using System.Net;
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json;
+using System.Net.Http;
+using System.Net.Http.Headers;
+
+namespace Usergrid.Notifications.Client
+{
+ 
+    /// <summary>
+    /// Usergrid client 
+    /// </summary>
+
+    public class Usergrid : IUsergridHttpClient, IUsergridClient
+    {
+        private string appUrl;
+        private string token;
+        private HttpClient client;
+        private IPushClient push;
+        private string managementUrl;
+
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        /// <param name="serverUrl"></param>
+        /// <param name="org"></param>
+        /// <param name="app"></param>
+        /// <param name="channel"></param>
+        internal Usergrid(string serverUrl, string org, string app, string userId, string password,string notifier)
+        {
+            string serverUrlWithSlash = serverUrl.EndsWith("/", StringComparison.CurrentCulture) ? serverUrl : serverUrl + "/";
+            this.appUrl = String.Format("{0}{1}/{2}/", serverUrlWithSlash, org, app);
+            this.managementUrl = serverUrlWithSlash + "management/";
+            this.client = new HttpClient();
+            Authenticate(userId, password, false).ContinueWith(task => {
+                this.push = new PushClient(this, userId, notifier);
+            });
+        }
+
+        public async Task Authenticate(string user, string password, bool isManagement)
+        {
+            var jsonObject = new JObject();
+            jsonObject.Add("username", user);
+            jsonObject.Add("password", password);
+            jsonObject.Add("grant_type", "password");
+           
+            var response = await SendAsync(HttpMethod.Post,"token", jsonObject, isManagement);
+
+            if (response.StatusIsOk)
+            {
+                this.token = response.GetValue("access_token").Value<String>();
+                client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token);
+            }
+            else
+            {
+                throw new Exception("Authentication failed: "+response.ToString());
+            }
+        }
+
+        private async Task<EntityResponse> GetJsonResponse(HttpResponseMessage response)
+        {
+            return  await EntityResponse.Parse(response);
+        }
+
+        public async Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj)
+        {
+            return await SendAsync(method, url, obj, false);
+        }
+
+        public async Task<EntityResponse> SendAsync(HttpMethod method, string url, object obj, bool useManagementUrl)
+        {
+            HttpRequestMessage message = new HttpRequestMessage(method, (useManagementUrl ? this.managementUrl : this.appUrl) + url);
+            if (obj != null)
+            {
+                message.Content = getJsonBody(obj);
+            }
+            message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue( "application/json"));
+            var response = await this.client.SendAsync(message);
+            return await EntityResponse.Parse(response);
+        }
+   
+        public IPushClient Push
+        {
+            get { return push; }
+        }
+
+        private HttpContent getJsonBody(Object jsonObject)
+        {
+            return new StringContent(JsonConvert.SerializeObject(jsonObject));
+        }
+
+
+        public Exception LastException
+        {
+            get;
+            set;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/MainPage.xaml
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/MainPage.xaml b/samples/notifications/Usergrid.Notifications/MainPage.xaml
new file mode 100644
index 0000000..004eba9
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/MainPage.xaml
@@ -0,0 +1,39 @@
+\ufeff<Page
+    x:Class="Usergrid.Notifications.MainPage"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="using:Usergrid.Notifications"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    mc:Ignorable="d"
+    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
+  <!--
+    /*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+    -->
+    <Grid>
+        <TextBox x:Name="pushText" HorizontalAlignment="Left" Margin="46,10,0,0" TextWrapping="Wrap" Text="Push Text" VerticalAlignment="Top" Width="261" TextChanged="pushText_TextChanged"/>
+        <Button x:Name="SendToast"  Content="Toast" HorizontalAlignment="Left" Margin="114,88,0,0" VerticalAlignment="Top" Click="Button_Click" Width="39"/>
+        <Button x:Name="Badge" Content="Badge" HorizontalAlignment="Left" Margin="114,157,0,0" VerticalAlignment="Top" Click="Badge_Click"/>
+        <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="46,295,0,0" TextWrapping="Wrap" Text="Did it work? " VerticalAlignment="Top" Height="49" Width="261" FontSize="25" SelectionChanged="Result_SelectionChanged"/>
+        <Button Content="Raw" HorizontalAlignment="Left" Margin="114,223,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
+
+    </Grid>
+</Page>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/MainPage.xaml.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/MainPage.xaml.cs b/samples/notifications/Usergrid.Notifications/MainPage.xaml.cs
new file mode 100644
index 0000000..2625289
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/MainPage.xaml.cs
@@ -0,0 +1,143 @@
+\ufeffusing Newtonsoft.Json.Linq;
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+using System;
+using System.Threading.Tasks;
+using Usergrid.Notifications.Client;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Navigation;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=391641
+
+namespace Usergrid.Notifications
+{
+    /// <summary>
+    /// An empty page that can be used on its own or navigated to within a Frame.
+    /// </summary>
+    public sealed partial class MainPage : Page
+    {
+        private IUsergridClient usergrid;
+        private string serverUrl;
+        private string org;
+        private string app;
+        private string notifier;
+        private string user;
+        private string password;
+        public MainPage()
+        {
+            this.InitializeComponent();
+            //TODO: change me to your server
+            serverUrl = "http://10.0.1.20:8080/";
+            //TODO: change me to your org
+            org = "test-organization";
+            //TODO: change me to your app
+            app = "test-app";
+            //TODO: change me to your notifier name
+            notifier = "windows";
+            //TODO: change me to your user
+            user = "mobileuser";
+            //TODO: change me to your password
+            password = "P@ssw0rd1";
+            this.NavigationCacheMode = NavigationCacheMode.Required;
+            usergrid = new Client.Usergrid(serverUrl, org, app, user, password, notifier);
+
+        }
+
+        private async Task setup()
+        {
+        }
+
+        /// <summary>
+        /// Invoked when this page is about to be displayed in a Frame.
+        /// </summary>
+        /// <param name="e">Event data that describes how this page was reached.
+        /// This parameter is typically used to configure the page.</param>
+        protected override void OnNavigatedTo(NavigationEventArgs e)
+        {
+            // TODO: Prepare page for display here.
+
+            // TODO: If your application contains multiple pages, ensure that you are
+            // handling the hardware Back button by registering for the
+            // Windows.Phone.UI.Input.HardwareButtons.BackPressed event.
+            // If you are using the NavigationHelper provided by some templates,
+            // this event is handled for you.
+        }
+
+        private void pushText_TextChanged(object sender, TextChangedEventArgs e)
+        {
+
+        }
+
+        private async void Button_Click(object sender, RoutedEventArgs e)
+        {
+            Result.Text = "Sending....";
+
+            var message = this.pushText.Text;
+            if (await usergrid.Push.SendToast(message))
+            {
+                Result.Text = "It did! :)";
+            }
+            else
+            {
+                Result.Text = "It did not! :(";
+            }
+        }
+
+        private async void Badge_Click(object sender, RoutedEventArgs e)
+        {
+            Result.Text = "Sending....";
+
+            if (await usergrid.Push.SendBadge<int>(new Random().Next(1,100)))
+            {
+                Result.Text = "It did! :)";
+            }
+            else
+            {
+                Result.Text = "It did not! :(";
+            }
+        }
+
+        private void Result_SelectionChanged(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        public AggregateException LastException { get; set; }
+
+        private async void Button_Click_1(object sender, RoutedEventArgs e)
+        {
+            Result.Text = "Sending....";
+
+            var message = this.pushText.Text;
+
+            JObject obj = new JObject();
+            obj.Add("message", message);
+            if (await usergrid.Push.SendRaw(message))
+            {
+                Result.Text = "It did! :)";
+            }
+            else
+            {
+                Result.Text = "It did not! :(";
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/MyBackgroundTask.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/MyBackgroundTask.cs b/samples/notifications/Usergrid.Notifications/MyBackgroundTask.cs
new file mode 100644
index 0000000..9d8a446
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/MyBackgroundTask.cs
@@ -0,0 +1,18 @@
+\ufeffusing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Windows.ApplicationModel.Background;
+
+namespace Usergrid.Notifications
+{
+
+    public sealed class ExampleBackgroundTask : IBackgroundTask
+    {
+        public void Run(IBackgroundTaskInstance taskInstance)
+        {
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Package.StoreAssociation.xml
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Package.StoreAssociation.xml b/samples/notifications/Usergrid.Notifications/Package.StoreAssociation.xml
new file mode 100644
index 0000000..c6278a4
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Package.StoreAssociation.xml
@@ -0,0 +1,194 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<StoreAssociation xmlns="http://schemas.microsoft.com/appx/2010/storeassociation">
+  <Publisher>CN=AC3A1EB7-E4EA-48C0-9556-C37AA8BAE0CF</Publisher>
+  <PublisherDisplayName>feldrocker</PublisherDisplayName>
+  <GeneratePackageHash>http://www.w3.org/2001/04/xmlenc#sha256</GeneratePackageHash>
+  <SupportedLocales>
+    <Language Code="af" InMinimumRequirementSet="true" />
+    <Language Code="af-za" InMinimumRequirementSet="true" />
+    <Language Code="sq" InMinimumRequirementSet="true" />
+    <Language Code="sq-al" InMinimumRequirementSet="true" />
+    <Language Code="ar" InMinimumRequirementSet="true" />
+    <Language Code="ar-ae" InMinimumRequirementSet="true" />
+    <Language Code="ar-bh" InMinimumRequirementSet="true" />
+    <Language Code="ar-dz" InMinimumRequirementSet="true" />
+    <Language Code="ar-eg" InMinimumRequirementSet="true" />
+    <Language Code="ar-iq" InMinimumRequirementSet="true" />
+    <Language Code="ar-jo" InMinimumRequirementSet="true" />
+    <Language Code="ar-kw" InMinimumRequirementSet="true" />
+    <Language Code="ar-lb" InMinimumRequirementSet="true" />
+    <Language Code="ar-ly" InMinimumRequirementSet="true" />
+    <Language Code="ar-ma" InMinimumRequirementSet="true" />
+    <Language Code="ar-om" InMinimumRequirementSet="true" />
+    <Language Code="ar-qa" InMinimumRequirementSet="true" />
+    <Language Code="ar-sa" InMinimumRequirementSet="true" />
+    <Language Code="ar-sy" InMinimumRequirementSet="true" />
+    <Language Code="ar-tn" InMinimumRequirementSet="true" />
+    <Language Code="ar-ye" InMinimumRequirementSet="true" />
+    <Language Code="az-latn" InMinimumRequirementSet="true" />
+    <Language Code="az-latn-az" InMinimumRequirementSet="true" />
+    <Language Code="az" InMinimumRequirementSet="true" />
+    <Language Code="eu" InMinimumRequirementSet="true" />
+    <Language Code="eu-es" InMinimumRequirementSet="true" />
+    <Language Code="be" InMinimumRequirementSet="true" />
+    <Language Code="be-by" InMinimumRequirementSet="true" />
+    <Language Code="pt-br" InMinimumRequirementSet="true" />
+    <Language Code="bg" InMinimumRequirementSet="true" />
+    <Language Code="bg-bg" InMinimumRequirementSet="true" />
+    <Language Code="ca" InMinimumRequirementSet="true" />
+    <Language Code="ca-es" InMinimumRequirementSet="true" />
+    <Language Code="hr" InMinimumRequirementSet="true" />
+    <Language Code="hr-hr" InMinimumRequirementSet="true" />
+    <Language Code="hr-ba" InMinimumRequirementSet="true" />
+    <Language Code="cs" InMinimumRequirementSet="true" />
+    <Language Code="cs-cz" InMinimumRequirementSet="true" />
+    <Language Code="da" InMinimumRequirementSet="true" />
+    <Language Code="da-dk" InMinimumRequirementSet="true" />
+    <Language Code="nl" InMinimumRequirementSet="true" />
+    <Language Code="nl-nl" InMinimumRequirementSet="true" />
+    <Language Code="nl-be" InMinimumRequirementSet="true" />
+    <Language Code="en" InMinimumRequirementSet="true" />
+    <Language Code="en-gb" InMinimumRequirementSet="true" />
+    <Language Code="en-029" InMinimumRequirementSet="true" />
+    <Language Code="en-au" InMinimumRequirementSet="true" />
+    <Language Code="en-bz" InMinimumRequirementSet="true" />
+    <Language Code="en-ie" InMinimumRequirementSet="true" />
+    <Language Code="en-in" InMinimumRequirementSet="true" />
+    <Language Code="en-jm" InMinimumRequirementSet="true" />
+    <Language Code="en-my" InMinimumRequirementSet="true" />
+    <Language Code="en-nz" InMinimumRequirementSet="true" />
+    <Language Code="en-ph" InMinimumRequirementSet="true" />
+    <Language Code="en-sg" InMinimumRequirementSet="true" />
+    <Language Code="en-tt" InMinimumRequirementSet="true" />
+    <Language Code="en-za" InMinimumRequirementSet="true" />
+    <Language Code="en-zw" InMinimumRequirementSet="true" />
+    <Language Code="en-hk" InMinimumRequirementSet="true" />
+    <Language Code="en-us" InMinimumRequirementSet="true" />
+    <Language Code="en-ca" InMinimumRequirementSet="true" />
+    <Language Code="et" InMinimumRequirementSet="true" />
+    <Language Code="et-ee" InMinimumRequirementSet="true" />
+    <Language Code="fil" InMinimumRequirementSet="true" />
+    <Language Code="fil-ph" InMinimumRequirementSet="true" />
+    <Language Code="fi" InMinimumRequirementSet="true" />
+    <Language Code="fi-fi" InMinimumRequirementSet="true" />
+    <Language Code="fr" InMinimumRequirementSet="true" />
+    <Language Code="fr-fr" InMinimumRequirementSet="true" />
+    <Language Code="fr-ca" InMinimumRequirementSet="true" />
+    <Language Code="fr-ch" InMinimumRequirementSet="true" />
+    <Language Code="fr-be" InMinimumRequirementSet="true" />
+    <Language Code="fr-lu" InMinimumRequirementSet="true" />
+    <Language Code="fr-mc" InMinimumRequirementSet="true" />
+    <Language Code="gl" InMinimumRequirementSet="true" />
+    <Language Code="gl-es" InMinimumRequirementSet="true" />
+    <Language Code="de" InMinimumRequirementSet="true" />
+    <Language Code="de-de" InMinimumRequirementSet="true" />
+    <Language Code="de-ch" InMinimumRequirementSet="true" />
+    <Language Code="de-at" InMinimumRequirementSet="true" />
+    <Language Code="de-li" InMinimumRequirementSet="true" />
+    <Language Code="de-lu" InMinimumRequirementSet="true" />
+    <Language Code="el" InMinimumRequirementSet="true" />
+    <Language Code="el-gr" InMinimumRequirementSet="true" />
+    <Language Code="ha-latn" InMinimumRequirementSet="true" />
+    <Language Code="ha-latn-ng" InMinimumRequirementSet="true" />
+    <Language Code="ha" InMinimumRequirementSet="true" />
+    <Language Code="he" InMinimumRequirementSet="true" />
+    <Language Code="he-il" InMinimumRequirementSet="true" />
+    <Language Code="hi" InMinimumRequirementSet="true" />
+    <Language Code="hi-in" InMinimumRequirementSet="true" />
+    <Language Code="hu" InMinimumRequirementSet="true" />
+    <Language Code="hu-hu" InMinimumRequirementSet="true" />
+    <Language Code="id" InMinimumRequirementSet="true" />
+    <Language Code="id-id" InMinimumRequirementSet="true" />
+    <Language Code="it" InMinimumRequirementSet="true" />
+    <Language Code="it-it" InMinimumRequirementSet="true" />
+    <Language Code="it-ch" InMinimumRequirementSet="true" />
+    <Language Code="ja" InMinimumRequirementSet="true" />
+    <Language Code="ja-jp" InMinimumRequirementSet="true" />
+    <Language Code="kk" InMinimumRequirementSet="true" />
+    <Language Code="kk-kz" InMinimumRequirementSet="true" />
+    <Language Code="ko" InMinimumRequirementSet="true" />
+    <Language Code="ko-kr" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-ba" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-cs" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-me" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-rs" InMinimumRequirementSet="true" />
+    <Language Code="sr" InMinimumRequirementSet="true" />
+    <Language Code="lv" InMinimumRequirementSet="true" />
+    <Language Code="lv-lv" InMinimumRequirementSet="true" />
+    <Language Code="lt" InMinimumRequirementSet="true" />
+    <Language Code="lt-lt" InMinimumRequirementSet="true" />
+    <Language Code="mk" InMinimumRequirementSet="true" />
+    <Language Code="mk-mk" InMinimumRequirementSet="true" />
+    <Language Code="ms" InMinimumRequirementSet="true" />
+    <Language Code="ms-my" InMinimumRequirementSet="true" />
+    <Language Code="ms-bn" InMinimumRequirementSet="true" />
+    <Language Code="nb" InMinimumRequirementSet="true" />
+    <Language Code="nb-no" InMinimumRequirementSet="true" />
+    <Language Code="fa" InMinimumRequirementSet="true" />
+    <Language Code="fa-ir" InMinimumRequirementSet="true" />
+    <Language Code="pl" InMinimumRequirementSet="true" />
+    <Language Code="pl-pl" InMinimumRequirementSet="true" />
+    <Language Code="pt" InMinimumRequirementSet="true" />
+    <Language Code="pt-pt" InMinimumRequirementSet="true" />
+    <Language Code="ro" InMinimumRequirementSet="true" />
+    <Language Code="ro-ro" InMinimumRequirementSet="true" />
+    <Language Code="ru" InMinimumRequirementSet="true" />
+    <Language Code="ru-ru" InMinimumRequirementSet="true" />
+    <Language Code="zh" InMinimumRequirementSet="true" />
+    <Language Code="zh-cn" InMinimumRequirementSet="true" />
+    <Language Code="zh-hans" InMinimumRequirementSet="true" />
+    <Language Code="zh-sg" InMinimumRequirementSet="true" />
+    <Language Code="sk" InMinimumRequirementSet="true" />
+    <Language Code="sk-sk" InMinimumRequirementSet="true" />
+    <Language Code="sl" InMinimumRequirementSet="true" />
+    <Language Code="sl-si" InMinimumRequirementSet="true" />
+    <Language Code="es" InMinimumRequirementSet="true" />
+    <Language Code="es-es" InMinimumRequirementSet="true" />
+    <Language Code="es-mx" InMinimumRequirementSet="true" />
+    <Language Code="es-ar" InMinimumRequirementSet="true" />
+    <Language Code="es-bo" InMinimumRequirementSet="true" />
+    <Language Code="es-cl" InMinimumRequirementSet="true" />
+    <Language Code="es-co" InMinimumRequirementSet="true" />
+    <Language Code="es-cr" InMinimumRequirementSet="true" />
+    <Language Code="es-do" InMinimumRequirementSet="true" />
+    <Language Code="es-ec" InMinimumRequirementSet="true" />
+    <Language Code="es-gt" InMinimumRequirementSet="true" />
+    <Language Code="es-hn" InMinimumRequirementSet="true" />
+    <Language Code="es-ni" InMinimumRequirementSet="true" />
+    <Language Code="es-pa" InMinimumRequirementSet="true" />
+    <Language Code="es-pe" InMinimumRequirementSet="true" />
+    <Language Code="es-pr" InMinimumRequirementSet="true" />
+    <Language Code="es-py" InMinimumRequirementSet="true" />
+    <Language Code="es-sv" InMinimumRequirementSet="true" />
+    <Language Code="es-us" InMinimumRequirementSet="true" />
+    <Language Code="es-uy" InMinimumRequirementSet="true" />
+    <Language Code="es-ve" InMinimumRequirementSet="true" />
+    <Language Code="sv" InMinimumRequirementSet="true" />
+    <Language Code="sv-fi" InMinimumRequirementSet="true" />
+    <Language Code="sv-se" InMinimumRequirementSet="true" />
+    <Language Code="th" InMinimumRequirementSet="true" />
+    <Language Code="th-th" InMinimumRequirementSet="true" />
+    <Language Code="zh-hant" InMinimumRequirementSet="true" />
+    <Language Code="zh-hk" InMinimumRequirementSet="true" />
+    <Language Code="zh-mo" InMinimumRequirementSet="true" />
+    <Language Code="zh-tw" InMinimumRequirementSet="true" />
+    <Language Code="tr" InMinimumRequirementSet="true" />
+    <Language Code="tr-tr" InMinimumRequirementSet="true" />
+    <Language Code="uk" InMinimumRequirementSet="true" />
+    <Language Code="uk-ua" InMinimumRequirementSet="true" />
+    <Language Code="uz-latn" InMinimumRequirementSet="true" />
+    <Language Code="uz-latn-uz" InMinimumRequirementSet="true" />
+    <Language Code="uz" InMinimumRequirementSet="true" />
+    <Language Code="vi" InMinimumRequirementSet="true" />
+    <Language Code="vi-vn" InMinimumRequirementSet="true" />
+  </SupportedLocales>
+  <ProductReservedInfo>
+    <MainPackageIdentityName>15661feldrocker.usergridsample</MainPackageIdentityName>
+    <ReservedNames>
+      <ReservedName>usergrid sample</ReservedName>
+    </ReservedNames>
+  </ProductReservedInfo>
+  <AccountPackageIdentityNames />
+  <PackageInfoList LandingUrl="https://dev.windowsphone.com/AppSubmission/AssociationLanding?windowsProductId=142f4403-3810-4c59-8236-0afe0b8472bf" />
+</StoreAssociation>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Package.appxmanifest
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Package.appxmanifest b/samples/notifications/Usergrid.Notifications/Package.appxmanifest
new file mode 100644
index 0000000..2eec1a9
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Package.appxmanifest
@@ -0,0 +1,61 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest" xmlns:m3="http://schemas.microsoft.com/appx/2014/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest">
+  <!--
+    /*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+    -->
+  <Identity Name="15661feldrocker.usergridsample" Publisher="CN=AC3A1EB7-E4EA-48C0-9556-C37AA8BAE0CF" Version="1.1.0.1" />
+  <mp:PhoneIdentity PhoneProductId="c05b658a-0b41-4187-a6e4-ca186c2338de" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
+  <Properties>
+    <DisplayName>usergrid sample</DisplayName>
+    <PublisherDisplayName>feldrocker</PublisherDisplayName>
+    <Logo>Assets\StoreLogo.png</Logo>
+  </Properties>
+  <Prerequisites>
+    <OSMinVersion>6.3.1</OSMinVersion>
+    <OSMaxVersionTested>6.3.1</OSMaxVersionTested>
+  </Prerequisites>
+  <Resources>
+    <Resource Language="x-generate" />
+  </Resources>
+  <Applications>
+    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Usergrid.Notifications.App">
+      <m3:VisualElements DisplayName="usergrid sample" Square150x150Logo="Assets\Logo.png" Square44x44Logo="Assets\SmallLogo.png" Description="Usergrid.Notifications" ForegroundText="light" BackgroundColor="transparent" ToastCapable="true">
+        <m3:DefaultTile Wide310x150Logo="Assets\WideLogo.png" Square71x71Logo="Assets\Square71x71Logo.png">
+        </m3:DefaultTile>
+        <m3:SplashScreen Image="Assets\SplashScreen.png" />
+        <m3:InitialRotationPreference>
+          <m3:Rotation Preference="portrait" />
+        </m3:InitialRotationPreference>
+      </m3:VisualElements>
+      <Extensions>
+        <Extension Category="windows.backgroundTasks" EntryPoint="Usergrid.Notifications.ExampleBackgroundTask">
+          <BackgroundTasks>
+            <Task Type="pushNotification" />
+          </BackgroundTasks>
+        </Extension>
+       
+      </Extensions>
+    </Application>
+  </Applications>
+  <Capabilities>
+    <Capability Name="internetClientServer" />
+  </Capabilities>
+</Package>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Properties/AssemblyInfo.cs b/samples/notifications/Usergrid.Notifications/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..daf5838
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Properties/AssemblyInfo.cs
@@ -0,0 +1,29 @@
+\ufeffusing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Usergrid.Notifications")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Usergrid.Notifications")]
+[assembly: AssemblyCopyright("Copyright �  2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: ComVisible(false)]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.csproj
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.csproj b/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.csproj
new file mode 100644
index 0000000..b2361e8
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.csproj
@@ -0,0 +1,143 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}</ProjectGuid>
+    <OutputType>AppContainerExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Usergrid.Notifications</RootNamespace>
+    <AssemblyName>Usergrid.Notifications</AssemblyName>
+    <DefaultLanguage>en-US</DefaultLanguage>
+    <TargetPlatformVersion>8.1</TargetPlatformVersion>
+    <MinimumVisualStudioVersion>12</MinimumVisualStudioVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{76F1466A-8B6D-4E39-A767-685A06062A39};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
+    <AppxBundlePlatforms>neutral</AppxBundlePlatforms>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\ARM\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <NoWarn>;2008</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>ARM</PlatformTarget>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
+    <OutputPath>bin\ARM\Release\</OutputPath>
+    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <Optimize>true</Optimize>
+    <NoWarn>;2008</NoWarn>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>ARM</PlatformTarget>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <NoWarn>;2008</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_PHONE_APP</DefineConstants>
+    <Optimize>true</Optimize>
+    <NoWarn>;2008</NoWarn>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>true</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="BackgroundTask.cs" />
+    <Compile Include="Client\EntityResponse.cs" />
+    <Compile Include="Client\IUsergridClient.cs" />
+    <Compile Include="Client\PushClient.cs" />
+    <Compile Include="MainPage.xaml.cs">
+      <DependentUpon>MainPage.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Client\Usergrid.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <AppxManifest Include="Package.appxmanifest">
+      <SubType>Designer</SubType>
+    </AppxManifest>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Assets\Logo.scale-240.png" />
+    <Content Include="Assets\SmallLogo.scale-240.png" />
+    <Content Include="Assets\SplashScreen.scale-240.png" />
+    <Content Include="Assets\Square71x71Logo.scale-240.png" />
+    <Content Include="Assets\StoreLogo.scale-240.png" />
+    <Content Include="Assets\WideLogo.scale-240.png" />
+    <None Include="Package.StoreAssociation.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+    <Page Include="MainPage.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\packages\Newtonsoft.Json.6.0.8\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '12.0' ">
+    <VisualStudioVersion>12.0</VisualStudioVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetPlatformIdentifier)' == '' ">
+    <TargetPlatformIdentifier>WindowsPhoneApp</TargetPlatformIdentifier>
+  </PropertyGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.sln
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.sln b/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.sln
new file mode 100644
index 0000000..79e96ec
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/Usergrid.Notifications.sln
@@ -0,0 +1,40 @@
+\ufeff
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.31101.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Usergrid.Notifications", "Usergrid.Notifications.csproj", "{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|ARM = Debug|ARM
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|ARM = Release|ARM
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|ARM.ActiveCfg = Debug|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|ARM.Build.0 = Debug|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|ARM.Deploy.0 = Debug|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|x86.ActiveCfg = Debug|x86
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|x86.Build.0 = Debug|x86
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Debug|x86.Deploy.0 = Debug|x86
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|Any CPU.Deploy.0 = Release|Any CPU
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|ARM.ActiveCfg = Release|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|ARM.Build.0 = Release|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|ARM.Deploy.0 = Release|ARM
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|x86.ActiveCfg = Release|x86
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|x86.Build.0 = Release|x86
+		{EB364B8E-B7C1-45C2-BF13-1CBF731EA8B6}.Release|x86.Deploy.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/Usergrid.Notifications/packages.config
----------------------------------------------------------------------
diff --git a/samples/notifications/Usergrid.Notifications/packages.config b/samples/notifications/Usergrid.Notifications/packages.config
new file mode 100644
index 0000000..2a3ff3c
--- /dev/null
+++ b/samples/notifications/Usergrid.Notifications/packages.config
@@ -0,0 +1,25 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <!--
+    /*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * under the Apache License, Version 2.0 (the "License"); you may not
+ *  * use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+    -->
+  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="wpa81" />
+</packages>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/notifications/packages/repositories.config
----------------------------------------------------------------------
diff --git a/samples/notifications/packages/repositories.config b/samples/notifications/packages/repositories.config
new file mode 100644
index 0000000..deb9991
--- /dev/null
+++ b/samples/notifications/packages/repositories.config
@@ -0,0 +1,4 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<repositories>
+  <repository path="..\Usergrid.Notifications\packages.config" />
+</repositories>
\ No newline at end of file


[05/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/LocationDotNetSample.csproj
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/LocationDotNetSample.csproj b/samples/locationSample/LocationDotNetSample/LocationDotNetSample.csproj
new file mode 100644
index 0000000..e67e559
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/LocationDotNetSample.csproj
@@ -0,0 +1,129 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{6F830639-6E84-4FBC-B975-49521F30DE83}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>LocationDotNetSample</RootNamespace>
+    <AssemblyName>LocationDotNetSample</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="BSE.Windows.Forms">
+      <HintPath>bin\BSE.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="Geocoder">
+      <HintPath>..\packages\Geocoder.0.1.0.0\lib\net45\Geocoder.dll</HintPath>
+    </Reference>
+    <Reference Include="GMap.NET.Core">
+      <HintPath>bin\GMap.NET.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="GMap.NET.WindowsForms">
+      <HintPath>bin\GMap.NET.WindowsForms.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\RestSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Usergrid.Sdk">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Usergrid.Sdk.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Store.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Program.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Program.cs b/samples/locationSample/LocationDotNetSample/Program.cs
new file mode 100644
index 0000000..4664ffc
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Program.cs
@@ -0,0 +1,37 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace LocationDotNetSample
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Properties/AssemblyInfo.cs b/samples/locationSample/LocationDotNetSample/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2e05189
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("LocationDotNetSample")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LocationDotNetSample")]
+[assembly: AssemblyCopyright("Copyright �  2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9bd68350-c7a0-4b65-aa3a-ee530c4ba987")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Properties/Resources.Designer.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Properties/Resources.Designer.cs b/samples/locationSample/LocationDotNetSample/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..c84f483
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Properties/Resources.Designer.cs
@@ -0,0 +1,86 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18331
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LocationDotNetSample.Properties
+{
+
+
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LocationDotNetSample.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Properties/Resources.resx
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Properties/Resources.resx b/samples/locationSample/LocationDotNetSample/Properties/Resources.resx
new file mode 100644
index 0000000..e65c186
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Properties/Resources.resx
@@ -0,0 +1,133 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Properties/Settings.Designer.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Properties/Settings.Designer.cs b/samples/locationSample/LocationDotNetSample/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..b9ab418
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Properties/Settings.Designer.cs
@@ -0,0 +1,45 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18331
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LocationDotNetSample.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Properties/Settings.settings
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Properties/Settings.settings b/samples/locationSample/LocationDotNetSample/Properties/Settings.settings
new file mode 100644
index 0000000..a3b7316
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Properties/Settings.settings
@@ -0,0 +1,23 @@
+\ufeff<?xml version='1.0' encoding='utf-8'?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Store.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Store.cs b/samples/locationSample/LocationDotNetSample/Store.cs
new file mode 100644
index 0000000..2b28744
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Store.cs
@@ -0,0 +1,45 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LocationDotNetSample
+{
+    class Store
+    {
+        public string uuid { get; set; }
+        public string type { get; set; }
+        public string name { get; set; }
+        public string[] hours { get; set; }
+        public location location { get; set; }
+        public string pharmacy { get; set; }
+        public string[] services { get; set; }
+        public string storeNumber { get; set; }
+        public string supertarget { get; set; }
+
+    }
+
+    class location
+    {
+        public string stateCode { get; set; }
+        public string latitude { get; set; }
+        public string longitude { get; set; }
+        public string displayAddress { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/packages.config
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/packages.config b/samples/locationSample/LocationDotNetSample/packages.config
new file mode 100644
index 0000000..0b04b25
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/packages.config
@@ -0,0 +1,21 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<packages>
+  <package id="Geocoder" version="0.1.0.0" targetFramework="net45" />
+</packages>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/ReadMe.md
----------------------------------------------------------------------
diff --git a/samples/locationSample/ReadMe.md b/samples/locationSample/ReadMe.md
new file mode 100644
index 0000000..6283f6f
--- /dev/null
+++ b/samples/locationSample/ReadMe.md
@@ -0,0 +1,20 @@
+#App Services .NET Location-based sample application
+
+##Setup Instructions
+First, you must load the store data into a collection on your App Services org.  This is done with the following curl command:
+	curl -X POST -d '@stores.json' https://api.usergrid.com/<YOUR ORGANIZATION>/<YOUR APP>/<YOUR COLLECTION>
+Next you must make sure all of your references are in order.  It is assumed that you have already built the App Services .NET SDK and have those
+available.  From within Visual Studio, choose Project > Add Reference and be sure to add references to:
+- Usergrid.Sdk.dll
+- RestSharp.dll
+= Newtonsoft.Json.dll
+Then, you will need to add references to the GMap.Net libraries
+- GMap.NET.Core.dll
+- GMap.NET.WindowsForm.dll
+These files can be found off the Hot Build page at http://greatmaps.codeplex.com/releases/view/73162
+Next, install the Geocoding NuGet library by typing "Install-Package Geocoder" in the Package Manager
+
+In the file Form1.cs, change the org and app names to match your account.  Note that it is assumed you are using a sandbox account that does not
+require a separate login step.  If that is not the case, add a call to client.Login() with the appropriate credentials.
+
+After these setup steps, you should be able to compile and run the application.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg
----------------------------------------------------------------------
diff --git a/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg b/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg
new file mode 100644
index 0000000..9bd73ef
Binary files /dev/null and b/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec
----------------------------------------------------------------------
diff --git a/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec b/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec
new file mode 100644
index 0000000..ffd289a
--- /dev/null
+++ b/samples/locationSample/packages/Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>Geocoder</id>
+    <version>0.1.0.0</version>
+    <title>Geocoder</title>
+    <authors>Brandon Montgomery</authors>
+    <owners>Brandon Montgomery</owners>
+    <projectUrl>http://github.com/bmontgomery/Geocoder</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>A simple .NET library which utilizes Google's Geocoding API to geocode street addresses.</description>
+    <releaseNotes />
+    <copyright>Copyright 2013</copyright>
+    <tags>Geocoding .NET</tags>
+  </metadata>
+</package>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/packages/Geocoder.0.1.0.0/README.txt
----------------------------------------------------------------------
diff --git a/samples/locationSample/packages/Geocoder.0.1.0.0/README.txt b/samples/locationSample/packages/Geocoder.0.1.0.0/README.txt
new file mode 100644
index 0000000..930ec73
--- /dev/null
+++ b/samples/locationSample/packages/Geocoder.0.1.0.0/README.txt
@@ -0,0 +1,3 @@
+Apache Software Foundation policy prevents us from including DLLs and other binary files in our releases.
+
+You will have to download this package and place it in this directory yourself. 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/packages/Geocoder.0.1.0.0/lib/net45/Geocoder.dll
----------------------------------------------------------------------
diff --git a/samples/locationSample/packages/Geocoder.0.1.0.0/lib/net45/Geocoder.dll b/samples/locationSample/packages/Geocoder.0.1.0.0/lib/net45/Geocoder.dll
new file mode 100644
index 0000000..f07998d
Binary files /dev/null and b/samples/locationSample/packages/Geocoder.0.1.0.0/lib/net45/Geocoder.dll differ

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/packages/repositories.config
----------------------------------------------------------------------
diff --git a/samples/locationSample/packages/repositories.config b/samples/locationSample/packages/repositories.config
new file mode 100644
index 0000000..480990e
--- /dev/null
+++ b/samples/locationSample/packages/repositories.config
@@ -0,0 +1,20 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<repositories>
+  <repository path="..\LocationDotNetSample\packages.config" />
+</repositories>


[09/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/LoginTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/LoginTests.cs b/Usergrid.Sdk.IntegrationTests/LoginTests.cs
new file mode 100644
index 0000000..ea2590c
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/LoginTests.cs
@@ -0,0 +1,96 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+    [TestFixture]
+    public class LoginTests : BaseTest
+    {
+        [Test]
+        public void ShouldLoginSuccessfullyWithClientCredentials()
+        {
+            var client = new Client(Organization, Application, ApiUri);
+            client.Login(ClientId, ClientSecret, AuthType.Organization);
+        }
+
+		[Test]
+		public void ShouldThrowWithInvalidOrganizationCredentials()
+		{
+			var client = new Client (Organization, Application, ApiUri);
+
+			try
+			{
+				client.Login("Invalid_User_Name", "Invalid_Password", AuthType.Organization);
+				Assert.True(true, "Was expecting login to throw UserGridException");
+			}
+			catch (UsergridException e)
+			{
+				Assert.That (e.Message, Is.EqualTo ("invalid username or password"));
+				Assert.That(e.ErrorCode, Is.EqualTo("invalid_grant"));
+			}
+		}
+
+		[Test]
+		public void ShouldLoginSuccessfullyWithApplicationCredentials()
+		{
+			var client = new Client(Organization, Application, ApiUri);
+			client.Login(ApplicationId, ApplicationSecret, AuthType.Application);
+		}
+
+		[Test]
+		public void ShouldThrowWithInvalidApplicationCredentials()
+		{
+			var client = new Client (Organization, Application, ApiUri);
+
+			try
+			{
+				client.Login("Invalid_User_Name", "Invalid_Password", AuthType.Application);
+				Assert.True(true, "Was expecting login to throw UserGridException");
+			}
+			catch (UsergridException e)
+			{
+				Assert.That (e.Message, Is.EqualTo ("invalid username or password"));
+				Assert.That(e.ErrorCode, Is.EqualTo("invalid_grant"));
+			}
+		}
+
+		[Test]
+		public void ShouldLoginSuccessfullyWithUserCredentials()
+		{
+			var client = new Client(Organization, Application, ApiUri);
+			client.Login(UserId, UserSecret, AuthType.User);
+		}
+
+        [Test]
+        public void ShouldThrowWithInvalidUserCredentials()
+        {
+            var client = new Client(Organization, Application, ApiUri);
+
+            try
+            {
+                client.Login("Invalid_User_Name", "Invalid_Password", AuthType.User);
+                Assert.True(true, "Was expecting login to throw UserGridException");
+            }
+            catch (UsergridException e)
+            {
+				Assert.That (e.Message, Is.EqualTo ("invalid username or password"));
+                Assert.That(e.ErrorCode, Is.EqualTo("invalid_grant"));
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/NotificationTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/NotificationTests.cs b/Usergrid.Sdk.IntegrationTests/NotificationTests.cs
new file mode 100644
index 0000000..5c27546
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/NotificationTests.cs
@@ -0,0 +1,133 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+    [TestFixture]
+    public class NotificationTests : BaseTest
+    {
+        [Test]
+        public void ShouldCreateNotifierForAndroid()
+        {
+            const string notifierName = "test_notifier";
+            var client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteNotifierIfExists(client, notifierName);
+
+            client.CreateNotifierForAndroid(notifierName, GoogleApiKey /*e.g. AIzaSyCkXOtBQ7A9GoJsSLqZlod_YjEfxxxxxxx*/);
+
+            UsergridNotifier usergridNotifier = client.GetNotifier<UsergridNotifier>(notifierName);
+            Assert.That(usergridNotifier, Is.Not.Null);
+            Assert.That(usergridNotifier.Provider, Is.EqualTo("google"));
+            Assert.That(usergridNotifier.Name, Is.EqualTo(notifierName));
+        }
+
+        [Test]
+        public void ShouldCreateNotifierForApple()
+        {
+            const string notifierName = "test_notifier";
+            const string environment = "development";
+            var client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteNotifierIfExists(client, notifierName);
+
+            client.CreateNotifierForApple(notifierName, environment, P12CertificatePath /*e.g. c:\temp\pushtest_dev.p12*/);
+
+            UsergridNotifier usergridNotifier = client.GetNotifier<UsergridNotifier>(notifierName);
+
+            Assert.That(usergridNotifier, Is.Not.Null);
+            Assert.That(usergridNotifier.Environment, Is.EqualTo(environment));
+            Assert.That(usergridNotifier.Provider, Is.EqualTo("apple"));
+            Assert.That(usergridNotifier.Name, Is.EqualTo(notifierName));
+        }
+
+        [Test]
+        public void ShouldPublishNotifications()
+        {
+            //Set up
+            const string appleNotifierName = "apple_notifier";
+            const string googleNotifierName = "google_notifier";
+            const string username = "NotificationTestUser";
+            const string appleTestMessge = "test message for Apple";
+            const string androidTestMessage = "test message for Android";
+
+            var client = InitializeClientAndLogin(AuthType.Organization);
+            CreateAppleNotifier(client,appleNotifierName);            
+            CreateAndroidNotifier(client,googleNotifierName);            
+            CreateUser(username, client);
+
+            //Setup Notifications
+            var appleNotification = new AppleNotification(appleNotifierName, appleTestMessge, "chime");
+            var googleNotification = new AndroidNotification(googleNotifierName, androidTestMessage);
+            //Setup recipients and scheduling
+            INotificationRecipients recipients = new NotificationRecipients().AddUserWithName(username);
+            var schedulerSettings = new NotificationSchedulerSettings {DeliverAt = DateTime.Now.AddDays(1)};
+
+            client.PublishNotification(new Notification[] {appleNotification, googleNotification}, recipients, schedulerSettings);
+
+            //Assert
+            UsergridCollection<dynamic> entities = client.GetEntities<dynamic>("notifications", query: "order by created desc");
+            dynamic notification = entities.FirstOrDefault();
+
+            Assert.IsNotNull(notification);
+            Assert.IsNotNull(notification.uuid);
+            Assert.AreEqual(appleTestMessge, notification.payloads.apple_notifier.aps.alert.Value);
+            Assert.AreEqual("chime", notification.payloads.apple_notifier.aps.sound.Value);
+            Assert.AreEqual(androidTestMessage, notification.payloads.google_notifier.data.Value);
+
+            //Cancel notification and assert it is canceled
+            client.CancelNotification(notification.uuid.Value);
+            dynamic entity = client.GetEntity<dynamic>("notifications", notification.uuid.Value);
+            Assert.AreEqual(entity.state.Value, "CANCELED");
+        }
+
+        private static void CreateUser(string username, IClient client)
+        {
+            var userEntity = new MyUsergridUser {UserName = username};
+            // See if this user exists
+            var userFromUsergrid = client.GetUser<UsergridUser>(username);
+            // Delete if exists
+            if (userFromUsergrid != null) {
+                client.DeleteUser(username);
+            }
+            // Now create the user
+            client.CreateUser(userEntity);
+        }
+
+
+        private void CreateAppleNotifier(IClient client, string notifierName)
+        {
+            DeleteNotifierIfExists(client, notifierName);
+            client.CreateNotifierForApple(notifierName, "development", base.P12CertificatePath);
+        }
+
+        private void CreateAndroidNotifier(IClient client, string notifierName)
+        {
+            DeleteNotifierIfExists(client, notifierName);
+            client.CreateNotifierForAndroid(notifierName, GoogleApiKey);
+        }
+        private static void DeleteNotifierIfExists(IClient client, string notifierName)
+        {
+            var usergridNotifier = client.GetNotifier<UsergridNotifier>(notifierName);
+            if (usergridNotifier != null)
+                client.DeleteNotifier(usergridNotifier.Uuid);
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/Properties/AssemblyInfo.cs b/Usergrid.Sdk.IntegrationTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..690e77a
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("Usergrid.Sdk.IntegrationTests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Usergrid.Sdk.IntegrationTests")]
+[assembly: AssemblyCopyright("Copyright � Microsoft 2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("4ea5bdce-1904-425c-bf6a-1a7fc05a4206")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("0.1.0.0")]

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/UserManagementTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/UserManagementTests.cs b/Usergrid.Sdk.IntegrationTests/UserManagementTests.cs
new file mode 100644
index 0000000..843e6f1
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/UserManagementTests.cs
@@ -0,0 +1,96 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NUnit.Framework;
+using Newtonsoft.Json;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+    public class MyUsergridUser : UsergridUser
+    {
+        [JsonProperty("city")]
+        public string City { get; set; }
+
+        [JsonProperty("password")]
+        public string Password { get; set; }
+    }
+
+    [TestFixture]
+    public class UserManagementTests : BaseTest
+    {
+        private IClient _client;
+        [SetUp]
+        public void Setup()
+        {
+            _client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteUserIfExists(_client, "user1");
+        }
+
+        [Test]
+        public void ShouldChangePassword()
+        {
+            MyUsergridUser user = new MyUsergridUser { UserName = "user1", Password = "user1", Email = "user1@gmail.com", City = "city1" };
+            _client.CreateUser(user);
+
+            user = _client.GetUser<MyUsergridUser>("user1");
+            Assert.IsNotNull(user);
+
+            _client.Login("user1", "user1", AuthType.User);
+
+            _client.ChangePassword("user1", "user1", "user1-2");
+
+            _client.Login("user1", "user1-2", AuthType.User);
+        }
+
+        [Test]
+        public void ShouldCreateUser()
+        {
+            MyUsergridUser user = new MyUsergridUser { UserName = "user1", Password = "user1", Email = "user1@gmail.com", City = "city1" };
+            _client.CreateUser(user);
+            user = _client.GetUser<MyUsergridUser>("user1");
+
+            Assert.IsNotNull(user);
+            Assert.AreEqual("user1", user.UserName);
+            Assert.AreEqual("user1@gmail.com", user.Email);
+            Assert.AreEqual("city1", user.City);
+            Assert.IsNull(user.Password);
+
+            _client.DeleteUser("user1");
+        }
+
+        [Test]
+        public void ShouldUpdateUser()
+        {
+            var user = new MyUsergridUser {UserName = "user1", Password = "user1", Email = "user1@gmail.com", City = "city1"};
+                _client.CreateUser(user);
+                user = _client.GetUser<MyUsergridUser>("user1");
+
+            user.Email = "user-2@gmail.com";
+            user.City = "city1-2";
+            user.Password = "user1-2";
+            _client.UpdateUser(user);
+
+            user = _client.GetUser<MyUsergridUser>("user1");
+            Assert.IsNotNull(user);
+            Assert.AreEqual("user1", user.UserName);
+            Assert.AreEqual("user-2@gmail.com", user.Email);
+            Assert.AreEqual("city1-2", user.City);
+            Assert.IsNull(user.Password);
+
+            _client.DeleteUser("user1");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.csproj
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.csproj b/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.csproj
new file mode 100644
index 0000000..8efabfd
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.csproj
@@ -0,0 +1,109 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Usergrid.Sdk.IntegrationTests</RootNamespace>
+    <AssemblyName>Usergrid.Sdk.IntegrationTests</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <HintPath>..\packages\NUnit.2.6.2\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\packages\RestSharp.104.1\lib\net4\RestSharp.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ConnectionTests.cs" />
+    <Compile Include="DeviceTests.cs" />
+    <Compile Include="GroupTests.cs" />
+    <Compile Include="LoginTests.cs" />
+    <Compile Include="NotificationTests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="UsergridFriend.cs" />
+    <Compile Include="UserManagementTests.cs" />
+    <Compile Include="BaseTest.cs" />
+    <Compile Include="EntityPagingTests.cs" />
+    <Compile Include="EntityCrudTests.cs" />
+    <Compile Include="Friend.cs" />
+    <Compile Include="ActivitiesTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ItemGroup>
+    <Content Include="Usergrid.Sdk.IntegrationTests.dll.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Usergrid.Sdk\Usergrid.Sdk.csproj">
+      <Project>{437D108F-528C-4B2A-B399-06CF02DEB08B}</Project>
+      <Name>Usergrid.Sdk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <PropertyGroup>
+    <PostBuildEvent>copy /y $(ProjectDir)MySettings.config $(ProjectDir)$(OutDir)</PostBuildEvent>
+  </PropertyGroup>
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.dll.config
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.dll.config b/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.dll.config
new file mode 100644
index 0000000..e8fd2e5
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/Usergrid.Sdk.IntegrationTests.dll.config
@@ -0,0 +1,33 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+
+<configuration>
+	<appSettings>
+                <add key="apiUri" value="BASE_URI_OF_USERGRID_API" />
+		<add key="organization" value="ORGANIZATION_NAME" />
+		<add key="application" value="APPLICATION_NAME" />
+		<add key="clientId" value="CLIENT_ID" />
+		<add key="clientSecret" value="CLIENT_SECRET" />
+		<add key="applicationId" value="APPLICATION_ID" />
+		<add key="applicationSecret" value="APPLICATION_SECRET" />
+ 		<add key="userId" value="USER_ID" />
+		<add key="userSecret" value="USER_SECRET" />
+	    <add key="P12CertificatePath" value="C:\Path_to\certificate.p12" />
+		<add key="googleApiKey" value="AIzaSyBwPpMkW6FWW-XXXXXXXXXXXXX" />
+</appSettings>
+</configuration>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/UsergridFriend.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/UsergridFriend.cs b/Usergrid.Sdk.IntegrationTests/UsergridFriend.cs
new file mode 100644
index 0000000..d68003c
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/UsergridFriend.cs
@@ -0,0 +1,23 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests {
+    public class UsergridFriend : UsergridEntity
+    {
+        public int Age { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/packages.config
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/packages.config b/Usergrid.Sdk.IntegrationTests/packages.config
new file mode 100644
index 0000000..f3b5dc9
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/packages.config
@@ -0,0 +1,24 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<packages>
+  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
+  <package id="NSubstitute" version="1.6.0.0" targetFramework="net40" />
+  <package id="NUnit" version="2.6.2" targetFramework="net40" />
+  <package id="RestSharp" version="104.1" targetFramework="net40" />
+</packages>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/AuthenticationManagerTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/AuthenticationManagerTests.cs b/Usergrid.Sdk.Tests/AuthenticationManagerTests.cs
new file mode 100644
index 0000000..ce79f23
--- /dev/null
+++ b/Usergrid.Sdk.Tests/AuthenticationManagerTests.cs
@@ -0,0 +1,135 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+using AuthenticationManager = Usergrid.Sdk.Manager.AuthenticationManager;
+
+namespace Usergrid.Sdk.Tests
+{
+    [TestFixture]
+    public class AuthenticationManagerTests
+    {
+        [Test]
+        public void ShouldLoginWithClientCredentialsWithCorrectRequestBodyForAuthTypeClient()
+        {
+            IUsergridRequest request = Helpers.InitializeUserGridRequestWithAccessToken("accessToken");
+
+            const string clientLoginId = "login";
+            const string clientSecret = "secret";
+
+            var authenticationManager = new AuthenticationManager(request);
+            authenticationManager.Login(clientLoginId, clientSecret, AuthType.Organization);
+
+            request
+                .Received(1)
+                .ExecuteJsonRequest<LoginResponse>(
+                    Arg.Any<string>(),
+                    Arg.Any<Method>(),
+                    Arg.Is<ClientIdLoginPayload>(d => d.GrantType == "client_credentials" && d.ClientId == clientLoginId && d.ClientSecret == clientSecret));
+        }
+
+        [Test]
+        public void ShouldLoginWithClientCredentialsWithCorrectRequestBodyForAuthTypeApplication()
+        {
+            IUsergridRequest request = Helpers.InitializeUserGridRequestWithAccessToken("accessToken");
+
+            const string clientLoginId = "login";
+            const string clientSecret = "secret";
+
+            var authenticationManager = new AuthenticationManager(request);
+            authenticationManager.Login(clientLoginId, clientSecret, AuthType.Application);
+
+            request
+                .Received(1)
+                .ExecuteJsonRequest<LoginResponse>(
+                    Arg.Any<string>(),
+                    Arg.Any<Method>(),
+                    Arg.Is<ClientIdLoginPayload>(d => d.GrantType == "client_credentials" && d.ClientId == clientLoginId && d.ClientSecret == clientSecret));
+        }
+
+        [Test]
+        public void ShouldLoginWithUserCredentialsWithCorrectRequestBodyForAuthTypeUser()
+        {
+            IUsergridRequest request = Helpers.InitializeUserGridRequestWithAccessToken("accessToken");
+
+            const string clientLoginId = "login";
+            const string clientSecret = "secret";
+
+            var authenticationManager = new AuthenticationManager(request);
+            authenticationManager.Login(clientLoginId, clientSecret, AuthType.User);
+
+            request
+                .Received(1)
+                .ExecuteJsonRequest<LoginResponse>(
+                    Arg.Any<string>(),
+                    Arg.Any<Method>(),
+                    Arg.Is<UserLoginPayload>(d => d.GrantType == "password" && d.UserName == clientLoginId && d.Password == clientSecret));
+        }
+
+        [Test]
+        public void ShouldNotMakeACallToEndPointWhenLoggingWithAuthTypeNone()
+        {
+            var request = Substitute.For<IUsergridRequest>();
+
+            var authenticationManager = new AuthenticationManager(request);
+            authenticationManager.Login(null, null, AuthType.None);
+
+            request.DidNotReceiveWithAnyArgs().ExecuteJsonRequest<LoginResponse>(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>());
+        }
+
+        [Test]
+        [TestCase(null, AuthType.None)]
+        [TestCase("accessToken1", AuthType.Application)]
+        [TestCase("accessToken2", AuthType.Organization)]
+        [TestCase("accessToken4", AuthType.User)]
+        public void ShouldSetTheAccessToken(string accessToken, AuthType authType)
+        {
+            IUsergridRequest request = Helpers.InitializeUserGridRequestWithAccessToken(accessToken);
+
+            var authenticationManager = new AuthenticationManager(request);
+            authenticationManager.Login(null, null, authType);
+
+            request.Received(1).AccessToken = accessToken;
+        }
+
+        [Test]
+        public void ShouldTranslateToUserGridErrorAndThrowWhenServiceReturnsBadRequest()
+        {
+            const string invalidUsernameOrPassword = "Invalid username or password";
+            const string invalidGrant = "invalid_grant";
+
+            var restResponseContent = new UsergridError {Description = invalidUsernameOrPassword, Error = invalidGrant};
+            var restResponse = Helpers.SetUpRestResponseWithContent<LoginResponse>(HttpStatusCode.BadRequest, restResponseContent);
+            var request = Helpers.SetUpUsergridRequestWithRestResponse(restResponse);
+
+            var authenticationManager = new AuthenticationManager(request);
+            try
+            {
+                authenticationManager.Login(null, null, AuthType.Organization);
+                throw new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual(invalidGrant, e.ErrorCode);
+                Assert.AreEqual(invalidUsernameOrPassword, e.Message);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/ActivityTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/ActivityTests.cs b/Usergrid.Sdk.Tests/ClientTests/ActivityTests.cs
new file mode 100644
index 0000000..5cec130
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/ActivityTests.cs
@@ -0,0 +1,86 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class ActivityTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _client = new Client(null, null) {EntityManager = _entityManager};
+        }
+
+        #endregion
+
+        private IEntityManager _entityManager;
+        private IClient _client;
+
+        [Test]
+        public void GetGroupActivitiesShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            _client.GetGroupActivities<UsergridActivity>("groupIdentifier");
+
+            _entityManager.Received(1).GetEntities<UsergridActivity>("/groups/groupIdentifier/activities");
+        }
+
+        [Test]
+        public void GetUserActivitiesShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            _client.GetUserActivities<UsergridActivity>("userIdentifier");
+
+            _entityManager.Received(1).GetEntities<UsergridActivity>("/users/userIdentifier/activities");
+        }
+
+        [Test]
+        public void PostActivityShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            var usergridActivity = new UsergridActivity();
+
+            _client.PostActivity("userIdentifier", usergridActivity);
+
+            _entityManager.Received(1).CreateEntity("/users/userIdentifier/activities", usergridActivity);
+        }
+
+        [Test]
+        public void PostActivityToGroupShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            var usergridActivity = new UsergridActivity();
+
+            _client.PostActivityToGroup("groupIdentifier", usergridActivity);
+
+            _entityManager.Received(1).CreateEntity("/groups/groupIdentifier/activities", usergridActivity);
+        }
+
+        [Test]
+        public void PostActivityToUsersFollowersInGroupShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            var usergridActivity = new UsergridActivity();
+
+            _client.PostActivityToUsersFollowersInGroup("userIdentifier", "groupIdentifier", usergridActivity);
+
+            _entityManager.Received(1).CreateEntity("/groups/groupIdentifier/users/userIdentifier/activities", usergridActivity);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/ConnectionTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/ConnectionTests.cs b/Usergrid.Sdk.Tests/ClientTests/ConnectionTests.cs
new file mode 100644
index 0000000..6fe0721
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/ConnectionTests.cs
@@ -0,0 +1,88 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System.Collections.Generic;
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class ConnectionTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _connectionManager = Substitute.For<IConnectionManager>();
+            _client = new Client(null, null) {ConnectionManager = _connectionManager};
+        }
+
+        #endregion
+
+        private IConnectionManager _connectionManager;
+        private IClient _client;
+
+        [Test]
+        public void CreateConnectionShouldDelegateToConnectionManagerWithCorrectParameters()
+        {
+            var connection = new Connection();
+            _client.CreateConnection(connection);
+
+            _connectionManager.Received(1).CreateConnection(connection);
+        }
+
+        [Test]
+        public void DeleteConnectionsShouldDelegateToConnectionManagerWithCorrectParameters()
+        {
+            var connection = new Connection();
+
+            _client.DeleteConnection(connection);
+
+            _connectionManager.Received(1).DeleteConnection(connection);
+        }
+
+        [Test]
+        public void GetConnectionsOfSpecificTypeShouldDelegateToConnectionManagerWithCorrectParameters()
+        {
+            var connection = new Connection();
+            var enityList = new List<UsergridEntity>();
+
+            _connectionManager.GetConnections<UsergridEntity>(connection).Returns(enityList);
+
+            IList<UsergridEntity> returnedEntityList = _client.GetConnections<UsergridEntity>(connection);
+
+            _connectionManager.Received(1).GetConnections<UsergridEntity>(connection);
+            Assert.AreEqual(enityList, returnedEntityList);
+        }
+
+        [Test]
+        public void GetConnectionsShouldDelegateToConnectionManagerWithCorrectParameters()
+        {
+            var connection = new Connection();
+            var enityList = new List<UsergridEntity>();
+            _connectionManager.GetConnections(connection).Returns(enityList);
+
+            IList<UsergridEntity> returnedEntityList = _client.GetConnections(connection);
+
+            _connectionManager.Received(1).GetConnections(connection);
+            Assert.AreEqual(enityList, returnedEntityList);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/DeviceTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/DeviceTests.cs b/Usergrid.Sdk.Tests/ClientTests/DeviceTests.cs
new file mode 100644
index 0000000..17307d3
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/DeviceTests.cs
@@ -0,0 +1,143 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class DeviceTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _client = new Client(null, null) {EntityManager = _entityManager};
+        }
+
+        #endregion
+
+        private IEntityManager _entityManager;
+        private IClient _client;
+
+        [Test]
+        public void CreateDeviceShouldDelegateToEntityManagerWithCorrectCollectionNameAndDevice()
+        {
+            var device = new UsergridDevice();
+
+            _client.CreateDevice(device);
+
+            _entityManager.Received(1).CreateEntity("devices", device);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateDeviceShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.CreateEntity("devices", Arg.Any<UsergridDevice>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateDevice<UsergridDevice>(null);
+        }
+
+        [Test]
+        public void DeleteDeviceShouldDelegateToEntityManagerrWithCorrectCollectionNameAndIdentfier()
+        {
+            _client.DeleteDevice("deviceName");
+
+            _entityManager.Received(1).DeleteEntity("devices", "deviceName");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void DeleteDeviceShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.DeleteEntity("devices", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.DeleteDevice(null);
+        }
+
+        [Test]
+        public void GetDeviceShouldDelegateToEntityManagerWithCorrectCollectionNameAndIdentifier()
+        {
+            _client.GetDevice<UsergridDevice>("identifier");
+
+            _entityManager.Received(1).GetEntity<UsergridDevice>("devices", "identifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void GetDeviceShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.GetEntity<UsergridDevice>("devices", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.GetDevice<UsergridDevice>(null);
+        }
+
+        [Test]
+        public void GetDeviceShouldReturnNullForUnexistingDevice()
+        {
+            _entityManager.GetEntity<UsergridDevice>("devices", "identifier").Returns(x => null);
+
+            var usergridDevice = _client.GetDevice<UsergridDevice>("identifier");
+
+            Assert.IsNull(usergridDevice);
+        }
+
+        [Test]
+        public void GetDeviceShouldReturnUsergridDevice()
+        {
+            var usergridDevice = new UsergridDevice();
+            _entityManager.GetEntity<UsergridDevice>("devices", "identifier").Returns(x => usergridDevice);
+
+            var returnedDevice = _client.GetDevice<UsergridDevice>("identifier");
+
+            Assert.AreEqual(usergridDevice, returnedDevice);
+        }
+
+        [Test]
+        public void UpdateDeviceShouldDelegateToEntityManagerrWithCorrectCollectionNameAndDeviceNameAsTheIdentifier()
+        {
+            var device = new UsergridDevice {Name = "deviceName"};
+
+            _client.UpdateDevice(device);
+
+            _entityManager.Received(1).UpdateEntity("devices", device.Name, device);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void UpdateDeviceShouldPassOnTheException()
+        {
+            var device = new UsergridDevice {Name = "deviceName"};
+
+            _entityManager
+                .When(m => m.UpdateEntity("devices", device.Name, device))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.UpdateDevice(device);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/EntityTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/EntityTests.cs b/Usergrid.Sdk.Tests/ClientTests/EntityTests.cs
new file mode 100644
index 0000000..bf9511d
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/EntityTests.cs
@@ -0,0 +1,210 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class EntityTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _client = new Client(null, null) {EntityManager = _entityManager};
+        }
+
+        #endregion
+
+        private IEntityManager _entityManager;
+        private IClient _client;
+
+
+        [Test]
+        public void CreateEntityShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            var entity = new {Name = "test"};
+
+            _client.CreateEntity<object>("collection", entity);
+
+            _entityManager.Received(1).CreateEntity<object>("collection", entity);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateEntityShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.CreateEntity(Arg.Any<string>(), Arg.Any<object>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateEntity<object>(null, null);
+        }
+
+        [Test]
+        public void CreateEntityShouldReturnUserGridEntity()
+        {
+            var entity = new object();
+            _entityManager.CreateEntity("collection", entity).ReturnsForAnyArgs(entity);
+
+            var returnedEntity = _client.CreateEntity("collection", entity);
+
+            Assert.AreEqual(entity, returnedEntity);
+        }
+
+        [Test]
+        public void DeleteEntityShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.DeleteEntity("collection", "identifier");
+
+            _entityManager.Received(1).DeleteEntity("collection", "identifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void DeleteEntityShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.DeleteEntity(Arg.Any<string>(), Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.DeleteEntity(null, null);
+        }
+
+        [Test]
+        public void GetEntitiesShouldDefaultTheLimit()
+        {
+            _client.GetEntities<object>("collection");
+
+            _entityManager.Received(1).GetEntities<object>("collection", 10);
+        }
+
+        [Test]
+        public void GetEntitiesShouldDefaultTheQueryToNull()
+        {
+            _client.GetEntities<object>("collection", 10);
+
+            _entityManager.Received(1).GetEntities<object>("collection", 10, null);
+        }
+
+        [Test]
+        public void GetEntitiesShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.GetEntities<object>("collection", 20, "query");
+
+            _entityManager.Received(1).GetEntities<object>("collection", 20, "query");
+        }
+
+        [Test]
+        public void GetEntityShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.GetEntity<object>("collection", "identifier");
+
+            _entityManager.Received(1).GetEntity<object>("collection", "identifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void GetEntityShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.GetEntity<object>(Arg.Any<string>(), Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.GetEntity<object>(null, null);
+        }
+
+        [Test]
+        public void GetEntityShouldReturnEntityFromEntityManager()
+        {
+            var entity = new object();
+            _entityManager.GetEntity<object>("collection", "identifier").ReturnsForAnyArgs(entity);
+
+            object createdEntity = _client.GetEntity<object>("collection", "identifier");
+
+            Assert.AreEqual(entity, createdEntity);
+        }
+
+        [Test]
+        public void GetEntityShouldReturnNullForUnexistingEntity()
+        {
+            _entityManager.GetEntity<UsergridEntity>("collection", "identifier").Returns(x => null);
+
+            var usergridEntity = _client.GetEntity<UsergridDevice>("collection", "identifier");
+
+            Assert.IsNull(usergridEntity);
+        }
+
+        [Test]
+        public void GetNextEntitiesShouldDefaultTheQueryToNull()
+        {
+            _client.GetNextEntities<object>("collection");
+
+            _entityManager.Received(1).GetNextEntities<object>("collection", null);
+        }
+
+        [Test]
+        public void GetNextEntitiesShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.GetNextEntities<object>("collection", "query");
+
+            _entityManager.Received(1).GetNextEntities<object>("collection", "query");
+        }
+
+        [Test]
+        public void GetPreviousEntitiesShouldDefaultTheQueryToNull()
+        {
+            _client.GetPreviousEntities<object>("collection");
+
+            _entityManager.Received(1).GetPreviousEntities<object>("collection", null);
+        }
+
+        [Test]
+        public void GetPreviousEntitiesShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.GetPreviousEntities<object>("collection", "query");
+
+            _entityManager.Received(1).GetPreviousEntities<object>("collection", "query");
+        }
+
+        [Test]
+        public void UpdateEntityShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            var entity = new {Name = "test"};
+
+            _client.UpdateEntity<object>("collection", "identifier", entity);
+
+            _entityManager.Received(1).UpdateEntity<object>("collection", "identifier", entity);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void UpdateEntityShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.UpdateEntity(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<object>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.UpdateEntity<object>(null, null, null);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/FeedTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/FeedTests.cs b/Usergrid.Sdk.Tests/ClientTests/FeedTests.cs
new file mode 100644
index 0000000..048e121
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/FeedTests.cs
@@ -0,0 +1,65 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class FeedTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _client = new Client(null, null) {EntityManager = _entityManager};
+        }
+
+        #endregion
+
+        private IEntityManager _entityManager;
+        private IClient _client;
+
+        [Test]
+        public void GetGroupFeedShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            var usergridActivities = new UsergridCollection<UsergridActivity>();
+            _entityManager.GetEntities<UsergridActivity>("/groups/groupIdentifier/feed").Returns(usergridActivities);
+
+            UsergridCollection<UsergridActivity> returnedActivities = _client.GetGroupFeed<UsergridActivity>("groupIdentifier");
+
+            _entityManager.Received(1).GetEntities<UsergridActivity>("/groups/groupIdentifier/feed");
+            Assert.AreEqual(usergridActivities, returnedActivities);
+        }
+
+        [Test]
+        public void GetUserFeedShouldDelegateToEntityManagerWithCorrectEndpoint()
+        {
+            var usergridActivities = new UsergridCollection<UsergridActivity>();
+            _entityManager.GetEntities<UsergridActivity>("/users/userIdentifier/feed").Returns(usergridActivities);
+
+            UsergridCollection<UsergridActivity> returnedActivities = _client.GetUserFeed<UsergridActivity>("userIdentifier");
+
+            _entityManager.Received(1).GetEntities<UsergridActivity>("/users/userIdentifier/feed");
+            Assert.AreEqual(usergridActivities, returnedActivities);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/GroupTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/GroupTests.cs b/Usergrid.Sdk.Tests/ClientTests/GroupTests.cs
new file mode 100644
index 0000000..5b9347e
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/GroupTests.cs
@@ -0,0 +1,199 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class GroupTests
+    {
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _request = Substitute.For<IUsergridRequest>();
+            _client = new Client(null, null, request: _request) {EntityManager = _entityManager};
+        }
+
+        private IEntityManager _entityManager;
+        private IClient _client;
+        private IUsergridRequest _request;
+
+        [Test]
+        public void AddUserToGroupShouldDelegateToEntityManagerrWithCorrectConnectionAndIdentifiers()
+        {
+            _client.AddUserToGroup("groupIdentifier", "userIdentifier");
+
+            _entityManager.Received(1).CreateEntity<object>("/groups/groupIdentifier/users/userIdentifier", null);
+        }
+
+        [Test]
+        public void CreateGroupShouldDelegateToEntityManagerWithCorrectCollectionNameAndUser()
+        {
+            var group = new UsergridGroup();
+
+            _client.CreateGroup(group);
+
+            _entityManager.Received(1).CreateEntity("groups", group);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateGroupShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.CreateEntity("groups", Arg.Any<UsergridGroup>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateGroup<UsergridGroup>(null);
+        }
+
+        [Test]
+        public void DeleteGroupShouldDelegateToEntityManagerrWithCorrectCollectionNameAndIdentfier()
+        {
+            _client.DeleteGroup("groupPath");
+
+            _entityManager.Received(1).DeleteEntity("groups", "groupPath");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void DeleteGroupShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.DeleteEntity("groups", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.DeleteGroup(null);
+        }
+
+        [Test]
+        public void DeleteUserFromGroupShouldDelegateToEntityManagerrWithCorrectConnectionAndIdentifier()
+        {
+            _client.DeleteUserFromGroup("groupIdentifier", "userIdentifier");
+
+            _entityManager.Received(1).DeleteEntity("/groups/groupIdentifier/users", "userIdentifier");
+        }
+
+        [Test]
+        public void GetGroupShouldDelegateToEntityManagerWithCorrectCollectionNameAndIdentifier()
+        {
+            _client.GetGroup<UsergridGroup>("identifier");
+
+            _entityManager.Received(1).GetEntity<UsergridGroup>("groups", "identifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void GetGroupShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.GetEntity<UsergridGroup>("groups", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.GetGroup<UsergridGroup>(null);
+        }
+
+        [Test]
+        public void GetGroupShouldReturnNullForUnexistingGroup()
+        {
+            _entityManager.GetEntity<UsergridUser>("groups", "identifier").Returns(x => null);
+
+            var usergridGroup = _client.GetGroup<UsergridGroup>("identifier");
+
+            Assert.IsNull(usergridGroup);
+        }
+
+        [Test]
+        public void GetGroupShouldReturnUsergridGroup()
+        {
+            var usergridGroup = new UsergridGroup();
+            _entityManager.GetEntity<UsergridGroup>("groups", "identifier").Returns(x => usergridGroup);
+
+            var returnedGroup = _client.GetGroup<UsergridGroup>("identifier");
+
+            Assert.AreEqual(usergridGroup, returnedGroup);
+        }
+
+        [Test]
+        public void UpdateGroupShouldDelegateToEntityManagerrWithCorrectCollectionNameAndGroupPathAsTheIdentifier()
+        {
+            var group = new UsergridGroup {Path = "groupPath"};
+
+            _client.UpdateGroup(group);
+
+            _entityManager.Received(1).UpdateEntity("groups", group.Path, group);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void UpdateGroupShouldPassOnTheException()
+        {
+            var group = new UsergridGroup {Path = "groupPath"};
+
+            _entityManager
+                .When(m => m.UpdateEntity("groups", group.Path, group))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.UpdateGroup(group);
+        }
+
+        [Test]
+        public void GetAllUsersInGroupShouldGetAllUsersInGroup()
+        {
+            var expectedUserList = new List<UsergridUser>() {new UsergridUser() {UserName = "userName", Name = "user1"}};
+            var responseContent = new UsergridGetResponse<UsergridUser>() {Entities = expectedUserList};
+            var restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<UsergridUser>>(HttpStatusCode.OK, responseContent);
+            
+            _request.ExecuteJsonRequest("/groups/groupName/users", Method.GET).Returns(restResponse);
+
+            var returnedUsers = _client.GetAllUsersInGroup<UsergridUser>("groupName");
+
+            _request.Received(1).ExecuteJsonRequest("/groups/groupName/users", Method.GET);
+            Assert.AreEqual(1, returnedUsers.Count);
+            Assert.AreEqual("userName", returnedUsers[0].UserName);
+            Assert.AreEqual("user1", returnedUsers[0].Name);
+        }
+
+        [Test]
+        public void GetAllUsersInGroupWillThrowWhenBadRequest()
+        {
+            UsergridError error = new UsergridError() {Description = "exception description", Error = "error code"};
+            var restResponse = Helpers.SetUpRestResponseWithContent<UsergridError>(HttpStatusCode.BadRequest, error);
+            
+            _request.ExecuteJsonRequest("/groups/groupName/users", Method.GET).Returns(restResponse);
+
+            try
+            {
+                _client.GetAllUsersInGroup<UsergridUser>("groupName");
+                Assert.Fail("Was expecting Usergrid exception to be thrown.");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual(error.Description, e.Message);
+                Assert.AreEqual(error.Error, e.ErrorCode);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/LoginTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/LoginTests.cs b/Usergrid.Sdk.Tests/ClientTests/LoginTests.cs
new file mode 100644
index 0000000..6094162
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/LoginTests.cs
@@ -0,0 +1,67 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class LoginTests
+    {
+        [TestCase("login1", "secret1", AuthType.Application)]
+        [TestCase("login2", "secret2", AuthType.Organization)]
+        [TestCase("login3", "secret3", AuthType.None)]
+        [TestCase("login4", "secret4", AuthType.User)]
+        public void LoginShouldDelegateToAuthenticationManagerWithCorrectParameters(string login, string secret, AuthType authType)
+        {
+            var authenticationManager = Substitute.For<IAuthenticationManager>();
+
+            var client = new Client(null, null) {AuthenticationManager = authenticationManager};
+
+            client.Login(login, secret, authType);
+
+            authenticationManager.Received(1).Login(login, secret, authType);
+        }
+
+        [Test]
+        public void LoginShouldDelegateToAuthenticationManager()
+        {
+            var authenticationManager = Substitute.For<IAuthenticationManager>();
+
+            var client = new Client(null, null) {AuthenticationManager = authenticationManager};
+
+            client.Login(null, null, AuthType.None);
+
+            authenticationManager.Received(1).Login(null, null, AuthType.None);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void LoginShouldPassOnTheException()
+        {
+            var authenticationManager = Substitute.For<IAuthenticationManager>();
+            authenticationManager
+                .When(m => m.Login(null, null, AuthType.None))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+
+            var client = new Client(null, null) {AuthenticationManager = authenticationManager};
+            client.Login(null, null, AuthType.None);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/NotificationTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/NotificationTests.cs b/Usergrid.Sdk.Tests/ClientTests/NotificationTests.cs
new file mode 100644
index 0000000..7f9a5fe
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/NotificationTests.cs
@@ -0,0 +1,149 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class NotificationTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _notificationsManager = Substitute.For<INotificationsManager>();
+            _entityManager = Substitute.For<IEntityManager>();
+            _client = new Client(null, null) {NotificationsManager = _notificationsManager, EntityManager = _entityManager};
+        }
+
+        #endregion
+
+        private INotificationsManager _notificationsManager;
+        private IEntityManager _entityManager;
+        private IClient _client;
+
+        [Test]
+        public void CancelNotificationShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.CancelNotification("notificationIdentifier");
+
+            _entityManager.Received(1).UpdateEntity("/notifications", "notificationIdentifier", Arg.Is<CancelNotificationPayload>(p => p.Canceled));
+        }
+
+        [Test]
+        public void CreateNotifierForAndroidShouldDelegateToNotificationsManager()
+        {
+            _client.CreateNotifierForAndroid("notifierName", "apiKey");
+
+            _notificationsManager.Received(1).CreateNotifierForAndroid("notifierName", "apiKey");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateNotifierForAndroidShouldPassOnTheException()
+        {
+            _notificationsManager
+                .When(m => m.CreateNotifierForAndroid(Arg.Any<string>(), Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateNotifierForAndroid(null, null);
+        }
+
+        [Test]
+        public void CreateNotifierForAppleShouldDelegateToNotificationsManager()
+        {
+            _client.CreateNotifierForApple("notifierName", "development", "certificateFilePath");
+
+            _notificationsManager.Received(1).CreateNotifierForApple("notifierName", "development", "certificateFilePath");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateNotifierForAppleShouldPassOnTheException()
+        {
+            _notificationsManager
+                .When(m => m.CreateNotifierForApple(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateNotifierForApple(null, null, null);
+        }
+
+        [Test]
+        public void DeleteNotifierShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.DeleteNotifier("notifierIdentifier");
+
+            _entityManager.Received(1).DeleteEntity("/notifiers", "notifierIdentifier");
+        }
+
+        [Test]
+        public void GetNotifierShouldDelegateToEntityManagerWithCorrectParameters()
+        {
+            _client.GetNotifier<UsergridNotifier>("notifierIdentifier");
+
+            _entityManager.Received(1).GetEntity<UsergridNotifier>("/notifiers", "notifierIdentifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void GetNotifierShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.GetEntity<UsergridNotifier>(Arg.Any<string>(), Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.GetNotifier<UsergridNotifier>(null);
+        }
+
+        [Test]
+        public void GetNotifierShouldReturnNullForUnexistingNotifier()
+        {
+            _entityManager.GetEntity<UsergridNotifier>("/notifiers", "notifierIdentifier").Returns(x => null);
+
+            var returnedEntity = _client.GetNotifier<UsergridNotifier>("notifierIdentifier");
+
+            Assert.IsNull(returnedEntity);
+        }
+
+        [Test]
+        public void GetNotifierShouldReturnUsergridNotifierFromEntityManager() {
+            var entity = new UsergridNotifier();
+            _entityManager.GetEntity<UsergridNotifier>("/notifiers", "notifierIdentifier").Returns(x => entity);
+
+            var returnedEntity = _client.GetNotifier<UsergridNotifier>("notifierIdentifier");
+
+            Assert.AreEqual(entity, returnedEntity);
+        }
+
+        [Test]
+        public void PublishNotificationShouldDelegateToNotificationsManagerWithCorrectParameters()
+        {
+            var notifications = new Notification[] {new AppleNotification("notifierName", "message", "chime")};
+            INotificationRecipients recipients = new NotificationRecipients().AddUserWithName("username");
+            var schedulerSettings = new NotificationSchedulerSettings {DeliverAt = DateTime.Now.AddDays(1)};
+
+            _client.PublishNotification(notifications, recipients, schedulerSettings);
+
+            _notificationsManager.Received(1).PublishNotification(notifications, recipients, schedulerSettings);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ClientTests/UserTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ClientTests/UserTests.cs b/Usergrid.Sdk.Tests/ClientTests/UserTests.cs
new file mode 100644
index 0000000..447a3bb
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ClientTests/UserTests.cs
@@ -0,0 +1,153 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NSubstitute;
+using NUnit.Framework;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.ClientTests
+{
+    [TestFixture]
+    public class UserTests
+    {
+        #region Setup/Teardown
+
+        [SetUp]
+        public void Setup()
+        {
+            _entityManager = Substitute.For<IEntityManager>();
+            _authenticationManager = Substitute.For<IAuthenticationManager>();
+            _client = new Client(null, null) {EntityManager = _entityManager, AuthenticationManager = _authenticationManager};
+        }
+
+        #endregion
+
+        private IEntityManager _entityManager;
+        private IAuthenticationManager _authenticationManager;
+        private IClient _client;
+
+        [Test]
+        public void ChangePasswordShouldDelegateToAuthenticationManager()
+        {
+            _client.ChangePassword("userName", "oldPassword", "newPassword");
+
+            _authenticationManager.Received(1).ChangePassword("userName", "oldPassword", "newPassword");
+        }
+
+        [Test]
+        public void CreateUserShouldDelegateToEntityManagerWithCorrectCollectionNameAndUser()
+        {
+            var user = new UsergridUser();
+
+            _client.CreateUser(user);
+
+            _entityManager.Received(1).CreateEntity("users", user);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void CreateUserShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.CreateEntity("users", Arg.Any<UsergridUser>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.CreateUser<UsergridUser>(null);
+        }
+
+        [Test]
+        public void DeleteUserShouldDelegateToEntityManagerrWithCorrectCollectionNameAndIdentfier()
+        {
+            _client.DeleteUser("userName");
+
+            _entityManager.Received(1).DeleteEntity("users", "userName");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void DeleteUserShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.DeleteEntity("users", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.DeleteUser(null);
+        }
+
+        [Test]
+        public void GetUserShouldDelegateToEntityManagerWithCorrectCollectionNameAndIdentifier()
+        {
+            _client.GetUser<UsergridUser>("identifier");
+
+            _entityManager.Received(1).GetEntity<UsergridUser>("users", "identifier");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void GetUserShouldPassOnTheException()
+        {
+            _entityManager
+                .When(m => m.GetEntity<UsergridUser>("users", Arg.Any<string>()))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.GetUser<UsergridUser>(null);
+        }
+
+        [Test]
+        public void GetUserShouldReturnNullForUnexistingUser()
+        {
+            _entityManager.GetEntity<UsergridUser>("users", "identifier").Returns((x) => null);
+
+            var usergridUser = _client.GetUser<UsergridUser>("identifier");
+
+            Assert.IsNull(usergridUser);
+        }
+
+        [Test]
+        public void GetUserShouldReturnUsergridUser()
+        {
+            var usergridUser = new UsergridUser();
+            _entityManager.GetEntity<UsergridUser>("users", "identifier").Returns((x) => usergridUser);
+
+            var returnedUser = _client.GetUser<UsergridUser>("identifier");
+
+            Assert.AreEqual(usergridUser, returnedUser);
+        }
+
+        [Test]
+        public void UpdateUserShouldDelegateToEntityManagerrWithCorrectCollectionNameAndUserNameAsTheIdentifier()
+        {
+            var user = new UsergridUser {UserName = "userName"};
+
+            _client.UpdateUser(user);
+
+            _entityManager.Received(1).UpdateEntity("users", user.UserName, user);
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException = typeof (UsergridException), ExpectedMessage = "Exception message")]
+        public void UpdateUserShouldPassOnTheException()
+        {
+            var user = new UsergridUser {UserName = "userName"};
+
+            _entityManager
+                .When(m => m.UpdateEntity("users", user.UserName, user))
+                .Do(m => { throw new UsergridException(new UsergridError {Description = "Exception message"}); });
+
+            _client.UpdateUser(user);
+        }
+    }
+}


[02/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/App.config
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/App.config b/samples/messageeTutorial/Messagee/App.config
new file mode 100644
index 0000000..84651f3
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/App.config
@@ -0,0 +1,23 @@
+\ufeff<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<configuration>
+    <startup>
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Globals.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Globals.vb b/samples/messageeTutorial/Messagee/Globals.vb
new file mode 100644
index 0000000..d49058f
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Globals.vb
@@ -0,0 +1,22 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+
+Public Class Globals
+    Public Shared client As Usergrid.Sdk.Client
+    Public Shared mainWindow As MessageeMainWindow
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/MainForm.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/MainForm.Designer.vb b/samples/messageeTutorial/Messagee/MainForm.Designer.vb
new file mode 100644
index 0000000..1285be2
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/MainForm.Designer.vb
@@ -0,0 +1,260 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class MessageeMainWindow
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.UsersLabel = New System.Windows.Forms.Label()
+        Me.PostMessage = New System.Windows.Forms.RichTextBox()
+        Me.MessageLabel = New System.Windows.Forms.Label()
+        Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
+        Me.MenuStrip2 = New System.Windows.Forms.MenuStrip()
+        Me.UserDetailsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
+        Me.SettingsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
+        Me.Followers = New System.Windows.Forms.ListBox()
+        Me.Label1 = New System.Windows.Forms.Label()
+        Me.Users = New System.Windows.Forms.ListBox()
+        Me.Label2 = New System.Windows.Forms.Label()
+        Me.Following = New System.Windows.Forms.ListBox()
+        Me.btnPost = New System.Windows.Forms.Button()
+        Me.YourFeed = New System.Windows.Forms.TabPage()
+        Me.YourFeedBox = New System.Windows.Forms.RichTextBox()
+        Me.RichTextBox1 = New System.Windows.Forms.RichTextBox()
+        Me.Feeds = New System.Windows.Forms.TabControl()
+        Me.MenuStrip2.SuspendLayout()
+        Me.YourFeed.SuspendLayout()
+        Me.Feeds.SuspendLayout()
+        Me.SuspendLayout()
+        '
+        'UsersLabel
+        '
+        Me.UsersLabel.AutoSize = True
+        Me.UsersLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.UsersLabel.Location = New System.Drawing.Point(12, 397)
+        Me.UsersLabel.Name = "UsersLabel"
+        Me.UsersLabel.Size = New System.Drawing.Size(118, 20)
+        Me.UsersLabel.TabIndex = 2
+        Me.UsersLabel.Text = "Choose User"
+        '
+        'PostMessage
+        '
+        Me.PostMessage.Location = New System.Drawing.Point(250, 424)
+        Me.PostMessage.Name = "PostMessage"
+        Me.PostMessage.Size = New System.Drawing.Size(342, 96)
+        Me.PostMessage.TabIndex = 3
+        Me.PostMessage.Text = ""
+        '
+        'MessageLabel
+        '
+        Me.MessageLabel.AutoSize = True
+        Me.MessageLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.MessageLabel.Location = New System.Drawing.Point(246, 397)
+        Me.MessageLabel.Name = "MessageLabel"
+        Me.MessageLabel.Size = New System.Drawing.Size(146, 20)
+        Me.MessageLabel.TabIndex = 4
+        Me.MessageLabel.Text = "Post A Message"
+        '
+        'MenuStrip1
+        '
+        Me.MenuStrip1.Location = New System.Drawing.Point(0, 28)
+        Me.MenuStrip1.Name = "MenuStrip1"
+        Me.MenuStrip1.Size = New System.Drawing.Size(763, 24)
+        Me.MenuStrip1.TabIndex = 5
+        Me.MenuStrip1.Text = "MenuStrip1"
+        '
+        'MenuStrip2
+        '
+        Me.MenuStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.UserDetailsToolStripMenuItem, Me.SettingsToolStripMenuItem})
+        Me.MenuStrip2.Location = New System.Drawing.Point(0, 0)
+        Me.MenuStrip2.Name = "MenuStrip2"
+        Me.MenuStrip2.Size = New System.Drawing.Size(763, 28)
+        Me.MenuStrip2.TabIndex = 6
+        Me.MenuStrip2.Text = "MenuStrip2"
+        '
+        'UserDetailsToolStripMenuItem
+        '
+        Me.UserDetailsToolStripMenuItem.Name = "UserDetailsToolStripMenuItem"
+        Me.UserDetailsToolStripMenuItem.Size = New System.Drawing.Size(100, 24)
+        Me.UserDetailsToolStripMenuItem.Text = "User Details"
+        '
+        'SettingsToolStripMenuItem
+        '
+        Me.SettingsToolStripMenuItem.Name = "SettingsToolStripMenuItem"
+        Me.SettingsToolStripMenuItem.Size = New System.Drawing.Size(74, 24)
+        Me.SettingsToolStripMenuItem.Text = "Settings"
+        '
+        'Followers
+        '
+        Me.Followers.FormattingEnabled = True
+        Me.Followers.ItemHeight = 16
+        Me.Followers.Location = New System.Drawing.Point(16, 531)
+        Me.Followers.Name = "Followers"
+        Me.Followers.Size = New System.Drawing.Size(148, 68)
+        Me.Followers.TabIndex = 7
+        '
+        'Label1
+        '
+        Me.Label1.AutoSize = True
+        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label1.Location = New System.Drawing.Point(12, 508)
+        Me.Label1.Name = "Label1"
+        Me.Label1.Size = New System.Drawing.Size(90, 20)
+        Me.Label1.TabIndex = 8
+        Me.Label1.Text = "Followers"
+        '
+        'Users
+        '
+        Me.Users.FormattingEnabled = True
+        Me.Users.ItemHeight = 16
+        Me.Users.Location = New System.Drawing.Point(16, 421)
+        Me.Users.Name = "Users"
+        Me.Users.Size = New System.Drawing.Size(148, 84)
+        Me.Users.TabIndex = 9
+        '
+        'Label2
+        '
+        Me.Label2.AutoSize = True
+        Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label2.Location = New System.Drawing.Point(14, 602)
+        Me.Label2.Name = "Label2"
+        Me.Label2.Size = New System.Drawing.Size(88, 20)
+        Me.Label2.TabIndex = 10
+        Me.Label2.Text = "Following"
+        '
+        'Following
+        '
+        Me.Following.FormattingEnabled = True
+        Me.Following.ItemHeight = 16
+        Me.Following.Location = New System.Drawing.Point(16, 624)
+        Me.Following.Name = "Following"
+        Me.Following.Size = New System.Drawing.Size(148, 68)
+        Me.Following.TabIndex = 11
+        '
+        'btnPost
+        '
+        Me.btnPost.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.btnPost.Location = New System.Drawing.Point(250, 531)
+        Me.btnPost.Name = "btnPost"
+        Me.btnPost.Size = New System.Drawing.Size(75, 28)
+        Me.btnPost.TabIndex = 12
+        Me.btnPost.Text = "Post"
+        Me.btnPost.UseVisualStyleBackColor = True
+        '
+        'YourFeed
+        '
+        Me.YourFeed.Controls.Add(Me.YourFeedBox)
+        Me.YourFeed.Controls.Add(Me.RichTextBox1)
+        Me.YourFeed.Location = New System.Drawing.Point(4, 25)
+        Me.YourFeed.Name = "YourFeed"
+        Me.YourFeed.Padding = New System.Windows.Forms.Padding(3)
+        Me.YourFeed.Size = New System.Drawing.Size(700, 319)
+        Me.YourFeed.TabIndex = 2
+        Me.YourFeed.Text = "Your Feed"
+        Me.YourFeed.UseVisualStyleBackColor = True
+        '
+        'YourFeedBox
+        '
+        Me.YourFeedBox.Location = New System.Drawing.Point(3, 3)
+        Me.YourFeedBox.Name = "YourFeedBox"
+        Me.YourFeedBox.Size = New System.Drawing.Size(698, 313)
+        Me.YourFeedBox.TabIndex = 1
+        Me.YourFeedBox.Text = ""
+        '
+        'RichTextBox1
+        '
+        Me.RichTextBox1.Location = New System.Drawing.Point(14, 193)
+        Me.RichTextBox1.Name = "RichTextBox1"
+        Me.RichTextBox1.Size = New System.Drawing.Size(8, 8)
+        Me.RichTextBox1.TabIndex = 0
+        Me.RichTextBox1.Text = ""
+        '
+        'Feeds
+        '
+        Me.Feeds.Controls.Add(Me.YourFeed)
+        Me.Feeds.Location = New System.Drawing.Point(12, 31)
+        Me.Feeds.Name = "Feeds"
+        Me.Feeds.SelectedIndex = 0
+        Me.Feeds.Size = New System.Drawing.Size(708, 348)
+        Me.Feeds.TabIndex = 0
+        '
+        'MessageeMainWindow
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(8!, 16!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(763, 704)
+        Me.Controls.Add(Me.btnPost)
+        Me.Controls.Add(Me.Following)
+        Me.Controls.Add(Me.Label2)
+        Me.Controls.Add(Me.Users)
+        Me.Controls.Add(Me.Label1)
+        Me.Controls.Add(Me.Followers)
+        Me.Controls.Add(Me.MessageLabel)
+        Me.Controls.Add(Me.PostMessage)
+        Me.Controls.Add(Me.UsersLabel)
+        Me.Controls.Add(Me.Feeds)
+        Me.Controls.Add(Me.MenuStrip1)
+        Me.Controls.Add(Me.MenuStrip2)
+        Me.MainMenuStrip = Me.MenuStrip1
+        Me.Name = "MessageeMainWindow"
+        Me.Text = "Messagee"
+        Me.MenuStrip2.ResumeLayout(false)
+        Me.MenuStrip2.PerformLayout
+        Me.YourFeed.ResumeLayout(false)
+        Me.Feeds.ResumeLayout(false)
+        Me.ResumeLayout(false)
+        Me.PerformLayout
+
+End Sub
+    Friend WithEvents UsersLabel As System.Windows.Forms.Label
+    Friend WithEvents PostMessage As System.Windows.Forms.RichTextBox
+    Friend WithEvents MessageLabel As System.Windows.Forms.Label
+    Friend WithEvents MenuStrip1 As System.Windows.Forms.MenuStrip
+    Friend WithEvents MenuStrip2 As System.Windows.Forms.MenuStrip
+    Friend WithEvents UserDetailsToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
+    Friend WithEvents SettingsToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
+    Friend WithEvents Followers As System.Windows.Forms.ListBox
+    Friend WithEvents Label1 As System.Windows.Forms.Label
+    Friend WithEvents Users As System.Windows.Forms.ListBox
+    Friend WithEvents Label2 As System.Windows.Forms.Label
+    Friend WithEvents Following As System.Windows.Forms.ListBox
+    Friend WithEvents btnPost As System.Windows.Forms.Button
+    Friend WithEvents YourFeed As System.Windows.Forms.TabPage
+    Friend WithEvents YourFeedBox As System.Windows.Forms.RichTextBox
+    Friend WithEvents RichTextBox1 As System.Windows.Forms.RichTextBox
+    Friend WithEvents Feeds As System.Windows.Forms.TabControl
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/MainForm.resx
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/MainForm.resx b/samples/messageeTutorial/Messagee/MainForm.resx
new file mode 100644
index 0000000..9d29dab
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/MainForm.resx
@@ -0,0 +1,143 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="MenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="MenuStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>149, 17</value>
+  </metadata>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/MainForm.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/MainForm.vb b/samples/messageeTutorial/Messagee/MainForm.vb
new file mode 100644
index 0000000..0ba998a
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/MainForm.vb
@@ -0,0 +1,97 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+Imports Usergrid.Sdk.Model
+
+Public Class MessageeMainWindow
+    Public Sub UpdateUsers()
+        Dim userList As UsergridCollection(Of UsergridUser)
+        userList = Globals.client.GetEntities(Of UsergridUser)("users", 10)
+        Dim i As Integer = 0
+        While i < userList.Count
+            Users.Items.Add(userList(i).UserName)
+            i = i + 1
+        End While
+    End Sub
+    Private Sub SettingsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SettingsToolStripMenuItem.Click
+        Settings.Show()
+    End Sub
+
+    Private Sub Users_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Users.SelectedIndexChanged
+        UpdateFollowersAndFollowing()
+        UpdateYourFeed()
+    End Sub
+    Public Sub UpdateFollowersAndFollowing()
+        Followers.Items.Clear()
+        Following.Items.Clear()
+        Dim followersList As IList(Of UsergridEntity)
+        Dim followingList As IList(Of UsergridEntity)
+        Dim conn As Connection = New Connection()
+        Dim userName As String = Users.Items(Users.SelectedIndex).ToString
+        followingList = Utils.GetFollowers(userName)
+        followersList = Utils.GetFollowed(userName)
+
+        Dim i As Integer = 0
+        While i < followersList.Count
+            Followers.Items.Add(followersList(i).Name)
+            i = i + 1
+        End While
+        i = 0
+        While i < followingList.Count
+            Following.Items.Add(followingList(i).Name)
+            i = i + 1
+        End While
+    End Sub
+
+    Public Sub UpdateYourFeed()
+        YourFeedBox.Text = ""
+        Dim userFeed As UsergridCollection(Of UsergridActivity)
+        userFeed = Globals.client.GetUserFeed(Of UsergridActivity)(Users.Items(Users.SelectedIndex).ToString)
+        Dim i As Integer = 0
+        While i < userFeed.Count
+            YourFeedBox.Text = YourFeedBox.Text & "Posted By: " & userFeed(i).Actor.DisplayName & " on " & userFeed(i).PublishedDate & vbCrLf
+            YourFeedBox.Text = YourFeedBox.Text & userFeed(i).Content & vbCrLf
+            YourFeedBox.Text = YourFeedBox.Text & vbCrLf
+            i = i + 1
+        End While
+    End Sub
+
+
+    Private Sub btnPost_Click(sender As Object, e As EventArgs) Handles btnPost.Click
+        Dim activity As UsergridActivity = New UsergridActivity()
+        activity.Actor = New UsergridActor
+        activity.Actor.DisplayName = Users.Items(Users.SelectedIndex).ToString
+        activity.Actor.UserName = Users.Items(Users.SelectedIndex).ToString
+        activity.Content = PostMessage.Text
+        activity.Verb = "post"
+        Globals.client.PostActivity(Of UsergridActivity)(Users.Items(Users.SelectedIndex).ToString, activity)
+        UpdateYourFeed()
+        PostMessage.Text = ""
+    End Sub
+
+    Private Sub UserDetailsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles UserDetailsToolStripMenuItem.Click
+        UserSettings.Show()
+       
+    End Sub
+
+    Private Sub MessageeMainWindow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+        Globals.mainWindow = Me
+    End Sub
+
+    Private Sub MenuStrip2_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuStrip2.ItemClicked
+
+    End Sub
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Messagee.vbproj
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Messagee.vbproj b/samples/messageeTutorial/Messagee/Messagee.vbproj
new file mode 100644
index 0000000..4a3676a
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Messagee.vbproj
@@ -0,0 +1,173 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E8C3967E-11F2-49E8-8818-ABF83F9927B2}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <StartupObject>Messagee.My.MyApplication</StartupObject>
+    <RootNamespace>Messagee</RootNamespace>
+    <AssemblyName>Messagee</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>WindowsForms</MyType>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Messagee.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Messagee.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\RestSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Usergrid.Sdk">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Usergrid.Sdk.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Drawing" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Windows.Forms" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Globals.vb" />
+    <Compile Include="MainForm.Designer.vb">
+      <DependentUpon>MainForm.vb</DependentUpon>
+    </Compile>
+    <Compile Include="MainForm.vb">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Settings.Designer.vb">
+      <DependentUpon>Settings.vb</DependentUpon>
+    </Compile>
+    <Compile Include="Settings.vb">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UserSettings.Designer.vb">
+      <DependentUpon>UserSettings.vb</DependentUpon>
+    </Compile>
+    <Compile Include="UserSettings.vb">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Utils.vb" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.vb</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Settings.resx">
+      <DependentUpon>Settings.vb</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UserSettings.resx">
+      <DependentUpon>UserSettings.vb</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Application.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Application.Designer.vb b/samples/messageeTutorial/Messagee/My Project/Application.Designer.vb
new file mode 100644
index 0000000..9f09467
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Application.Designer.vb	
@@ -0,0 +1,53 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+    
+    'NOTE: This file is auto-generated; do not modify it directly.  To make changes,
+    ' or if you encounter build errors in this file, go to the Project Designer
+    ' (go to Project Properties or double-click the My Project node in
+    ' Solution Explorer), and make changes on the Application tab.
+    '
+    Partial Friend Class MyApplication
+        
+        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
+        Public Sub New()
+            MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
+            Me.IsSingleInstance = false
+            Me.EnableVisualStyles = true
+            Me.SaveMySettingsOnExit = true
+            Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
+        End Sub
+        
+        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
+        Protected Overrides Sub OnCreateMainForm()
+            Me.MainForm = Global.Messagee.MessageeMainWindow
+        End Sub
+    End Class
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Application.myapp
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Application.myapp b/samples/messageeTutorial/Messagee/My Project/Application.myapp
new file mode 100644
index 0000000..615b8fc
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Application.myapp	
@@ -0,0 +1,27 @@
+\ufeff<?xml version="1.0" encoding="utf-16"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>true</MySubMain>
+  <MainForm>MessageeMainWindow</MainForm>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/AssemblyInfo.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/AssemblyInfo.vb b/samples/messageeTutorial/Messagee/My Project/AssemblyInfo.vb
new file mode 100644
index 0000000..88a0f58
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/AssemblyInfo.vb	
@@ -0,0 +1,50 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following 
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("Messagee")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("Messagee")> 
+<Assembly: AssemblyCopyright("Copyright �  2013")> 
+<Assembly: AssemblyTrademark("")> 
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("56fbdedb-0160-4cf9-993f-12067af9ee8b")> 
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version 
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers 
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")> 
+
+<Assembly: AssemblyVersion("1.0.0.0")> 
+<Assembly: AssemblyFileVersion("1.0.0.0")> 

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Resources.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Resources.Designer.vb b/samples/messageeTutorial/Messagee/My Project/Resources.Designer.vb
new file mode 100644
index 0000000..827f128
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Resources.Designer.vb	
@@ -0,0 +1,77 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+    
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Messagee.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Resources.resx
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Resources.resx b/samples/messageeTutorial/Messagee/My Project/Resources.resx
new file mode 100644
index 0000000..098d9b6
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Resources.resx	
@@ -0,0 +1,134 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Settings.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Settings.Designer.vb b/samples/messageeTutorial/Messagee/My Project/Settings.Designer.vb
new file mode 100644
index 0000000..888a2d9
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Settings.Designer.vb	
@@ -0,0 +1,88 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+    
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
+    Friend Module MySettingsProperty
+        
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
+        Friend ReadOnly Property Settings() As Global.Messagee.My.MySettings
+            Get
+                Return Global.Messagee.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/My Project/Settings.settings
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/My Project/Settings.settings b/samples/messageeTutorial/Messagee/My Project/Settings.settings
new file mode 100644
index 0000000..9c270f1
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/My Project/Settings.settings	
@@ -0,0 +1,24 @@
+\ufeff<?xml version='1.0' encoding='utf-8'?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Settings.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Settings.Designer.vb b/samples/messageeTutorial/Messagee/Settings.Designer.vb
new file mode 100644
index 0000000..a1f4040
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Settings.Designer.vb
@@ -0,0 +1,159 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class Settings
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.Label1 = New System.Windows.Forms.Label()
+        Me.txtUserName = New System.Windows.Forms.TextBox()
+        Me.Password = New System.Windows.Forms.Label()
+        Me.txtPassword = New System.Windows.Forms.TextBox()
+        Me.Label2 = New System.Windows.Forms.Label()
+        Me.txtOrg = New System.Windows.Forms.TextBox()
+        Me.App = New System.Windows.Forms.Label()
+        Me.txtApp = New System.Windows.Forms.TextBox()
+        Me.btnSave = New System.Windows.Forms.Button()
+        Me.SuspendLayout()
+        '
+        'Label1
+        '
+        Me.Label1.AutoSize = True
+        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label1.Location = New System.Drawing.Point(27, 41)
+        Me.Label1.Name = "Label1"
+        Me.Label1.Size = New System.Drawing.Size(103, 20)
+        Me.Label1.TabIndex = 0
+        Me.Label1.Text = "User Name"
+        '
+        'txtUserName
+        '
+        Me.txtUserName.Location = New System.Drawing.Point(160, 41)
+        Me.txtUserName.Name = "txtUserName"
+        Me.txtUserName.Size = New System.Drawing.Size(180, 22)
+        Me.txtUserName.TabIndex = 1
+        '
+        'Password
+        '
+        Me.Password.AutoSize = True
+        Me.Password.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Password.Location = New System.Drawing.Point(31, 94)
+        Me.Password.Name = "Password"
+        Me.Password.Size = New System.Drawing.Size(91, 20)
+        Me.Password.TabIndex = 2
+        Me.Password.Text = "Password"
+        '
+        'txtPassword
+        '
+        Me.txtPassword.Location = New System.Drawing.Point(160, 94)
+        Me.txtPassword.Name = "txtPassword"
+        Me.txtPassword.Size = New System.Drawing.Size(180, 22)
+        Me.txtPassword.TabIndex = 3
+        Me.txtPassword.UseSystemPasswordChar = True
+        '
+        'Label2
+        '
+        Me.Label2.AutoSize = True
+        Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label2.Location = New System.Drawing.Point(31, 148)
+        Me.Label2.Name = "Label2"
+        Me.Label2.Size = New System.Drawing.Size(40, 20)
+        Me.Label2.TabIndex = 4
+        Me.Label2.Text = "Org"
+        '
+        'txtOrg
+        '
+        Me.txtOrg.Location = New System.Drawing.Point(160, 148)
+        Me.txtOrg.Name = "txtOrg"
+        Me.txtOrg.Size = New System.Drawing.Size(180, 22)
+        Me.txtOrg.TabIndex = 5
+        '
+        'App
+        '
+        Me.App.AutoSize = True
+        Me.App.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.App.Location = New System.Drawing.Point(35, 202)
+        Me.App.Name = "App"
+        Me.App.Size = New System.Drawing.Size(41, 20)
+        Me.App.TabIndex = 6
+        Me.App.Text = "App"
+        '
+        'txtApp
+        '
+        Me.txtApp.Location = New System.Drawing.Point(160, 202)
+        Me.txtApp.Name = "txtApp"
+        Me.txtApp.Size = New System.Drawing.Size(180, 22)
+        Me.txtApp.TabIndex = 7
+        '
+        'btnSave
+        '
+        Me.btnSave.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.btnSave.Location = New System.Drawing.Point(160, 289)
+        Me.btnSave.Name = "btnSave"
+        Me.btnSave.Size = New System.Drawing.Size(117, 31)
+        Me.btnSave.TabIndex = 8
+        Me.btnSave.Text = "Save Settings"
+        Me.btnSave.UseVisualStyleBackColor = True
+        '
+        'Settings
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(517, 420)
+        Me.Controls.Add(Me.btnSave)
+        Me.Controls.Add(Me.txtApp)
+        Me.Controls.Add(Me.App)
+        Me.Controls.Add(Me.txtOrg)
+        Me.Controls.Add(Me.Label2)
+        Me.Controls.Add(Me.txtPassword)
+        Me.Controls.Add(Me.Password)
+        Me.Controls.Add(Me.txtUserName)
+        Me.Controls.Add(Me.Label1)
+        Me.Name = "Settings"
+        Me.Text = "Settings"
+        Me.ResumeLayout(False)
+        Me.PerformLayout()
+
+    End Sub
+    Friend WithEvents Label1 As System.Windows.Forms.Label
+    Friend WithEvents txtUserName As System.Windows.Forms.TextBox
+    Friend WithEvents Password As System.Windows.Forms.Label
+    Friend WithEvents txtPassword As System.Windows.Forms.TextBox
+    Friend WithEvents Label2 As System.Windows.Forms.Label
+    Friend WithEvents txtOrg As System.Windows.Forms.TextBox
+    Friend WithEvents App As System.Windows.Forms.Label
+    Friend WithEvents txtApp As System.Windows.Forms.TextBox
+    Friend WithEvents btnSave As System.Windows.Forms.Button
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Settings.resx
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Settings.resx b/samples/messageeTutorial/Messagee/Settings.resx
new file mode 100644
index 0000000..85d1d78
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Settings.resx
@@ -0,0 +1,137 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/Settings.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/Settings.vb b/samples/messageeTutorial/Messagee/Settings.vb
new file mode 100644
index 0000000..ec2adb2
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/Settings.vb
@@ -0,0 +1,28 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+Imports Usergrid.Sdk.Model
+
+Public Class Settings
+
+    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
+        Dim client As Client = New Client(txtOrg.Text, txtApp.Text)
+        client.Login(txtUserName.Text, txtPassword.Text, AuthType.User)
+        Globals.client = client
+        MessageeMainWindow.UpdateUsers()
+        Me.Close()
+    End Sub
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee/UserSettings.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee/UserSettings.Designer.vb b/samples/messageeTutorial/Messagee/UserSettings.Designer.vb
new file mode 100644
index 0000000..0e10cae
--- /dev/null
+++ b/samples/messageeTutorial/Messagee/UserSettings.Designer.vb
@@ -0,0 +1,191 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class UserSettings
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.Label1 = New System.Windows.Forms.Label()
+        Me.userNameLabel = New System.Windows.Forms.Label()
+        Me.Label2 = New System.Windows.Forms.Label()
+        Me.uuidLabel = New System.Windows.Forms.Label()
+        Me.unconnectedUsers = New System.Windows.Forms.ListBox()
+        Me.Label3 = New System.Windows.Forms.Label()
+        Me.followingList = New System.Windows.Forms.ListBox()
+        Me.Label4 = New System.Windows.Forms.Label()
+        Me.btnAddFollowing = New System.Windows.Forms.Button()
+        Me.btnDeleteFollowing = New System.Windows.Forms.Button()
+        Me.btnClose = New System.Windows.Forms.Button()
+        Me.SuspendLayout()
+        '
+        'Label1
+        '
+        Me.Label1.AutoSize = True
+        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label1.Location = New System.Drawing.Point(30, 22)
+        Me.Label1.Name = "Label1"
+        Me.Label1.Size = New System.Drawing.Size(109, 20)
+        Me.Label1.TabIndex = 0
+        Me.Label1.Text = "User Name:"
+        '
+        'userNameLabel
+        '
+        Me.userNameLabel.AutoSize = True
+        Me.userNameLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.userNameLabel.Location = New System.Drawing.Point(145, 22)
+        Me.userNameLabel.Name = "userNameLabel"
+        Me.userNameLabel.Size = New System.Drawing.Size(59, 20)
+        Me.userNameLabel.TabIndex = 1
+        Me.userNameLabel.Text = "Label2"
+        '
+        'Label2
+        '
+        Me.Label2.AutoSize = True
+        Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label2.Location = New System.Drawing.Point(34, 60)
+        Me.Label2.Name = "Label2"
+        Me.Label2.Size = New System.Drawing.Size(60, 20)
+        Me.Label2.TabIndex = 2
+        Me.Label2.Text = "UUID:"
+        '
+        'uuidLabel
+        '
+        Me.uuidLabel.AutoSize = True
+        Me.uuidLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.uuidLabel.Location = New System.Drawing.Point(149, 60)
+        Me.uuidLabel.Name = "uuidLabel"
+        Me.uuidLabel.Size = New System.Drawing.Size(59, 20)
+        Me.uuidLabel.TabIndex = 3
+        Me.uuidLabel.Text = "Label3"
+        '
+        'unconnectedUsers
+        '
+        Me.unconnectedUsers.FormattingEnabled = True
+        Me.unconnectedUsers.ItemHeight = 16
+        Me.unconnectedUsers.Location = New System.Drawing.Point(38, 131)
+        Me.unconnectedUsers.Name = "unconnectedUsers"
+        Me.unconnectedUsers.Size = New System.Drawing.Size(120, 84)
+        Me.unconnectedUsers.TabIndex = 4
+        '
+        'Label3
+        '
+        Me.Label3.AutoSize = True
+        Me.Label3.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label3.Location = New System.Drawing.Point(38, 108)
+        Me.Label3.Name = "Label3"
+        Me.Label3.Size = New System.Drawing.Size(59, 20)
+        Me.Label3.TabIndex = 5
+        Me.Label3.Text = "Users"
+        '
+        'followingList
+        '
+        Me.followingList.FormattingEnabled = True
+        Me.followingList.ItemHeight = 16
+        Me.followingList.Location = New System.Drawing.Point(341, 131)
+        Me.followingList.Name = "followingList"
+        Me.followingList.Size = New System.Drawing.Size(120, 84)
+        Me.followingList.TabIndex = 6
+        '
+        'Label4
+        '
+        Me.Label4.AutoSize = True
+        Me.Label4.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.2!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+        Me.Label4.Location = New System.Drawing.Point(337, 108)
+        Me.Label4.Name = "Label4"
+        Me.Label4.Size = New System.Drawing.Size(88, 20)
+        Me.Label4.TabIndex = 7
+        Me.Label4.Text = "Following"
+        '
+        'btnAddFollowing
+        '
+        Me.btnAddFollowing.Location = New System.Drawing.Point(198, 131)
+        Me.btnAddFollowing.Name = "btnAddFollowing"
+        Me.btnAddFollowing.Size = New System.Drawing.Size(75, 23)
+        Me.btnAddFollowing.TabIndex = 8
+        Me.btnAddFollowing.Text = "Add ->"
+        Me.btnAddFollowing.UseVisualStyleBackColor = True
+        '
+        'btnDeleteFollowing
+        '
+        Me.btnDeleteFollowing.Location = New System.Drawing.Point(198, 177)
+        Me.btnDeleteFollowing.Name = "btnDeleteFollowing"
+        Me.btnDeleteFollowing.Size = New System.Drawing.Size(75, 23)
+        Me.btnDeleteFollowing.TabIndex = 9
+        Me.btnDeleteFollowing.Text = "<- Delete"
+        Me.btnDeleteFollowing.UseVisualStyleBackColor = True
+        '
+        'btnClose
+        '
+        Me.btnClose.Location = New System.Drawing.Point(341, 325)
+        Me.btnClose.Name = "btnClose"
+        Me.btnClose.Size = New System.Drawing.Size(75, 23)
+        Me.btnClose.TabIndex = 10
+        Me.btnClose.Text = "Close"
+        Me.btnClose.UseVisualStyleBackColor = True
+        '
+        'UserSettings
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(537, 395)
+        Me.Controls.Add(Me.btnClose)
+        Me.Controls.Add(Me.btnDeleteFollowing)
+        Me.Controls.Add(Me.btnAddFollowing)
+        Me.Controls.Add(Me.Label4)
+        Me.Controls.Add(Me.followingList)
+        Me.Controls.Add(Me.Label3)
+        Me.Controls.Add(Me.unconnectedUsers)
+        Me.Controls.Add(Me.uuidLabel)
+        Me.Controls.Add(Me.Label2)
+        Me.Controls.Add(Me.userNameLabel)
+        Me.Controls.Add(Me.Label1)
+        Me.Name = "UserSettings"
+        Me.Text = "UserSettings"
+        Me.ResumeLayout(False)
+        Me.PerformLayout()
+
+    End Sub
+    Friend WithEvents Label1 As System.Windows.Forms.Label
+    Friend WithEvents userNameLabel As System.Windows.Forms.Label
+    Friend WithEvents Label2 As System.Windows.Forms.Label
+    Friend WithEvents uuidLabel As System.Windows.Forms.Label
+    Friend WithEvents unconnectedUsers As System.Windows.Forms.ListBox
+    Friend WithEvents Label3 As System.Windows.Forms.Label
+    Friend WithEvents followingList As System.Windows.Forms.ListBox
+    Friend WithEvents Label4 As System.Windows.Forms.Label
+    Friend WithEvents btnAddFollowing As System.Windows.Forms.Button
+    Friend WithEvents btnDeleteFollowing As System.Windows.Forms.Button
+    Friend WithEvents btnClose As System.Windows.Forms.Button
+End Class


[04/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/stores.json
----------------------------------------------------------------------
diff --git a/samples/locationSample/stores.json b/samples/locationSample/stores.json
new file mode 100644
index 0000000..28a8ac7
--- /dev/null
+++ b/samples/locationSample/stores.json
@@ -0,0 +1 @@
+[{"location":{"stateCode":"AL","latitude":33.2265,"longitude":-86.8058,"displayAddress":"250 S Colonial Dr, Alabaster, AL, 35007"},"storeNumber":2276,"name":"Alabaster","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":30.673,"longitude":-88.1248,"displayAddress":"3150 Bel Air Mall, Mobile, AL, 36606"},"storeNumber":797,"name":"Bel-Air","supertarget":false,"services":["Pharmacy","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AL","latitude":33.3339,"longitude":-86.9905,"displayAddress":"4889 Pro
 menade Pkwy, Bessemer, AL, 35022"},"storeNumber":2375,"name":"Bessemer","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":33.4258,"longitude":-86.7118,"displayAddress":"4616 Highway 280 S, Birmingham, AL, 35242"},"storeNumber":1772,"name":"Birmingham 280 Corridor SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":30.6027,"longitude":-87.8964,"displayAddress":"1698 US Highway 98, Daphne, AL, 36526"},"storeNumber":127
 4,"name":"Daphne","supertarget":false,"services":["Pharmacy","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":34.5604,"longitude":-86.9718,"displayAddress":"1235 Point Mallard Parkway SE, Decatur, AL, 35601"},"storeNumber":2084,"name":"Decatur","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AL","latitude":31.2672,"longitude":-85.4409,"displayAddress":"4601 Montgomery Hwy Ste 300, Dothan, AL, 36303"},"storeNumber":1468,"name":"Dothan","supertarget":false,"services":["Pharmacy
 ","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":34.842,"longitude":-87.635,"displayAddress":"372 Cox Creek Pkwy, Florence, AL, 35630"},"storeNumber":1322,"name":"Florence","supertarget":false,"services":["Pharmacy","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":33.6068,"longitude":-86.8063,"displayAddress":"3489 Lowery Pkwy, Fultondale, AL, 35068"},"storeNumber":2355,"name":"Fultondale","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00
  a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":30.3031,"longitude":-87.6807,"displayAddress":"3820 Gulf Shores Pkwy, Gulf Shores, AL, 36542"},"storeNumber":2154,"name":"Gulf Shores","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":33.3611,"longitude":-86.8526,"displayAddress":"5561 Grove Blvd, Birmingham, AL, 35226"},"storeNumber":2503,"name":"Hoover West SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa:
  8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":34.6729,"longitude":-86.5414,"displayAddress":"2750 Carl T Jones Dr SE Ste 7, Huntsville, AL, 35802"},"storeNumber":1367,"name":"Huntsville South SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":34.7418,"longitude":-86.6818,"displayAddress":"6275 University Dr NW, Huntsville, AL, 35806"},"storeNumber":1346,"name":"Huntsville West SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Portrait Studio","Wine Available","Flu
  Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":34.7492,"longitude":-86.7557,"displayAddress":"8207 HIGHWAY 72 W, Madison, AL, 35758"},"storeNumber":2816,"name":"Madison","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AL","latitude":30.6741,"longitude":-88.228,"displayAddress":"790 Schillinger Rd S, Mobile, AL, 36695"},"storeNumber":1376,"name":"Mobile West SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target M
 obile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AL","latitude":32.3609,"longitude":-86.1621,"displayAddress":"2576 Berryhill Rd, Montgomery, AL, 36117"},"storeNumber":1825,"name":"Montgomery","supertarget":false,"services":["Pharmacy","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":32.6178,"longitude":-85.4101,"displayAddress":"2640 Enterprise Dr, Opelika, AL, 36801"},"storeNumber":1499,"name":"Opelika","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8
 :00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":33.6098,"longitude":-85.7836,"displayAddress":"400 Oxford Exchange Blvd, Oxford, AL, 36203"},"storeNumber":2153,"name":"Oxford","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":32.4577,"longitude":-86.396,"displayAddress":"2754 Legends Pkwy, Prattville, AL, 36066"},"storeNumber":2274,"name":"Prattville","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:0
 0PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AL","latitude":33.6047,"longitude":-86.6371,"displayAddress":"1654 Gadsden Hwy, Birmingham, AL, 35235"},"storeNumber":1773,"name":"Trussville SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AL","latitude":33.1933,"longitude":-87.5182,"displayAddress":"1901 13th Ave E, Tuscaloosa, AL, 35404"},"storeNumber":1787,"name":"Tuscaloosa SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 
 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AK","latitude":61.2276,"longitude":-149.743,"displayAddress":"1200 N Muldoon Rd, Anchorage, AK, 99504"},"storeNumber":2371,"name":"Anchorage NE","supertarget":false,"services":["Pharmacy","Photo Center","Starbucks","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AK","latitude":61.1295,"longitude":-149.882,"displayAddress":"150 W 100th Ave, Anchorage, AK, 99515"},"storeNumber":2372,"name":"Anchorage South","supertarget":false,"services":["Pharmacy","Photo Center","Starbucks","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Su
 n 8:00AM-10:00PM."]},{"location":{"stateCode":"AK","latitude":61.5774,"longitude":-149.405,"displayAddress":"1801 E Parks Hwy, Wasilla, AK, 99654"},"storeNumber":2339,"name":"Wasilla","supertarget":false,"services":["Pharmacy","Photo Center","Starbucks","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.3214,"longitude":-111.981,"displayAddress":"4734 E Ray Rd, Phoenix, AZ, 85044"},"storeNumber":909,"name":"Ahwatukee","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.4789,"longitude":-111.984,"dis
 playAddress":"4515 E Thomas Rd, Phoenix, AZ, 85018"},"storeNumber":950,"name":"Arcadia Crossing","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":35.0511,"longitude":-114.592,"displayAddress":"3699 Hwy 95, Bullhead City, AZ, 86442"},"storeNumber":2368,"name":"Bullhead City","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":32.8809,"longitude":-111.684,"displayAddress":"951 N Promenade Pkwy, Casa
  Grande, AZ, 85194"},"storeNumber":2353,"name":"Casa Grande","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":33.3383,"longitude":-111.844,"displayAddress":"2150 N Arizona Ave, Chandler, AZ, 85225"},"storeNumber":252,"name":"Chandler","supertarget":false,"services":["Pharmacy","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":33.2499,"longitude":-111.838,"displayAddress":"3777 S ARIZONA AVE, Chandler, AZ, 85248"},"storeNumber":2747,"name":"Ch
 andler South","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.2963,"longitude":-111.899,"displayAddress":"3425 W Frye Rd, Chandler, AZ, 85226"},"storeNumber":1838,"name":"Chandler West Santan","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.6381,"longitude":-112.069,"displayAddress":"16806 N 7th St, Phoenix, AZ, 85022"},"storeNumber":2236,"name":"Deer Valley SuperTarget","supertarget":true,
 "services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.7795,"longitude":-111.923,"displayAddress":"32351 N Scottsdale Rd, Scottsdale, AZ, 85262"},"storeNumber":1327,"name":"Far North Scottsdale","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":35.184,"longitude":-111.66,"displayAddress":"1650 S Milton Rd, Flagstaff, AZ, 86001"},"storeNumber":935,"na
 me":"Flagstaff","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.5738,"longitude":-111.718,"displayAddress":"16825 E Shea Blvd, Fountain Hills, AZ, 85268"},"storeNumber":1432,"name":"Fountain Hills","supertarget":false,"services":["Pharmacy","Fresh Grocery","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":33.3342,"longitude":-111.757,"displayAddress":"1515 E Warner Rd, Gilbert, AZ, 85296"},"storeNumber":1209,"name":"Gilbert","super
 target":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.3228,"longitude":-111.688,"displayAddress":"5110 S Power Rd, Mesa, AZ, 85212"},"storeNumber":1959,"name":"Gilbert SE SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.279,"longitude":-111.788,"displayAddress":"3931 S Gilbert Rd, Gilbert, AZ, 85297"},"storeNumber":1960,"name":"Gilbert SW SuperTarget","supertarget":true,"service
 s":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.5805,"longitude":-112.153,"displayAddress":"10404 N 43rd Ave, Glendale, AZ, 85302"},"storeNumber":2341,"name":"Glendale","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.4632,"longitude":-112.356,"displayAddress":"1515 N Litchfield Rd, Goodyear, AZ, 85395"},"storeNumber":1242,"name":"Goodyear","supertarget":false,"services":["Pharmacy","Optical","Fresh
  Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.4375,"longitude":-112.422,"displayAddress":"995 S Cotton Ln, Goodyear, AZ, 85338"},"storeNumber":2400,"name":"Goodyear West SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.3942,"longitude":-111.786,"displayAddress":"1135 S Gilbert Rd, Mesa, AZ, 85204"},"storeNumber":251,"name":"Mesa Central","supertarget":false,"services":["Pharmacy","Fresh Grocery","Wine Available","Flu Shot"],"pharma
 cy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.3879,"longitude":-111.684,"displayAddress":"1525 S Power Rd, Mesa, AZ, 85206"},"storeNumber":639,"name":"Mesa East","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.4537,"longitude":-111.682,"displayAddress":"2151 N Power Rd, Mesa, AZ, 85215"},"storeNumber":1386,"name":"Mesa Red Mountain","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 
 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.3919,"longitude":-111.865,"displayAddress":"1230 S Longmore Ave, Mesa, AZ, 85202"},"storeNumber":1429,"name":"Mesa West","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.6274,"longitude":-111.889,"displayAddress":"15444 N Frank Lloyd Wright Blvd, Scottsdale, AZ, 85260"},"storeNumber":936,"name":"North Scottsdale","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 
 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":32.3992,"longitude":-110.959,"displayAddress":"10555 N Oracle Rd, Oro Valley, AZ, 85737"},"storeNumber":700,"name":"Oro Valley","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.6008,"longitude":-111.99,"displayAddress":"12602 N Paradise Village Pkwy W, Phoenix, AZ, 85032"},"storeNumber":233,"name":"Paradise Valley","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25
 -12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.7088,"longitude":-112.275,"displayAddress":"24890 N Lake Pleasant Pkwy, Peoria, AZ, 85383"},"storeNumber":2227,"name":"Peoria Far North SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.6358,"longitude":-112.228,"displayAddress":"8055 W Bell Rd, Peoria, AZ, 85382"},"storeNumber":825,"name":"Peoria North","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We wi
 ll open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.5546,"longitude":-112.261,"displayAddress":"9350 W Northern Ave, Glendale, AZ, 85305"},"storeNumber":1361,"name":"Peoria SW","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.6747,"longitude":-111.974,"displayAddress":"21001 N Tatum Blvd Ste 20, Phoenix, AZ, 85050"},"storeNumber":1360,"name":"Phoenix NE","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat
  8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.6671,"longitude":-112.119,"displayAddress":"2727 W Agua Fria Fwy, Phoenix, AZ, 85027"},"storeNumber":1141,"name":"Phoenix North Central","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.4236,"longitude":-112.269,"displayAddress":"9830 W Lower Buckeye Rd, Tolleson, AZ, 85353"},"storeNumber":2149,"name":"Phoenix SW","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stat
 eCode":"AZ","latitude":33.5226,"longitude":-112.096,"displayAddress":"5715 N 19th Ave, Phoenix, AZ, 85015"},"storeNumber":2354,"name":"Phoenix Spectrum SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":34.5488,"longitude":-112.432,"displayAddress":"1851 E Highway 69, Prescott, AZ, 86301"},"storeNumber":884,"name":"Prescott","supertarget":false,"services":[],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":33.2535,"longitude":-111.641,"displayAddress":"21398 S Ellsworth Loop Rd, Queen Creek, A
 Z, 85142"},"storeNumber":2365,"name":"Queen Creek SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.5403,"longitude":-111.888,"displayAddress":"9000 E Indian Bend Rd, Scottsdale, AZ, 85250"},"storeNumber":363,"name":"Scottsdale","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":31.5559,"longitude":-110.255,"displayAddress":"4151 E Highway 90, Sierra Vista, AZ, 85635"},"storeNumber":735,"name":"Sierra Vista","s
 upertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":33.3791,"longitude":-112.034,"displayAddress":"2140 E Baseline Rd, Phoenix, AZ, 85042"},"storeNumber":1905,"name":"South Mountain","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.6371,"longitude":-112.352,"displayAddress":"13731 W Bell Rd, Surprise, AZ, 85374"},"storeNumber":1335,"name":"Surprise","supertarget":fals
 e,"services":["Pharmacy","Optical","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.4312,"longitude":-111.904,"displayAddress":"1800 E Rio Salado Pkwy Ste 120, Tempe, AZ, 85281"},"storeNumber":2176,"name":"Tempe NE","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.3795,"longitude":-111.908,"displayAddress":"1818 E Baseline Rd, Tempe, AZ, 85283"},"storeNumber":319,"name":"Tempe","supertarget":false,"services":["Pharmacy","Photo Center","
 Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":32.2228,"longitude":-110.88,"displayAddress":"5255 E Broadway Blvd, Tucson, AZ, 85711"},"storeNumber":179,"name":"Tucson Broadway","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":32.2228,"longitude":-110.918,"displayAddress":"3699 E Broadway Blvd, Tucson, AZ, 85716"},"storeNumber":1439,"name":"Tucson El Con Mall","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile",
 "Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":32.2493,"longitude":-110.853,"displayAddress":"6500 E Grant Rd, Tucson, AZ, 85715"},"storeNumber":855,"name":"Tucson NE","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":32.3354,"longitude":-111.049,"displayAddress":"3901 W Ina Rd, Tucson, AZ, 85741"},"storeNumber":854,"name":"Tucson NW","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr
 : 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AZ","latitude":32.2802,"longitude":-110.977,"displayAddress":"4040 N Oracle Rd, Tucson, AZ, 85705"},"storeNumber":2140,"name":"Tucson North SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AZ","latitude":32.2081,"longitude":-110.788,"displayAddress":"9615 E Old Spanish Trl, Tucson, AZ, 85748"},"storeNumber":1863,"name":"Tucson SE","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine A
 vailable","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":32.1606,"longitude":-110.989,"displayAddress":"1225 W Irvington Rd, Tucson, AZ, 85714"},"storeNumber":1316,"name":"Tucson SW","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":33.4758,"longitude":-112.218,"displayAddress":"7409 W Virginia Ave, Phoenix, AZ, 85035"},"storeNumber":851,"name":"Westridge","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p
 .m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AZ","latitude":32.7006,"longitude":-114.602,"displayAddress":"1450 S Yuma Palms Pkwy, Yuma, AZ, 85365"},"storeNumber":2083,"name":"Yuma","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AR","latitude":34.6043,"longitude":-92.5321,"displayAddress":"7377 Alcoa Rd, Bryant, AR, 72022"},"storeNumber":2204,"name":"Bryant","supertarget":false,"services":["Pharmacy","Starbucks","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We w
 ill open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AR","latitude":35.0871,"longitude":-92.4135,"displayAddress":"501 Elsinger Blvd, Conway, AR, 72032"},"storeNumber":1891,"name":"Conway","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AR","latitude":36.1157,"longitude":-94.1555,"displayAddress":"3545 N Shiloh Dr, Fayetteville, AR, 72703"},"storeNumber":1470,"name":"Fayetteville","supertarget":false,"services":["Pharmacy","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"AR","latitude":35.3394,"longitude":-94.3896,"displayAddress
 ":"4001 Phoenix Ave, Fort Smith, AR, 72903"},"storeNumber":2284,"name":"Fort Smith","supertarget":false,"services":["Pharmacy","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AR","latitude":35.8228,"longitude":-90.6668,"displayAddress":"3000 E Highland Dr Ste A, Jonesboro, AR, 72401"},"storeNumber":1919,"name":"Jonesboro","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"AR","latitude":34.7886,"longitude":-92.2284,"displayAddress":"4000 McCain Blvd, North Little Rock, AR, 72116"},"storeNumber":162,"
 name":"Little Rock North","supertarget":false,"services":[],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AR","latitude":34.7493,"longitude":-92.3448,"displayAddress":"420 S University Ave, Little Rock, AR, 72205"},"storeNumber":2737,"name":"Little Rock Univer","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AR","latitude":34.7556,"longitude":-92.414,"displayAddress":"12700 Chenal Pkwy, Little Rock, AR, 72211"},"storeNumber":1114,"name":"Little Rock West","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","W
 ine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"AR","latitude":36.2995,"longitude":-94.1735,"displayAddress":"2404 Promenade Blvd, Rogers, AR, 72758"},"storeNumber":2498,"name":"Rogers","supertarget":false,"services":["Pharmacy","Starbucks","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.8832,"longitude":-122.307,"displayAddress":"1057 Eastshore Hwy, Albany, CA, 94710"},"storeNumber":1926,"name":"Albany","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","S
 u: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.0908,"longitude":-118.148,"displayAddress":"2120 W Main St, Alhambra, CA, 91801"},"storeNumber":184,"name":"Alhambra","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.5708,"longitude":-117.705,"displayAddress":"26932 La Paz Rd, Aliso Viejo, CA, 92656"},"storeNumber":259,"name":"Aliso Viejo","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.
 m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8658,"longitude":-117.747,"displayAddress":"8148 E Santa Ana Canyon Rd, Anaheim, CA, 92808"},"storeNumber":677,"name":"Anaheim Hills","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8312,"longitude":-117.943,"displayAddress":"101 S Euclid St, Anaheim, CA, 92802"},"storeNumber":2421,"name":"Anaheim","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00
  p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.964,"longitude":-121.738,"displayAddress":"5769 Lone Tree Way, Antioch, CA, 94531"},"storeNumber":1819,"name":"Antioch Slatten Ranch","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.5276,"longitude":-117.219,"displayAddress":"20288 US Hwy 18, Apple Valley, CA, 92307"},"storeNumber":2260,"name":"Apple Valley North SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"
 pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.3404,"longitude":-120.611,"displayAddress":"1000 Commerce Ave, Atwater, CA, 95301"},"storeNumber":2386,"name":"Atwater SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":38.9431,"longitude":-121.096,"displayAddress":"2700 Bell Rd, Auburn, CA, 95603"},"storeNumber":1097,"name":"Auburn","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hou
 rs":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":34.1371,"longitude":-117.908,"displayAddress":"809 N Azusa Ave, Azusa, CA, 91702"},"storeNumber":2627,"name":"Azusa","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":35.3365,"longitude":-119.036,"displayAddress":"2901 Ming Ave, Bakersfield, CA, 93304"},"storeNumber":2524,"name":"Bakersfield Central","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 
 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":35.3939,"longitude":-118.956,"displayAddress":"3401 Mall View Rd, Bakersfield, CA, 93306"},"storeNumber":614,"name":"Bakersfield NE","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":35.3846,"longitude":-119.103,"displayAddress":"9100 Rosedale Hwy, Bakersfield, CA, 93312"},"storeNumber":1384,"name":"Bakersfield NW","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:
 00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":35.3499,"longitude":-119.125,"displayAddress":"11000 Stockdale Hwy, Bakersfield, CA, 93311"},"storeNumber":2715,"name":"Bakersfield West","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":32.8218,"longitude":-117.179,"displayAddress":"5680 Balboa Ave, San Diego, CA, 92111"},"storeNumber":2465,"name":"Balboa","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.
 m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.0698,"longitude":-117.978,"displayAddress":"3100 Baldwin Park Blvd, Baldwin Park, CA, 91706"},"storeNumber":1033,"name":"Baldwin Park","supertarget":false,"services":["Photo Center","Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":38.6728,"longitude":-121.274,"displayAddress":"5837 Sunrise Blvd, Citrus Heights, CA, 95610"},"storeNumber":1121,"name":"Birdcage-Citrus Heights","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8
 :00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.9189,"longitude":-117.888,"displayAddress":"855 E Birch St, Brea, CA, 92821"},"storeNumber":2482,"name":"Brea","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.7618,"longitude":-117.956,"displayAddress":"13831 Brookhurst St, Garden Grove, CA, 92843"},"storeNumber":193,"name":"Brookhurst","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will op
 en Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8575,"longitude":-118.0,"displayAddress":"7530 Orangethorpe Ave, Buena Park, CA, 90621"},"storeNumber":2082,"name":"Buena Park","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":34.1893,"longitude":-118.33,"displayAddress":"1800 W Empire Ave, Burbank, CA, 91504"},"storeNumber":1362,"name":"Burbank","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 
 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.2173,"longitude":-119.073,"displayAddress":"209 W Ventura Blvd, Camarillo, CA, 93010"},"storeNumber":1027,"name":"Camarillo","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":36.9752,"longitude":-121.966,"displayAddress":"1825 41st Ave, Capitola, CA, 95010"},"storeNumber":2795,"name":"Capitola","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 
 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.8461,"longitude":-118.263,"displayAddress":"20700 S Avalon Blvd Ste 700, Carson, CA, 90746"},"storeNumber":2026,"name":"Carson North","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8095,"longitude":-118.286,"displayAddress":"651 W Sepulveda Blvd, Carson, CA, 90745"},"storeNumber":2328,"name":"Carson","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.
 - 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.8472,"longitude":-118.063,"displayAddress":"20200 Bloomfield Ave, Cerritos, CA, 90703"},"storeNumber":289,"name":"Cerritos","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8594,"longitude":-118.089,"displayAddress":"11525 South St, Cerritos, CA, 90703"},"storeNumber":1305,"name":"Cerritos West","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00
  a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":39.7256,"longitude":-121.807,"displayAddress":"1951 E 20th St, Chico, CA, 95928"},"storeNumber":317,"name":"Chico","supertarget":false,"services":["Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":34.0022,"longitude":-117.719,"displayAddress":"3944 Grand Ave, Chino, CA, 91710"},"storeNumber":912,"name":"Chino Hills","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:0
 0PM."]},{"location":{"stateCode":"CA","latitude":34.0312,"longitude":-117.684,"displayAddress":"5555 Philadelphia St, Chino, CA, 91710"},"storeNumber":258,"name":"Chino","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":32.6046,"longitude":-117.08,"displayAddress":"1240 Broadway, Chula Vista, CA, 91911"},"storeNumber":203,"name":"Chula Vista Broadway","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."
 ]},{"location":{"stateCode":"CA","latitude":32.6498,"longitude":-116.969,"displayAddress":"910 Eastlake Pkwy, Chula Vista, CA, 91914"},"storeNumber":1815,"name":"Chula Vista East","supertarget":false,"services":["Photo Center","Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":32.6512,"longitude":-117.089,"displayAddress":"40 N 4th Ave, Chula Vista, CA, 91910"},"storeNumber":204,"name":"Chula Vista North 4th","supertarget":false,"services":["Target Mobile"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":36.8386,"longitude":-119.728,"displayAddress":"695 W Herndon Ave, Clovis, CA,
  93612"},"storeNumber":2018,"name":"Clovis NW","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":36.8067,"longitude":-119.698,"displayAddress":"900 Shaw Ave, Clovis, CA, 93612"},"storeNumber":358,"name":"Clovis","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.6736,"longitude":-122.465,"displayAddress":"5001 Junipero Serra Blvd, Colma, CA, 94
 014"},"storeNumber":320,"name":"Colma","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.0184,"longitude":-118.152,"displayAddress":"5600 Whittier Blvd, Los Angeles, CA, 90022"},"storeNumber":189,"name":"Commerce","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.88,"longitude":-118.219,"displayAddress":"1621 S Alameda St, Compton,
  CA, 90220"},"storeNumber":2275,"name":"Compton-Rancho Dom","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8244,"longitude":-117.511,"displayAddress":"2615 Tuscanny St, Corona, CA, 92881"},"storeNumber":1548,"name":"Corona","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.6825,"longitude":-117.918,"displayAddress":"3030 Harbor Blvd Ste A, Costa Mesa, CA, 92626"},"storeNumber":12
 93,"name":"Costa Mesa","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.9994,"longitude":-118.394,"displayAddress":"10820 Jefferson Blvd, Culver City, CA, 90230"},"storeNumber":198,"name":"Culver City","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.985,"longitude":-118.394,"
 displayAddress":"6000 Sepulveda Blvd, Culver City, CA, 90230"},"storeNumber":2632,"name":"Culver City South","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":37.324,"longitude":-122.036,"displayAddress":"20745 Stevens Creek Blvd, Cupertino, CA, 95014"},"storeNumber":323,"name":"Cupertino","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM
 ."]},{"location":{"stateCode":"CA","latitude":33.8039,"longitude":-118.012,"displayAddress":"6835 Katella Ave, Cypress, CA, 90630"},"storeNumber":229,"name":"Cypress","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.6704,"longitude":-122.471,"displayAddress":"133 Serramonte Ctr, Daly City, CA, 94015"},"storeNumber":1407,"name":"Daly City Serramonte","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00
 AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":38.5542,"longitude":-121.699,"displayAddress":"4601 2nd St, Davis, CA, 95618"},"storeNumber":2455,"name":"Davis","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":34.0034,"longitude":-117.821,"displayAddress":"747 Grand Ave, Diamond Bar, CA, 91765"},"storeNumber":2179,"name":"Diamond Bar","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]}
 ,{"location":{"stateCode":"CA","latitude":34.1382,"longitude":-117.983,"displayAddress":"1050 Huntington Dr, Duarte, CA, 91010"},"storeNumber":302,"name":"Duarte","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.7029,"longitude":-121.854,"displayAddress":"2800 Dublin Blvd, Dublin, CA, 94568"},"storeNumber":2771,"name":"Dublin East","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37
 .7068,"longitude":-121.931,"displayAddress":"7200 Amador Plaza Rd, Dublin, CA, 94568"},"storeNumber":328,"name":"Dublin","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.9777,"longitude":-117.554,"displayAddress":"12471 Limonite Ave, Eastvale, CA, 91752"},"storeNumber":1961,"name":"Eastvale","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":32.8091,"long
 itude":-116.96,"displayAddress":"250 Broadway, El Cajon, CA, 92021"},"storeNumber":304,"name":"El Cajon","supertarget":false,"services":["Pharmacy","Fresh Grocery","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":32.8133,"longitude":-115.569,"displayAddress":"2295 N Imperial Ave, El Centro, CA, 92243"},"storeNumber":1816,"name":"El Centro","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":38.6498,"longitude":-121.063,"displayAddress
 ":"4400 Town Center Blvd, El Dorado Hills, CA, 95762"},"storeNumber":2270,"name":"El Dorado Hills","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":38.4266,"longitude":-121.416,"displayAddress":"7505 Laguna Blvd, Elk Grove, CA, 95758"},"storeNumber":1025,"name":"Elk Grove","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.0633,"longitude":-117.265,"displayAddress":"1010 
 N El Camino Real, Encinitas, CA, 92024"},"storeNumber":1029,"name":"Encinitas","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.1135,"longitude":-117.1,"displayAddress":"1280 Auto Park Way, Escondido, CA, 92029"},"storeNumber":274,"name":"Escondido","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.0699,"longitude":-117.065,"displayAddress":"280 E Via Rancho Pkwy, 
 Escondido, CA, 92025"},"storeNumber":2802,"name":"Escondido South","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":40.8055,"longitude":-124.145,"displayAddress":"2525 4th St, Eureka, CA, 95501"},"storeNumber":1421,"name":"Eureka","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":38.2466,"longitude":-122.069,"displayAddress":"2059 Cadenasso Dr, Fairfield, CA
 , 94533"},"storeNumber":675,"name":"Fairfield","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":38.6717,"longitude":-121.152,"displayAddress":"430 Blue Ravine Rd, Folsom, CA, 95630"},"storeNumber":1098,"name":"Folsom","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":34.1519,"longitude":-117.474,"displayAddress":"15272 Summit Ave, Fontana, CA, 92336"},"storeNumb
 er":1958,"name":"Fontana North","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":34.0649,"longitude":-117.434,"displayAddress":"16964 Slover Ave, Fontana, CA, 92337"},"storeNumber":660,"name":"Fontana","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.6776,"longitude":-117.664,"displayAddress":"26762 Portola Pkwy, Foothill Ranch, CA, 92610"},"storeNumber":913,"name":"
 Foothill Ranch","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":37.5451,"longitude":-121.985,"displayAddress":"39201 Fremont Blvd, Fremont, CA, 94538"},"storeNumber":1422,"name":"Fremont Hub","supertarget":false,"services":["Photo Center","Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":37.5018,"longitude":-121.968,"displayAddress":"43950 Pacific Commons Blvd, Fremont, CA, 94538"},"storeNumber":2615,"name":"
 Fremont South","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":36.8222,"longitude":-119.788,"displayAddress":"5740 N Blackstone Ave, Fresno, CA, 93710"},"storeNumber":1417,"name":"Fresno Central","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":36.8459,"longitude":-119.788,"displayAddress":"7600 N Blackstone Ave, Fresno, CA, 93720"},"storeNumber":911,"name":"F
 resno North","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":36.7803,"longitude":-119.772,"displayAddress":"3173 E Shields Ave, Fresno, CA, 93726"},"storeNumber":314,"name":"Fresno South","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":36.8097,"longitude":-119.847,"displayAddress":"3150 W Shaw Ave, Fresno, CA, 93711"},"storeNumber":275,"name":"Fresno West","supertarget":f
 alse,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.8887,"longitude":-117.874,"displayAddress":"2920 Yorba Linda Blvd, Fullerton, CA, 92831"},"storeNumber":293,"name":"Fullerton","supertarget":false,"services":["Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8584,"longitude":-117.925,"displayAddress":"200 W Orangethorpe Ave, Fullerton, CA, 92832"},"storeNumber":1418,"name":"Fullerton South","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu 
 Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.7875,"longitude":-117.914,"displayAddress":"12100 Harbor Blvd, Garden Grove, CA, 92840"},"storeNumber":192,"name":"Garden Grove Harbor","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.8866,"longitude":-118.317,"displayAddress":"2169 W Redondo Beach Blvd, Gardena, CA, 90247"},"storeNumber":290,"name":"Gardena","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","
 Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":37.0009,"longitude":-121.551,"displayAddress":"6705 Camino Arroyo, Gilroy, CA, 95020"},"storeNumber":1851,"name":"Gilroy","supertarget":false,"services":["Pharmacy","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.1445,"longitude":-118.259,"displayAddress":"2195 Glendale Galleria, Glendale, CA, 91210"},"storeNumber":2307,"name":"Glendale","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wi
 ne Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.2727,"longitude":-118.503,"displayAddress":"11133 Balboa Blvd, Granada Hills, CA, 91344"},"storeNumber":2329,"name":"Granada Hills","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":36.3237,"longitude":-119.675,"displayAddress":"140 N 12th Ave, Hanford, CA, 93230"},"storeNumber":1906,"name":"Hanford","supertarget":false,"services":["Pharmacy","Photo Center","Fre
 sh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.9227,"longitude":-118.319,"displayAddress":"2700 W 120th St, Hawthorne, CA, 90250"},"storeNumber":2280,"name":"Hawthorne","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":37.6666,"longitude":-122.121,"displayAddress":"19661 Hesperian Blvd, Hayward, CA, 94541"},"storeNumber":2185,"name":"Hayward North","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Targe
 t Mobile","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.6077,"longitude":-122.063,"displayAddress":"2499 Whipple Rd, Hayward, CA, 94544"},"storeNumber":1472,"name":"Hayward","supertarget":false,"services":["Pharmacy","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.746,"longitude":-117.009,"displayAddress":"3527 W Florida Ave, Hemet, CA, 92545"},"storeNumber":761,"name":"Hemet","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m
 .- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.4247,"longitude":-117.385,"displayAddress":"12795 Main St, Hesperia, CA, 92345"},"storeNumber":2468,"name":"Hesperia SuperTarget","supertarget":true,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.6708,"longitude":-117.955,"displayAddress":"9882 Adams Ave, Huntington Beach, CA, 92646"},"storeNumber":2051,"name":"Huntington Beach East","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","In-
 Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.7394,"longitude":-116.218,"displayAddress":"42625 Jackson St, Indio, CA, 92203"},"storeNumber":2441,"name":"Indio SuperTarget","supertarget":true,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.9478,"longitude":-118.333,"displayAddress":"3471 W Century Blvd, Inglewood, CA, 90303"},"storeNumber":1329,"name":"Inglewood","supertarget":false,"services":["Pharmacy","Optical","Fresh Grocery","Starbucks","Target Mobile","Portrait Studio","In-Store
  Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.7278,"longitude":-117.785,"displayAddress":"13200 Jamboree Rd, Irvine, CA, 92602"},"storeNumber":1238,"name":"Irvine North","supertarget":false,"services":["Pharmacy","Photo Center","Optical","Fresh Grocery","Target Mobile","Portrait Studio","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":33.6836,"longitude":-117.81,"displayAddress":"3750 Barranca Pkwy, Irvine, CA, 92606"},"storeNumber":336,"name":"Irvine","supertarget":false,"services":["Pharmacy","Photo Cente
 r","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.6529,"longitude":-117.744,"displayAddress":"115 Fortune Dr, Irvine, CA, 92618"},"storeNumber":2128,"name":"Irvine Spectrum","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":32.8162,"longitude":-117.151,"displayAddress":"8001 Othello Ave, San Diego, CA, 92111"},"storeNumber":205,"name":"Kearny Mesa","supertarget":false,"services":["Fresh Grocery","Wine Available"],"pharmacy":false,"hours"
 :["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":34.0489,"longitude":-118.261,"displayAddress":"735 S Figueroa St, Los Angeles, CA, 90017"},"storeNumber":2776,"name":"LA Central","supertarget":false,"services":["Pharmacy","Starbucks","Target Mobile","Wine Available","In-Store Apple Store"],"pharmacy":true,"hours":["M-Fr: 7:00 a.m.- 9:00 p.m.","Sa: 8:00 a.m. - 9:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","From 11/25/12 - 12/22/12 we will be open Mon-Fri 7:00 AM to 10:00 PM Sat 8:00 AM to 10:00 PM Sun 8:00 AM to 10:00 PM"]},{"location":{"stateCode":"CA","latitude":34.0629,"longitude":-118.444,"displayAddress":"10861 Weyburn Ave, Los Angeles, CA, 90024"},"storeNumber":2774,"name":"LA Westwood","supertarget":false,"services":["Starbucks","Target Mobile","In-Store Apple Store"],"pharmacy":false,"hours":["M-Fr: 7:00 a.m.- 10:00 p.m.","Sa: 8:0
 0 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will be open Mon-Fri 7:00 AM to 11:00 PM Sat 8:00 AM to 11:00 PM Sun 8:00 AM to 10:00 PM"]},{"location":{"stateCode":"CA","latitude":33.9161,"longitude":-117.958,"displayAddress":"1000 W Imperial Hwy, La Habra, CA, 90631"},"storeNumber":2397,"name":"La Habra","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.7104,"longitude":-116.291,"displayAddress":"78935 US Hwy 111, La Quinta, CA, 92253"},"storeNumber":1867,"name":"La Quinta","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","
 Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":33.6897,"longitude":-117.342,"displayAddress":"18287 Collier Ave, Lake Elsinore, CA, 92530"},"storeNumber":2195,"name":"Lake Elsinore","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":33.8522,"longitude":-118.141,"displayAddress":"141 Lakewood Center Mall, Lakewood, CA, 90712"},"storeNumber":1409,"name":"Lakewood Center Mall","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m
 .","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":34.6737,"longitude":-118.149,"displayAddress":"43525 10th St W, Lancaster, CA, 93534"},"storeNumber":245,"name":"Lancaster","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":37.8087,"longitude":-121.299,"displayAddress":"16858 Golden Valley Pkwy, Lathrop, CA, 95330"},"storeNumber":2347,"name":"Lathrop","supertarget":false,"services":["Pharmacy","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We wi
 ll open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":34.1101,"longitude":-117.76,"displayAddress":"2462 Foothill Blvd, La Verne, CA, 91750"},"storeNumber":226,"name":"Laverne","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","In-Store Apple Store","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":32.7414,"longitude":-117.054,"displayAddress":"3424 College Ave, San Diego, CA, 92115"},"storeNumber":1846,"name":"Lemon Grove","supertarget":false,"services":["Photo Center","Fresh Grocery","Target Mobile","Wine Available"],"pharmacy":false,"hours":["M-Fr: 8:00 a.m.- 11:00 p.m.","Sa: 8:00 a.m. - 11:00 p.m.","Su: 8:00 a.m.- 10:00 p.m.","11/25-12/
 15 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM."]},{"location":{"stateCode":"CA","latitude":38.8732,"longitude":-121.301,"displayAddress":"950 Groveland LN, Lincoln, CA, 95648"},"storeNumber":2214,"name":"Lincoln","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.","11/25-12/22 We will open Mon-Sat 8:00AM-11:00PM and Sun 8:00AM-10:00PM.","On 12/23 hours will be 8:00AM-12:00AM."]},{"location":{"stateCode":"CA","latitude":37.7014,"longitude":-121.747,"displayAddress":"4300 Las Positas Rd, Livermore, CA, 94551"},"storeNumber":828,"name":"Livermore","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":true,"hours":["M-Fr: 8:00 a.m.- 10:00 p.m.","Sa: 8:00 a.m. - 10:00 p.m.","Su: 8:00 a.m.- 9:00 p.m.
 ","12/9 - 12/22 we will be open Mon-Sat 8:00AM-12:00AM and Sun 8:00AM-11:00PM"]},{"location":{"stateCode":"CA","latitude":38.117,"longitude":-121.304,"displayAddress":"2355 W Kettleman Ln, Lodi, CA, 95242"},"storeNumber":853,"name":"Lodi","supertarget":false,"services":["Pharmacy","Photo Center","Fresh Grocery","Starbucks","Target Mobile","Wine Available","Flu Shot"],"pharmacy":

<TRUNCATED>

[06/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/UsergridRequest.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/UsergridRequest.cs b/Usergrid.Sdk/UsergridRequest.cs
new file mode 100644
index 0000000..e434fdb
--- /dev/null
+++ b/Usergrid.Sdk/UsergridRequest.cs
@@ -0,0 +1,91 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using RestSharp;
+
+namespace Usergrid.Sdk
+{
+    internal class UsergridRequest : IUsergridRequest
+    {
+        private readonly string _application;
+        private readonly string _organization;
+        private readonly IRestClient _restClient;
+
+        public UsergridRequest(string baseUri, string organization, string application, IRestClient restClient = null)
+        {
+            _organization = organization;
+            _application = application;
+            _restClient = restClient ?? new RestClient(baseUri);
+        }
+
+        public string AccessToken { get; set; }
+
+        public IRestResponse<T> ExecuteJsonRequest<T>(string resource, Method method, object body = null) where T : new()
+        {
+            RestRequest request = GetRequest(resource, method);
+            AddBodyAsJson(body, request);
+            IRestResponse<T> response = _restClient.Execute<T>(request);
+            return response;
+        }
+
+        public IRestResponse ExecuteJsonRequest(string resource, Method method, object body = null)
+        {
+            RestRequest request = GetRequest(resource, method);
+            AddBodyAsJson(body, request);
+            IRestResponse response = _restClient.Execute(request);
+            return response;
+        }
+
+        public IRestResponse ExecuteMultipartFormDataRequest(string resource, Method method, IDictionary<string, object> formParameters, IDictionary<string, string> fileParameters)
+        {
+            RestRequest request = GetRequest(resource, method);
+            foreach (var parameter in formParameters)
+            {
+                request.AddParameter(parameter.Key, parameter.Value, ParameterType.GetOrPost);
+            }
+            foreach (var parameter in fileParameters)
+            {
+                request.AddFile(parameter.Key, parameter.Value);
+            }
+
+            IRestResponse response = _restClient.Execute(request);
+            return response;
+        }
+
+        private RestRequest GetRequest(string resource, Method method)
+        {
+            var request = new RestRequest(string.Format("{0}/{1}{2}", _organization, _application, resource), method);
+            AddAuthorizationHeader(request);
+            return request;
+        }
+
+        private static void AddBodyAsJson(object body, RestRequest request)
+        {
+            if (body != null)
+            {
+                request.JsonSerializer = new RestSharpJsonSerializer();
+                request.RequestFormat = DataFormat.Json;
+                request.AddBody(body);
+            }
+        }
+
+        private void AddAuthorizationHeader(RestRequest request)
+        {
+            if (AccessToken != null)
+                request.AddHeader("Authorization", string.Format("Bearer {0}", AccessToken));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/packages.config
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/packages.config b/Usergrid.Sdk/packages.config
new file mode 100644
index 0000000..e0fdea2
--- /dev/null
+++ b/Usergrid.Sdk/packages.config
@@ -0,0 +1,22 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<packages>
+  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
+  <package id="RestSharp" version="104.1" targetFramework="net40" />
+</packages>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.sln
----------------------------------------------------------------------
diff --git a/Usergrid.sln b/Usergrid.sln
new file mode 100644
index 0000000..0cc597d
--- /dev/null
+++ b/Usergrid.sln
@@ -0,0 +1,49 @@
+\ufeff# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Usergrid.Sdk.IntegrationTests", "Usergrid.Sdk.IntegrationTests\Usergrid.Sdk.IntegrationTests.csproj", "{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Usergrid.Sdk.Tests", "Usergrid.Sdk.Tests\Usergrid.Sdk.Tests.csproj", "{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Usergrid.Sdk", "Usergrid.Sdk\Usergrid.Sdk.csproj", "{437D108F-528C-4B2A-B399-06CF02DEB08B}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0278A0A4-F5E9-41F7-A86E-CD376D3FE5E2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{437D108F-528C-4B2A-B399-06CF02DEB08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{437D108F-528C-4B2A-B399-06CF02DEB08B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{437D108F-528C-4B2A-B399-06CF02DEB08B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{437D108F-528C-4B2A-B399-06CF02DEB08B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = Usergrid.Sdk.IntegrationTests\Usergrid.Sdk.IntegrationTests.csproj
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/new-project-template/new-project-template.sln
----------------------------------------------------------------------
diff --git a/new-project-template/new-project-template.sln b/new-project-template/new-project-template.sln
new file mode 100644
index 0000000..7c02301
--- /dev/null
+++ b/new-project-template/new-project-template.sln
@@ -0,0 +1,37 @@
+\ufeff# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.20827.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "new-project-template", "new-project-template\new-project-template.csproj", "{4093C602-DF22-4AC7-AECE-DBD7216E4252}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{4093C602-DF22-4AC7-AECE-DBD7216E4252}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4093C602-DF22-4AC7-AECE-DBD7216E4252}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4093C602-DF22-4AC7-AECE-DBD7216E4252}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4093C602-DF22-4AC7-AECE-DBD7216E4252}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/new-project-template/new-project-template/App.config
----------------------------------------------------------------------
diff --git a/new-project-template/new-project-template/App.config b/new-project-template/new-project-template/App.config
new file mode 100644
index 0000000..fdea839
--- /dev/null
+++ b/new-project-template/new-project-template/App.config
@@ -0,0 +1,22 @@
+\ufeff<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/new-project-template/new-project-template/Program.cs
----------------------------------------------------------------------
diff --git a/new-project-template/new-project-template/Program.cs b/new-project-template/new-project-template/Program.cs
new file mode 100644
index 0000000..c509c80
--- /dev/null
+++ b/new-project-template/new-project-template/Program.cs
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace new_project_template
+{
+    class Book : Usergrid.Sdk.Model.UsergridEntity
+    {
+        public string title { get; set; }
+    }
+
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            //Start by replacing <org name> with your App Services organization name!
+            var client = new Usergrid.Sdk.Client( <org name>, "sandbox");
+            
+            //Uncomment this line if you are not using your App Services 'sandbox' application
+            //client.Login(<login id>, <password>, Usergrid.Sdk.Model.AuthType.User);
+
+            //
+            // Print out the books from the books collection
+            //
+
+            Console.WriteLine("Book Number\tBook Title");
+            Console.WriteLine("===========\t==========");
+            var books = client.GetEntities<Book>("books");
+            int j = 1;
+            do
+            {
+                for (int i = 0; i < books.Count; i++)
+                {
+                    Book b = books[i];
+                    Console.WriteLine(j + "\t\t" + b.title);
+                    j++;
+                }
+                books = client.GetNextEntities<Book>("books");
+            } while (books.Count > 0);
+
+            //
+            // Create a new book and add it to the database
+            //
+            Book newBook = new Book();
+            newBook.title = "The Old Man and the Sea";
+            client.CreateEntity<Book>("books", newBook);
+
+            //
+            // Change/Update Entities
+            //
+            books = client.GetEntities<Book>("books", 10, null);
+            for (int k = 0; k < books.Count; k++)
+            {
+                Book b = books[k];
+                Book updatedBook = new Book();
+                updatedBook.title = "Another Title";
+                client.UpdateEntity<Book>("books", b.Uuid, updatedBook);
+            }
+
+            //
+            // Delete Entities
+            //
+            books = client.GetEntities<Book>("books", 10, "where title contains 'Another'");
+            for (int k = 0; k < books.Count; k++)
+            {
+                Book b = books[k];
+                client.DeleteEntity("books", b.Uuid);
+            }
+
+            Console.Read();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/new-project-template/new-project-template/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/new-project-template/new-project-template/Properties/AssemblyInfo.cs b/new-project-template/new-project-template/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..77af3bb
--- /dev/null
+++ b/new-project-template/new-project-template/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("new-project-template")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("new-project-template")]
+[assembly: AssemblyCopyright("Copyright �  2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("92325506-0927-47df-be5b-db9c3608de9d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/new-project-template/new-project-template/new-project-template.csproj
----------------------------------------------------------------------
diff --git a/new-project-template/new-project-template/new-project-template.csproj b/new-project-template/new-project-template/new-project-template.csproj
new file mode 100644
index 0000000..7f7a170
--- /dev/null
+++ b/new-project-template/new-project-template/new-project-template.csproj
@@ -0,0 +1,84 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4093C602-DF22-4AC7-AECE-DBD7216E4252}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>new_project_template</RootNamespace>
+    <AssemblyName>new-project-template</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\RestSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Usergrid.Sdk">
+      <HintPath>..\..\..\..\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Usergrid.Sdk.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/NSubstitute.1.6.0.0/LICENSE.txt
----------------------------------------------------------------------
diff --git a/packages/NSubstitute.1.6.0.0/LICENSE.txt b/packages/NSubstitute.1.6.0.0/LICENSE.txt
new file mode 100644
index 0000000..4d1337d
--- /dev/null
+++ b/packages/NSubstitute.1.6.0.0/LICENSE.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2009 Anthony Egerton (nsubstitute@delfish.com) and David Tchepak (dave@davesquared.net)
+All rights reserved.
+ 
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+ 
+    * Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+    * Neither the names of the copyright holders nor the names of 
+    contributors may be used to endorse or promote products derived from this
+    software without specific prior written permission.
+ 
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+[ http://www.opensource.org/licenses/bsd-license.php ]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/NSubstitute.1.6.0.0/NSubstitute.1.6.0.0.nuspec
----------------------------------------------------------------------
diff --git a/packages/NSubstitute.1.6.0.0/NSubstitute.1.6.0.0.nuspec b/packages/NSubstitute.1.6.0.0/NSubstitute.1.6.0.0.nuspec
new file mode 100644
index 0000000..19d3d02
--- /dev/null
+++ b/packages/NSubstitute.1.6.0.0/NSubstitute.1.6.0.0.nuspec
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+  <metadata>
+    <id>NSubstitute</id>
+    <version>1.6.0.0</version>
+    <title>NSubstitute</title>
+    <authors>Anthony Egerton, David Tchepak</authors>
+    <owners>Anthony Egerton, David Tchepak</owners>
+    <licenseUrl>https://github.com/nsubstitute/NSubstitute/raw/master/LICENSE.txt</licenseUrl>
+    <projectUrl>http://nsubstitute.github.com/</projectUrl>
+    <iconUrl>http://nsubstitute.github.com/images/nsubstitute-100x100.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>NSubstitute is a friendly substitute for .NET mocking frameworks. It has a simple, succinct syntax to help developers write clearer tests. NSubstitute is designed for Arrange-Act-Assert (AAA) testing and with Test Driven Development (TDD) in mind.</description>
+    <releaseNotes />
+    <copyright />
+    <language />
+    <tags>mocking mocks testing unit-testing TDD AAA</tags>
+  </metadata>
+</package>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/NSubstitute.1.6.0.0/acknowledgements.txt
----------------------------------------------------------------------
diff --git a/packages/NSubstitute.1.6.0.0/acknowledgements.txt b/packages/NSubstitute.1.6.0.0/acknowledgements.txt
new file mode 100644
index 0000000..c8fedea
--- /dev/null
+++ b/packages/NSubstitute.1.6.0.0/acknowledgements.txt
@@ -0,0 +1,63 @@
+
+The aim of this file is to acknowledge the software projects that have been 
+used to create NSubstitute, particularly those distributed as Open Source 
+Software. They have been invaluable in helping us produce this software.
+
+# Software distributed with/compiled into NSubstitute
+
+## Castle.Core
+NSubstitute is built on the Castle.Core library, particularly Castle.DynamicProxy 
+which is used for generating proxies for types and intercepting calls 
+made to them so that NSubstitute can record them. 
+
+Castle.Core is maintained by the Castle Project [http://www.castleproject.org/] 
+and is released under the Apache License, Version 2.0 
+[http://www.apache.org/licenses/LICENSE-2.0.html].
+
+# Software used to help build NSubstitute
+
+## NUnit [http://www.nunit.org/]
+NUnit is used for coding and running unit and integration tests for NSubstitute. It is distributed under an open source zlib/libpng based license [http://www.opensource.org/licenses/zlib-license.html].
+
+## Rhino Mocks [http://www.ayende.com/projects/rhino-mocks.aspx]
+Used for mocking parts of the NSubstitute mocking framework for testing. It is distributed under the BSD license [http://www.opensource.org/licenses/bsd-license.php].
+
+## Moq [http://moq.me/]
+Moq is not used in NSubstitute, but was a great source of inspiration. Moq pioneered Arrange-Act-Assert (AAA) mocking syntax for .NET, as well as removing the distinction between mocks and stubs, both of which have become important parts of NSubstitute. Moq is available under the BSD license [http://www.opensource.org/licenses/bsd-license.php].
+
+## NuPack [http://nupack.codeplex.com/]
+Used for packaging NSubstitute for distribution as a nu package. Distributed under the Apache License, Version 2.0 [http://www.apache.org/licenses/LICENSE-2.0.html].
+
+## Jekyll [http://jekyllrb.com/]
+Static website generator written in Ruby, used for NSubstitute's website and documentation. Distributed under the MIT license [http://www.opensource.org/licenses/bsd-license.php].
+
+## SyntaxHighlighter [http://alexgorbatchev.com/SyntaxHighlighter/]
+Open source, JavaScript, client-side code highlighter used for highlighting code samples on the NSubstitute website. Distributed under the MIT License [http://en.wikipedia.org/wiki/MIT_License] and the GPL [http://www.gnu.org/copyleft/lesser.html].
+
+## Ruby (and libraries) [http://www.ruby-lang.org]
+Ruby is used for NSubstitute's build. The rake library is used to run the build; custom Ruby code is used to extract and test code samples from documentation; rspec is used to test that Ruby code; Markdown is used for documentation; gems for installing all this stuff; RubyInstaller for Windows and DevKit for interop with Windows; and much more. Ruby is awesome, as are the many projects contributed to the Ruby community that make developers' lives awesome.
+
+Ruby is distributed under the Ruby license [http://www.ruby-lang.org/en/LICENSE.txt]. The libraries mentioned are available under a variety of licenses. Please see their websites for more information.
+
+## Microsoft .NET Framework [http://www.microsoft.com/net/]
+NSubstitute is coded in C# and compiled using Microsoft .NET. It can also run and compile under Mono [http://www.mono-project.com], an open source implementation of the open .NET standards for C# and the CLI.
+
+Microsoft's .NET Framework is available under a EULA (and possibly other licenses like MS Reference Source License).
+Mono is available under four open source licenses for different parts of the project (including MIT/X11, GPL, MS-Pl). These are described on the project site [http://www.mono-project.com/Licensing].
+
+## Microsoft Ilmerge [http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx]
+Used for combining assemblies so NSubstitute can be distributed as a single DLL. Available for use under a EULA as described on the ilmerge site.
+
+## Microsoft Reactive Extensions for .NET (Rx) [http://msdn.microsoft.com/en-us/devlabs/ee794896]
+Used to provide .NET 3.5 with some of the neat concurrency helper classes that ship with out of the box with .NET 4.0. Distributed under a EULA [http://msdn.microsoft.com/en-us/devlabs/ff394099].
+
+## 7-Zip [http://www.7-zip.org/]
+7-zip is used to ZIP up NSubstitute distributions as part of the automated build process. Distributed under a mixed GNU LGPL / unRAR licence [http://www.7-zip.org/license.txt].
+
+# Other acknowledgements
+
+## Software developers
+Yes, you! To everyone who has tried to get better at the craft and science of programming, especially those of you who have talked, tweeted, blogged, screencasted, and/or contributed software or ideas to the community.
+
+No software developers were harmed to any significant extent during the production of NSubstitute, although some had to get by on reduced sleep.
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec
----------------------------------------------------------------------
diff --git a/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec
new file mode 100644
index 0000000..01e43e2
--- /dev/null
+++ b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>NUnit</id>
+    <version>2.6.2</version>
+    <title>NUnit</title>
+    <authors>Charlie Poole</authors>
+    <owners>Charlie Poole</owners>
+    <licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+    <projectUrl>http://nunit.org/</projectUrl>
+    <iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests.
+
+Version 2.6 is the seventh major release of this well-known and well-tested programming tool.
+
+This package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.</description>
+    <summary>NUnit is a unit-testing framework for all .Net languages with a strong TDD focus.</summary>
+    <releaseNotes>Version 2.6 is the seventh major release of NUnit.
+
+Unlike earlier versions, this package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.
+
+The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package.</releaseNotes>
+    <copyright />
+    <language>en-US</language>
+    <tags>test testing tdd framework fluent assert theory plugin addin</tags>
+    <references>
+      <reference file="nunit.framework.dll" />
+    </references>
+  </metadata>
+</package>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/NUnit.2.6.2/license.txt
----------------------------------------------------------------------
diff --git a/packages/NUnit.2.6.2/license.txt b/packages/NUnit.2.6.2/license.txt
new file mode 100644
index 0000000..530a6e0
--- /dev/null
+++ b/packages/NUnit.2.6.2/license.txt
@@ -0,0 +1,15 @@
+Copyright \ufffd 2002-2012 Charlie Poole
+Copyright \ufffd 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+Copyright \ufffd 2000-2002 Philip A. Craig
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+
+Portions Copyright \ufffd 2002-2012 Charlie Poole or Copyright \ufffd 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright \ufffd 2000-2002 Philip A. Craig
+
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/Newtonsoft.Json.4.5.11/LICENSE.txt
----------------------------------------------------------------------
diff --git a/packages/Newtonsoft.Json.4.5.11/LICENSE.txt b/packages/Newtonsoft.Json.4.5.11/LICENSE.txt
new file mode 100644
index 0000000..4aa4a21
--- /dev/null
+++ b/packages/Newtonsoft.Json.4.5.11/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files (the "Software"), to deal 
+in the Software without restriction, including without limitation the rights 
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
+of the Software, and to permit persons to whom the Software is furnished to 
+do so, subject to the following conditions:
+
+
+The above copyright notice and this permission notice shall be included in all 
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR 
+A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/Newtonsoft.Json.4.5.11/Newtonsoft.Json.4.5.11.nuspec
----------------------------------------------------------------------
diff --git a/packages/Newtonsoft.Json.4.5.11/Newtonsoft.Json.4.5.11.nuspec b/packages/Newtonsoft.Json.4.5.11/Newtonsoft.Json.4.5.11.nuspec
new file mode 100644
index 0000000..f0c616e
--- /dev/null
+++ b/packages/Newtonsoft.Json.4.5.11/Newtonsoft.Json.4.5.11.nuspec
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>Newtonsoft.Json</id>
+    <version>4.5.11</version>
+    <title>Json.NET</title>
+    <authors>James Newton-King</authors>
+    <owners>James Newton-King</owners>
+    <licenseUrl>http://json.codeplex.com/license</licenseUrl>
+    <projectUrl>http://james.newtonking.com/projects/json-net.aspx</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Json.NET is a popular high-performance JSON framework for .NET</description>
+    <language>en-US</language>
+    <tags>json</tags>
+    <references>
+      <reference file="Newtonsoft.Json.dll" />
+    </references>
+  </metadata>
+</package>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/RestSharp.104.1/LICENSE.txt
----------------------------------------------------------------------
diff --git a/packages/RestSharp.104.1/LICENSE.txt b/packages/RestSharp.104.1/LICENSE.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packages/RestSharp.104.1/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/RestSharp.104.1/RestSharp.104.1.nuspec
----------------------------------------------------------------------
diff --git a/packages/RestSharp.104.1/RestSharp.104.1.nuspec b/packages/RestSharp.104.1/RestSharp.104.1.nuspec
new file mode 100644
index 0000000..ba03ed3
--- /dev/null
+++ b/packages/RestSharp.104.1/RestSharp.104.1.nuspec
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>RestSharp</id>
+    <version>104.1</version>
+    <title>RestSharp</title>
+    <authors>John Sheehan,  RestSharp Community</authors>
+    <owners>John Sheehan,  RestSharp Community</owners>
+    <licenseUrl>https://github.com/restsharp/RestSharp/blob/master/LICENSE.txt</licenseUrl>
+    <projectUrl>http://restsharp.org/</projectUrl>
+    <iconUrl>http://dl.dropbox.com/u/1827/restsharp100.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Simple REST and HTTP API Client</description>
+    <releaseNotes>For full release notes see https://github.com/restsharp/RestSharp/blob/master/releasenotes.markdown</releaseNotes>
+    <copyright />
+    <language>en-US</language>
+    <tags>REST HTTP API JSON XML</tags>
+    <references>
+      <reference file="RestSharp.dll" />
+      <reference file="RestSharp.WindowsPhone.dll" />
+      <reference file="RestSharp.Silverlight.dll" />
+    </references>
+  </metadata>
+</package>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/packages/repositories.config
----------------------------------------------------------------------
diff --git a/packages/repositories.config b/packages/repositories.config
new file mode 100644
index 0000000..4cf3a85
--- /dev/null
+++ b/packages/repositories.config
@@ -0,0 +1,22 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<repositories>
+  <repository path="..\Sdk.Test\packages.config" />
+  <repository path="..\Sdk\packages.config" />
+  <repository path="..\Usergrid.Sdk.IntegrationTests\packages.config" />
+</repositories>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/README.md
----------------------------------------------------------------------
diff --git a/samples/README.md b/samples/README.md
new file mode 100644
index 0000000..1ab4dff
--- /dev/null
+++ b/samples/README.md
@@ -0,0 +1 @@
+#samples directory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample.sln
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample.sln b/samples/locationSample/LocationDotNetSample.sln
new file mode 100644
index 0000000..c4a9430
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample.sln
@@ -0,0 +1,36 @@
+\ufeff# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.20827.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocationDotNetSample", "LocationDotNetSample\LocationDotNetSample.csproj", "{6F830639-6E84-4FBC-B975-49521F30DE83}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6F830639-6E84-4FBC-B975-49521F30DE83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6F830639-6E84-4FBC-B975-49521F30DE83}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6F830639-6E84-4FBC-B975-49521F30DE83}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6F830639-6E84-4FBC-B975-49521F30DE83}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/App.config
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/App.config b/samples/locationSample/LocationDotNetSample/App.config
new file mode 100644
index 0000000..fdea839
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/App.config
@@ -0,0 +1,22 @@
+\ufeff<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Form1.Designer.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Form1.Designer.cs b/samples/locationSample/LocationDotNetSample/Form1.Designer.cs
new file mode 100644
index 0000000..9e83694
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Form1.Designer.cs
@@ -0,0 +1,269 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace LocationDotNetSample
+{
+    partial class Form1
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.gMap = new GMap.NET.WindowsForms.GMapControl();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtStreetAddress = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.txtCity = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.txtState = new System.Windows.Forms.TextBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.btnSubmit = new System.Windows.Forms.Button();
+            this.label6 = new System.Windows.Forms.Label();
+            this.txtZip = new System.Windows.Forms.TextBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.storeList = new System.Windows.Forms.ListBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.txtStoreDetails = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // gMap
+            // 
+            this.gMap.Bearing = 0F;
+            this.gMap.CanDragMap = true;
+            this.gMap.GrayScaleMode = false;
+            this.gMap.LevelsKeepInMemmory = 5;
+            this.gMap.Location = new System.Drawing.Point(0, 0);
+            this.gMap.MarkersEnabled = true;
+            this.gMap.MaxZoom = 18;
+            this.gMap.MinZoom = 2;
+            this.gMap.MouseWheelZoomType = GMap.NET.MouseWheelZoomType.MousePositionAndCenter;
+            this.gMap.Name = "gMap";
+            this.gMap.NegativeMode = false;
+            this.gMap.PolygonsEnabled = true;
+            this.gMap.RetryLoadTile = 0;
+            this.gMap.RoutesEnabled = true;
+            this.gMap.ShowTileGridLines = false;
+            this.gMap.Size = new System.Drawing.Size(831, 665);
+            this.gMap.TabIndex = 0;
+            this.gMap.Zoom = 11D;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(971, 22);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(85, 25);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "Address";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label2.Location = new System.Drawing.Point(837, 75);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(121, 20);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Street Address";
+            // 
+            // txtStreetAddress
+            // 
+            this.txtStreetAddress.Location = new System.Drawing.Point(976, 75);
+            this.txtStreetAddress.Name = "txtStreetAddress";
+            this.txtStreetAddress.Size = new System.Drawing.Size(291, 22);
+            this.txtStreetAddress.TabIndex = 3;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label3.Location = new System.Drawing.Point(841, 121);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(38, 20);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "City";
+            // 
+            // txtCity
+            // 
+            this.txtCity.Location = new System.Drawing.Point(976, 121);
+            this.txtCity.Name = "txtCity";
+            this.txtCity.Size = new System.Drawing.Size(278, 22);
+            this.txtCity.TabIndex = 5;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label4.Location = new System.Drawing.Point(841, 172);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(48, 20);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "State";
+            // 
+            // txtState
+            // 
+            this.txtState.Location = new System.Drawing.Point(976, 172);
+            this.txtState.Name = "txtState";
+            this.txtState.Size = new System.Drawing.Size(278, 22);
+            this.txtState.TabIndex = 7;
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label5.Location = new System.Drawing.Point(845, 217);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(0, 20);
+            this.label5.TabIndex = 8;
+            // 
+            // btnSubmit
+            // 
+            this.btnSubmit.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.btnSubmit.Location = new System.Drawing.Point(1179, 275);
+            this.btnSubmit.Name = "btnSubmit";
+            this.btnSubmit.Size = new System.Drawing.Size(88, 42);
+            this.btnSubmit.TabIndex = 10;
+            this.btnSubmit.Text = "Submit";
+            this.btnSubmit.UseVisualStyleBackColor = true;
+            this.btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click);
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(841, 226);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(65, 17);
+            this.label6.TabIndex = 11;
+            this.label6.Text = "Zip Code";
+            // 
+            // txtZip
+            // 
+            this.txtZip.Location = new System.Drawing.Point(976, 226);
+            this.txtZip.Name = "txtZip";
+            this.txtZip.Size = new System.Drawing.Size(143, 22);
+            this.txtZip.TabIndex = 12;
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label7.Location = new System.Drawing.Point(844, 313);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(148, 25);
+            this.label7.TabIndex = 13;
+            this.label7.Text = "Store Locations";
+            // 
+            // storeList
+            // 
+            this.storeList.FormattingEnabled = true;
+            this.storeList.ItemHeight = 16;
+            this.storeList.Location = new System.Drawing.Point(844, 341);
+            this.storeList.Name = "storeList";
+            this.storeList.Size = new System.Drawing.Size(473, 100);
+            this.storeList.TabIndex = 14;
+            this.storeList.SelectedIndexChanged += new System.EventHandler(this.storeList_SelectedIndexChanged);
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label8.Location = new System.Drawing.Point(844, 459);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(123, 25);
+            this.label8.TabIndex = 15;
+            this.label8.Text = "Store Details";
+            // 
+            // txtStoreDetails
+            // 
+            this.txtStoreDetails.AutoSize = true;
+            this.txtStoreDetails.Location = new System.Drawing.Point(845, 484);
+            this.txtStoreDetails.Name = "txtStoreDetails";
+            this.txtStoreDetails.Size = new System.Drawing.Size(0, 17);
+            this.txtStoreDetails.TabIndex = 16;
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1366, 677);
+            this.Controls.Add(this.txtStoreDetails);
+            this.Controls.Add(this.label8);
+            this.Controls.Add(this.storeList);
+            this.Controls.Add(this.label7);
+            this.Controls.Add(this.txtZip);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.btnSubmit);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.txtState);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.txtCity);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.txtStreetAddress);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.gMap);
+            this.Name = "Form1";
+            this.Text = "Form1";
+            this.Load += new System.EventHandler(this.Form1_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private GMap.NET.WindowsForms.GMapControl gMap;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtStreetAddress;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TextBox txtCity;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox txtState;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Button btnSubmit;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.TextBox txtZip;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.ListBox storeList;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.Label txtStoreDetails;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Form1.cs
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Form1.cs b/samples/locationSample/LocationDotNetSample/Form1.cs
new file mode 100644
index 0000000..0297d27
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Form1.cs
@@ -0,0 +1,148 @@
+
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Geocoder;
+// https://github.com/bmontgomery/Geocoder
+
+namespace LocationDotNetSample
+{
+    public partial class Form1 : Form
+    {
+        private Geocoder.Location mapCenter{get; set;}
+        private GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen currentPosition { get; set; }
+        private GMap.NET.WindowsForms.GMapOverlay markerOverlay { get; set; }
+        private Usergrid.Sdk.Client client { get; set; }
+        private Usergrid.Sdk.UsergridCollection<Store> stores;
+        private string orgName = "mmalloy@apigee.com";
+        private string appName = "testapp";
+        private string collection = "targets";
+
+        public Form1()
+        {
+            InitializeComponent();
+            currentPosition = null;
+            client = new Usergrid.Sdk.Client("mmalloy@apigee.com", "testapp");
+        }
+
+       
+        private void btnSubmit_Click(object sender, EventArgs e)
+        {
+
+            string address = "";
+            if (txtStreetAddress.Text != "" && txtCity.Text != "" && txtState.Text != "") { address = txtStreetAddress.Text + "," + txtCity.Text + "," + txtState.Text; }
+            else if (txtCity.Text != "" && txtState.Text != ""){ address = txtCity.Text + "," + txtState.Text;}
+            else if (txtZip.Text != "") { address = txtZip.Text; }
+
+            if (address == "") { MessageBox.Show("Enter a valid address, city, or zip code");}
+            else {
+                var geocoder = new Geocoder.GeocodeService();
+                var location = geocoder.GeocodeLocation(address);
+                storeList.Items.Clear();
+                txtStoreDetails.Text = "";
+                markerOverlay.Markers.Clear(); 
+                centerMap(location); 
+                markCurrentLocation(location);
+                stores = findStores();
+                for (int i = 0; i < stores.Count; i++) { markStoreLocation(stores[i]); }
+                addStoresToList();
+
+            }
+            
+        }
+
+        private void centerMap(Geocoder.Location location)
+        {
+            mapCenter = location;
+            var lat = mapCenter.Latitude;
+            var lon = mapCenter.Longitude;
+            gMap.Position = new GMap.NET.PointLatLng(lat, lon);
+
+        }
+        private void markCurrentLocation(Geocoder.Location location)
+        {
+            var lat = location.Latitude;
+            var lon = location.Longitude;
+            GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen m = new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(new GMap.NET.PointLatLng(lat, lon));
+            currentPosition = m;
+            markerOverlay.Markers.Add(m);
+            m.ToolTipText = "Current Position";
+        }
+
+        private void markStoreLocation(Store store)
+        {
+            var lat = Convert.ToDouble(store.location.latitude);
+            var lon = Convert.ToDouble(store.location.longitude);
+            GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed m = new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleRed(new GMap.NET.PointLatLng(lat, lon));
+            string tooltiptext = store.name + "\n" + store.location.displayAddress;
+            m.ToolTipText = tooltiptext;
+            markerOverlay.Markers.Add(m);
+        }
+
+        private void addStoresToList()
+        {
+            for (int i = 0; i < stores.Count; i++)
+            {
+                storeList.Items.Add(stores[i].name);
+            }
+        }
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+            this.Text = "Store Finder";
+            gMap.MapProvider = GMap.NET.MapProviders.GoogleMapProvider.Instance;
+            GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
+            var geocoder = new Geocoder.GeocodeService();
+            var location = geocoder.GeocodeLocation("Palo Alto, CA");
+            centerMap(location);
+            markerOverlay = new GMap.NET.WindowsForms.GMapOverlay(gMap, "markers");
+            gMap.Overlays.Add(markerOverlay);
+        }
+
+        private Usergrid.Sdk.UsergridCollection<Store> findStores()
+        {
+            string latlon = mapCenter.Latitude + "," + mapCenter.Longitude;
+            return client.GetEntities<Store>(collection, 20, "location within 15000 of " + latlon);
+        }
+
+        private void storeList_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            Store selectedStore = stores[storeList.SelectedIndex];
+            txtStoreDetails.Text = "Store Name: " + selectedStore.name + "\n" + "Hours:";
+            for (int j = 0; j < selectedStore.hours.Count(); j++)
+            {
+                txtStoreDetails.Text += "\n" + selectedStore.hours[j];
+            }
+            txtStoreDetails.Text += "\n\nServices: ";
+            for (int k = 0; k < selectedStore.services.Count(); k++)
+            {          
+                txtStoreDetails.Text += selectedStore.services[k];
+                if (k != selectedStore.services.Count()-1) { txtStoreDetails.Text += ","; }
+                if (k != 0 && k % 4 == 0) { txtStoreDetails.Text += "\n"; }
+            }
+               
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/locationSample/LocationDotNetSample/Form1.resx
----------------------------------------------------------------------
diff --git a/samples/locationSample/LocationDotNetSample/Form1.resx b/samples/locationSample/LocationDotNetSample/Form1.resx
new file mode 100644
index 0000000..85d1d78
--- /dev/null
+++ b/samples/locationSample/LocationDotNetSample/Form1.resx
@@ -0,0 +1,137 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>


[10/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
Initial commit of Usergrid .NET SDK into its own rep


Project: http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/commit/94c0483c
Tree: http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/tree/94c0483c
Diff: http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/diff/94c0483c

Branch: refs/heads/master
Commit: 94c0483ccbb3107902f05b3fcc2be298d361ace3
Parents: 
Author: Michael Russo <mr...@apigee.com>
Authored: Fri Sep 2 10:06:01 2016 -0700
Committer: Michael Russo <mr...@apigee.com>
Committed: Fri Sep 2 10:06:01 2016 -0700

----------------------------------------------------------------------
 .gitattributes                                  |  22 +
 .gitignore                                      | 152 +++++++
 LICENSE                                         | 202 +++++++++
 NOTICE                                          |  56 +++
 README.md                                       | 316 +++++++++++++
 .../ActivitiesTests.cs                          | 174 ++++++++
 Usergrid.Sdk.IntegrationTests/BaseTest.cs       | 163 +++++++
 .../ConnectionTests.cs                          | 199 +++++++++
 Usergrid.Sdk.IntegrationTests/DeviceTests.cs    |  63 +++
 .../EntityCrudTests.cs                          | 153 +++++++
 .../EntityPagingTests.cs                        |  83 ++++
 Usergrid.Sdk.IntegrationTests/Friend.cs         |  23 +
 Usergrid.Sdk.IntegrationTests/GroupTests.cs     |  91 ++++
 Usergrid.Sdk.IntegrationTests/LoginTests.cs     |  96 ++++
 .../NotificationTests.cs                        | 133 ++++++
 .../Properties/AssemblyInfo.cs                  |  55 +++
 .../UserManagementTests.cs                      |  96 ++++
 .../Usergrid.Sdk.IntegrationTests.csproj        | 109 +++++
 .../Usergrid.Sdk.IntegrationTests.dll.config    |  33 ++
 Usergrid.Sdk.IntegrationTests/UsergridFriend.cs |  23 +
 Usergrid.Sdk.IntegrationTests/packages.config   |  24 +
 .../AuthenticationManagerTests.cs               | 135 ++++++
 Usergrid.Sdk.Tests/ClientTests/ActivityTests.cs |  86 ++++
 .../ClientTests/ConnectionTests.cs              |  88 ++++
 Usergrid.Sdk.Tests/ClientTests/DeviceTests.cs   | 143 ++++++
 Usergrid.Sdk.Tests/ClientTests/EntityTests.cs   | 210 +++++++++
 Usergrid.Sdk.Tests/ClientTests/FeedTests.cs     |  65 +++
 Usergrid.Sdk.Tests/ClientTests/GroupTests.cs    | 199 +++++++++
 Usergrid.Sdk.Tests/ClientTests/LoginTests.cs    |  67 +++
 .../ClientTests/NotificationTests.cs            | 149 +++++++
 Usergrid.Sdk.Tests/ClientTests/UserTests.cs     | 153 +++++++
 Usergrid.Sdk.Tests/ConnectionManagerTests.cs    | 240 ++++++++++
 Usergrid.Sdk.Tests/EntityManagerTests.cs        | 440 +++++++++++++++++++
 Usergrid.Sdk.Tests/Friend.cs                    |  35 ++
 Usergrid.Sdk.Tests/Helpers.cs                   |  94 ++++
 .../Model/NotificationRecipientsTests.cs        | 147 +++++++
 Usergrid.Sdk.Tests/Model/NotificationTests.cs   |  55 +++
 Usergrid.Sdk.Tests/NotificationsManagerTests.cs | 118 +++++
 Usergrid.Sdk.Tests/Properties/AssemblyInfo.cs   |  57 +++
 Usergrid.Sdk.Tests/Usergrid.Sdk.Tests.csproj    | 110 +++++
 Usergrid.Sdk.Tests/UsergridRequestTests.cs      | 140 ++++++
 Usergrid.Sdk.Tests/packages.config              |  24 +
 Usergrid.Sdk/Client.cs                          | 262 +++++++++++
 Usergrid.Sdk/IClient.cs                         |  73 +++
 Usergrid.Sdk/IUsergridRequest.cs                |  28 ++
 Usergrid.Sdk/Manager/AuthenticationManager.cs   |  74 ++++
 Usergrid.Sdk/Manager/ConnectionManager.cs       |  99 +++++
 Usergrid.Sdk/Manager/EntityManager.cs           | 177 ++++++++
 Usergrid.Sdk/Manager/IAuthenticationManager.cs  |  25 ++
 Usergrid.Sdk/Manager/IConnectionManager.cs      |  26 ++
 Usergrid.Sdk/Manager/IEntityManager.cs          |  30 ++
 Usergrid.Sdk/Manager/INotificationsManager.cs   |  27 ++
 Usergrid.Sdk/Manager/ManagerBase.cs             |  42 ++
 Usergrid.Sdk/Manager/NotificationsManager.cs    |  77 ++++
 Usergrid.Sdk/Model/AndroidNotification.cs       |  37 ++
 Usergrid.Sdk/Model/AppleNotification.cs         |  49 +++
 Usergrid.Sdk/Model/AuthType.cs                  |  25 ++
 Usergrid.Sdk/Model/Connection.cs                |  24 +
 Usergrid.Sdk/Model/INotificationRecipients.cs   |  32 ++
 Usergrid.Sdk/Model/Notification.cs              |  31 ++
 Usergrid.Sdk/Model/NotificationRecipients.cs    | 137 ++++++
 .../Model/NotificationSchedulerSettings.cs      |  35 ++
 Usergrid.Sdk/Model/UnixDateTimeHelper.cs        |  53 +++
 Usergrid.Sdk/Model/UserGridEntity.cs            |  45 ++
 Usergrid.Sdk/Model/UsergridActivity.cs          |  50 +++
 Usergrid.Sdk/Model/UsergridActor.cs             |  29 ++
 Usergrid.Sdk/Model/UsergridCollection.cs        |  30 ++
 Usergrid.Sdk/Model/UsergridDevice.cs            |  22 +
 Usergrid.Sdk/Model/UsergridEntitySerializer.cs  |  51 +++
 Usergrid.Sdk/Model/UsergridError.cs             |  31 ++
 Usergrid.Sdk/Model/UsergridException.cs         |  30 ++
 Usergrid.Sdk/Model/UsergridGroup.cs             |  24 +
 Usergrid.Sdk/Model/UsergridImage.cs             |  28 ++
 Usergrid.Sdk/Model/UsergridNotifier.cs          |  23 +
 Usergrid.Sdk/Model/UsergridUser.cs              |  27 ++
 Usergrid.Sdk/Payload/AndroidNotifierPayload.cs  |  29 ++
 .../Payload/CancelNotificationPayload.cs        |  25 ++
 Usergrid.Sdk/Payload/ChangePasswordPayload.cs   |  28 ++
 Usergrid.Sdk/Payload/ClientIdLoginPayload.cs    |  34 ++
 Usergrid.Sdk/Payload/LoginResponse.cs           |  25 ++
 Usergrid.Sdk/Payload/NotificationPayload.cs     |  38 ++
 Usergrid.Sdk/Payload/UserLoginPayload.cs        |  34 ++
 Usergrid.Sdk/Payload/UsergridGetResponse.cs     |  28 ++
 Usergrid.Sdk/Properties/AssemblyInfo.cs         |  51 +++
 Usergrid.Sdk/RestSharpJsonSerializer.cs         |  38 ++
 Usergrid.Sdk/Usergrid.Sdk.csproj                | 124 ++++++
 Usergrid.Sdk/UsergridRequest.cs                 |  91 ++++
 Usergrid.Sdk/packages.config                    |  22 +
 Usergrid.sln                                    |  49 +++
 new-project-template/new-project-template.sln   |  37 ++
 .../new-project-template/App.config             |  22 +
 .../new-project-template/Program.cs             |  91 ++++
 .../Properties/AssemblyInfo.cs                  |  51 +++
 .../new-project-template.csproj                 |  84 ++++
 packages/NSubstitute.1.6.0.0/LICENSE.txt        |  27 ++
 .../NSubstitute.1.6.0.0.nuspec                  |  19 +
 .../NSubstitute.1.6.0.0/acknowledgements.txt    |  63 +++
 packages/NUnit.2.6.2/NUnit.2.6.2.nuspec         |  31 ++
 packages/NUnit.2.6.2/license.txt                |  15 +
 packages/Newtonsoft.Json.4.5.11/LICENSE.txt     |  21 +
 .../Newtonsoft.Json.4.5.11.nuspec               |  19 +
 packages/RestSharp.104.1/LICENSE.txt            | 202 +++++++++
 packages/RestSharp.104.1/RestSharp.104.1.nuspec |  24 +
 packages/repositories.config                    |  22 +
 samples/README.md                               |   1 +
 samples/locationSample/LocationDotNetSample.sln |  36 ++
 .../LocationDotNetSample/App.config             |  22 +
 .../LocationDotNetSample/Form1.Designer.cs      | 269 ++++++++++++
 .../LocationDotNetSample/Form1.cs               | 148 +++++++
 .../LocationDotNetSample/Form1.resx             | 137 ++++++
 .../LocationDotNetSample.csproj                 | 129 ++++++
 .../LocationDotNetSample/Program.cs             |  37 ++
 .../Properties/AssemblyInfo.cs                  |  51 +++
 .../Properties/Resources.Designer.cs            |  86 ++++
 .../Properties/Resources.resx                   | 133 ++++++
 .../Properties/Settings.Designer.cs             |  45 ++
 .../Properties/Settings.settings                |  23 +
 .../LocationDotNetSample/Store.cs               |  45 ++
 .../LocationDotNetSample/packages.config        |  21 +
 samples/locationSample/ReadMe.md                |  20 +
 .../Geocoder.0.1.0.0/Geocoder.0.1.0.0.nupkg     | Bin 0 -> 5053 bytes
 .../Geocoder.0.1.0.0/Geocoder.0.1.0.0.nuspec    |  32 ++
 .../packages/Geocoder.0.1.0.0/README.txt        |   3 +
 .../Geocoder.0.1.0.0/lib/net45/Geocoder.dll     | Bin 0 -> 6144 bytes
 .../locationSample/packages/repositories.config |  20 +
 samples/locationSample/stores.json              |   1 +
 samples/loginAndCollectionSample/BooksApp.sln   |  36 ++
 .../BooksApp2/AddBook.Designer.vb               | 109 +++++
 .../BooksApp2/AddBook.resx                      | 136 ++++++
 .../BooksApp2/AddBook.vb                        |  33 ++
 .../BooksApp2/App.config                        |  23 +
 .../loginAndCollectionSample/BooksApp2/Book.vb  |  21 +
 .../BooksApp2/BooksApp.vbproj                   | 174 ++++++++
 .../BooksApp2/MainWindow.Designer.vb            | 147 +++++++
 .../BooksApp2/MainWindow.resx                   | 146 ++++++
 .../BooksApp2/MainWindow.vb                     |  70 +++
 .../My Project/Application.Designer.vb          |  53 +++
 .../BooksApp2/My Project/Application.myapp      |  27 ++
 .../BooksApp2/My Project/AssemblyInfo.vb        |  50 +++
 .../BooksApp2/My Project/Resources.Designer.vb  |  78 ++++
 .../BooksApp2/My Project/Resources.resx         | 134 ++++++
 .../BooksApp2/My Project/Settings.Designer.vb   |  88 ++++
 .../BooksApp2/My Project/Settings.settings      |  24 +
 .../BooksApp2/Settings.vb                       |  22 +
 .../BooksApp2/SettingsForm.Designer.vb          | 164 +++++++
 .../BooksApp2/SettingsForm.resx                 | 137 ++++++
 .../BooksApp2/SettingsForm.vb                   |  44 ++
 samples/loginAndCollectionSample/Readme.md      |  17 +
 samples/messageeTutorial/Messagee.sln           |  36 ++
 samples/messageeTutorial/Messagee/App.config    |  23 +
 samples/messageeTutorial/Messagee/Globals.vb    |  22 +
 .../Messagee/MainForm.Designer.vb               | 260 +++++++++++
 samples/messageeTutorial/Messagee/MainForm.resx | 143 ++++++
 samples/messageeTutorial/Messagee/MainForm.vb   |  97 ++++
 .../messageeTutorial/Messagee/Messagee.vbproj   | 173 ++++++++
 .../Messagee/My Project/Application.Designer.vb |  53 +++
 .../Messagee/My Project/Application.myapp       |  27 ++
 .../Messagee/My Project/AssemblyInfo.vb         |  50 +++
 .../Messagee/My Project/Resources.Designer.vb   |  77 ++++
 .../Messagee/My Project/Resources.resx          | 134 ++++++
 .../Messagee/My Project/Settings.Designer.vb    |  88 ++++
 .../Messagee/My Project/Settings.settings       |  24 +
 .../Messagee/Settings.Designer.vb               | 159 +++++++
 samples/messageeTutorial/Messagee/Settings.resx | 137 ++++++
 samples/messageeTutorial/Messagee/Settings.vb   |  28 ++
 .../Messagee/UserSettings.Designer.vb           | 191 ++++++++
 .../messageeTutorial/Messagee/UserSettings.resx | 137 ++++++
 .../messageeTutorial/Messagee/UserSettings.vb   |  96 ++++
 samples/messageeTutorial/Messagee/Utils.vb      |  82 ++++
 samples/messageeTutorial/README.md              |  15 +
 .../Usergrid.Notifications/App.xaml             |  27 ++
 .../Usergrid.Notifications/App.xaml.cs          | 150 +++++++
 .../Assets/Logo.scale-240.png                   | Bin 0 -> 2516 bytes
 .../Assets/SmallLogo.scale-240.png              | Bin 0 -> 753 bytes
 .../Assets/SplashScreen.scale-240.png           | Bin 0 -> 14715 bytes
 .../Assets/Square71x71Logo.scale-240.png        | Bin 0 -> 1122 bytes
 .../Assets/StoreLogo.scale-240.png              | Bin 0 -> 2200 bytes
 .../Assets/WideLogo.scale-240.png               | Bin 0 -> 4530 bytes
 .../Usergrid.Notifications/BackgroundTask.cs    |  57 +++
 .../Client/EntityResponse.cs                    |  80 ++++
 .../Client/IUsergridClient.cs                   | 123 ++++++
 .../Usergrid.Notifications/Client/PushClient.cs | 185 ++++++++
 .../Usergrid.Notifications/Client/Usergrid.cs   | 122 +++++
 .../Usergrid.Notifications/MainPage.xaml        |  39 ++
 .../Usergrid.Notifications/MainPage.xaml.cs     | 143 ++++++
 .../Usergrid.Notifications/MyBackgroundTask.cs  |  18 +
 .../Package.StoreAssociation.xml                | 194 ++++++++
 .../Usergrid.Notifications/Package.appxmanifest |  61 +++
 .../Properties/AssemblyInfo.cs                  |  29 ++
 .../Usergrid.Notifications.csproj               | 143 ++++++
 .../Usergrid.Notifications.sln                  |  40 ++
 .../Usergrid.Notifications/packages.config      |  25 ++
 .../notifications/packages/repositories.config  |   4 +
 193 files changed, 14602 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/.gitattributes
----------------------------------------------------------------------
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..412eeda
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs     diff=csharp
+*.sln    merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc	 diff=astextplain
+*.DOC	 diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot  diff=astextplain
+*.DOT  diff=astextplain
+*.pdf  diff=astextplain
+*.PDF	 diff=astextplain
+*.rtf	 diff=astextplain
+*.RTF	 diff=astextplain

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cad534a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,152 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+MySettings.config
+
+# Build results
+
+[Dd]ebug/
+[Rr]elease/
+x64/
+build/
+[Bb]in/
+[Oo]bj/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.log
+*.scc
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+*.ncrunch*
+.*crunch*.local.xml
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.Publish.xml
+*.pubxml
+
+# NuGet Packages Directory
+## TODO: If you have NuGet Package Restore enabled, uncomment the next line
+#packages/
+
+# Windows Azure Build Output
+csx
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Others
+sql/
+*.Cache
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.[Pp]ublish.xml
+*.pfx
+*.publishsettings
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+App_Data/*.mdf
+App_Data/*.ldf
+
+# =========================
+# Windows detritus
+# =========================
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Mac crap
+.DS_Store
+
+# Intellij
+.idea

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e06d208
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..84a2bf0
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,56 @@
+Apache Usergrid 
+Copyright (c) The Apache Software Foundation.
+
+This product uses the following software:
+
+
+# Software distributed with/compiled into NSubstitute
+
+## Castle.Core
+NSubstitute is built on the Castle.Core library, particularly Castle.DynamicProxy 
+which is used for generating proxies for types and intercepting calls 
+made to them so that NSubstitute can record them. 
+
+Castle.Core is maintained by the Castle Project [http://www.castleproject.org/] 
+and is released under the Apache License, Version 2.0 
+[http://www.apache.org/licenses/LICENSE-2.0.html].
+
+# Software used to help build NSubstitute
+
+## NUnit [http://www.nunit.org/]
+NUnit is used for coding and running unit and integration tests for NSubstitute. It is distributed under an open source zlib/libpng based license [http://www.opensource.org/licenses/zlib-license.html].
+
+## Rhino Mocks [http://www.ayende.com/projects/rhino-mocks.aspx]
+Used for mocking parts of the NSubstitute mocking framework for testing. It is distributed under the BSD license [http://www.opensource.org/licenses/bsd-license.php].
+
+## Moq [http://moq.me/]
+Moq is not used in NSubstitute, but was a great source of inspiration. Moq pioneered Arrange-Act-Assert (AAA) mocking syntax for .NET, as well as removing the distinction between mocks and stubs, both of which have become important parts of NSubstitute. Moq is available under the BSD license [http://www.opensource.org/licenses/bsd-license.php].
+
+## NuPack [http://nupack.codeplex.com/]
+Used for packaging NSubstitute for distribution as a nu package. Distributed under the Apache License, Version 2.0 [http://www.apache.org/licenses/LICENSE-2.0.html].
+
+## Jekyll [http://jekyllrb.com/]
+Static website generator written in Ruby, used for NSubstitute's website and documentation. Distributed under the MIT license [http://www.opensource.org/licenses/bsd-license.php].
+
+## SyntaxHighlighter [http://alexgorbatchev.com/SyntaxHighlighter/]
+Open source, JavaScript, client-side code highlighter used for highlighting code samples on the NSubstitute website. Distributed under the MIT License [http://en.wikipedia.org/wiki/MIT_License] and the GPL [http://www.gnu.org/copyleft/lesser.html].
+
+## Ruby (and libraries) [http://www.ruby-lang.org]
+Ruby is used for NSubstitute's build. The rake library is used to run the build; custom Ruby code is used to extract and test code samples from documentation; rspec is used to test that Ruby code; Markdown is used for documentation; gems for installing all this stuff; RubyInstaller for Windows and DevKit for interop with Windows; and much more. Ruby is awesome, as are the many projects contributed to the Ruby community that make developers' lives awesome.
+
+Ruby is distributed under the Ruby license [http://www.ruby-lang.org/en/LICENSE.txt]. The libraries mentioned are available under a variety of licenses. Please see their websites for more information.
+
+## Microsoft .NET Framework [http://www.microsoft.com/net/]
+NSubstitute is coded in C# and compiled using Microsoft .NET. It can also run and compile under Mono [http://www.mono-project.com], an open source implementation of the open .NET standards for C# and the CLI.
+
+Microsoft's .NET Framework is available under a EULA (and possibly other licenses like MS Reference Source License).
+Mono is available under four open source licenses for different parts of the project (including MIT/X11, GPL, MS-Pl). These are described on the project site [http://www.mono-project.com/Licensing].
+
+## Microsoft Ilmerge [http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx]
+Used for combining assemblies so NSubstitute can be distributed as a single DLL. Available for use under a EULA as described on the ilmerge site.
+
+## Microsoft Reactive Extensions for .NET (Rx) [http://msdn.microsoft.com/en-us/devlabs/ee794896]
+Used to provide .NET 3.5 with some of the neat concurrency helper classes that ship with out of the box with .NET 4.0. Distributed under a EULA [http://msdn.microsoft.com/en-us/devlabs/ff394099].
+
+## 7-Zip [http://www.7-zip.org/]
+7-zip is used to ZIP up NSubstitute distributions as part of the automated build process. Distributed under a mixed GNU LGPL / unRAR licence [http://www.7-zip.org/license.txt].
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b0861b5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,316 @@
+# Usergrid .NET SDK
+
+## Version
+Current version is v0.1.0. All assemblies are marked with this version number.
+
+## Assemblies
+Solution is composed of following projects:
+
+* Usergrid.Sdk - this is the main .NET SDK project.
+* Usergrid.Sdk.Tests - this is the unit test project.
+* Usergrid.Sdk.IntegrationTests - this is the integration test project.
+
+## Comments and Questions
+Please feel free to send your comments/suggestions/questions one of the
+several communication platforms. 
+<http://usergrid.apache.org/community/>
+    
+## Overview
+We welcome your contributions and suggestions. The repository is located [here][RepositoryLocation].
+
+You can download this package here:
+
+* Download as a development [zip file][ZipFileLocation] SNAPSHOT
+
+## Installing
+Usergrid .NET SDK can be installed via:
+
+* Build source and reference Usergrid.Sdk assembly OR
+* Use Nuget
+
+### Building from Source
+If you prefer to build the assembly from source, head over to [here][RepositoryLocation], download/clone the source files and build. Source can be compiled via VS Studio 2010 or using Xamarin tools.
+
+### Using Nuget
+@TODO
+
+### Getting Started
+The main facade to all SDK functionality is provided by the Client class (which can also be injected using IClient):
+
+	var client = new Client("YourOrgName", "YourAppName");
+
+By default any method invoked using this client interacts with Usergrid without any authentication tokens. You can use this to access your "Sandbox" application which comes with all new Usergrid accounts - please see [Creating a sandbox app](http://usergrid.apache.org/docs/using-usergrid/creating-a-new-application.html) for more information.
+
+If you are ready to authenticate, then you can get an access token via login method:
+
+	client.Login("loginId", "loginSecret", AuthType.ClientId);
+	
+This method authenticates with Usergrid and attaches the retrieved access token to this client instance.
+
+Above example uses your client credentials to access Usergrid - note that this is not the only credentials/method you can use, please see "Authentication" section below.
+
+You are now ready to use this client instance to make calls to Usergrid.
+
+### Running Integration Tests
+In order to run the integration tests, do the following:
+
+* Open Usergrid.Sdk.IntegrationTests.dll.config and configure all configuration items according to your own setup.
+* Tests have been implemented using NUnit, so you can use any NUnit runner to run the tests.
+
+## Authentication
+Usergrid Authentication is explained in [Usergrid Documentation](http://usergrid.apache.org/docs/).
+
+You can access your Usergrid data using following credentials:
+
+### Organization API Credentials
+You can find your organisation's credentials on the "Org Overview" page of the [Admin Portal](https://github.com/apache/usergrid/tree/master/portal). Once you located your organisation credentials, you can pass them to the Login method instance:
+
+	client.Login("clientId", "clientSecret", AuthType.Organization);
+
+### Application Credentials
+You can find an application's credentials on the "App Settings" page of the [Admin Portal](https://github.com/apache/usergrid/tree/master/portal). Once you located your application credentials, you can pass them to the Login method:
+
+	client.Login("applicationId", "applicationSecret", AuthType.Application);
+	
+### Admin and User Credentials
+You can find a list of all admin users on the "Org Overview" page of the [Admin Portal](https://github.com/apache/usergrid/tree/master/portal). 
+
+You can pass the credentials of a user (admin or normal user) to the Login method:
+
+	client.Login("userLoginId", "userSecret", AuthType.User);
+
+## Entities and Collections
+Usergrid stores its data as "Entities" in "Collections".  Entities are essentially JSON objects and Collections are just like folders for storing these objects. You can learn more about Entities and Collections in the App Services docs.
+
+### Entities
+```
+T CreateEntity<T>(string collection, T entity);
+void DeleteEntity(string collection, string name);
+void UpdateEntity<T>(string collection, string identifier, T entity);
+T GetEntity<T>(string collectionName, string identifer);
+```
+
+All Entity CRUD operations are supported as individual methods in Client class. SDK handles JSON de/serialisation of your entities.
+
+Every entity in Usergrid has common default properties, like name, uuid, type, created, modified, etc. While modelling your entities, you should note the following:
+
+* Each entity has a unique UUID assigned to it. You can also assign your own id property to an entity.
+* For entities of type user, the username property value must be unique.
+* For all other entity types, the name property value must be unique and is immutable. This means that once you set it, it cannot be changed.
+
+You can model your entities in the following ways:
+
+* Inherit from UsergridEntity - base Entity class in .NET SDK. It defines all common/default properties for entities. If you choose to derive your own entities from UsergridEntity, then you don't need to deal with the definition and de/serialisation of those default properties. UsergridEntity code is under Usergrid.SDK/Model/UsergridEntity.cs. Please see ShouldCrudUsergridEntity method in [EntityCrudTests.cs][] under Usergrid.Sdk.IntegrationTests project for example usage.
+* Use your own entity classes - if you choose not to inherit from UsergridEntity, then you will need to include the properties that you care about yourself. SDK will still handle the JSON de/serialisation for your entities. Please see ShouldCrudPocoEntity method in [EntityCrudTests.cs][] under Usergrid.Sdk.IntegrationTests project.  
+
+### Collections
+```
+UsergridCollection<T> GetEntities<T>(string collection, int limit = 10, string query = null);
+UsergridCollection<T> GetNextEntities<T>(string collection, string query = null);
+UsergridCollection<T> GetPreviousEntities<T>(string collection, string query = null);
+```
+The Collection object models Collections in the database.  Once you start programming your app, you will likely find that this is the most useful method of interacting with the database.
+
+SDK defines a class UsergridCollection<T> in order to model collections. Implementation inherits from List<T> and also supports paging within the collection items.
+
+Please see @TODO link to EntityPagingTests.cs for example paging implementation.
+
+## Users and Groups
+```
+T GetUser<T>(string identifer /*username or uuid or email*/) where T : UsergridUser;
+void CreateUser<T>(T user) where T : UsergridUser;
+void UpdateUser<T>(T user) where T : UsergridUser;
+void DeleteUser(string identifer /*username or uuid or email*/);
+void ChangePassword(string identifer /*username or uuid or email*/, string oldPassword, string newPassword);
+void CreateGroup<T>(T group) where T : UsergridGroup;
+void DeleteGroup(string path);
+T GetGroup<T>(string identifer /*uuid or path*/) where T : UsergridGroup;
+void UpdateGroup<T>(T group) where T : UsergridGroup;
+void AddUserToGroup(string groupIdentifier, string userName);
+void DeleteUserFromGroup(string groupIdentifier, string userIdentifier);
+```
+A user entity represents an application user. Using App services APIs you can create, retrieve, update, delete, and query user entities.
+
+A group entity organizes users into a group. Using App Services APIs you can create, retrieve, update, or delete a group. You can also add or delete a user to or from a group.
+
+SDK contains special classes - UsergridUser and UsergridGroup - which models a Usergrid User and Group. You can derive from these classes and add your own properties.
+There are a couple of things you need to be aware of when working with users and groups.
+
+For users:
+* UserName property must be unique and it is mandatory.
+* Email property must be unique
+* For more information check the [documentation](http://usergrid.apache.org/docs/user-management/user-management.html) on users.
+
+For groups:
+* Path property must be unique and it is mandatory.
+* For more information check the [documentation](http://usergrid.apache.org/docs/user-management/user-management.html) on groups.
+ 
+Please see [GroupTests.cs][] and [UserManagementTests.cs][] for integration tests.
+
+## Activities and Feeds
+```
+void PostActivity<T>(string userIdentifier, T activity) where T:UsergridActivity;
+void PostActivityToGroup<T>(string groupIdentifier, T activity) where T:UsergridActivity;
+void PostActivityToUsersFollowersInGroup<T>(string userIdentifier, string groupIdentifier, T activity) where T:UsergridActivity;
+UsergridCollection<T> GetUserActivities<T>(string userIdentifier) where T:UsergridActivity;
+UsergridCollection<T> GetGroupActivities<T>(string groupIdentifier) where T:UsergridActivity;
+UsergridCollection<T> GetUserFeed<T>(string userIdentifier) where T : UsergridActivity;
+UsergridCollection<T> GetGroupFeed<T>(string groupIdentifier) where T : UsergridActivity;
+```
+An activity is an entity type that represents activity stream (feed) actions.
+
+#### Creating an activity
+
+The SDK provides UsergridActivity and UsergridActor classes to create an activity for a user. Here is some sample code from [ActivitiesTests.cs][] which creates an activity for a user.
+```
+userFromUsergrid = client.GetUser<UsergridUser> (username);
+
+// Create an activity for this user
+var activityEntity = new UsergridActivity {
+Actor = new UsergridActor
+{
+	DisplayName = "Joe Doe",
+	Email = userFromUsergrid.Email,
+	UserName = userFromUsergrid.UserName,
+	Uuid = userFromUsergrid.Uuid,
+	Image = new UsergridImage
+	{
+		Height = 10,
+		Width = 20,
+		Duration = 0,
+		Url = "apigee.com"
+	}
+},
+Content = "Hello Usergrid",
+Verb = "post"
+};
+
+client.PostActivity (userFromUsergrid.UserName, activityEntity);
+```
+You can also post an activity to a group with the PostActivityToGroup method `client.PostActivityToGroup (groupName, activityEntity);`
+
+
+## Devices
+```
+T GetDevice<T>(string identifer) where T : UsergridDevice;
+void UpdateDevice<T>(T device) where T : UsergridDevice;
+void CreateDevice<T>(T device) where T : UsergridDevice;
+void DeleteDevice(string identifer);
+```
+You can derive your own class from UserdridDevice to add your own properties and perform CRUD operations on devices.
+  You can find the integration tests for devices in [DeviceTests.cs][]
+
+## Connections
+```
+void CreateConnection(Connection connection);
+IList<UsergridEntity> GetConnections(Connection connection);
+IList<TConnectee> GetConnections<TConnectee>(Connection connection);
+void DeleteConnection(Connection connection);
+```
+
+In the SDK, connections are configured with the [Connection][] class, which holds the connector/connectee details and the connection name.ConnectionName property is a mandatory field when managing the connections.  
+To create and delete a connection, you'll need to populate all the fields in the connection object.  
+Connections can reference any type of entity, if you want to get all entities in a connection, you only need to populate connector details plus the connection name and use the non generic version of the GetConnections method. This will give you a list of UsergridEntity.
+```
+//get the connections, supply only the connector details
+//we get a list of Usergrid entites
+IList<UsergridEntity> allConnections = client.GetConnections(new Connection()
+    {
+        ConnectorCollectionName = "customers", 
+        ConnectorIdentifier = "customer1", 
+        ConnectionName = "has"
+    });
+```
+To get a list of a specific type of an entity, you also need to populate the connectee connection name and use the generic version of the GetConnections method.
+```
+//now, just get the orders for customer from the connection
+//we need to supply the connectee collection name
+IList<Order> orderConnections = client.GetConnections<Order>(new Connection()
+    {
+        ConnectorCollectionName = "customers", 
+        ConnectorIdentifier = "customer1", 
+        ConnecteeCollectionName = "orders", 
+        ConnectionName = "has"
+    });
+```
+Check [ConnectionTests.cs][] for the integration tests, and documentation on [Entity relationships][UsergridEntityRrelationshipsDoc].
+
+## Push Notifications
+
+```
+void CreateNotifierForApple(string notifierName, string environment, string p12CertificatePath);
+void CreateNotifierForAndroid(string notifierName, string apiKey);
+T GetNotifier<T>(string identifer/*uuid or notifier name*/) where T : UsergridNotifier;
+void DeleteNotifier(string notifierName);
+```
+
+You can send notifications to devices, users, or groups. But first, you need to register your app with push notification providers. This is explained in detail [here][RegisterYourAppDoc].  
+Once you've rgistered your app you need to create a notifier for it. Notifiers, which you explicitly create and add to notifications, contain the credentials necessary to securely access push notification providers--which in turn send your notifications to targeted devices. 
+#### Creating notifiers
+You need to give your notifier a name and then call the relevant method for your provider to create it. For example, to create a notifier for android :
+```
+const string notifierName = "test_notifier";
+...
+client.CreateNotifierForAndroid(notifierName, GoogleApiKey /*e.g. AIzaSyCkXOtBQ7A9GoJsSLqZlod_YjEfxxxxxxx*/);
+```
+You can check for existance of a notifier with the `GetNotifier` method which expects a notifier name, and returns a [UsergridNotifier][].
+####Publishing notifications
+To publish a notification you need to  
+
+* Create notification objects with your message
+
+Assuming you have created two notifiers (one for apple one for android)
+```
+const string appleTestMessge = "test message for Apple";
+const string androidTestMessage = "test message for Android";
+...
+var appleNotification = new AppleNotification(appleNotifierName, appleTestMessge, "chime");
+var googleNotification = new AndroidNotification(googleNotifierName, androidTestMessage);
+```
+*  Setup your recipients
+
+Use NotificationRecipients class, which provides builder methods for setting up recipients. For example if you want to send your message to a user:
+```
+INotificationRecipients recipients = new NotificationRecipients().AddUserWithName(username);
+```
+You can check the behaviour of the NotificationRecipients class in [NotificationRecipientsTests][].
+
+*  Setup scheduling
+
+You can schedule a notification to be delivered or to be exipred at a certain date time. This is done using NotificationSchedulerSettings. For example, if you want your message to be delivered tomorrow:
+```
+var schedulerSettings = new NotificationSchedulerSettings {DeliverAt = DateTime.Now.AddDays(1)};
+```
+
+*  and publish
+
+You can publish more than one notification, PublishNotification method accepts an array of notifications, recipients and the scheduler settings:
+
+```
+client.PublishNotification(new Notification[] {appleNotification, googleNotification}, recipients, schedulerSettings);
+```
+
+Integration tests are in [NotificationTests.cs][], and you can read about the push notifications in Usergrid documentation [here][PushNotificationsDoc].
+
+
+
+<!---Code reference-->
+[GroupTests.cs]: @TODO
+[UserManagementTests.cs]: @TODO
+[ActivitiesTests.cs]: @TODO
+[DeviceTests.cs]: @TODO
+[Connection]: @TODO
+[ConnectionTests.cs]: @TODO
+[RepositoryLocation]: https://github.com/apache/usergrid-dotnet
+[ZipFileLocation]: @TODO
+[TarGzFileLocation]: @TODO
+[EntityCrudTests.cs]: @TODO
+
+
+[UsergridNotifier]: @TODO
+[NotificationRecipientsTests]: @TODO
+[NotificationTests.cs]: @TODO
+<!---Docs-->
+[PushNotificationsDoc]: http://usergrid.apache.org/docs/push-notifications/overview.html
+[RegisterYourAppDoc]: @TODO
+[UsergridEntityRrelationshipsDoc]:@TODO

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/ActivitiesTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/ActivitiesTests.cs b/Usergrid.Sdk.IntegrationTests/ActivitiesTests.cs
new file mode 100644
index 0000000..89bf2ef
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/ActivitiesTests.cs
@@ -0,0 +1,174 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+	[TestFixture]
+	public class ActivitiesTests : BaseTest
+	{
+        private IClient _client;
+        [SetUp]
+        public void Setup()
+        {
+            _client = InitializeClientAndLogin(AuthType.Organization);
+        }
+
+		[Test]
+		public void ShouldCreateAndRetrieveUserActivities()
+		{
+            // Create a user
+            var usergridUser = SetupUsergridUser(_client, new UsergridUser { UserName = "test_user", Email = "test_user@apigee.com" });
+			// Create an activity for this user
+			var activityEntity = new UsergridActivity {
+				Actor = new UsergridActor
+				{
+					DisplayName = "Joe Doe",
+                    Email = usergridUser.Email,
+                    UserName = usergridUser.UserName,
+                    Uuid = usergridUser.Uuid,
+					Image = new UsergridImage
+					{
+						Height = 10,
+						Width = 20,
+						Duration = 0,
+						Url = "apigee.com"
+					}
+				},
+				Content = "Hello Usergrid",
+				Verb = "post"
+			};
+
+            _client.PostActivity(usergridUser.UserName, activityEntity);
+
+			// Get the activities
+            var activities = _client.GetUserActivities<UsergridActivity>(usergridUser.UserName);
+			Assert.IsNotNull (activities);
+			Assert.AreEqual (1, activities.Count);
+			var thisActivity = activities [0];
+			Assert.AreEqual ("Joe Doe", thisActivity.Actor.DisplayName);
+            Assert.AreEqual(usergridUser.Email, thisActivity.Actor.Email);
+			Assert.AreEqual (10, thisActivity.Actor.Image.Height);
+			Assert.AreEqual (20, thisActivity.Actor.Image.Width);
+			Assert.AreEqual ("Hello Usergrid", thisActivity.Content);
+			Assert.IsTrue (thisActivity.PublishedDate > DateTime.Now.ToUniversalTime().AddHours(-1));
+
+			// Get the feed
+            var feed = _client.GetUserFeed<UsergridActivity>(usergridUser.UserName);
+			Assert.IsNotNull (feed);
+			Assert.AreEqual (1, feed.Count);
+			thisActivity = feed [0];
+			Assert.AreEqual ("Joe Doe", thisActivity.Actor.DisplayName);
+            Assert.AreEqual(usergridUser.Email, thisActivity.Actor.Email);
+			Assert.AreEqual (10, thisActivity.Actor.Image.Height);
+			Assert.AreEqual (20, thisActivity.Actor.Image.Width);
+			Assert.AreEqual ("Hello Usergrid", thisActivity.Content);
+			Assert.IsTrue (thisActivity.PublishedDate > DateTime.Now.ToUniversalTime().AddHours(-1));
+		}
+
+		[Test]
+		public void ShouldCreateAndRetrieveGroupActivities()
+		{
+
+            // Create a user
+            var usergridUser = SetupUsergridUser(_client, new UsergridUser { UserName = "test_user", Email = "test_user@apigee.com" });
+            // Create a group
+            var usergridGroup = SetupUsergridGroup(_client, new UsergridGroup { Path = "test-group", Title = "mygrouptitle" });
+
+			// Create an activity for this group
+			var activityEntity = new UsergridActivity {
+				Actor = new UsergridActor
+				{
+					DisplayName = "Joe Doe",
+                    Email = usergridUser.Email,
+                    UserName = usergridUser.UserName,
+                    Uuid = usergridUser.Uuid,
+					Image = new UsergridImage
+					{
+						Height = 10,
+						Width = 20,
+						Duration = 0,
+						Url = "apigee.com"
+					}
+				},
+				Content = "Hello Usergrid",
+				Verb = "post"
+			};
+
+            _client.PostActivityToGroup(usergridGroup.Path, activityEntity);
+
+			// Get the activities
+            var activities = _client.GetGroupActivities<UsergridActivity>(usergridGroup.Path);
+			Assert.IsNotNull (activities);
+			Assert.AreEqual (1, activities.Count);
+			var thisActivity = activities [0];
+			Assert.AreEqual ("Joe Doe", thisActivity.Actor.DisplayName);
+			Assert.AreEqual (usergridUser.Email, thisActivity.Actor.Email);
+			Assert.AreEqual (10, thisActivity.Actor.Image.Height);
+			Assert.AreEqual (20, thisActivity.Actor.Image.Width);
+			Assert.AreEqual ("Hello Usergrid", thisActivity.Content);
+			Assert.IsTrue (thisActivity.PublishedDate > DateTime.Now.ToUniversalTime().AddHours(-1));
+
+			// Get the feed
+            var feed = _client.GetGroupFeed<UsergridActivity>(usergridGroup.Path);
+			Assert.IsNotNull (feed);
+			Assert.AreEqual (1, feed.Count);
+			thisActivity = feed [0];
+			Assert.AreEqual ("Joe Doe", thisActivity.Actor.DisplayName);
+            Assert.AreEqual(usergridUser.Email, thisActivity.Actor.Email);
+			Assert.AreEqual (10, thisActivity.Actor.Image.Height);
+			Assert.AreEqual (20, thisActivity.Actor.Image.Width);
+			Assert.AreEqual ("Hello Usergrid", thisActivity.Content);
+			Assert.IsTrue (thisActivity.PublishedDate > DateTime.Now.ToUniversalTime().AddHours(-1));
+		}
+	
+		[Test]
+		public void ShouldCreateAndRetrieveUsersFollowersActivities()
+		{
+			
+
+            // Create a user
+            var usergridUser = SetupUsergridUser(_client, new UsergridUser { UserName = "test_user", Email = "test_user@apigee.com" });
+            // Create a group
+            var usergridGroup = SetupUsergridGroup(_client, new UsergridGroup { Path = "test-group", Title = "mygrouptitle" });
+
+
+			// Create an activity for this group
+            var activityEntity = new UsergridActivity(usergridUser)
+            {
+				Content = "Hello Usergrid",
+				Verb = "post"
+			};
+
+            _client.PostActivityToUsersFollowersInGroup(usergridUser.UserName, usergridGroup.Path, activityEntity);
+
+			// Get the activities
+            var activities = _client.GetUserActivities<UsergridActivity>(usergridUser.UserName);
+			Assert.IsNotNull (activities);
+			Assert.AreEqual (1, activities.Count);
+			var thisActivity = activities [0];
+            Assert.AreEqual(usergridUser.Name, thisActivity.Actor.DisplayName);
+            Assert.AreEqual(usergridUser.Email, thisActivity.Actor.Email);
+			Assert.IsNull (thisActivity.Actor.Image);
+			Assert.AreEqual ("Hello Usergrid", thisActivity.Content);
+			Assert.IsTrue (thisActivity.PublishedDate > DateTime.Now.ToUniversalTime().AddHours(-1));
+		}
+	}
+
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/BaseTest.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/BaseTest.cs b/Usergrid.Sdk.IntegrationTests/BaseTest.cs
new file mode 100644
index 0000000..b83cf7e
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/BaseTest.cs
@@ -0,0 +1,163 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Configuration;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+	public class BaseTest
+	{
+		private static Random random = new Random(DateTime.Now.Millisecond);
+
+	    private readonly Configuration _config;
+	    public BaseTest()
+	    {
+            var configMap = new ExeConfigurationFileMap {ExeConfigFilename = "MySettings.config"};
+			Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
+	        if (config.HasFile && config.AppSettings.Settings.Count > 0)
+	            _config = config;
+	    }
+
+        /// <summary>
+        /// The URI of the Usergrid API, which defaults to api.usergrid.com if none is specified, just like the Client object does
+        /// </summary>
+        protected string ApiUri
+        {
+            get
+            {
+                var apiUri = GetAppSetting("apiUri");
+                if (String.IsNullOrWhiteSpace(apiUri))
+                {
+                    apiUri = "http://api.usergrid.com";
+                }
+
+                return apiUri;
+            }
+        }
+
+        protected string Organization
+		{
+			get{ return GetAppSetting("organization");}
+		}
+
+		protected string Application
+		{
+			get{ return GetAppSetting("application");}
+		}
+
+		protected string ClientId
+		{
+			get { return GetAppSetting("clientId");}
+		}
+
+		protected string ClientSecret
+		{
+			get{ return GetAppSetting("clientSecret");}
+		}
+
+		protected string ApplicationId
+		{
+			get {return GetAppSetting("applicationId");}
+		}
+
+		protected string ApplicationSecret
+		{
+			get {return GetAppSetting ("applicationSecret");}
+		}
+
+		protected string UserId
+		{
+			get { return GetAppSetting("userId");}
+		}
+
+		protected string UserSecret
+		{
+			get{ return GetAppSetting("userSecret");}
+		}
+
+        protected string P12CertificatePath
+		{
+            get { return GetAppSetting("p12CertificatePath"); }
+		}
+
+        protected string GoogleApiKey
+		{
+            get { return GetAppSetting("googleApiKey"); }
+		}
+
+        private string GetAppSetting(string key)
+        {
+            return _config == null ? ConfigurationManager.AppSettings[key] : _config.AppSettings.Settings[key]?.Value;
+        }
+
+        protected IClient InitializeClientAndLogin(AuthType authType)
+        {
+            var client = new Client(Organization, Application, ApiUri);
+            if (authType == AuthType.Application || authType == AuthType.Organization)
+                client.Login(ClientId, ClientSecret, authType);
+            else if (authType == AuthType.User)
+                client.Login(UserId, UserSecret, authType);
+
+            return client;
+        }
+
+		protected static int GetRandomInteger(int minValue, int maxValue)
+		{
+			return random.Next (minValue, maxValue);
+		}
+
+	    protected void DeleteEntityIfExists<TEntity>(IClient client, string collectionName, string entityIdentifier)
+	    {
+	        TEntity customer = client.GetEntity<TEntity>(collectionName, entityIdentifier);
+
+	        if (customer != null)
+	            client.DeleteEntity(collectionName, entityIdentifier);
+	    }
+
+	    protected void DeleteDeviceIfExists(IClient client, string deviceName)
+	    {
+	        UsergridDevice usergridDevice = client.GetDevice<UsergridDevice>(deviceName);
+	        if (usergridDevice != null)
+	            client.DeleteDevice(usergridDevice.Uuid);
+	    }
+
+        protected void DeleteUserIfExists(IClient client, string userName)
+	    {
+            UsergridUser existingUser = client.GetUser<UsergridUser>(userName);
+            if (existingUser != null)
+                client.DeleteUser(existingUser.Uuid);
+        }
+
+        protected UsergridUser SetupUsergridUser(IClient client, UsergridUser user)
+	    {
+            DeleteUserIfExists(client, user.UserName);
+            client.CreateUser(user);
+            return client.GetUser<UsergridUser>(user.UserName);
+	    }
+        
+        protected UsergridGroup SetupUsergridGroup(IClient client, UsergridGroup @group)
+	    {
+	        var existingGroup = client.GetGroup<UsergridGroup>(@group.Path);
+            if (existingGroup != null)
+                client.DeleteGroup(existingGroup.Path);
+            client.CreateGroup(@group);
+            return client.GetGroup<UsergridGroup>(@group.Path);
+
+	    }
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/ConnectionTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/ConnectionTests.cs b/Usergrid.Sdk.IntegrationTests/ConnectionTests.cs
new file mode 100644
index 0000000..294cee4
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/ConnectionTests.cs
@@ -0,0 +1,199 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+using System.Linq;
+
+namespace Usergrid.Sdk.IntegrationTests {
+    public class Customer {
+        public string Name { get; set; }
+        public string No { get; set; }
+    }
+
+    public class Order {
+        public string Name { get; set; }
+        public string Id { get; set; }
+    }
+
+    [TestFixture]
+    public class ConnectionTests : BaseTest {
+        [Test]
+        public void ShouldCreateAndGetSimpleConnection() {
+            IClient client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteEntityIfExists<Customer>(client, "customers", "customer1");
+            DeleteEntityIfExists<Order>(client, "orders", "order1");
+            DeleteDeviceIfExists(client, "device1");
+
+            //create a customer, order and a device
+            //then we will connect the order entity and device entity to the customer using the same connection name (has)
+            //order and device are different types of entities
+            client.CreateEntity("customers", new Customer
+                {
+                    Name = "customer1",
+                    No = "1"
+                });
+            client.CreateEntity("orders", new Order
+                {
+                    Name = "order1",
+                    Id = "1"
+                });
+            client.CreateDevice(
+                new DeviceTests.MyCustomUserGridDevice()
+                    {
+                        Name = "device1",
+                        DeviceType = "device type"
+                    });
+
+            //create a connection between customer1 and order1
+            client.CreateConnection(new Connection()
+            {
+                ConnectorCollectionName = "customers",
+                ConnectorIdentifier = "customer1",
+                ConnecteeCollectionName = "orders",
+                ConnecteeIdentifier = "order1",
+                ConnectionName = "has"
+            });
+            //create a connection between customer1 and device1
+            client.CreateConnection(new Connection()
+            {
+                ConnectorCollectionName = "customers",
+                ConnectorIdentifier = "customer1",
+                ConnecteeCollectionName = "devices",
+                ConnecteeIdentifier = "device1",
+                ConnectionName = "has"
+            });
+
+            //get the connections, supply only the connector details
+            //we get a list of Usergrid entites
+            IList<UsergridEntity> allConnections = client.GetConnections(new Connection()
+                {
+                    ConnectorCollectionName = "customers", 
+                    ConnectorIdentifier = "customer1", 
+                    ConnectionName = "has"
+                });
+            Assert.AreEqual(2, allConnections.Count);
+            Assert.True(allConnections.Any(c=>c.Name == "order1"));
+            Assert.True(allConnections.Any(c=>c.Name == "device1"));
+
+            //now, just get the devices for customer from the connection
+            //we need to supply the connectee collection name
+            IList<DeviceTests.MyCustomUserGridDevice> deviceConnections = client.GetConnections<DeviceTests.MyCustomUserGridDevice>(new Connection()
+                {
+                    ConnectorCollectionName = "customers", 
+                    ConnectorIdentifier = "customer1", 
+                    ConnecteeCollectionName = "devices", 
+                    ConnectionName = "has"
+                });
+            Assert.AreEqual(1, deviceConnections.Count);
+            Assert.AreEqual("device1", deviceConnections[0].Name);
+
+            //now, just get the orders for customer from the connection
+            //we need to supply the connectee collection name
+            IList<Order> orderConnections = client.GetConnections<Order>(new Connection()
+                {
+                    ConnectorCollectionName = "customers", 
+                    ConnectorIdentifier = "customer1", 
+                    ConnecteeCollectionName = "orders", 
+                    ConnectionName = "has"
+                });
+            Assert.AreEqual(1, orderConnections.Count);
+            Assert.AreEqual("order1", orderConnections[0].Name);
+
+            //delete the connections
+            client.DeleteConnection(new Connection()
+            {
+                ConnectorCollectionName = "customers",
+                ConnectorIdentifier = "customer1",
+                ConnecteeCollectionName = "devices",
+                ConnecteeIdentifier = "device1",
+                ConnectionName = "has"
+            });
+            //delete the connections
+            client.DeleteConnection(new Connection()
+            {
+                ConnectorCollectionName = "customers",
+                ConnectorIdentifier = "customer1",
+                ConnecteeCollectionName = "orders",
+                ConnecteeIdentifier = "order1",
+                ConnectionName = "has"
+            });
+
+            //verify that it is deleted
+            var noConnections = client.GetConnections(new Connection()
+                {
+                    ConnectorCollectionName = "customers", 
+                    ConnectorIdentifier = "customer1", 
+                    ConnectionName = "has"
+                });
+            Assert.AreEqual(0, noConnections.Count);
+        }
+
+        [Test]
+        public void ShouldGetAndGetSimpleConnection() {
+            IClient client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteEntityIfExists<Customer>(client, "customers", "customer1");
+            DeleteEntityIfExists<Order>(client, "orders", "order1");
+
+            client.CreateEntity("customers", new Customer
+                {
+                    Name = "customer1",
+                    No = "1"
+                });
+            client.CreateEntity("orders", new Order
+                {
+                    Name = "order1",
+                    Id = "1"
+                });
+
+            //to get a collection you need connector details and the connection name
+            var getConnectionDetails = new Connection()
+                {
+                    ConnectorCollectionName = "customers", 
+                    ConnectorIdentifier = "customer1", 
+                    ConnectionName = "has"
+                };
+            //to create/delete a collection you need all the connector and connectee details and the connection name.
+            var createDeleteConnectionDetails = new Connection()
+            {
+                ConnectorCollectionName = "customers",
+                ConnectorIdentifier = "customer1",
+                ConnecteeCollectionName = "orders",
+                ConnecteeIdentifier = "order1",
+                ConnectionName = "has"
+            };
+
+            //no connections yet
+            IList<UsergridEntity> connections = client.GetConnections(getConnectionDetails);
+            Assert.AreEqual(0, connections.Count);
+
+            //create a connection between customer1 and order1
+            client.CreateConnection(createDeleteConnectionDetails);
+
+            //verify the connection
+            connections = client.GetConnections(getConnectionDetails);
+            Assert.AreEqual(1, connections.Count);
+            Assert.AreEqual("order1", connections[0].Name);
+
+            //delete the connection
+            client.DeleteConnection(createDeleteConnectionDetails);
+
+            //verify that it is deleted
+            connections = client.GetConnections(getConnectionDetails);
+            Assert.AreEqual(0, connections.Count);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/DeviceTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/DeviceTests.cs b/Usergrid.Sdk.IntegrationTests/DeviceTests.cs
new file mode 100644
index 0000000..3710448
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/DeviceTests.cs
@@ -0,0 +1,63 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+    [TestFixture]
+    public class DeviceTests : BaseTest
+    {
+        [Test]
+        public void ShouldCrudDevices()
+        {
+            const string deviceName = "test_device";
+            var client = InitializeClientAndLogin(AuthType.Organization);
+            DeleteDeviceIfExists(client, deviceName);
+
+            client.CreateDevice(new UsergridDevice() {Name = deviceName});
+            //get device and assert
+            UsergridDevice device = client.GetDevice<UsergridDevice>(deviceName);
+            Assert.That(device.Name, Is.EqualTo(deviceName));
+
+            //create a custom device
+            DeleteDeviceIfExists(client, deviceName);
+            const string deviceTypeiPhone = "iPhone";
+
+            client.CreateDevice(new MyCustomUserGridDevice() { Name = deviceName, DeviceType = deviceTypeiPhone });
+            //get device and assert
+            MyCustomUserGridDevice myCustomDevice = client.GetDevice<MyCustomUserGridDevice>(deviceName);
+            Assert.That(myCustomDevice.Name, Is.EqualTo(deviceName));
+            Assert.That(myCustomDevice.DeviceType, Is.EqualTo(deviceTypeiPhone));
+
+            //update device type
+            const string deviceTypeAndroid = "Android";
+
+            myCustomDevice.DeviceType = deviceTypeAndroid;
+            client.UpdateDevice(myCustomDevice);
+
+            //get device and assert
+            myCustomDevice = client.GetDevice<MyCustomUserGridDevice>(deviceName);
+            Assert.That(myCustomDevice.Name, Is.EqualTo(deviceName));
+            Assert.That(myCustomDevice.DeviceType, Is.EqualTo(deviceTypeAndroid));
+        }
+
+        public class MyCustomUserGridDevice : UsergridDevice
+        {
+            public string DeviceType { get; set; }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/EntityCrudTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/EntityCrudTests.cs b/Usergrid.Sdk.IntegrationTests/EntityCrudTests.cs
new file mode 100644
index 0000000..ffdd6c9
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/EntityCrudTests.cs
@@ -0,0 +1,153 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests {
+    [TestFixture]
+    public class EntityCrudTests : BaseTest {
+        private IClient _client;
+        [SetUp]
+        public void Setup() {
+            _client = InitializeClientAndLogin(AuthType.Organization);
+        }
+
+        [Test]
+        public void ShouldCrudPocoEntity() {
+            const string collectionName = "friends";
+            var friend = new Friend
+                {
+                    Name = "EntityName",
+                    Age = 25
+                };
+
+            DeleteEntityIfExists<Friend>(_client, collectionName, friend.Name);
+
+            // Create a new entity
+            _client.CreateEntity(collectionName, friend);
+
+            // Get it back
+            var friendFromUsergrid = _client.GetEntity<Friend>(collectionName, friend.Name);
+
+            // Assert that the entity returned is correct
+            Assert.IsNotNull(friendFromUsergrid);
+            Assert.AreEqual(friend.Name, friendFromUsergrid.Name);
+            Assert.AreEqual(friend.Age, friendFromUsergrid.Age);
+
+            // Get it back with query
+            string query = "select * where name = '" + friend.Name + "'";
+            UsergridCollection<Friend> friends = _client.GetEntities<Friend>(collectionName, query: query);
+
+            // Assert the collection is correct
+            Assert.IsNotNull(friends);
+            Assert.AreEqual(1, friends.Count);
+            Assert.IsFalse(friends.HasNext);
+            Assert.IsFalse(friends.HasPrevious);
+            friendFromUsergrid = friends[0];
+            Assert.IsNotNull(friendFromUsergrid);
+            Assert.AreEqual(friend.Name, friendFromUsergrid.Name);
+            Assert.AreEqual(friend.Age, friendFromUsergrid.Age);
+
+
+            // Update the entity
+            Friend friendToUpdate = friendFromUsergrid;
+            friendToUpdate.Age = 30;
+            _client.UpdateEntity(collectionName, friendToUpdate.Name, friendToUpdate);
+
+            // Get it back
+            friendFromUsergrid = _client.GetEntity<Friend>(collectionName, friendToUpdate.Name);
+
+            // Assert that entity is updated
+            Assert.AreEqual(friendToUpdate.Age, friendFromUsergrid.Age);
+
+            // Delete the entity
+            _client.DeleteEntity(collectionName, friend.Name);
+
+            // Get it back
+            friendFromUsergrid = _client.GetEntity<Friend>(collectionName, friend.Name);
+
+            // Assert that it doesn't exist
+            Assert.IsNull(friendFromUsergrid);
+        }
+
+        [Test]
+        public void ShouldCrudUserGridEntity() {
+            const string collectionName = "friends";
+            var friend = new UsergridFriend
+                {
+                    Name = "EntityName",
+                    Age = 25
+                };
+
+            DeleteEntityIfExists<Friend>(_client, collectionName, friend.Name);
+
+            // Create a new entity
+            _client.CreateEntity(collectionName, friend);
+
+            // Get it back
+            var friendFromUsergrid = _client.GetEntity<UsergridFriend>(collectionName, friend.Name);
+
+            // Assert that the entity returned is correct
+            Assert.IsNotNull(friendFromUsergrid);
+            Assert.IsNotEmpty(friendFromUsergrid.Uuid);
+            Assert.IsNotEmpty(friendFromUsergrid.Type);
+            Assert.IsTrue(friendFromUsergrid.CreatedDate > DateTime.MinValue);
+            Assert.IsTrue(friendFromUsergrid.ModifiedDate > DateTime.MinValue);
+            Assert.AreEqual(friend.Name, friendFromUsergrid.Name);
+            Assert.AreEqual(friend.Age, friendFromUsergrid.Age);
+
+            // Get it back with query
+            string query = "select * where name = '" + friend.Name + "'";
+            UsergridCollection<UsergridFriend> friends = _client.GetEntities<UsergridFriend>(collectionName, query: query);
+
+            // Assert the collection is correct
+            Assert.IsNotNull(friends);
+            Assert.AreEqual(1, friends.Count);
+            Assert.IsFalse(friends.HasNext);
+            Assert.IsFalse(friends.HasPrevious);
+            friendFromUsergrid = friends[0];
+            Assert.IsNotNull(friendFromUsergrid);
+            Assert.AreEqual(friend.Name, friendFromUsergrid.Name);
+            Assert.AreEqual(friend.Age, friendFromUsergrid.Age);
+            Assert.IsNotEmpty(friendFromUsergrid.Uuid);
+            Assert.IsNotEmpty(friendFromUsergrid.Type);
+            Assert.IsTrue(friendFromUsergrid.CreatedDate > DateTime.MinValue);
+            Assert.IsTrue(friendFromUsergrid.ModifiedDate > DateTime.MinValue);
+
+
+            // Update the entity
+            UsergridFriend friendToUpdate = friendFromUsergrid;
+            friendToUpdate.Age = 30;
+            _client.UpdateEntity(collectionName, friendToUpdate.Name, friendToUpdate);
+
+            // Get it back
+            friendFromUsergrid = _client.GetEntity<UsergridFriend>(collectionName, friendToUpdate.Name);
+
+            // Assert that entity is updated
+            Assert.AreEqual(friendToUpdate.Age, friendFromUsergrid.Age);
+
+            // Delete the entity
+            _client.DeleteEntity(collectionName, friend.Name);
+
+            // Get it back
+            friendFromUsergrid = _client.GetEntity<UsergridFriend>(collectionName, friend.Name);
+
+            // Assert that it doesn't exist
+            Assert.IsNull(friendFromUsergrid);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/EntityPagingTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/EntityPagingTests.cs b/Usergrid.Sdk.IntegrationTests/EntityPagingTests.cs
new file mode 100644
index 0000000..79234de
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/EntityPagingTests.cs
@@ -0,0 +1,83 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+	public class Page
+	{
+		public int PageNumber {get;set;}
+		public string Name {get;set;}
+	}
+
+	[TestFixture]
+	public class EntityPagingTests : BaseTest
+	{
+		[Test]
+		public void ShouldDoPaging()
+		{
+			var client = new Client(Organization, Application, ApiUri);
+			client.Login(ClientId, ClientSecret, AuthType.Organization);
+
+			for (var i=0; i<20; i++) 
+			{
+				try{
+					client.DeleteEntity ("pages", "page-" + i);
+					Console.WriteLine ("Deleted " + i);
+				} catch (UsergridException) {
+				}
+			}
+
+			for (var i=0; i<20; i++) 
+			{
+				var page = new Page { PageNumber = i, Name = "page-" + i };
+				client.CreateEntity ("pages", page);
+				Console.WriteLine ("Created " + i);
+			}
+      
+
+			var collection = client.GetEntities<Page> ("pages", 3);
+			Assert.AreEqual (3, collection.Count);
+			Assert.IsTrue (collection.HasNext);
+			Assert.IsFalse (collection.HasPrevious);
+			Assert.AreEqual ("page-1", collection [1].Name);
+
+			collection = client.GetNextEntities<Page> ("pages");
+			Assert.IsTrue (collection.HasNext);
+			Assert.IsTrue (collection.HasPrevious);
+			Assert.AreEqual ("page-4", collection [1].Name);
+
+			collection = client.GetNextEntities<Page> ("pages");
+			Assert.IsTrue (collection.HasNext);
+			Assert.IsTrue (collection.HasPrevious);
+			Assert.AreEqual ("page-7", collection [1].Name);
+
+			collection = client.GetPreviousEntities<Page> ("pages");
+			Assert.IsTrue (collection.HasNext);
+			Assert.IsTrue (collection.HasPrevious);
+			Assert.AreEqual ("page-4", collection [1].Name);
+
+			for (var i=0; i<20; i++) 
+			{
+				client.DeleteEntity ("pages", "page-" + i);
+				Console.WriteLine ("Deleted " + i);
+			}
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/Friend.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/Friend.cs b/Usergrid.Sdk.IntegrationTests/Friend.cs
new file mode 100644
index 0000000..6b3af85
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/Friend.cs
@@ -0,0 +1,23 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+	public class Friend
+	{
+		public string Name { get; set; }
+		public int Age { get; set; }
+	}
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.IntegrationTests/GroupTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.IntegrationTests/GroupTests.cs b/Usergrid.Sdk.IntegrationTests/GroupTests.cs
new file mode 100644
index 0000000..4213c24
--- /dev/null
+++ b/Usergrid.Sdk.IntegrationTests/GroupTests.cs
@@ -0,0 +1,91 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.IntegrationTests
+{
+    public class MyUsergridGroup : UsergridGroup
+    {
+        public string Description { get; set; }
+    }
+
+    [TestFixture]
+    public class GroupTests : BaseTest
+    {
+        [Test]
+        public void ShouldManageGroupLifecycle()
+        {
+            var client = new Client(Organization, Application, ApiUri);
+            client.Login(ClientId, ClientSecret, AuthType.Organization);
+
+            var group = client.GetGroup<MyUsergridGroup>("group1");
+
+            if (group != null)
+                client.DeleteGroup("group1");
+
+            group = new MyUsergridGroup {Path = "group1", Title = "title1", Description = "desc1"};
+            client.CreateGroup(group);
+            group = client.GetGroup<MyUsergridGroup>("group1");
+
+            Assert.IsNotNull(group);
+            Assert.AreEqual("group1", group.Path);
+            Assert.AreEqual("title1", group.Title);
+            Assert.AreEqual("desc1", group.Description);
+
+            group.Description = "desc2";
+            group.Title = "title2";
+
+            client.UpdateGroup(group);
+
+            group = client.GetGroup<MyUsergridGroup>("group1");
+
+            Assert.IsNotNull(group);
+            Assert.AreEqual("group1", group.Path);
+            Assert.AreEqual("title2", group.Title);
+            Assert.AreEqual("desc2", group.Description);
+
+            client.DeleteGroup("group1");
+
+            group = client.GetGroup<MyUsergridGroup>("group1");
+            Assert.IsNull(group);
+        }
+        
+        [Test]
+        public void ShouldManageUsersInGroup()
+        {
+            var client = new Client(Organization, Application, ApiUri);
+            client.Login(ClientId, ClientSecret, AuthType.Organization);
+
+            var user = SetupUsergridUser(client, new MyUsergridUser {UserName = "user1", Password = "user1", Email = "user1@gmail.com", City = "city1"});
+            var group = SetupUsergridGroup(client, new MyUsergridGroup {Path = "group1", Title = "title1", Description = "desc1"});
+
+            client.AddUserToGroup(group.Path, user.UserName);
+            IList<UsergridUser> users = client.GetAllUsersInGroup<UsergridUser>(group.Path);
+            Assert.IsNotNull(users);
+            Assert.AreEqual(1, users.Count);
+
+            client.DeleteUserFromGroup("group1", "user1");
+            users = client.GetAllUsersInGroup<UsergridUser>(group.Path);
+            Assert.IsNotNull(users);
+            Assert.AreEqual(0, users.Count);
+
+            client.DeleteGroup("group1");
+            client.DeleteUser("user1");
+        }
+    }
+}


[07/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/AuthenticationManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/AuthenticationManager.cs b/Usergrid.Sdk/Manager/AuthenticationManager.cs
new file mode 100644
index 0000000..d733683
--- /dev/null
+++ b/Usergrid.Sdk/Manager/AuthenticationManager.cs
@@ -0,0 +1,74 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Manager
+{
+    internal class AuthenticationManager : ManagerBase, IAuthenticationManager
+    {
+        public AuthenticationManager(IUsergridRequest request) : base(request)
+        {
+        }
+
+        public void ChangePassword(string userName, string oldPassword, string newPassword)
+        {
+            var payload = new ChangePasswordPayload {OldPassword = oldPassword, NewPassword = newPassword};
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/users/{0}/password", userName), Method.POST, payload);
+            ValidateResponse(response);
+        }
+
+        public void Login(string loginId, string secret, AuthType authType)
+        {
+            if (authType == AuthType.None)
+            {
+                Request.AccessToken = null;
+                return;
+            }
+
+            object body = GetLoginBody(loginId, secret, authType);
+
+            IRestResponse<LoginResponse> response = Request.ExecuteJsonRequest<LoginResponse>("/token", Method.POST, body);
+            ValidateResponse(response);
+
+            Request.AccessToken = response.Data.AccessToken;
+        }
+
+        private object GetLoginBody(string loginId, string secret, AuthType authType)
+        {
+            object body = null;
+
+            if (authType == AuthType.Organization || authType == AuthType.Application)
+            {
+                body = new ClientIdLoginPayload
+                    {
+                        ClientId = loginId,
+                        ClientSecret = secret
+                    };
+            }
+            else if (authType == AuthType.User)
+            {
+                body = new UserLoginPayload
+                    {
+                        UserName = loginId,
+                        Password = secret
+                    };
+            }
+            return body;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/ConnectionManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/ConnectionManager.cs b/Usergrid.Sdk/Manager/ConnectionManager.cs
new file mode 100644
index 0000000..c253af6
--- /dev/null
+++ b/Usergrid.Sdk/Manager/ConnectionManager.cs
@@ -0,0 +1,99 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using System.Net;
+using Newtonsoft.Json;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Manager
+{
+    internal class ConnectionManager : ManagerBase, IConnectionManager
+    {
+        internal ConnectionManager(IUsergridRequest request) : base(request)
+        {
+        }
+
+        public void CreateConnection(Connection connection) 
+        {
+            // e.g. /user/fred/following/user/barney
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format(
+                "/{0}/{1}/{2}/{3}/{4}",
+                connection.ConnectorCollectionName,
+                connection.ConnectorIdentifier,
+                connection.ConnectionName,
+                connection.ConnecteeCollectionName,
+                connection.ConnecteeIdentifier), Method.POST);
+
+            ValidateResponse(response);
+        }
+
+        public IList<UsergridEntity> GetConnections(Connection connection) 
+        {
+            // e.g. /user/fred/following
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/{0}/{1}/{2}",
+                                                                              connection.ConnectorCollectionName,
+                                                                              connection.ConnectorIdentifier,
+                                                                              connection.ConnectionName), Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+            {
+                return default(List<UsergridEntity>);
+            }
+
+            ValidateResponse(response);
+
+            var entity = JsonConvert.DeserializeObject<UsergridGetResponse<UsergridEntity>>(response.Content);
+
+            return entity.Entities;
+        }
+
+        public IList<TConnectee> GetConnections<TConnectee>(Connection connection) 
+        {
+            // e.g. /user/fred/following/user
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/{0}/{1}/{2}/{3}",
+                                                                              connection.ConnectorCollectionName,
+                                                                              connection.ConnectorIdentifier, 
+                                                                              connection.ConnectionName,
+                                                                              connection.ConnecteeCollectionName), Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+            {
+                return default(List<TConnectee>);
+            }
+
+            ValidateResponse(response);
+
+            var entity = JsonConvert.DeserializeObject<UsergridGetResponse<TConnectee>>(response.Content);
+
+            return entity.Entities;
+        }
+
+        public void DeleteConnection(Connection connection)
+        {
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format(
+                "/{0}/{1}/{2}/{3}/{4}",
+                connection.ConnectorCollectionName,
+                connection.ConnectorIdentifier,
+                connection.ConnectionName,
+                connection.ConnecteeCollectionName,
+                connection.ConnecteeIdentifier), Method.DELETE);
+
+            ValidateResponse(response);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/EntityManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/EntityManager.cs b/Usergrid.Sdk/Manager/EntityManager.cs
new file mode 100644
index 0000000..349d16e
--- /dev/null
+++ b/Usergrid.Sdk/Manager/EntityManager.cs
@@ -0,0 +1,177 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Manager {
+    internal class EntityManager : ManagerBase, IEntityManager {
+        private readonly IDictionary<Type, Stack<string>> _cursorStates = new Dictionary<Type, Stack<string>>();
+        private readonly IDictionary<Type, int> _pageSizes = new Dictionary<Type, int>();
+
+        internal EntityManager(IUsergridRequest request) : base(request) {}
+
+        public T CreateEntity<T>(string collection, T entity) {
+            IRestResponse response = Request.ExecuteJsonRequest("/" + collection, Method.POST, entity);
+            ValidateResponse(response);
+            var returnedEntity = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+
+            return returnedEntity.Entities.FirstOrDefault();
+        }
+
+        public void DeleteEntity(string collection, string identifer) {
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/{0}/{1}", collection, identifer), Method.DELETE);
+            ValidateResponse(response);
+        }
+
+        public void UpdateEntity<T>(string collection, string identifer, T entity) {
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/{0}/{1}", collection, identifer), Method.PUT, entity);
+            ValidateResponse(response);
+        }
+
+        public T GetEntity<T>(string collectionName, string identifer) {
+            IRestResponse response = Request.ExecuteJsonRequest(string.Format("/{0}/{1}", collectionName, identifer), Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+                return default(T);
+            ValidateResponse(response);
+
+            var entity = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+
+            return entity.Entities.FirstOrDefault();
+        }
+
+        public UsergridCollection<T> GetEntities<T>(string collectionName, int limit = 10, string query = null) {
+            _pageSizes.Remove(typeof (T));
+            _pageSizes.Add(typeof (T), limit);
+
+            string url = string.Format("/{0}?limit={1}", collectionName, limit);
+            if (query != null)
+                url += "&query=" + query;
+
+            IRestResponse response = Request.ExecuteJsonRequest(url, Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+                return new UsergridCollection<T>();
+
+            ValidateResponse(response);
+
+            var getResponse = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+            var collection = new UsergridCollection<T>(getResponse.Entities);
+
+            _cursorStates.Remove(typeof (T));
+
+            if (getResponse.Cursor != null) {
+                collection.HasNext = true;
+                collection.HasPrevious = false;
+                _cursorStates.Add(typeof (T), new Stack<string>(new[] {null, null, getResponse.Cursor}));
+            }
+
+            return collection;
+        }
+
+        public UsergridCollection<T> GetNextEntities<T>(string collectionName, string query = null) {
+            if (!_cursorStates.ContainsKey(typeof (T))) {
+                return new UsergridCollection<T>();
+            }
+
+            Stack<string> stack = _cursorStates[typeof (T)];
+            string cursor = stack.Peek();
+
+            if (cursor == null) {
+                return new UsergridCollection<T> {HasNext = false, HasPrevious = true};
+            }
+
+            int limit = _pageSizes[typeof (T)];
+
+            string url = string.Format("/{0}?cursor={1}&limit={2}", collectionName, cursor, limit);
+            if (query != null)
+                url += "&query=" + query;
+
+            IRestResponse response = Request.ExecuteJsonRequest(url, Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+                return new UsergridCollection<T>();
+
+            ValidateResponse(response);
+
+            var getResponse = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+            var collection = new UsergridCollection<T>(getResponse.Entities);
+
+            if (getResponse.Cursor != null) {
+                collection.HasNext = true;
+                stack.Push(getResponse.Cursor);
+            }
+            else {
+                stack.Push(null);
+            }
+
+            collection.HasPrevious = true;
+
+            return collection;
+        }
+
+        public UsergridCollection<T> GetPreviousEntities<T>(string collectionName, string query = null) {
+            if (!_cursorStates.ContainsKey(typeof (T))) {
+                var error = new UsergridError
+                    {
+                        Error = "cursor_not_initialized",
+                        Description = "Call GetEntities method to initialize the cursor"
+                    };
+                throw new UsergridException(error);
+            }
+
+            Stack<string> stack = _cursorStates[typeof (T)];
+            stack.Pop();
+            stack.Pop();
+            string cursor = stack.Peek();
+
+            int limit = _pageSizes[typeof (T)];
+
+            if (cursor == null) {
+                return GetEntities<T>(collectionName, limit);
+            }
+
+            string url = string.Format("/{0}?cursor={1}&limit={2}", collectionName, cursor, limit);
+            if (query != null)
+                url += "&query=" + query;
+
+            IRestResponse response = Request.ExecuteJsonRequest(url, Method.GET);
+
+            if (response.StatusCode == HttpStatusCode.NotFound)
+                return new UsergridCollection<T>();
+
+            ValidateResponse(response);
+
+            var getResponse = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+            var collection = new UsergridCollection<T>(getResponse.Entities)
+                {
+                    HasNext = true, 
+                    HasPrevious = true
+                };
+
+            stack.Push(getResponse.Cursor);
+
+            return collection;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/IAuthenticationManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/IAuthenticationManager.cs b/Usergrid.Sdk/Manager/IAuthenticationManager.cs
new file mode 100644
index 0000000..797ebd0
--- /dev/null
+++ b/Usergrid.Sdk/Manager/IAuthenticationManager.cs
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Manager
+{
+    internal interface IAuthenticationManager
+    {
+        void ChangePassword(string userName, string oldPassword, string newPassword);
+        void Login(string loginId, string secret, AuthType authType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/IConnectionManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/IConnectionManager.cs b/Usergrid.Sdk/Manager/IConnectionManager.cs
new file mode 100644
index 0000000..563b164
--- /dev/null
+++ b/Usergrid.Sdk/Manager/IConnectionManager.cs
@@ -0,0 +1,26 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Manager {
+    internal interface IConnectionManager {
+        void CreateConnection(Connection connection);
+        IList<UsergridEntity> GetConnections(Connection connection);
+        IList<TConnectee> GetConnections<TConnectee>(Connection connection);
+        void DeleteConnection(Connection connection);
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/IEntityManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/IEntityManager.cs b/Usergrid.Sdk/Manager/IEntityManager.cs
new file mode 100644
index 0000000..4ab8a1f
--- /dev/null
+++ b/Usergrid.Sdk/Manager/IEntityManager.cs
@@ -0,0 +1,30 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Manager
+{
+    public interface IEntityManager
+    {
+        T CreateEntity<T>(string collection, T entity);
+        void DeleteEntity(string collection, string identifer /*name or uuid*/);
+        void UpdateEntity<T>(string collection, string identifer /*name or uuid*/, T entity);
+        T GetEntity<T>(string collectionName, string identifer /*name or uuid*/);
+		UsergridCollection<T> GetEntities<T> (string collectionName, int limit = 10, string query = null);
+		UsergridCollection<T> GetNextEntities<T>(string collectionName, string query = null);
+		UsergridCollection<T> GetPreviousEntities<T>(string collectionName, string query = null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/INotificationsManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/INotificationsManager.cs b/Usergrid.Sdk/Manager/INotificationsManager.cs
new file mode 100644
index 0000000..34fd1ea
--- /dev/null
+++ b/Usergrid.Sdk/Manager/INotificationsManager.cs
@@ -0,0 +1,27 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Manager
+{
+    internal interface INotificationsManager
+    {
+        void CreateNotifierForApple(string notifierName, string environment, string p12CertificatePath);
+        void CreateNotifierForAndroid(string notifierName, string apiKey);
+		void PublishNotification (IEnumerable<Notification> notification, INotificationRecipients recipients, NotificationSchedulerSettings schedulingSettings = null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/ManagerBase.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/ManagerBase.cs b/Usergrid.Sdk/Manager/ManagerBase.cs
new file mode 100644
index 0000000..00aa167
--- /dev/null
+++ b/Usergrid.Sdk/Manager/ManagerBase.cs
@@ -0,0 +1,42 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using System.Net;
+using Newtonsoft.Json;
+using RestSharp;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Manager
+{
+	internal abstract class ManagerBase
+    {
+        protected readonly IUsergridRequest Request;
+
+        internal ManagerBase(IUsergridRequest request)
+        {
+            Request = request;
+        }
+
+        protected void ValidateResponse(IRestResponse response)
+        {
+            if (response.StatusCode != HttpStatusCode.OK)
+            {
+                var userGridError = JsonConvert.DeserializeObject<UsergridError>(response.Content);
+                throw new UsergridException(userGridError);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Manager/NotificationsManager.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Manager/NotificationsManager.cs b/Usergrid.Sdk/Manager/NotificationsManager.cs
new file mode 100644
index 0000000..96fa138
--- /dev/null
+++ b/Usergrid.Sdk/Manager/NotificationsManager.cs
@@ -0,0 +1,77 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Manager
+{
+    internal class NotificationsManager : ManagerBase, INotificationsManager
+    {
+        public NotificationsManager(IUsergridRequest request) : base(request)
+        {
+        }
+
+        public void CreateNotifierForApple(string notifierName, string environment, string p12CertificatePath)
+        {
+            var formParameters = new Dictionary<string, object>
+                {
+                    {"name", notifierName},
+                    {"provider", "apple"},
+                    {"environment", environment}
+                };
+
+            var fileParameters = new Dictionary<string, string>
+                {
+                    {"p12Certificate", p12CertificatePath}
+                };
+
+
+            IRestResponse response = Request.ExecuteMultipartFormDataRequest("/notifiers", Method.POST, formParameters, fileParameters);
+            ValidateResponse(response);
+        }
+
+        public void CreateNotifierForAndroid(string notifierName, string apiKey)
+        {
+            IRestResponse response = Request.ExecuteJsonRequest("/notifiers", Method.POST, new AndroidNotifierPayload {ApiKey = apiKey, Name = notifierName});
+            ValidateResponse(response);
+        }
+
+        public void PublishNotification(IEnumerable<Notification> notifications, INotificationRecipients recipients, NotificationSchedulerSettings schedulerSettings = null)
+        {
+            var payload = new NotificationPayload();
+            foreach (Notification notification in notifications)
+            {
+                payload.Payloads.Add(notification.NotifierIdentifier, notification.GetPayload());
+            }
+
+            if (schedulerSettings != null)
+            {
+                if (schedulerSettings.DeliverAt != DateTime.MinValue)
+                    payload.DeliverAt = schedulerSettings.DeliverAt.ToUnixTime();
+                if (schedulerSettings.ExpireAt != DateTime.MinValue)
+                    payload.ExpireAt = schedulerSettings.ExpireAt.ToUnixTime();
+            }
+
+            string query = recipients.BuildQuery();
+
+            IRestResponse response = Request.ExecuteJsonRequest(query, Method.POST, payload);
+            ValidateResponse(response);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/AndroidNotification.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/AndroidNotification.cs b/Usergrid.Sdk/Model/AndroidNotification.cs
new file mode 100644
index 0000000..f3e4260
--- /dev/null
+++ b/Usergrid.Sdk/Model/AndroidNotification.cs
@@ -0,0 +1,37 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using RestSharp;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Model
+{
+
+    public class AndroidNotification : Notification
+    {
+        public AndroidNotification(string notifierIdentifier, string message) : base(notifierIdentifier, message)
+        {
+        }
+
+        internal override object GetPayload()
+        {
+            return new {data = Message};
+        }
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/AppleNotification.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/AppleNotification.cs b/Usergrid.Sdk/Model/AppleNotification.cs
new file mode 100644
index 0000000..0c9229d
--- /dev/null
+++ b/Usergrid.Sdk/Model/AppleNotification.cs
@@ -0,0 +1,49 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using RestSharp;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Model
+{
+
+    public class AppleNotification : Notification
+    {
+        public AppleNotification(string notifierIdentifier, string message, string sound = null)
+            : base(notifierIdentifier, message)
+        {
+            Sound = sound;
+        }
+
+        public string Sound { get; set; }
+
+        internal override object GetPayload()
+        {
+
+            if (Sound != null)
+            {
+                return new {aps = new {alert = Message, sound = Sound}};
+            }
+            else
+            {
+                return Message;
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/AuthType.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/AuthType.cs b/Usergrid.Sdk/Model/AuthType.cs
new file mode 100644
index 0000000..c1922ce
--- /dev/null
+++ b/Usergrid.Sdk/Model/AuthType.cs
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Model
+{
+    public enum AuthType
+    {
+        Organization,
+		Application,
+        User,
+        None
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/Connection.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/Connection.cs b/Usergrid.Sdk/Model/Connection.cs
new file mode 100644
index 0000000..b044350
--- /dev/null
+++ b/Usergrid.Sdk/Model/Connection.cs
@@ -0,0 +1,24 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Model {
+    public class Connection {
+        public string ConnectorCollectionName { get; set; }
+        public string ConnectorIdentifier { get; set; }
+        public string ConnecteeCollectionName { get; set; }
+        public string ConnecteeIdentifier { get; set; }
+        public string ConnectionName { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/INotificationRecipients.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/INotificationRecipients.cs b/Usergrid.Sdk/Model/INotificationRecipients.cs
new file mode 100644
index 0000000..6f4d05c
--- /dev/null
+++ b/Usergrid.Sdk/Model/INotificationRecipients.cs
@@ -0,0 +1,32 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk.Model
+{
+	public interface INotificationRecipients
+	{
+		INotificationRecipients AddUserWithName(string name);
+		INotificationRecipients AddUserWithUuid(string uuid);
+		INotificationRecipients AddUserWithQuery(string query);
+		INotificationRecipients AddGroupWithPath(string path);
+		INotificationRecipients AddGroupWithQuery(string query);
+		INotificationRecipients AddDeviceWithName(string name);
+		INotificationRecipients AddDeviceWithQuery(string query);
+		string BuildQuery();
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/Notification.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/Notification.cs b/Usergrid.Sdk/Model/Notification.cs
new file mode 100644
index 0000000..be94993
--- /dev/null
+++ b/Usergrid.Sdk/Model/Notification.cs
@@ -0,0 +1,31 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Model
+{
+    public abstract class Notification
+    {
+        protected Notification(string notifierIdentifier, string message)
+        {
+            NotifierIdentifier = notifierIdentifier;
+            Message = message;
+        }
+
+        public string NotifierIdentifier { get; set; }
+        public string Message { get; set; }
+
+        internal abstract object GetPayload();
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/NotificationRecipients.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/NotificationRecipients.cs b/Usergrid.Sdk/Model/NotificationRecipients.cs
new file mode 100644
index 0000000..0aa79cd
--- /dev/null
+++ b/Usergrid.Sdk/Model/NotificationRecipients.cs
@@ -0,0 +1,137 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk.Model
+{
+	public class NotificationRecipients : INotificationRecipients
+	{
+		string _userName;
+		string _userUuid;
+		string _userQuery;
+		string _groupPath;
+		string _groupQuery;
+		string _deviceName;
+		string _deviceQuery;
+
+		public INotificationRecipients AddUserWithName (string name)
+		{
+            if (_userUuid != null)
+                throw new ArgumentException("User name and uuid can not be added at the same time.");
+            _userName = name;
+			return this;
+		}
+
+		public INotificationRecipients AddUserWithUuid (string uuid)
+		{
+			if (_userName != null)
+				throw new ArgumentException ("User name and uuid can not be added at the same time.");
+
+			_userUuid = uuid;
+			return this;
+		}
+
+		public INotificationRecipients AddUserWithQuery (string query)
+		{
+            if (_userName != null || _userUuid != null)
+                throw new ArgumentException("User query can not be added together with user name or uuid.");
+            
+            _userQuery = query;
+			return this;
+		}
+
+		public INotificationRecipients AddGroupWithPath (string path)
+		{
+            if (_groupQuery != null)
+                throw new ArgumentException("Group path and query can not be added at the same time.");
+            
+            _groupPath = path;
+			return this;
+		}
+
+		public INotificationRecipients AddGroupWithQuery (string query)
+		{
+            if (_groupPath != null)
+                throw new ArgumentException("Group path and query can not be added at the same time.");
+            
+            _groupQuery = query;
+			return this;
+		}
+
+		public INotificationRecipients AddDeviceWithName (string name)
+		{
+            if (_deviceQuery != null)
+                throw new ArgumentException("Device name and query can not be added at the same time.");
+            
+            _deviceName = name;
+			return this;
+		}
+
+		public INotificationRecipients AddDeviceWithQuery (string query)
+		{
+            if (_deviceName != null)
+                throw new ArgumentException("Device name and query can not be added at the same time.");
+            
+            _deviceQuery = query;
+			return this;
+		}
+
+		public string BuildQuery()
+		{
+			var query = string.Empty;
+
+			if (_groupPath != null)
+			{
+				query += string.Format ("/groups/{0}", _groupPath);
+			}
+
+			if (_groupQuery != null)
+			{
+				query += string.Format ("/groups;ql={0}", _groupQuery);
+			}
+
+			if (_userName != null)
+			{
+				query += string.Format ("/users/{0}", _userName);
+			}
+
+			if (_userUuid != null)
+			{
+				query += string.Format ("/users/{0}", _userUuid);
+			}
+
+			if (_userQuery != null)
+			{
+				query += string.Format ("/users;ql={0}", _userQuery);
+			}
+
+			if (_deviceName != null)
+			{
+				query += string.Format ("/devices/{0}", _deviceName);
+			}
+
+			if (_deviceQuery != null)
+			{
+				query += string.Format ("/devices;ql={0}", _deviceQuery);
+			}
+
+			query += "/notifications";
+
+			return query;
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/NotificationSchedulerSettings.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/NotificationSchedulerSettings.cs b/Usergrid.Sdk/Model/NotificationSchedulerSettings.cs
new file mode 100644
index 0000000..45b7261
--- /dev/null
+++ b/Usergrid.Sdk/Model/NotificationSchedulerSettings.cs
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Model
+{
+	public class NotificationSchedulerSettings
+	{
+		[JsonProperty("deliver")]
+		public DateTime DeliverAt {get;set;}
+		[JsonProperty("expire")]
+		public DateTime ExpireAt { get; set;}
+
+		public NotificationSchedulerSettings()
+		{
+			DeliverAt = DateTime.MinValue;
+			ExpireAt = DateTime.MinValue;
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UnixDateTimeHelper.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UnixDateTimeHelper.cs b/Usergrid.Sdk/Model/UnixDateTimeHelper.cs
new file mode 100644
index 0000000..d2b8017
--- /dev/null
+++ b/Usergrid.Sdk/Model/UnixDateTimeHelper.cs
@@ -0,0 +1,53 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk
+{
+	public static class UnixDateTimeHelper
+	{
+		private const string InvalidUnixEpochErrorMessage = "Unix epoc starts January 1st, 1970";
+
+		/// <summary>
+		///   Convert a long into a DateTime
+		/// </summary>
+		public static DateTime FromUnixTime(this Int64 self)
+		{
+			var ret = new DateTime(1970, 1, 1);
+			return ret.AddSeconds(self/1000);
+		}
+
+		/// <summary>
+		///   Convert a DateTime into a long
+		/// </summary>
+		public static Int64 ToUnixTime(this DateTime self)
+		{
+
+			if (self == DateTime.MinValue)
+			{
+				return 0;
+			}
+
+			var epoc = new DateTime(1970, 1, 1);
+			var delta = self - epoc;
+
+			if (delta.TotalSeconds < 0) throw new ArgumentOutOfRangeException(InvalidUnixEpochErrorMessage);
+
+			return (long) delta.TotalSeconds * 1000;
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UserGridEntity.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UserGridEntity.cs b/Usergrid.Sdk/Model/UserGridEntity.cs
new file mode 100644
index 0000000..889a43a
--- /dev/null
+++ b/Usergrid.Sdk/Model/UserGridEntity.cs
@@ -0,0 +1,45 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridEntity
+    {
+        public string Uuid { get; set; }
+        public string Type { get; set; }
+        public string Name { get; set; }
+
+        [JsonProperty("created")]
+        private long createdLong { get; set; }
+
+        [JsonIgnore]
+        public DateTime CreatedDate
+        {
+            get { return createdLong.FromUnixTime(); }
+        }
+
+        [JsonProperty("modified")]
+        private long modifiedLong { get; set; }
+
+        [JsonIgnore]
+        public DateTime ModifiedDate
+        {
+            get { return modifiedLong.FromUnixTime(); }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridActivity.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridActivity.cs b/Usergrid.Sdk/Model/UsergridActivity.cs
new file mode 100644
index 0000000..0d39b0a
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridActivity.cs
@@ -0,0 +1,50 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Model
+{
+	public class UsergridActivity
+	{
+		public UsergridActivity(){}
+
+		public UsergridActivity(UsergridUser user, UsergridImage image = null){
+			Actor = new UsergridActor {
+				DisplayName = user.Name,
+				Email = user.Email,
+				Image = image,
+				UserName = user.UserName,
+				Uuid = user.Uuid
+			};
+		}
+
+		public UsergridActor Actor {get;set;}
+
+		public string Verb {get;set;}
+
+		public string Content { get; set;}
+
+		[JsonProperty("published")]
+		private long PublishedLong {  get;  set;}
+
+		[JsonIgnore]
+		public DateTime PublishedDate {
+			get { return PublishedLong.FromUnixTime(); }
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridActor.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridActor.cs b/Usergrid.Sdk/Model/UsergridActor.cs
new file mode 100644
index 0000000..8e562ec
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridActor.cs
@@ -0,0 +1,29 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk
+{
+	public class UsergridActor
+	{
+		public string DisplayName {get;set;}
+		public string Uuid { get; set;}
+		public string UserName {get;set;}
+		public UsergridImage Image {get;set;}
+		public string Email {get;set;}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridCollection.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridCollection.cs b/Usergrid.Sdk/Model/UsergridCollection.cs
new file mode 100644
index 0000000..ca801a4
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridCollection.cs
@@ -0,0 +1,30 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+
+namespace Usergrid.Sdk
+{
+	public class UsergridCollection<T> : List<T>
+	{
+		public UsergridCollection() : base() {}
+		public UsergridCollection(IEnumerable<T> items) : base(items) {}
+
+		public bool HasNext {get;set;}
+		public bool HasPrevious {get;set;}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridDevice.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridDevice.cs b/Usergrid.Sdk/Model/UsergridDevice.cs
new file mode 100644
index 0000000..b0837a9
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridDevice.cs
@@ -0,0 +1,22 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk.Model
+{
+	public class UsergridDevice : UsergridEntity {}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridEntitySerializer.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridEntitySerializer.cs b/Usergrid.Sdk/Model/UsergridEntitySerializer.cs
new file mode 100644
index 0000000..2ca84ed
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridEntitySerializer.cs
@@ -0,0 +1,51 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace Usergrid.Sdk.Model
+{
+	public class EntitySerializer : JsonConverter
+	{
+		public override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+		{
+			var jsonSerializer = new JsonSerializer ();
+
+			var obj = JObject.Load(reader); 
+			var r1 = obj.CreateReader();
+			var r2 = obj.CreateReader ();
+
+			var usergridEntity = jsonSerializer.Deserialize (r1, objectType);
+			var entityProperty = usergridEntity.GetType ().GetProperty ("Entity");
+			var entity = jsonSerializer.Deserialize(r2, entityProperty.PropertyType);
+			entityProperty.SetValue (usergridEntity, entity, null);
+
+			return usergridEntity;
+		}
+
+		public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
+		{
+			throw new NotImplementedException ();
+		}
+
+		public override bool CanConvert (Type objectType)
+		{
+			return typeof(UsergridEntity).IsAssignableFrom (objectType);
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridError.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridError.cs b/Usergrid.Sdk/Model/UsergridError.cs
new file mode 100644
index 0000000..b70433b
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridError.cs
@@ -0,0 +1,31 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridError
+    {
+        [JsonProperty(PropertyName = "error")]
+        public string Error { get; set; }
+
+        [JsonProperty(PropertyName = "exception")]
+        public string Exception { get; set; }
+
+        [JsonProperty(PropertyName = "error_description")]
+        public string Description { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridException.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridException.cs b/Usergrid.Sdk/Model/UsergridException.cs
new file mode 100644
index 0000000..c7f9816
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridException.cs
@@ -0,0 +1,30 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridException : Exception
+    {
+		public UsergridException(UsergridError error) : base(error.Description)
+		{
+			ErrorCode = error.Error;
+		}
+
+		public string ErrorCode { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridGroup.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridGroup.cs b/Usergrid.Sdk/Model/UsergridGroup.cs
new file mode 100644
index 0000000..6be20f6
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridGroup.cs
@@ -0,0 +1,24 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridGroup : UsergridEntity
+    {
+        public string Title { get; set; }
+        public string Path { get; set; }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridImage.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridImage.cs b/Usergrid.Sdk/Model/UsergridImage.cs
new file mode 100644
index 0000000..53d7a24
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridImage.cs
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+
+namespace Usergrid.Sdk
+{
+	public class UsergridImage
+	{
+		public int Duration {get;set;}
+		public int Height {get;set;}
+		public int Width {get;set;}
+		public string Url {get;set;}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridNotifier.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridNotifier.cs b/Usergrid.Sdk/Model/UsergridNotifier.cs
new file mode 100644
index 0000000..a6f6964
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridNotifier.cs
@@ -0,0 +1,23 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridNotifier : UsergridEntity
+    {
+        public string Provider { get; set; }
+        public string Environment { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Model/UsergridUser.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Model/UsergridUser.cs b/Usergrid.Sdk/Model/UsergridUser.cs
new file mode 100644
index 0000000..dbddb2c
--- /dev/null
+++ b/Usergrid.Sdk/Model/UsergridUser.cs
@@ -0,0 +1,27 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Model
+{
+    public class UsergridUser : UsergridEntity
+    {
+        [JsonProperty("username")]
+        public string UserName { get; set; }
+        [JsonProperty("email")]
+        public string Email { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/AndroidNotifierPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/AndroidNotifierPayload.cs b/Usergrid.Sdk/Payload/AndroidNotifierPayload.cs
new file mode 100644
index 0000000..ec41723
--- /dev/null
+++ b/Usergrid.Sdk/Payload/AndroidNotifierPayload.cs
@@ -0,0 +1,29 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace Usergrid.Sdk.Payload
+{
+    internal class AndroidNotifierPayload
+    {
+        public string Name { get; set; }
+
+        public string Provider
+        {
+            get { return "google"; }
+        }
+
+        public string ApiKey { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/CancelNotificationPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/CancelNotificationPayload.cs b/Usergrid.Sdk/Payload/CancelNotificationPayload.cs
new file mode 100644
index 0000000..aa3694b
--- /dev/null
+++ b/Usergrid.Sdk/Payload/CancelNotificationPayload.cs
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+    internal class CancelNotificationPayload
+    {
+        [JsonProperty(PropertyName = "canceled")]
+        internal bool Canceled { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/ChangePasswordPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/ChangePasswordPayload.cs b/Usergrid.Sdk/Payload/ChangePasswordPayload.cs
new file mode 100644
index 0000000..9143664
--- /dev/null
+++ b/Usergrid.Sdk/Payload/ChangePasswordPayload.cs
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+	internal class ChangePasswordPayload
+    {
+        [JsonProperty(PropertyName = "oldpassword")]
+		internal string OldPassword { get; set; }
+
+        [JsonProperty(PropertyName = "newpassword")]
+		internal string NewPassword { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/ClientIdLoginPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/ClientIdLoginPayload.cs b/Usergrid.Sdk/Payload/ClientIdLoginPayload.cs
new file mode 100644
index 0000000..b7b155b
--- /dev/null
+++ b/Usergrid.Sdk/Payload/ClientIdLoginPayload.cs
@@ -0,0 +1,34 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+	internal class ClientIdLoginPayload
+    {
+        [JsonProperty(PropertyName = "grant_type")]
+		internal string GrantType
+        {
+            get { return "client_credentials"; }
+        }
+
+        [JsonProperty(PropertyName = "client_id")]
+		internal string ClientId { get; set; }
+
+        [JsonProperty(PropertyName = "client_secret")]
+		internal string ClientSecret { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/LoginResponse.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/LoginResponse.cs b/Usergrid.Sdk/Payload/LoginResponse.cs
new file mode 100644
index 0000000..07bee35
--- /dev/null
+++ b/Usergrid.Sdk/Payload/LoginResponse.cs
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+    internal class LoginResponse
+    {
+        [JsonProperty(PropertyName = "access_token")]
+        public string AccessToken { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/NotificationPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/NotificationPayload.cs b/Usergrid.Sdk/Payload/NotificationPayload.cs
new file mode 100644
index 0000000..499af3a
--- /dev/null
+++ b/Usergrid.Sdk/Payload/NotificationPayload.cs
@@ -0,0 +1,38 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using RestSharp;
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+    internal class NotificationPayload
+    {
+        
+        public IDictionary<string, object>  Payloads { get; set; }
+		[JsonProperty("deliver", NullValueHandling = NullValueHandling.Ignore)]
+		public long? DeliverAt {get;set;}
+		[JsonProperty("expire", NullValueHandling = NullValueHandling.Ignore)]
+		public long? ExpireAt { get; set;}
+
+        public NotificationPayload()
+        {
+            Payloads = new Dictionary<string, object>();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/UserLoginPayload.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/UserLoginPayload.cs b/Usergrid.Sdk/Payload/UserLoginPayload.cs
new file mode 100644
index 0000000..a45ca71
--- /dev/null
+++ b/Usergrid.Sdk/Payload/UserLoginPayload.cs
@@ -0,0 +1,34 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+	internal class UserLoginPayload
+    {
+        [JsonProperty(PropertyName = "grant_type")]
+		internal string GrantType
+        {
+            get { return "password"; }
+        }
+
+        [JsonProperty(PropertyName = "username")]
+		internal string UserName { get; set; }
+
+        [JsonProperty(PropertyName = "password")]
+		internal string Password { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Payload/UsergridGetResponse.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Payload/UsergridGetResponse.cs b/Usergrid.Sdk/Payload/UsergridGetResponse.cs
new file mode 100644
index 0000000..b29c7b9
--- /dev/null
+++ b/Usergrid.Sdk/Payload/UsergridGetResponse.cs
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using Newtonsoft.Json;
+
+namespace Usergrid.Sdk.Payload
+{
+    public class UsergridGetResponse<T>
+    {
+        [JsonProperty(PropertyName = "cursor")] 
+		internal string Cursor;
+        [JsonProperty(PropertyName = "entities")] 
+		internal IList<T> Entities;
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Properties/AssemblyInfo.cs b/Usergrid.Sdk/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..bca6c49
--- /dev/null
+++ b/Usergrid.Sdk/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("Usergrid.Sdk")]
+[assembly: AssemblyCompany("Apigee")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("8718e539-88e7-44ce-8c8f-b2ca37632a81")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("0.1.0.0")]
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
+[assembly: InternalsVisibleTo("Usergrid.Sdk.Tests")]

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/RestSharpJsonSerializer.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/RestSharpJsonSerializer.cs b/Usergrid.Sdk/RestSharpJsonSerializer.cs
new file mode 100644
index 0000000..ff4557c
--- /dev/null
+++ b/Usergrid.Sdk/RestSharpJsonSerializer.cs
@@ -0,0 +1,38 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+using RestSharp.Serializers;
+
+namespace Usergrid.Sdk
+{
+	public class RestSharpJsonSerializer : ISerializer
+    {
+		public string Serialize(object obj)
+        {
+            var serializeObject = JsonConvert.SerializeObject(obj, new JsonSerializerSettings()
+                                                                       {
+                                                                           ContractResolver = new CamelCasePropertyNamesContractResolver()
+                                                                       });
+            return serializeObject;
+        }
+
+		public string RootElement { get; set; }
+		public string Namespace { get; set; }
+		public string DateFormat { get; set; }
+		public string ContentType { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Usergrid.Sdk.csproj
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Usergrid.Sdk.csproj b/Usergrid.Sdk/Usergrid.Sdk.csproj
new file mode 100644
index 0000000..d422771
--- /dev/null
+++ b/Usergrid.Sdk/Usergrid.Sdk.csproj
@@ -0,0 +1,124 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{437D108F-528C-4B2A-B399-06CF02DEB08B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Usergrid.Sdk</RootNamespace>
+    <AssemblyName>Usergrid.Sdk</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\packages\RestSharp.104.1\lib\net4\RestSharp.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Client.cs" />
+    <Compile Include="IClient.cs" />
+    <Compile Include="IUsergridRequest.cs" />
+    <Compile Include="Manager\INotificationsManager.cs" />
+    <Compile Include="Manager\NotificationsManager.cs" />
+    <Compile Include="Model\Connection.cs" />
+    <Compile Include="Model\UsergridEntity.cs" />
+    <Compile Include="Model\UsergridError.cs" />
+    <Compile Include="Model\UsergridNotifier.cs" />
+    <Compile Include="Payload\AndroidNotifierPayload.cs" />
+    <Compile Include="Payload\CancelNotificationPayload.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RestSharpJsonSerializer.cs" />
+    <Compile Include="UsergridRequest.cs" />
+    <Compile Include="Model\UsergridUser.cs" />
+    <Compile Include="Model\UsergridGroup.cs" />
+    <Compile Include="Payload\UserLoginPayload.cs" />
+    <Compile Include="Payload\ChangePasswordPayload.cs" />
+    <Compile Include="Payload\ClientIdLoginPayload.cs" />
+    <Compile Include="Payload\LoginResponse.cs" />
+    <Compile Include="Payload\UsergridGetResponse.cs" />
+    <Compile Include="Manager\EntityManager.cs" />
+    <Compile Include="Manager\IAuthenticationManager.cs" />
+    <Compile Include="Manager\IConnectionManager.cs" />
+    <Compile Include="Manager\IEntityManager.cs" />
+    <Compile Include="Manager\ManagerBase.cs" />
+    <Compile Include="Model\UsergridException.cs" />
+    <Compile Include="Model\AuthType.cs" />
+    <Compile Include="Manager\AuthenticationManager.cs" />
+    <Compile Include="Manager\ConnectionManager.cs" />
+    <Compile Include="Model\UsergridCollection.cs" />
+    <Compile Include="Model\UsergridEntitySerializer.cs" />
+    <Compile Include="Model\UsergridActivity.cs" />
+    <Compile Include="Model\UsergridActor.cs" />
+    <Compile Include="Model\UsergridImage.cs" />
+    <Compile Include="Model\UnixDateTimeHelper.cs" />
+    <Compile Include="Model\INotificationRecipients.cs" />
+    <Compile Include="Model\NotificationRecipients.cs" />
+    <Compile Include="Model\Notification.cs" />
+    <Compile Include="Model\AndroidNotification.cs" />
+    <Compile Include="Model\AppleNotification.cs" />
+    <Compile Include="Payload\NotificationPayload.cs" />
+    <Compile Include="Model\NotificationSchedulerSettings.cs" />
+    <Compile Include="Model\UsergridDevice.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ItemGroup />
+</Project>


[08/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/ConnectionManagerTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/ConnectionManagerTests.cs b/Usergrid.Sdk.Tests/ConnectionManagerTests.cs
new file mode 100644
index 0000000..cbe536e
--- /dev/null
+++ b/Usergrid.Sdk.Tests/ConnectionManagerTests.cs
@@ -0,0 +1,240 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System.Collections.Generic;
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests
+{
+    [TestFixture]
+    public class ConnectionManagerTests
+    {
+        [SetUp]
+        public void Setup()
+        {
+            _request = Substitute.For<IUsergridRequest>();
+            _connectionManager = new ConnectionManager(_request);
+        }
+
+        private IUsergridRequest _request;
+        private ConnectionManager _connectionManager;
+
+        [Test]
+        public void CreateConnectionShouldPostToCorrectEndpoint() {
+            var connection = new Connection
+                {
+                    ConnectorCollectionName = "users",
+                    ConnectorIdentifier = "userName",
+                    ConnecteeCollectionName = "devices",
+                    ConnecteeIdentifier = "deviceName",
+                    ConnectionName = "has"
+                };
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            _connectionManager.CreateConnection(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest(
+                    "/users/userName/has/devices/deviceName",
+                    Method.POST);
+        }
+
+        [Test]
+        public void CreateConnectionShouldThrowUsergridExceptionWhenBadResponse() {
+            var connection = new Connection();
+            var restResponseContent = new UsergridError {Description = "Exception message", Error = "error code"};
+            IRestResponse<LoginResponse> restResponseWithBadRequest = Helpers.SetUpRestResponseWithContent<LoginResponse>(HttpStatusCode.BadRequest, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponseWithBadRequest);
+
+            try
+            {
+                _connectionManager.CreateConnection(connection);
+                new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual("error code", e.ErrorCode);
+                Assert.AreEqual("Exception message", e.Message);
+            }
+        }
+
+        [Test]
+        public void GetConnectionsReturnsConnectionsAsList()
+        {
+            var connection = new Connection
+            {
+                ConnectorCollectionName = "users",
+                ConnectorIdentifier = "userName",
+                ConnectionName = "has"
+            };
+
+            var expectedEntities = new List<UsergridEntity>();
+            var responseData = new UsergridGetResponse<UsergridEntity>() {Entities = expectedEntities};
+            IRestResponse restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<UsergridEntity>>(HttpStatusCode.OK, responseData);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var returnedEntities = _connectionManager.GetConnections(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest("/users/userName/has",Method.GET);
+            Assert.AreEqual(expectedEntities, returnedEntities);
+        }
+
+        [Test]
+        public void GetConnectionsReturnsNullWhenConnectionIsNotFound()
+        {
+            var connection = new Connection
+            {
+                ConnectorCollectionName = "users",
+                ConnectorIdentifier = "userName",
+                ConnectionName = "has"
+            };
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.NotFound);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var returnedEntities = _connectionManager.GetConnections(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest("/users/userName/has",Method.GET);
+
+            Assert.IsNull(returnedEntities);
+        }
+
+        [Test]
+        public void GetConnectionsOfSpecificTypeReturnsConnectionsAsListOfConnecteeType()
+        {
+            var connection = new Connection
+            {
+                ConnectorCollectionName = "users",
+                ConnectorIdentifier = "userName",
+                ConnecteeCollectionName = "devices",
+                ConnectionName = "has"
+            };
+            var expectedEntities = new List<UsergridDevice>();
+            var responseData = new UsergridGetResponse<UsergridDevice>() { Entities = expectedEntities };
+            IRestResponse restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<UsergridDevice>>(HttpStatusCode.OK, responseData);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var returnedEntities = _connectionManager.GetConnections<UsergridDevice>(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest("/users/userName/has/devices", Method.GET);
+            Assert.AreEqual(expectedEntities, returnedEntities);
+        }
+
+        [Test]
+        public void GetConnectionsOfSpecificTypeReturnsNullWhenConnectionIsNotFound()
+        {
+            var connection = new Connection
+            {
+                ConnectorCollectionName = "users",
+                ConnectorIdentifier = "userName",
+                ConnecteeCollectionName = "devices",
+                ConnectionName = "has"
+            };
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.NotFound);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var returnedEntities = _connectionManager.GetConnections<UsergridDevice>(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest("/users/userName/has/devices",Method.GET);
+
+            Assert.IsNull(returnedEntities);
+        }
+
+
+        [Test]
+        public void DeleteConnectionShouldDeleteToCorrectEndpoint()
+        {
+            var connection = new Connection
+            {
+                ConnectorCollectionName = "users",
+                ConnectorIdentifier = "userName",
+                ConnecteeCollectionName = "devices",
+                ConnecteeIdentifier = "deviceName",
+                ConnectionName = "has"
+            };
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            _connectionManager.DeleteConnection(connection);
+
+            _request
+                .Received(1)
+                .ExecuteJsonRequest(
+                    "/users/userName/has/devices/deviceName",
+                    Method.DELETE);
+        }
+
+        [Test]
+        public void DeleteConnectionShouldThrowUsergridExceptionWhenBadResponse()
+        {
+            var connection = new Connection();
+            var restResponseContent = new UsergridError { Description = "Exception message", Error = "error code" };
+            IRestResponse<LoginResponse> restResponseWithBadRequest = Helpers.SetUpRestResponseWithContent<LoginResponse>(HttpStatusCode.BadRequest, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponseWithBadRequest);
+
+            try
+            {
+                _connectionManager.DeleteConnection(connection);
+                new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual("error code", e.ErrorCode);
+                Assert.AreEqual("Exception message", e.Message);
+            }
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/EntityManagerTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/EntityManagerTests.cs b/Usergrid.Sdk.Tests/EntityManagerTests.cs
new file mode 100644
index 0000000..4d3456b
--- /dev/null
+++ b/Usergrid.Sdk.Tests/EntityManagerTests.cs
@@ -0,0 +1,440 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests
+{
+    [TestFixture]
+    public class EntityManagerTests
+    {
+
+        [SetUp]
+        public void Setup()
+        {
+            _request = Substitute.For<IUsergridRequest>();
+            _entityManager = new EntityManager(_request);
+        }
+
+        private IUsergridRequest _request;
+        private EntityManager _entityManager;
+
+        [Test]
+        public void CreateEntityShouldPostToCorrectEndPoint()
+        {
+            const string collectionName = "collection";
+            var entityToPost = new Friend {Name = "name1", Age = 1};
+            var restResponseContent = new UsergridGetResponse<Friend> {Entities = new List<Friend> {entityToPost}, Cursor = "cursor"};
+            IRestResponse<UsergridGetResponse<Friend>> restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            Friend returnedEntity = _entityManager.CreateEntity(collectionName, entityToPost);
+
+            _request.Received(1).ExecuteJsonRequest(
+                Arg.Is(string.Format("/{0}", collectionName)),
+                Arg.Is(Method.POST),
+                Arg.Is(entityToPost));
+
+            Assert.AreEqual(entityToPost.Age, returnedEntity.Age);
+            Assert.AreEqual(entityToPost.Name, returnedEntity.Name);
+        }
+
+        [Test]
+        public void CreateEntityShouldTranslateToUserGridErrorAndThrowWhenServiceReturnsBadRequest()
+        {
+            var restResponseContent = new UsergridError
+                                          {
+                                              Description = "Subject does not have permission",
+                                              Error = "unauthorized"
+                                          };
+            const string collectionName = "collection";
+            IRestResponse<UsergridError> restResponse = Helpers.SetUpRestResponseWithContent<UsergridError>(HttpStatusCode.BadRequest, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            try
+            {
+                _entityManager.CreateEntity(collectionName, new object());
+                new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual("unauthorized", e.ErrorCode);
+                Assert.AreEqual("Subject does not have permission", e.Message);
+            }
+        }
+
+
+        [Test]
+        public void DeleteEntityShouldSendDeleteToCorrectEndPoint()
+        {
+            const string collection = "collection";
+            const string identifier = "identifier";
+
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            _entityManager.DeleteEntity(collection, identifier);
+
+            _request.Received(1).ExecuteJsonRequest(
+                Arg.Is(string.Format("/{0}/{1}", collection, identifier)),
+                Arg.Is(Method.DELETE),
+                Arg.Any<object>());
+        }
+
+        [Test]
+        public void DeleteEntityShouldTranslateToUserGridErrorAndThrowWhenServiceReturnsNotFound()
+        {
+            var restResponseContent = new UsergridError
+                                          {
+                                              Description = "Service resource not found",
+                                              Error = "service_resource_not_found"
+                                          };
+            const string collection = "collection";
+            const string identifier = "identifier";
+
+            IRestResponse<UsergridError> restResponse = Helpers.SetUpRestResponseWithContent<UsergridError>(HttpStatusCode.NotFound, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            try
+            {
+                _entityManager.DeleteEntity(collection, identifier);
+                throw new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual("service_resource_not_found", e.ErrorCode);
+                Assert.AreEqual("Service resource not found", e.Message);
+            }
+        }
+
+        [Test]
+        public void GetEntityShouldGetToCorrectEndPoint()
+        {
+            var restResponseContent = new UsergridGetResponse<Friend> {Entities = new List<Friend>(), Cursor = ""};
+            IRestResponse<UsergridGetResponse<Friend>> restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            const string collectionName = "collection";
+            const string identifer = "identifier";
+
+            _entityManager.GetEntity<Friend>(collectionName, identifer);
+
+            _request.Received(1).ExecuteJsonRequest(
+                Arg.Is(string.Format("/{0}/{1}", collectionName, identifer)),
+                Arg.Is(Method.GET),
+                Arg.Any<object>());
+        }
+
+        [Test]
+        public void GetEntityShouldReturnEntityCorrectly()
+        {
+            var friend = new Friend {Name = "name", Age = 1};
+
+            const string restResponseContent = "{\"entities\": [" +
+                                               "{" +
+                                               "\"uuid\": \"bcb343ba-d6d1-11e2-a295-7b4b45081d3b\"," +
+                                               "\"type\": \"friend\"," +
+                                               "\"name\": \"name\"," +
+                                               "\"age\": 1," +
+                                               "\"created\": 1371420707691," +
+                                               "\"modified\": 1371420707691," +
+                                               "\"metadata\": {" +
+                                               "  \"path\": \"/friends/bcb343ba-d6d1-11e2-a295-7b4b45081d3b\"" +
+                                               "}," +
+                                               "}" +
+                                               "]}";
+            IRestResponse<UsergridGetResponse<Friend>> restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            const string collectionName = "collection";
+            const string identifier = "identifier";
+
+            Friend returnedFriend = _entityManager.GetEntity<Friend>(collectionName, identifier);
+
+            Assert.IsNotNull(returnedFriend);
+            Assert.AreEqual(friend.Name, returnedFriend.Name);
+            Assert.AreEqual(friend.Age, returnedFriend.Age);
+        }
+
+
+        [Test]
+        public void GetEntityShouldReturnFirstEntityInListCorrectly()
+        {
+            var friend1 = new Friend {Name = "name1", Age = 1};
+            var friend2 = new Friend {Name = "name2", Age = 2};
+
+            var entities = new List<Friend> {friend1, friend2};
+            var restResponseContent = new UsergridGetResponse<Friend> {Entities = entities, Cursor = "cursor"};
+            IRestResponse<UsergridGetResponse<Friend>> restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            const string collectionName = "collection";
+            const string identifier = "identifier";
+
+            Friend returnedFriend = _entityManager.GetEntity<Friend>(collectionName, identifier);
+
+            Assert.IsNotNull(returnedFriend);
+            Assert.AreEqual(friend1.Name, returnedFriend.Name);
+            Assert.AreEqual(friend1.Age, returnedFriend.Age);
+        }
+
+
+        [Test]
+        public void UpdateEntityShouldPutToCorrectEndPoint()
+        {
+            const string collectionName = "collection";
+            const string identifier = "identifier";
+            var entityToPost = new {FirstName = "first", LastName = "last"};
+
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            _entityManager.UpdateEntity(collectionName, identifier, entityToPost);
+
+            _request.Received(1).ExecuteJsonRequest(
+                Arg.Is(string.Format("/{0}/{1}", collectionName, identifier)),
+                Arg.Is(Method.PUT),
+                Arg.Is(entityToPost));
+        }
+
+        [Test]
+        public void UpdateEntityShouldTranslateToUserGridErrorAndThrowWhenServiceReturnsNotFound()
+        {
+            var restResponseContent = new UsergridError
+                                          {
+                                              Description = "Service resource not found",
+                                              Error = "service_resource_not_found"
+                                          };
+
+            const string collectionName = "collection";
+            const string identifier = "identifier";
+            var entityToPost = new {FirstName = "first", LastName = "last"};
+
+            IRestResponse<UsergridError> restResponse = Helpers.SetUpRestResponseWithContent<UsergridError>(HttpStatusCode.NotFound, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            try
+            {
+                _entityManager.UpdateEntity(collectionName, identifier, entityToPost);
+                new AssertionException("UserGridException was expected to be thrown here");
+            }
+            catch (UsergridException e)
+            {
+                Assert.AreEqual("service_resource_not_found", e.ErrorCode);
+                Assert.AreEqual("Service resource not found", e.Message);
+            }
+        }
+
+        [Test]
+        public void GetEntitiesShouldGetToCorrectEndPointWithDefaultLimitAndQuery()
+        {
+            var restResponseContent = new UsergridGetResponse<Friend> { Entities = new List<Friend>(), Cursor = "" };
+            var restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            const string collectionName = "collection";
+
+            _entityManager.GetEntities<Friend>(collectionName);
+
+            _request.Received(1).ExecuteJsonRequest(
+                Arg.Is(string.Format("/{0}?limit=10", collectionName)),
+                Arg.Is(Method.GET),
+                Arg.Is<object>(x=> x == null));
+        }
+
+        [Test]
+        public void GetEntitiesShouldReturnListCorrectly()
+        {
+            var friend1 = new Friend { Name = "name1", Age = 1 };
+            var friend2 = new Friend { Name = "name2", Age = 2 };
+            var entities = new List<Friend> { friend1, friend2 };
+            var restResponseContent = new UsergridGetResponse<Friend> { Entities = entities, Cursor = "cursor" };
+            var restResponse = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent);
+
+            _request
+                .ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var friends = _entityManager.GetEntities<Friend>("collection");
+
+            Assert.IsNotNull(friends);
+            Assert.AreEqual(entities.Count, friends.Count);
+            Assert.AreEqual(friend1.Name, friends[0].Name);
+            Assert.AreEqual(friend1.Age, friends[0].Age);
+            Assert.AreEqual(friend2.Name, friends[1].Name);
+            Assert.AreEqual(friend2.Age, friends[1].Age);
+        }
+
+        [Test]
+        public void GetNextEntitiesShouldReturnEmptyListIfCalledBeforeGetEntities()
+        {
+            var friends = _entityManager.GetNextEntities<Friend>("collection");
+
+            CollectionAssert.IsEmpty(friends);
+        }
+
+        [Test]
+        public void GetNextEntitiesShouldGetToCorrectEndPointWithCorrectCursorState()
+        {
+            var friend1 = new Friend { Name = "name1", Age = 1 };
+            var friend2 = new Friend { Name = "name2", Age = 2 };
+            var friend3 = new Friend { Name = "name3", Age = 3 };
+            var friend4 = new Friend { Name = "name4", Age = 4 };
+            var friend5 = new Friend { Name = "name5", Age = 5 };
+            var friend6 = new Friend { Name = "name6", Age = 6 };
+            var entities1 = new List<Friend> { friend1, friend2 };
+            var entities2 = new List<Friend> { friend3, friend4 };
+            var entities3 = new List<Friend> { friend5, friend6 };
+            var restResponseContent1 = new UsergridGetResponse<Friend> { Entities = entities1, Cursor = "cursor1" };
+            var restResponse1 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent1);
+            var restResponseContent2 = new UsergridGetResponse<Friend> { Entities = entities2, Cursor = "cursor2" };
+            var restResponse2 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent2);
+            var restResponseContent3 = new UsergridGetResponse<Friend> { Entities = entities3 };
+            var restResponse3 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent3);
+
+            _request
+                .ExecuteJsonRequest("/collection?limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse1);
+            _request
+                .ExecuteJsonRequest("/collection?cursor=cursor1&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse2);
+            _request
+                .ExecuteJsonRequest("/collection?cursor=cursor2&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse3);
+
+            UsergridCollection<Friend> list1 = _entityManager.GetEntities<Friend>("collection");
+            UsergridCollection<Friend> list2 = _entityManager.GetNextEntities<Friend>("collection");
+            UsergridCollection<Friend> list3 = _entityManager.GetNextEntities<Friend>("collection");
+
+            Assert.AreEqual(entities1[0].Name,list1[0].Name);
+            Assert.AreEqual(entities1[1].Age,list1[1].Age);
+            Assert.IsTrue(list1.HasNext);
+            Assert.IsFalse(list1.HasPrevious);
+            Assert.AreEqual(entities2[0].Name,list2[0].Name);
+            Assert.AreEqual(entities2[1].Age,list2[1].Age);
+            Assert.IsTrue(list2.HasNext);
+            Assert.IsTrue(list2.HasPrevious);
+            Assert.AreEqual(entities3[0].Name,list3[0].Name);
+            Assert.AreEqual(entities3[1].Age,list3[1].Age);
+            Assert.IsFalse(list3.HasNext);
+            Assert.IsTrue(list3.HasPrevious);
+        }
+
+        [Test]
+        public void GetPreviousEntitiesShouldGetToCorrectEndPointWithCorrectCursorState()
+        {
+            var friend1 = new Friend { Name = "name1", Age = 1 };
+            var friend2 = new Friend { Name = "name2", Age = 2 };
+            var friend3 = new Friend { Name = "name3", Age = 3 };
+            var friend4 = new Friend { Name = "name4", Age = 4 };
+            var friend5 = new Friend { Name = "name5", Age = 5 };
+            var friend6 = new Friend { Name = "name6", Age = 6 };
+            var entities1 = new List<Friend> { friend1, friend2 };
+            var entities2 = new List<Friend> { friend3, friend4 };
+            var entities3 = new List<Friend> { friend5, friend6 };
+            var restResponseContent1 = new UsergridGetResponse<Friend> { Entities = entities1, Cursor = "cursor1" };
+            var restResponse1 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent1);
+            var restResponseContent2 = new UsergridGetResponse<Friend> { Entities = entities2, Cursor = "cursor2" };
+            var restResponse2 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent2);
+            var restResponseContent3 = new UsergridGetResponse<Friend> { Entities = entities3 };
+            var restResponse3 = Helpers.SetUpRestResponseWithContent<UsergridGetResponse<Friend>>(HttpStatusCode.OK, restResponseContent3);
+
+            _request
+               .ExecuteJsonRequest("/collection?limit=10", Method.GET, Arg.Is<object>(x => x == null))
+               .Returns(restResponse1);
+            _request
+                .ExecuteJsonRequest("/collection?cursor=cursor1&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse2);
+            _request
+                .ExecuteJsonRequest("/collection?cursor=cursor2&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse3);
+            _request
+                .ExecuteJsonRequest("/collection?cursor=cursor1&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse2);
+            _request
+                .ExecuteJsonRequest("/collection?&limit=10", Method.GET, Arg.Is<object>(x => x == null))
+                .Returns(restResponse1);
+
+            UsergridCollection<Friend> list1 = _entityManager.GetEntities<Friend>("collection");
+            UsergridCollection<Friend> list2 = _entityManager.GetNextEntities<Friend>("collection");
+            UsergridCollection<Friend> list3 = _entityManager.GetNextEntities<Friend>("collection");
+            UsergridCollection<Friend> list4 = _entityManager.GetPreviousEntities<Friend>("collection");
+            UsergridCollection<Friend> list5 = _entityManager.GetPreviousEntities<Friend>("collection");
+
+            Assert.AreEqual(entities1[0].Name,list1[0].Name);
+            Assert.AreEqual(entities1[1].Age,list1[1].Age);
+            Assert.IsTrue(list1.HasNext);
+            Assert.IsFalse(list1.HasPrevious);
+
+            Assert.AreEqual(entities2[0].Name,list2[0].Name);
+            Assert.AreEqual(entities2[1].Age,list2[1].Age);
+            Assert.IsTrue(list2.HasNext);
+            Assert.IsTrue(list2.HasPrevious);
+            
+            Assert.AreEqual(entities3[0].Name,list3[0].Name);
+            Assert.AreEqual(entities3[1].Age,list3[1].Age);
+            Assert.IsFalse(list3.HasNext);
+            Assert.IsTrue(list3.HasPrevious);
+
+            Assert.AreEqual(entities2[0].Name, list4[0].Name);
+            Assert.AreEqual(entities2[1].Age, list4[1].Age);
+            Assert.IsTrue(list4.HasNext);
+            Assert.IsTrue(list4.HasPrevious);
+
+            Assert.AreEqual(entities1[0].Name, list5[0].Name);
+            Assert.AreEqual(entities1[1].Age, list5[1].Age);
+            Assert.IsTrue(list5.HasNext);
+            Assert.IsFalse(list5.HasPrevious);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Friend.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Friend.cs b/Usergrid.Sdk.Tests/Friend.cs
new file mode 100644
index 0000000..ea6cc32
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Friend.cs
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System.Collections.Generic;
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests
+{
+
+    public class Friend
+    {
+        public string Name { get; set; }
+        public int Age { get; set; }
+    }
+
+   
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Helpers.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Helpers.cs b/Usergrid.Sdk.Tests/Helpers.cs
new file mode 100644
index 0000000..6188d16
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Helpers.cs
@@ -0,0 +1,94 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System.Net;
+using System.Reflection;
+using NSubstitute;
+using Newtonsoft.Json;
+using RestSharp;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests
+{
+	internal static class Helpers
+    {
+		internal static string Serialize(this object obj)
+        {
+            return JsonConvert.SerializeObject(obj);
+        }
+
+		internal static IRestResponse<T> SetUpRestResponseWithContent<T>(HttpStatusCode httpStatusCode, object responseContent)
+		{
+		    return SetUpRestResponseWithContent<T>(httpStatusCode, responseContent.Serialize());
+		}
+		
+        internal static IRestResponse<T> SetUpRestResponseWithContent<T>(HttpStatusCode httpStatusCode, string responseContent)
+        {
+            var restResponse = Substitute.For<IRestResponse<T>>();
+            restResponse.StatusCode.Returns(httpStatusCode);
+            restResponse.Content.Returns(responseContent);
+            return restResponse;
+        }
+
+        internal static IRestResponse SetUpRestResponse(HttpStatusCode httpStatusCode)
+        {
+            var restResponse = Substitute.For<IRestResponse>();
+            restResponse.StatusCode.Returns(httpStatusCode);
+            return restResponse;
+        }
+
+		internal static IRestResponse<T> SetUpRestResponseWithData<T>(HttpStatusCode httpStatusCode, T responseData)
+        {
+            var restResponse = Substitute.For<IRestResponse<T>>();
+            restResponse.StatusCode.Returns(httpStatusCode);
+            restResponse.Data.Returns(responseData);
+            return restResponse;
+        }
+
+        internal static IUsergridRequest SetUpUsergridRequestWithRestResponse<T>(IRestResponse<T> restResponse) where T : new()
+        {
+            var request = Substitute.For<IUsergridRequest>();
+            request
+                .ExecuteJsonRequest<T>(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            return request;
+        }
+
+		internal static IUsergridRequest InitializeUserGridRequestWithAccessToken(string accessToken)
+        {
+            IRestResponse<LoginResponse> loginResponse = SetUpRestResponseWithData(HttpStatusCode.OK, new LoginResponse {AccessToken = accessToken});
+
+            var request = Substitute.For<IUsergridRequest>();
+            request
+                .ExecuteJsonRequest<LoginResponse>(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(loginResponse);
+
+            return request;
+        }
+
+        public static object GetReflectedProperty(this object obj, string propertyName)
+        {
+            PropertyInfo property = obj.GetType().GetProperty(propertyName);
+
+            if (property == null)
+                return null;
+
+            return property.GetValue(obj, null);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Model/NotificationRecipientsTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Model/NotificationRecipientsTests.cs b/Usergrid.Sdk.Tests/Model/NotificationRecipientsTests.cs
new file mode 100644
index 0000000..032e733
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Model/NotificationRecipientsTests.cs
@@ -0,0 +1,147 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System;
+using NSubstitute.Core;
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.Model
+{
+    [TestFixture]
+    public class NotificationRecipientsTests
+    {
+        [Test]
+        public void NotificationRecipientsBuildsQuery1()
+        {
+            var query = new NotificationRecipients()
+                .AddDeviceWithName("d")
+                .AddGroupWithPath("p")
+                .AddUserWithName("u")
+                .BuildQuery();
+
+            Assert.AreEqual("/groups/p/users/u/devices/d/notifications", query);
+        }
+
+        [Test]
+        public void NotificationRecipientsBuildsQuery2()
+        {
+            var query = new NotificationRecipients()
+                .AddDeviceWithName("d")
+                .AddGroupWithPath("p")
+                .AddUserWithUuid("u")
+                .BuildQuery();
+
+            Assert.AreEqual("/groups/p/users/u/devices/d/notifications", query);
+        }
+
+        [Test]
+        public void NotificationRecipientsBuildsQuery3()
+        {
+            var query = new NotificationRecipients()
+                .AddDeviceWithQuery("d")
+                .AddGroupWithQuery("p")
+                .AddUserWithQuery("u")
+                .BuildQuery();
+
+            Assert.AreEqual("/groups;ql=p/users;ql=u/devices;ql=d/notifications", query);
+        }
+        [Test]
+        public void NotificationRecipientsBuildsQuery4()
+        {
+            var query = new NotificationRecipients()
+                .AddDeviceWithQuery(string.Empty)
+                .AddGroupWithQuery(string.Empty)
+                .AddUserWithQuery(string.Empty)
+                .BuildQuery();
+
+            Assert.AreEqual("/groups;ql=/users;ql=/devices;ql=/notifications", query);
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "User name and uuid can not be added at the same time.")]
+        public void UserNameAndUuidCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddUserWithName("u")
+                .AddUserWithUuid("i");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "User name and uuid can not be added at the same time.")]
+        public void UserUuidAndNameCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddUserWithUuid("i")
+                .AddUserWithName("u");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "User query can not be added together with user name or uuid.")]
+        public void UserUuidAndQueryCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddUserWithUuid("i")
+                .AddUserWithQuery("u");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "User query can not be added together with user name or uuid.")]
+        public void UserNameAndQueryCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddUserWithName("i")
+                .AddUserWithQuery("u");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Group path and query can not be added at the same time.")]
+        public void GroupPathAndQueryCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddGroupWithPath("u")
+                .AddGroupWithQuery("i");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Group path and query can not be added at the same time.")]
+        public void GroupQueryAndPathCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddGroupWithQuery("i")
+                .AddGroupWithPath("u");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Device name and query can not be added at the same time.")]
+        public void DeviceQueryAndNameCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddDeviceWithQuery("i")
+                .AddDeviceWithName("u");
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Device name and query can not be added at the same time.")]
+        public void DeviceNameAndQueryCannotBeAddedAtTheSameTime()
+        {
+            new NotificationRecipients()
+                .AddDeviceWithName("i")
+                .AddDeviceWithQuery("u");
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Model/NotificationTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Model/NotificationTests.cs b/Usergrid.Sdk.Tests/Model/NotificationTests.cs
new file mode 100644
index 0000000..2bea74c
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Model/NotificationTests.cs
@@ -0,0 +1,55 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using NUnit.Framework;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk.Tests.Model
+{
+    [TestFixture]
+    public class NotificationTests
+    {
+        [Test]
+        public void AndroidNotificationShouldReturnCorrectPayload()
+        {
+            var notification = new AndroidNotification("notifierName", "notification message");
+            var payload = notification.GetPayload();
+
+            Assert.AreEqual("notification message", payload.GetReflectedProperty("data"));
+        }
+
+        [Test]
+        public void GoogleNotificationShouldReturnCorrectPayloadWithSound()
+        {
+            var notification = new AppleNotification("notifierName", "notification message", "chime");
+            var payload = notification.GetPayload();
+
+            var aps = payload.GetReflectedProperty("aps");
+            Assert.IsNotNull(aps);
+            Assert.AreEqual("notification message", aps.GetReflectedProperty("alert"));
+            Assert.AreEqual("chime", aps.GetReflectedProperty("sound"));
+        }
+
+        [Test]
+        public void GoogleNotificationShouldReturnCorrectPayloadWithoutSound()
+        {
+            var notification = new AppleNotification("notifierName", "notification message");
+            var payload = notification.GetPayload();
+
+            Assert.AreEqual("notification message", payload);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/NotificationsManagerTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/NotificationsManagerTests.cs b/Usergrid.Sdk.Tests/NotificationsManagerTests.cs
new file mode 100644
index 0000000..ae5135a
--- /dev/null
+++ b/Usergrid.Sdk.Tests/NotificationsManagerTests.cs
@@ -0,0 +1,118 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+
+namespace Usergrid.Sdk.Tests
+{
+    [TestFixture]
+    public class NotificationsManagerTests
+    {
+        private IUsergridRequest _request;
+        private NotificationsManager _notificationsManager;
+
+        [SetUp]
+        public void Setup()
+        {
+            _request = Substitute.For<IUsergridRequest>();
+            _notificationsManager = new NotificationsManager(_request);
+        }
+
+
+        [Test]
+        public void CreateNotifierForAppleExecutesMultipartFormDataRequestWithCorrectParameters()
+        {
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+            _request.ExecuteMultipartFormDataRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<IDictionary<string, object>>(), Arg.Any<IDictionary<string, string>>())
+                .Returns(restResponse);
+
+            _notificationsManager.CreateNotifierForApple("notifierName", "development", @"C:\filePath");
+
+            _request.Received(1).ExecuteMultipartFormDataRequest(
+                "/notifiers",
+                Method.POST,
+                Arg.Is<IDictionary<string, object>>(d => (string) d["name"] == "notifierName" && (string) d["provider"] == "apple" && (string) d["environment"] == "development"),
+                Arg.Is<IDictionary<string, string>>(d => d["p12Certificate"] == @"C:\filePath"));
+        }
+
+        [Test]
+        public void CreateNotifierForAndroidExecutesMultipartFormDataRequestWithCorrectParameters()
+        {
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+            _request.ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            _notificationsManager.CreateNotifierForAndroid("notifierName", "apiKey");
+
+            _request.Received(1).ExecuteJsonRequest(
+                "/notifiers",
+                Method.POST,
+                Arg.Is<AndroidNotifierPayload>(p => p.ApiKey == "apiKey" && p.Name == "notifierName" && p.Provider == "google"));
+        }
+
+        [Test]
+        public void PublishNotificationPostsByBuildingQueryAndPayload()
+        {
+            IRestResponse restResponse = Helpers.SetUpRestResponse(HttpStatusCode.OK);
+            _request.ExecuteJsonRequest(Arg.Any<string>(), Arg.Any<Method>(), Arg.Any<object>())
+                .Returns(restResponse);
+
+            var recipients = Substitute.For<INotificationRecipients>();
+            recipients.BuildQuery().Returns("query");
+
+            var appleNotification = new AppleNotification("appleNotifierName", "appleTestMessge", "chime");
+            var googleNotification = new AndroidNotification("googleNotifierName", "androidTestMessage");
+
+            var deliverAt = DateTime.Now.AddDays(1);
+            var expireAt = DateTime.Now.AddDays(2);
+
+            var schedulerSettings = new NotificationSchedulerSettings {DeliverAt = deliverAt, ExpireAt = expireAt};
+
+            //call PublishNotification
+            _notificationsManager.PublishNotification(new Notification[] {appleNotification, googleNotification}, recipients, schedulerSettings);
+
+            //assert
+            recipients.Received(1).BuildQuery();
+
+            Func<NotificationPayload, bool> validatePayload = p =>
+                                                                  {
+                                                                      bool isValid = true;
+                                                                      isValid &= p.DeliverAt == deliverAt.ToUnixTime();
+                                                                      isValid &= p.ExpireAt == expireAt.ToUnixTime();
+
+                                                                      var applePayload = p.Payloads["appleNotifierName"].GetReflectedProperty("aps");
+                                                                      isValid &= (string) applePayload.GetReflectedProperty("alert") == "appleTestMessge";
+                                                                      isValid &= (string) applePayload.GetReflectedProperty("sound") == "chime";
+
+                                                                      var googlePayload = p.Payloads["googleNotifierName"].GetReflectedProperty("data");
+                                                                      isValid &= (string) googlePayload == "androidTestMessage";
+
+                                                                      return isValid;
+                                                                  };
+            _request.Received(1).ExecuteJsonRequest("query", Method.POST,
+                                                    Arg.Is<NotificationPayload>(
+                                                        p => validatePayload(p)));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Properties/AssemblyInfo.cs b/Usergrid.Sdk.Tests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..eae3356
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("Usergrid.Sdk.Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Usergrid.Sdk.Tests")]
+[assembly: AssemblyCopyright("Copyright � Microsoft 2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+
+[assembly: Guid("7f12bc68-97ae-41c8-bc55-87ef2ecfb2f7")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("0.1.0.0")]
+
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/Usergrid.Sdk.Tests.csproj
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/Usergrid.Sdk.Tests.csproj b/Usergrid.Sdk.Tests/Usergrid.Sdk.Tests.csproj
new file mode 100644
index 0000000..a3aff04
--- /dev/null
+++ b/Usergrid.Sdk.Tests/Usergrid.Sdk.Tests.csproj
@@ -0,0 +1,110 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9C25CFBA-1F57-4DF3-B0A1-52D1F90F24E6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Usergrid.Sdk.Tests</RootNamespace>
+    <AssemblyName>Usergrid.Sdk.Tests</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <HintPath>..\packages\NUnit.2.6.2\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="NSubstitute">
+      <HintPath>..\packages\NSubstitute.1.6.0.0\lib\NET40\NSubstitute.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>..\packages\RestSharp.104.1\lib\net4\RestSharp.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ClientTests\ConnectionTests.cs" />
+    <Compile Include="ClientTests\ActivityTests.cs" />
+    <Compile Include="ClientTests\FeedTests.cs" />
+    <Compile Include="ClientTests\NotificationTests.cs" />
+    <Compile Include="ClientTests\DeviceTests.cs" />
+    <Compile Include="ClientTests\GroupTests.cs" />
+    <Compile Include="ClientTests\UserTests.cs" />
+    <Compile Include="ClientTests\EntityTests.cs" />
+    <Compile Include="ClientTests\LoginTests.cs" />
+    <Compile Include="ConnectionManagerTests.cs" />
+    <Compile Include="UsergridRequestTests.cs" />
+    <Compile Include="Model\NotificationRecipientsTests.cs" />
+    <Compile Include="Model\NotificationTests.cs" />
+    <Compile Include="NotificationsManagerTests.cs" />
+    <Compile Include="EntityManagerTests.cs" />
+    <Compile Include="Helpers.cs" />
+    <Compile Include="AuthenticationManagerTests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Friend.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Usergrid.Sdk\Usergrid.Sdk.csproj">
+      <Project>{437D108F-528C-4B2A-B399-06CF02DEB08B}</Project>
+      <Name>Usergrid.Sdk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/UsergridRequestTests.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/UsergridRequestTests.cs b/Usergrid.Sdk.Tests/UsergridRequestTests.cs
new file mode 100644
index 0000000..b5fb7f1
--- /dev/null
+++ b/Usergrid.Sdk.Tests/UsergridRequestTests.cs
@@ -0,0 +1,140 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+using System;
+using System.Collections.Generic;
+using NSubstitute;
+using NUnit.Framework;
+using RestSharp;
+using RestSharp.Serializers;
+
+namespace Usergrid.Sdk.Tests
+{
+    [TestFixture]
+    public class UsergridRequestTests
+    {
+        [Test]
+        public void ExecuteJsonRequestAddsAuthorizationHeader()
+        {
+            var restClient = Substitute.For<IRestClient>();
+            var usergridRequest = new UsergridRequest("http://usergrid.com", "org", "app", restClient);
+            usergridRequest.AccessToken = "accessToken";
+
+            usergridRequest.ExecuteJsonRequest("/resource", Method.POST);
+
+
+            Func<RestRequest, bool> ValidateRequest = r => r.Parameters[0].Name == "Authorization" &&
+                                                           (string)r.Parameters[0].Value == "Bearer accessToken" &&
+                                                           r.Parameters[0].Type == ParameterType.HttpHeader &&
+                                                           r.Method == Method.POST;
+            restClient.Received(1).Execute(Arg.Is<RestRequest>(r=>ValidateRequest(r)));
+        }
+
+        [Test]
+        public void GenericExecuteJsonRequestAddsAuthorizationHeader()
+        {
+            var restClient = Substitute.For<IRestClient>();
+            var usergridRequest = new UsergridRequest("http://usergrid.com", "org", "app", restClient);
+            usergridRequest.AccessToken = "accessToken";
+
+            usergridRequest.ExecuteJsonRequest<object>("/resource", Method.POST);
+
+
+            Func<RestRequest, bool> ValidateRequest = r => r.Parameters[0].Name == "Authorization" &&
+                                                           (string)r.Parameters[0].Value == "Bearer accessToken" &&
+                                                           r.Parameters[0].Type == ParameterType.HttpHeader &&
+                                                           r.Method == Method.POST;
+            restClient.Received(1).Execute<object>(Arg.Is<RestRequest>(r=>ValidateRequest(r)));
+        }
+
+        [Test]
+        public void ExecuteJsonRequestAddsBodyAsJsonAndSetsSerializer()
+        {
+            var restClient = Substitute.For<IRestClient>();
+            var body = new {data="test"};
+            var usergridRequest = new UsergridRequest("http://usergrid.com", "org", "app", restClient);
+
+            usergridRequest.ExecuteJsonRequest("/resource", Method.POST, body);
+
+
+            Func<RestRequest, bool> ValidateRequest = r => 
+                (string)r.Parameters[0].Value == "{\"data\":\"test\"}"&& 
+                r.RequestFormat == DataFormat.Json &&
+                r.JsonSerializer is RestSharpJsonSerializer;
+            restClient.Received(1).Execute(Arg.Is<RestRequest>(r => ValidateRequest(r)));
+        }
+
+        [Test]
+        public void GenericExecuteJsonRequestAddsBodyAsJsonAndSetsSerializer()
+        {
+            var restClient = Substitute.For<IRestClient>();
+            var body = new {data="test"};
+            var usergridRequest = new UsergridRequest("http://usergrid.com", "org", "app", restClient);
+
+            usergridRequest.ExecuteJsonRequest<object>("/resource", Method.POST, body);
+
+
+            Func<RestRequest, bool> ValidateRequest = r => 
+                (string)r.Parameters[0].Value == "{\"data\":\"test\"}"&& 
+                r.RequestFormat == DataFormat.Json &&
+                r.JsonSerializer is RestSharpJsonSerializer;
+            restClient.Received(1).Execute<object>(Arg.Is<RestRequest>(r => ValidateRequest(r)));
+        }
+
+        [Test]
+        public void ExecuteMultipartFormDataRequestAddsFormsParametersAndFileParameters()
+        {
+            var restClient = Substitute.For<IRestClient>();
+            var usergridRequest = new UsergridRequest("http://usergrid.com", "org", "app", restClient);
+
+            IDictionary<string, object> formParameters = new Dictionary<string, object>()
+                                                             {
+                                                                 {"param1", "value1"},
+                                                                 {"param2", "value2"}
+                                                             };
+
+            IDictionary<string, string> fileParameters = new Dictionary<string, string>()
+                                                             {
+                                                                 {"fileParam1", "filePath1"}
+                                                             };
+
+            usergridRequest.ExecuteMultipartFormDataRequest("/resource", Method.POST, formParameters, fileParameters);
+
+
+            Func<RestRequest, bool> ValidateRequest = r =>
+                                                          {
+                                                              bool isValid = true;
+                                                              isValid &= r.Parameters[0].Name == "param1";
+                                                              isValid &= (string)r.Parameters[0].Value == "value1";
+                                                              isValid &= r.Parameters[0].Type == ParameterType.GetOrPost;
+
+                                                              isValid &= r.Parameters[1].Name == "param2";
+                                                              isValid &= (string)r.Parameters[1].Value == "value2";
+                                                              isValid &= r.Parameters[1].Type == ParameterType.GetOrPost;
+
+                                                              isValid &= r.Files[0].Name == "fileParam1";
+                                                              isValid &= r.Files[0].FileName == "filePath1";
+
+                                                              return isValid;
+                                                          };
+
+
+            restClient.Received(1).Execute(Arg.Is<RestRequest>(r => ValidateRequest(r)));
+
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk.Tests/packages.config
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk.Tests/packages.config b/Usergrid.Sdk.Tests/packages.config
new file mode 100644
index 0000000..f3b5dc9
--- /dev/null
+++ b/Usergrid.Sdk.Tests/packages.config
@@ -0,0 +1,24 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<packages>
+  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
+  <package id="NSubstitute" version="1.6.0.0" targetFramework="net40" />
+  <package id="NUnit" version="2.6.2" targetFramework="net40" />
+  <package id="RestSharp" version="104.1" targetFramework="net40" />
+</packages>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/Client.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/Client.cs b/Usergrid.Sdk/Client.cs
new file mode 100644
index 0000000..9870c33
--- /dev/null
+++ b/Usergrid.Sdk/Client.cs
@@ -0,0 +1,262 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using System.Net;
+using Newtonsoft.Json;
+using RestSharp;
+using Usergrid.Sdk.Manager;
+using Usergrid.Sdk.Model;
+using Usergrid.Sdk.Payload;
+using AuthenticationManager = Usergrid.Sdk.Manager.AuthenticationManager;
+
+namespace Usergrid.Sdk {
+    public class Client : IClient {
+        private const string UserGridEndPoint = "http://api.usergrid.com";
+        private readonly IUsergridRequest _request;
+
+        private IAuthenticationManager _authenticationManager;
+        private IConnectionManager _connectionManager;
+        private IEntityManager _entityManager;
+        private INotificationsManager _notificationsManager;
+
+        public Client(string organization, string application)
+            : this(organization, application, UserGridEndPoint, new UsergridRequest(UserGridEndPoint, organization, application)) {}
+
+        public Client(string organization, string application, string uri = UserGridEndPoint)
+            : this(organization, application, uri, new UsergridRequest(uri, organization, application)) {}
+
+        internal Client(string organization, string application, string uri = UserGridEndPoint, IUsergridRequest request = null) {
+            _request = request ?? new UsergridRequest(uri, organization, application);
+        }
+
+        internal IAuthenticationManager AuthenticationManager {
+            get { return _authenticationManager ?? (_authenticationManager = new AuthenticationManager(_request)); }
+            set { _authenticationManager = value; }
+        }
+
+        internal IEntityManager EntityManager {
+            get { return _entityManager ?? (_entityManager = new EntityManager(_request)); }
+            set { _entityManager = value; }
+        }
+
+        internal IConnectionManager ConnectionManager {
+            get { return _connectionManager ?? (_connectionManager = new ConnectionManager(_request)); }
+            set { _connectionManager = value; }
+        }
+
+        internal INotificationsManager NotificationsManager {
+            get { return _notificationsManager ?? (_notificationsManager = new NotificationsManager(_request)); }
+            set { _notificationsManager = value; }
+        }
+
+        public void Login(string loginId, string secret, AuthType authType) {
+            AuthenticationManager.Login(loginId, secret, authType);
+        }
+
+        public T CreateEntity<T>(string collection, T entity) {
+            return EntityManager.CreateEntity(collection, entity);
+        }
+
+        public void DeleteEntity(string collection, string name) {
+            EntityManager.DeleteEntity(collection, name);
+        }
+
+        public void UpdateEntity<T>(string collection, string identifier, T entity) {
+            EntityManager.UpdateEntity(collection, identifier, entity);
+        }
+
+        public T GetEntity<T>(string collectionName, string entityIdentifier) {
+            return EntityManager.GetEntity<T>(collectionName, entityIdentifier);
+        }
+
+        public T GetUser<T>(string identifer /*username or uuid or email*/) where T : UsergridUser {
+            var user = GetEntity<T>("users", identifer);
+            if (user == null)
+                return null;
+
+            return user;
+        }
+
+        public void CreateUser<T>(T user) where T : UsergridUser {
+            CreateEntity("users", user);
+        }
+
+        public void UpdateUser<T>(T user) where T : UsergridUser {
+            UpdateEntity("users", user.UserName, user);
+        }
+
+        public void DeleteUser(string identifer /*username or uuid or email*/) {
+            DeleteEntity("users", identifer);
+        }
+
+        public void ChangePassword(string identifer /*username or uuid or email*/, string oldPassword, string newPassword) {
+            AuthenticationManager.ChangePassword(identifer, oldPassword, newPassword);
+        }
+
+        public void CreateGroup<T>(T group) where T : UsergridGroup {
+            CreateEntity("groups", group);
+        }
+
+        public void DeleteGroup(string path) {
+            DeleteEntity("groups", path);
+        }
+
+        public T GetGroup<T>(string identifer /*uuid or path*/) where T : UsergridGroup {
+            var usergridGroup = EntityManager.GetEntity<T>("groups", identifer);
+            if (usergridGroup == null)
+                return null;
+
+            return usergridGroup;
+        }
+
+        public void UpdateGroup<T>(T group) where T : UsergridGroup {
+            UpdateEntity("groups", group.Path, group);
+        }
+
+        public void AddUserToGroup(string groupIdentifier, string userName) {
+            EntityManager.CreateEntity<object>(string.Format("/groups/{0}/users/{1}", groupIdentifier, userName), null);
+        }
+
+        public void DeleteUserFromGroup(string groupIdentifier, string userIdentifier) {
+            DeleteEntity("/groups/" + groupIdentifier + "/users", userIdentifier);
+        }
+
+        public IList<T> GetAllUsersInGroup<T>(string groupName) where T : UsergridUser {
+            IRestResponse response = _request.ExecuteJsonRequest(string.Format("/groups/{0}/users", groupName), Method.GET);
+            ValidateResponse(response);
+
+            var responseObject = JsonConvert.DeserializeObject<UsergridGetResponse<T>>(response.Content);
+            return responseObject.Entities;
+        }
+
+        public UsergridCollection<T> GetEntities<T>(string collection, int limit = 10, string query = null) {
+            return EntityManager.GetEntities<T>(collection, limit, query);
+        }
+
+        public UsergridCollection<T> GetNextEntities<T>(string collection, string query = null) {
+            return EntityManager.GetNextEntities<T>(collection, query);
+        }
+
+        public UsergridCollection<T> GetPreviousEntities<T>(string collection, string query = null) {
+            return EntityManager.GetPreviousEntities<T>(collection, query);
+        }
+
+        public void CreateConnection(Connection connection) {
+            ConnectionManager.CreateConnection(connection);
+        }
+        public IList<UsergridEntity> GetConnections(Connection connection) {
+            return ConnectionManager.GetConnections(connection);
+        }
+        public IList<TConnectee> GetConnections<TConnectee>(Connection connection) {
+            return ConnectionManager.GetConnections<TConnectee>(connection);
+        }
+        public void DeleteConnection(Connection connection) {
+            ConnectionManager.DeleteConnection(connection);
+        }
+
+        public void PostActivity<T>(string userIdentifier, T activity) where T : UsergridActivity {
+            string collection = string.Format("/users/{0}/activities", userIdentifier);
+            EntityManager.CreateEntity(collection, activity);
+        }
+
+        public void PostActivityToGroup<T>(string groupIdentifier, T activity) where T : UsergridActivity {
+            string collection = string.Format("/groups/{0}/activities", groupIdentifier);
+            EntityManager.CreateEntity(collection, activity);
+        }
+
+        public void PostActivityToUsersFollowersInGroup<T>(string userIdentifier, string groupIdentifier, T activity) where T : UsergridActivity {
+            string collection = string.Format("/groups/{0}/users/{1}/activities", groupIdentifier, userIdentifier);
+            EntityManager.CreateEntity(collection, activity);
+        }
+
+        public UsergridCollection<T> GetUserActivities<T>(string userIdentifier) where T : UsergridActivity {
+            string collection = string.Format("/users/{0}/activities", userIdentifier);
+            return EntityManager.GetEntities<T>(collection);
+        }
+
+        public UsergridCollection<T> GetGroupActivities<T>(string groupIdentifier) where T : UsergridActivity {
+            string collection = string.Format("/groups/{0}/activities", groupIdentifier);
+            return EntityManager.GetEntities<T>(collection);
+        }
+
+        public T GetDevice<T>(string identifer) where T : UsergridDevice {
+            var device = GetEntity<T>("devices", identifer);
+            if (device == null)
+                return null;
+
+            return device;
+        }
+
+        public void UpdateDevice<T>(T device) where T : UsergridDevice {
+            UpdateEntity("devices", device.Name, device);
+        }
+
+        public void CreateDevice<T>(T device) where T : UsergridDevice {
+            CreateEntity("devices", device);
+        }
+
+        public void DeleteDevice(string identifer) {
+            DeleteEntity("devices", identifer);
+        }
+
+        public void CreateNotifierForApple(string notifierName, string environment, string p12CertificatePath) {
+            NotificationsManager.CreateNotifierForApple(notifierName, environment, p12CertificatePath);
+        }
+
+        public void CreateNotifierForAndroid(string notifierName, string apiKey) {
+            NotificationsManager.CreateNotifierForAndroid(notifierName, apiKey);
+        }
+
+        public T GetNotifier<T>(string identifer /*uuid or notifier name*/) where T : UsergridNotifier {
+            var usergridNotifier = EntityManager.GetEntity<T>("/notifiers", identifer);
+            if (usergridNotifier == null)
+                return null;
+
+            return usergridNotifier;
+        }
+
+        public void DeleteNotifier(string notifierName) {
+            EntityManager.DeleteEntity("/notifiers", notifierName);
+        }
+
+        public void PublishNotification(IEnumerable<Notification> notifications, INotificationRecipients recipients, NotificationSchedulerSettings schedulerSettings = null) {
+            NotificationsManager.PublishNotification(notifications, recipients, schedulerSettings);
+        }
+
+        public void CancelNotification(string notificationIdentifier) {
+            EntityManager.UpdateEntity("/notifications", notificationIdentifier, new CancelNotificationPayload {Canceled = true});
+        }
+
+        //TODO: IList?
+        public UsergridCollection<T> GetUserFeed<T>(string userIdentifier) where T : UsergridActivity {
+            string collection = string.Format("/users/{0}/feed", userIdentifier);
+            return EntityManager.GetEntities<T>(collection);
+        }
+
+        public UsergridCollection<T> GetGroupFeed<T>(string groupIdentifier) where T : UsergridActivity {
+            string collection = string.Format("/groups/{0}/feed", groupIdentifier);
+            return EntityManager.GetEntities<T>(collection);
+        }
+
+
+        private static void ValidateResponse(IRestResponse response) {
+            if (response.StatusCode != HttpStatusCode.OK) {
+                var userGridError = JsonConvert.DeserializeObject<UsergridError>(response.Content);
+                throw new UsergridException(userGridError);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/IClient.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/IClient.cs b/Usergrid.Sdk/IClient.cs
new file mode 100644
index 0000000..b2fa827
--- /dev/null
+++ b/Usergrid.Sdk/IClient.cs
@@ -0,0 +1,73 @@
+\ufeff// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using Usergrid.Sdk.Model;
+
+namespace Usergrid.Sdk
+{
+    public interface IClient
+    {
+        void Login(string loginId, string secret, AuthType authType);
+        T CreateEntity<T>(string collection, T entity);
+        void DeleteEntity(string collection, string name);
+        void UpdateEntity<T>(string collection, string identifier, T entity);
+        T GetEntity<T>(string collectionName, string identifer);
+        
+        T GetUser<T>(string identifer /*username or uuid or email*/) where T : UsergridUser;
+        void CreateUser<T>(T user) where T : UsergridUser;
+        void UpdateUser<T>(T user) where T : UsergridUser;
+        void DeleteUser(string identifer /*username or uuid or email*/);
+        void ChangePassword(string identifer /*username or uuid or email*/, string oldPassword, string newPassword);
+        void CreateGroup<T>(T group) where T : UsergridGroup;
+        void DeleteGroup(string path);
+        T GetGroup<T>(string identifer /*uuid or path*/) where T : UsergridGroup;
+        void UpdateGroup<T>(T group) where T : UsergridGroup;
+        void AddUserToGroup(string groupIdentifier, string userName);
+        void DeleteUserFromGroup(string groupIdentifier, string userIdentifier);
+        IList<T> GetAllUsersInGroup<T>(string groupName) where T : UsergridUser;
+        
+        UsergridCollection<T> GetEntities<T>(string collection, int limit = 10, string query = null);
+        UsergridCollection<T> GetNextEntities<T>(string collection, string query = null);
+        UsergridCollection<T> GetPreviousEntities<T>(string collection, string query = null);
+
+        void CreateConnection(Connection connection);
+        IList<UsergridEntity> GetConnections(Connection connection);
+        IList<TConnectee> GetConnections<TConnectee>(Connection connection);
+        void DeleteConnection(Connection connection);
+        
+        void PostActivity<T>(string userIdentifier, T activity) where T:UsergridActivity;
+        void PostActivityToGroup<T>(string groupIdentifier, T activity) where T:UsergridActivity;
+        void PostActivityToUsersFollowersInGroup<T>(string userIdentifier, string groupIdentifier, T activity) where T:UsergridActivity;
+        UsergridCollection<T> GetUserActivities<T>(string userIdentifier) where T:UsergridActivity;
+        UsergridCollection<T> GetGroupActivities<T>(string groupIdentifier) where T:UsergridActivity;
+        UsergridCollection<T> GetUserFeed<T>(string userIdentifier) where T : UsergridActivity;
+        UsergridCollection<T> GetGroupFeed<T>(string groupIdentifier) where T : UsergridActivity;
+
+
+        void CreateNotifierForApple(string notifierName, string environment, string p12CertificatePath);
+        void CreateNotifierForAndroid(string notifierName, string apiKey);
+        T GetNotifier<T>(string identifer/*uuid or notifier name*/) where T : UsergridNotifier;
+        void DeleteNotifier(string notifierName);
+        
+        
+        T GetDevice<T>(string identifer) where T : UsergridDevice;
+        void UpdateDevice<T>(T device) where T : UsergridDevice;
+        void CreateDevice<T>(T device) where T : UsergridDevice;
+        void DeleteDevice(string identifer);
+        void PublishNotification (IEnumerable<Notification> notifications, INotificationRecipients recipients, NotificationSchedulerSettings schedulerSettings = null );
+        void CancelNotification(string notificationIdentifier);
+    }
+}

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/Usergrid.Sdk/IUsergridRequest.cs
----------------------------------------------------------------------
diff --git a/Usergrid.Sdk/IUsergridRequest.cs b/Usergrid.Sdk/IUsergridRequest.cs
new file mode 100644
index 0000000..66842b1
--- /dev/null
+++ b/Usergrid.Sdk/IUsergridRequest.cs
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System.Collections.Generic;
+using RestSharp;
+
+namespace Usergrid.Sdk
+{
+    public interface IUsergridRequest
+    {
+        IRestResponse<T> ExecuteJsonRequest<T>(string resource, Method method, object body = null) where T : new();
+        IRestResponse ExecuteJsonRequest(string resource, Method method, object body = null);
+        IRestResponse ExecuteMultipartFormDataRequest(string resource, Method method, IDictionary<string, object> formParameters, IDictionary<string, string> fileParameters);
+        string AccessToken { get; set; }
+    }
+}


[03/10] usergrid-dotnet git commit: Initial commit of Usergrid .NET SDK into its own rep

Posted by mr...@apache.org.
http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp.sln
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp.sln b/samples/loginAndCollectionSample/BooksApp.sln
new file mode 100644
index 0000000..bf735fa
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp.sln
@@ -0,0 +1,36 @@
+\ufeff# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.20827.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "BooksApp", "BooksApp2\BooksApp.vbproj", "{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/AddBook.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/AddBook.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/AddBook.Designer.vb
new file mode 100644
index 0000000..62e6e95
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/AddBook.Designer.vb
@@ -0,0 +1,109 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class AddBookForm
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.Label1 = New System.Windows.Forms.Label()
+        Me.title = New System.Windows.Forms.TextBox()
+        Me.Label2 = New System.Windows.Forms.Label()
+        Me.author = New System.Windows.Forms.TextBox()
+        Me.btnSave = New System.Windows.Forms.Button()
+        Me.SuspendLayout()
+        '
+        'Label1
+        '
+        Me.Label1.AutoSize = True
+        Me.Label1.Location = New System.Drawing.Point(13, 50)
+        Me.Label1.Name = "Label1"
+        Me.Label1.Size = New System.Drawing.Size(55, 13)
+        Me.Label1.TabIndex = 0
+        Me.Label1.Text = "Book Title"
+        '
+        'title
+        '
+        Me.title.Location = New System.Drawing.Point(82, 47)
+        Me.title.Name = "title"
+        Me.title.Size = New System.Drawing.Size(160, 20)
+        Me.title.TabIndex = 1
+        '
+        'Label2
+        '
+        Me.Label2.AutoSize = True
+        Me.Label2.Location = New System.Drawing.Point(13, 87)
+        Me.Label2.Name = "Label2"
+        Me.Label2.Size = New System.Drawing.Size(38, 13)
+        Me.Label2.TabIndex = 2
+        Me.Label2.Text = "Author"
+        '
+        'author
+        '
+        Me.author.Location = New System.Drawing.Point(82, 79)
+        Me.author.Name = "author"
+        Me.author.Size = New System.Drawing.Size(160, 20)
+        Me.author.TabIndex = 3
+        '
+        'btnSave
+        '
+        Me.btnSave.Location = New System.Drawing.Point(82, 165)
+        Me.btnSave.Name = "btnSave"
+        Me.btnSave.Size = New System.Drawing.Size(75, 23)
+        Me.btnSave.TabIndex = 4
+        Me.btnSave.Text = "Save"
+        Me.btnSave.UseVisualStyleBackColor = True
+        '
+        'AddBookForm
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(284, 262)
+        Me.Controls.Add(Me.btnSave)
+        Me.Controls.Add(Me.author)
+        Me.Controls.Add(Me.Label2)
+        Me.Controls.Add(Me.title)
+        Me.Controls.Add(Me.Label1)
+        Me.Name = "AddBookForm"
+        Me.Text = "Add a Book"
+        Me.ResumeLayout(False)
+        Me.PerformLayout()
+
+    End Sub
+    Friend WithEvents Label1 As System.Windows.Forms.Label
+    Friend WithEvents title As System.Windows.Forms.TextBox
+    Friend WithEvents Label2 As System.Windows.Forms.Label
+    Friend WithEvents author As System.Windows.Forms.TextBox
+    Friend WithEvents btnSave As System.Windows.Forms.Button
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/AddBook.resx
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/AddBook.resx b/samples/loginAndCollectionSample/BooksApp2/AddBook.resx
new file mode 100644
index 0000000..1e7ba63
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/AddBook.resx
@@ -0,0 +1,136 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/AddBook.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/AddBook.vb b/samples/loginAndCollectionSample/BooksApp2/AddBook.vb
new file mode 100644
index 0000000..935e457
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/AddBook.vb
@@ -0,0 +1,33 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+
+Public Class AddBookForm
+
+    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
+        Dim b As Book
+        b = New Book
+        b.title = title.Text
+        b.author = author.Text
+        Settings.client.CreateEntity(Of Book)("books", b)
+        MainWindow.updateBooks()
+        Me.Close()
+    End Sub
+
+    Private Sub AddBookForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+
+    End Sub
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/App.config
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/App.config b/samples/loginAndCollectionSample/BooksApp2/App.config
new file mode 100644
index 0000000..84651f3
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/App.config
@@ -0,0 +1,23 @@
+\ufeff<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<configuration>
+    <startup>
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/Book.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/Book.vb b/samples/loginAndCollectionSample/BooksApp2/Book.vb
new file mode 100644
index 0000000..8f3243a
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/Book.vb
@@ -0,0 +1,21 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Public Class Book
+    Public title As String
+    Public author As String
+    Public uuid As String
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/BooksApp.vbproj
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/BooksApp.vbproj b/samples/loginAndCollectionSample/BooksApp2/BooksApp.vbproj
new file mode 100644
index 0000000..4ca3298
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/BooksApp.vbproj
@@ -0,0 +1,174 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{A5DC2266-0FAA-4267-967B-CB9E1A239AC8}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <StartupObject>BooksApp.My.MyApplication</StartupObject>
+    <RootNamespace>BooksApp</RootNamespace>
+    <AssemblyName>BooksApp</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>WindowsForms</MyType>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>BooksApp.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>BooksApp.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>\\vmware-host\Shared Folders\Desktop\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="RestSharp">
+      <HintPath>\\vmware-host\Shared Folders\Desktop\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\RestSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Messaging" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Usergrid.Sdk">
+      <HintPath>\\vmware-host\Shared Folders\Desktop\GitHub\usergrid-.net-sdk\Usergrid.Sdk\bin\Debug\Usergrid.Sdk.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Drawing" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Windows.Forms" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddBook.Designer.vb">
+      <DependentUpon>AddBook.vb</DependentUpon>
+    </Compile>
+    <Compile Include="AddBook.vb">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Book.vb" />
+    <Compile Include="MainWindow.Designer.vb">
+      <DependentUpon>MainWindow.vb</DependentUpon>
+    </Compile>
+    <Compile Include="MainWindow.vb">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Settings.vb" />
+    <Compile Include="SettingsForm.Designer.vb">
+      <DependentUpon>SettingsForm.vb</DependentUpon>
+    </Compile>
+    <Compile Include="SettingsForm.vb">
+      <SubType>Form</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AddBook.resx">
+      <DependentUpon>AddBook.vb</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainWindow.resx">
+      <DependentUpon>MainWindow.vb</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsForm.resx">
+      <DependentUpon>SettingsForm.vb</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/MainWindow.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/MainWindow.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/MainWindow.Designer.vb
new file mode 100644
index 0000000..034849e
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/MainWindow.Designer.vb
@@ -0,0 +1,147 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class MainWindow
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.booksGrid = New System.Windows.Forms.DataGridView()
+        Me.btnRetrieveBooks = New System.Windows.Forms.Button()
+        Me.btnSettings = New System.Windows.Forms.Button()
+        Me.btnAddABook = New System.Windows.Forms.Button()
+        Me.btnDeleteABook = New System.Windows.Forms.Button()
+        Me.title = New System.Windows.Forms.DataGridViewTextBoxColumn()
+        Me.author = New System.Windows.Forms.DataGridViewTextBoxColumn()
+        Me.uuid = New System.Windows.Forms.DataGridViewTextBoxColumn()
+        CType(Me.booksGrid, System.ComponentModel.ISupportInitialize).BeginInit()
+        Me.SuspendLayout()
+        '
+        'booksGrid
+        '
+        Me.booksGrid.AllowUserToAddRows = False
+        Me.booksGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
+        Me.booksGrid.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.title, Me.author, Me.uuid})
+        Me.booksGrid.Location = New System.Drawing.Point(40, 32)
+        Me.booksGrid.Margin = New System.Windows.Forms.Padding(4)
+        Me.booksGrid.Name = "booksGrid"
+        Me.booksGrid.Size = New System.Drawing.Size(467, 401)
+        Me.booksGrid.TabIndex = 0
+        '
+        'btnRetrieveBooks
+        '
+        Me.btnRetrieveBooks.Location = New System.Drawing.Point(40, 471)
+        Me.btnRetrieveBooks.Margin = New System.Windows.Forms.Padding(4)
+        Me.btnRetrieveBooks.Name = "btnRetrieveBooks"
+        Me.btnRetrieveBooks.Size = New System.Drawing.Size(129, 28)
+        Me.btnRetrieveBooks.TabIndex = 1
+        Me.btnRetrieveBooks.Text = "Retrieve Books"
+        Me.btnRetrieveBooks.UseVisualStyleBackColor = True
+        '
+        'btnSettings
+        '
+        Me.btnSettings.Location = New System.Drawing.Point(407, 471)
+        Me.btnSettings.Margin = New System.Windows.Forms.Padding(4)
+        Me.btnSettings.Name = "btnSettings"
+        Me.btnSettings.Size = New System.Drawing.Size(100, 28)
+        Me.btnSettings.TabIndex = 2
+        Me.btnSettings.Text = "Settings"
+        Me.btnSettings.UseVisualStyleBackColor = True
+        '
+        'btnAddABook
+        '
+        Me.btnAddABook.Location = New System.Drawing.Point(191, 471)
+        Me.btnAddABook.Margin = New System.Windows.Forms.Padding(4)
+        Me.btnAddABook.Name = "btnAddABook"
+        Me.btnAddABook.Size = New System.Drawing.Size(100, 28)
+        Me.btnAddABook.TabIndex = 3
+        Me.btnAddABook.Text = "Add A Book"
+        Me.btnAddABook.UseVisualStyleBackColor = True
+        '
+        'btnDeleteABook
+        '
+        Me.btnDeleteABook.Location = New System.Drawing.Point(299, 471)
+        Me.btnDeleteABook.Margin = New System.Windows.Forms.Padding(4)
+        Me.btnDeleteABook.Name = "btnDeleteABook"
+        Me.btnDeleteABook.Size = New System.Drawing.Size(100, 28)
+        Me.btnDeleteABook.TabIndex = 4
+        Me.btnDeleteABook.Text = "Delete Book"
+        Me.btnDeleteABook.UseVisualStyleBackColor = True
+        '
+        'title
+        '
+        Me.title.HeaderText = "Title"
+        Me.title.Name = "title"
+        Me.title.Width = 200
+        '
+        'author
+        '
+        Me.author.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill
+        Me.author.HeaderText = "Author"
+        Me.author.Name = "author"
+        '
+        'uuid
+        '
+        Me.uuid.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill
+        Me.uuid.HeaderText = "UUID"
+        Me.uuid.Name = "uuid"
+        Me.uuid.Visible = False
+        '
+        'Form1
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(578, 535)
+        Me.Controls.Add(Me.btnDeleteABook)
+        Me.Controls.Add(Me.btnAddABook)
+        Me.Controls.Add(Me.btnSettings)
+        Me.Controls.Add(Me.btnRetrieveBooks)
+        Me.Controls.Add(Me.booksGrid)
+        Me.Margin = New System.Windows.Forms.Padding(4)
+        Me.Name = "Form1"
+        Me.Text = "Books Demo"
+        CType(Me.booksGrid, System.ComponentModel.ISupportInitialize).EndInit()
+        Me.ResumeLayout(False)
+
+    End Sub
+    Friend WithEvents booksGrid As System.Windows.Forms.DataGridView
+    Friend WithEvents btnRetrieveBooks As System.Windows.Forms.Button
+    Friend WithEvents btnSettings As System.Windows.Forms.Button
+    Friend WithEvents btnAddABook As System.Windows.Forms.Button
+    Friend WithEvents btnDeleteABook As System.Windows.Forms.Button
+    Friend WithEvents title As System.Windows.Forms.DataGridViewTextBoxColumn
+    Friend WithEvents author As System.Windows.Forms.DataGridViewTextBoxColumn
+    Friend WithEvents uuid As System.Windows.Forms.DataGridViewTextBoxColumn
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/MainWindow.resx
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/MainWindow.resx b/samples/loginAndCollectionSample/BooksApp2/MainWindow.resx
new file mode 100644
index 0000000..d8973e5
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/MainWindow.resx
@@ -0,0 +1,146 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="title.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="author.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="uuid.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/MainWindow.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/MainWindow.vb b/samples/loginAndCollectionSample/BooksApp2/MainWindow.vb
new file mode 100644
index 0000000..3aa34d4
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/MainWindow.vb
@@ -0,0 +1,70 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+
+Public Class MainWindow
+
+    Private Sub MainWindow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+
+    End Sub
+    Public Sub clearBooks()
+        booksGrid.Rows.Clear()
+    End Sub
+    Public Sub updateBooks()
+        'Clear the current list of books
+        clearBooks()
+
+        'Look for the books
+        Dim books As UsergridCollection(Of Book)
+        Dim book As Book
+        books = Settings.client.GetEntities(Of Book)("books", 10)
+        Do
+            Dim i As Integer = 0
+            While i < books.Count
+                book = books(i)
+                booksGrid.Rows.Add(book.title, book.author, book.uuid)
+                i = i + 1
+            End While
+            books = Settings.client.GetNextEntities(Of Book)("books")
+        Loop While books.Count > 0
+    End Sub
+
+    Private Sub btnRetrieveBooks_Click(sender As Object, e As EventArgs) Handles btnRetrieveBooks.Click
+        booksGrid.Rows.Clear()
+        updateBooks()
+    End Sub
+
+    Private Sub btnSettings_Click(sender As Object, e As EventArgs) Handles btnSettings.Click
+        SettingsForm.Show()
+    End Sub
+
+
+    Private Sub btnAddBook_Click(sender As Object, e As EventArgs) Handles btnAddABook.Click
+        AddBookForm.Show()
+    End Sub
+
+    Private Sub btnDeleteABook_Click(sender As Object, e As EventArgs) Handles btnDeleteABook.Click
+        Dim i As Integer
+        Dim uuid As String
+        i = booksGrid.CurrentRow.Index
+        uuid = booksGrid.Item(2, i).Value
+        Settings.client.DeleteEntity("books", uuid)
+        booksGrid.Rows.RemoveAt(i)
+        clearBooks()
+        updateBooks()
+    End Sub
+
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Application.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Application.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/My Project/Application.Designer.vb
new file mode 100644
index 0000000..17da912
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Application.Designer.vb	
@@ -0,0 +1,53 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+    
+    'NOTE: This file is auto-generated; do not modify it directly.  To make changes,
+    ' or if you encounter build errors in this file, go to the Project Designer
+    ' (go to Project Properties or double-click the My Project node in
+    ' Solution Explorer), and make changes on the Application tab.
+    '
+    Partial Friend Class MyApplication
+        
+        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
+        Public Sub New()
+            MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
+            Me.IsSingleInstance = false
+            Me.EnableVisualStyles = true
+            Me.SaveMySettingsOnExit = true
+            Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
+        End Sub
+        
+        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
+        Protected Overrides Sub OnCreateMainForm()
+            Me.MainForm = Global.BooksApp.MainWindow
+        End Sub
+    End Class
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Application.myapp
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Application.myapp b/samples/loginAndCollectionSample/BooksApp2/My Project/Application.myapp
new file mode 100644
index 0000000..6c21bb5
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Application.myapp	
@@ -0,0 +1,27 @@
+\ufeff<?xml version="1.0" encoding="utf-16"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>true</MySubMain>
+  <MainForm>MainWindow</MainForm>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/AssemblyInfo.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/AssemblyInfo.vb b/samples/loginAndCollectionSample/BooksApp2/My Project/AssemblyInfo.vb
new file mode 100644
index 0000000..0a96883
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/AssemblyInfo.vb	
@@ -0,0 +1,50 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following 
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("BooksApp2")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("BooksApp2")> 
+<Assembly: AssemblyCopyright("Copyright �  2013")> 
+<Assembly: AssemblyTrademark("")> 
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("423c19b0-9a48-4e9a-a044-e89c12ecbecf")> 
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version 
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers 
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")> 
+
+<Assembly: AssemblyVersion("1.0.0.0")> 
+<Assembly: AssemblyFileVersion("1.0.0.0")> 

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.Designer.vb
new file mode 100644
index 0000000..d3710bb
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.Designer.vb	
@@ -0,0 +1,78 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("BooksApp.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.resx
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.resx b/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.resx
new file mode 100644
index 0000000..098d9b6
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Resources.resx	
@@ -0,0 +1,134 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.Designer.vb
new file mode 100644
index 0000000..0d22375
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.Designer.vb	
@@ -0,0 +1,88 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.18331
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                If Not addedHandler Then
+                    SyncLock addedHandlerLockObject
+                        If Not addedHandler Then
+                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                            addedHandler = True
+                        End If
+                    End SyncLock
+                End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.BooksApp.My.MySettings
+            Get
+                Return Global.BooksApp.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.settings
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.settings b/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.settings
new file mode 100644
index 0000000..9c270f1
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/My Project/Settings.settings	
@@ -0,0 +1,24 @@
+\ufeff<?xml version='1.0' encoding='utf-8'?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/Settings.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/Settings.vb b/samples/loginAndCollectionSample/BooksApp2/Settings.vb
new file mode 100644
index 0000000..91aa3e2
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/Settings.vb
@@ -0,0 +1,22 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Public Class Settings
+    Public Shared userName As String
+    Public Shared password As String
+    Public Shared org As String
+    Public Shared app As String
+    Public Shared client As Usergrid.Sdk.Client
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/SettingsForm.Designer.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/SettingsForm.Designer.vb b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.Designer.vb
new file mode 100644
index 0000000..aab8e4b
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.Designer.vb
@@ -0,0 +1,164 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
+Partial Class SettingsForm
+    Inherits System.Windows.Forms.Form
+
+    'Form overrides dispose to clean up the component list.
+    <System.Diagnostics.DebuggerNonUserCode()> _
+    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+        Try
+            If disposing AndAlso components IsNot Nothing Then
+                components.Dispose()
+            End If
+        Finally
+            MyBase.Dispose(disposing)
+        End Try
+    End Sub
+
+    'Required by the Windows Form Designer
+    Private components As System.ComponentModel.IContainer
+
+    'NOTE: The following procedure is required by the Windows Form Designer
+    'It can be modified using the Windows Form Designer.  
+    'Do not modify it using the code editor.
+    <System.Diagnostics.DebuggerStepThrough()> _
+    Private Sub InitializeComponent()
+        Me.Label1 = New System.Windows.Forms.Label()
+        Me.userName = New System.Windows.Forms.TextBox()
+        Me.Label2 = New System.Windows.Forms.Label()
+        Me.password = New System.Windows.Forms.MaskedTextBox()
+        Me.Label3 = New System.Windows.Forms.Label()
+        Me.org = New System.Windows.Forms.TextBox()
+        Me.Label4 = New System.Windows.Forms.Label()
+        Me.app = New System.Windows.Forms.TextBox()
+        Me.btnSave = New System.Windows.Forms.Button()
+        Me.SuspendLayout()
+        '
+        'Label1
+        '
+        Me.Label1.AutoSize = True
+        Me.Label1.Location = New System.Drawing.Point(33, 44)
+        Me.Label1.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0)
+        Me.Label1.Name = "Label1"
+        Me.Label1.Size = New System.Drawing.Size(79, 17)
+        Me.Label1.TabIndex = 0
+        Me.Label1.Text = "User Name"
+        '
+        'userName
+        '
+        Me.userName.Location = New System.Drawing.Point(121, 41)
+        Me.userName.Margin = New System.Windows.Forms.Padding(4)
+        Me.userName.Name = "userName"
+        Me.userName.Size = New System.Drawing.Size(179, 22)
+        Me.userName.TabIndex = 1
+        '
+        'Label2
+        '
+        Me.Label2.AutoSize = True
+        Me.Label2.Location = New System.Drawing.Point(37, 92)
+        Me.Label2.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0)
+        Me.Label2.Name = "Label2"
+        Me.Label2.Size = New System.Drawing.Size(69, 17)
+        Me.Label2.TabIndex = 2
+        Me.Label2.Text = "Password"
+        '
+        'password
+        '
+        Me.password.Location = New System.Drawing.Point(121, 92)
+        Me.password.Margin = New System.Windows.Forms.Padding(4)
+        Me.password.Name = "password"
+        Me.password.PasswordChar = Global.Microsoft.VisualBasic.ChrW(46)
+        Me.password.Size = New System.Drawing.Size(179, 22)
+        Me.password.TabIndex = 3
+        '
+        'Label3
+        '
+        Me.Label3.AutoSize = True
+        Me.Label3.Location = New System.Drawing.Point(37, 134)
+        Me.Label3.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0)
+        Me.Label3.Name = "Label3"
+        Me.Label3.Size = New System.Drawing.Size(32, 17)
+        Me.Label3.TabIndex = 4
+        Me.Label3.Text = "Org"
+        '
+        'org
+        '
+        Me.org.Location = New System.Drawing.Point(121, 134)
+        Me.org.Margin = New System.Windows.Forms.Padding(4)
+        Me.org.Name = "org"
+        Me.org.Size = New System.Drawing.Size(179, 22)
+        Me.org.TabIndex = 5
+        '
+        'Label4
+        '
+        Me.Label4.AutoSize = True
+        Me.Label4.Location = New System.Drawing.Point(37, 177)
+        Me.Label4.Margin = New System.Windows.Forms.Padding(4, 0, 4, 0)
+        Me.Label4.Name = "Label4"
+        Me.Label4.Size = New System.Drawing.Size(33, 17)
+        Me.Label4.TabIndex = 6
+        Me.Label4.Text = "App"
+        '
+        'app
+        '
+        Me.app.Location = New System.Drawing.Point(121, 177)
+        Me.app.Margin = New System.Windows.Forms.Padding(4)
+        Me.app.Name = "app"
+        Me.app.Size = New System.Drawing.Size(179, 22)
+        Me.app.TabIndex = 7
+        '
+        'btnSave
+        '
+        Me.btnSave.Location = New System.Drawing.Point(121, 254)
+        Me.btnSave.Margin = New System.Windows.Forms.Padding(4)
+        Me.btnSave.Name = "btnSave"
+        Me.btnSave.Size = New System.Drawing.Size(121, 28)
+        Me.btnSave.TabIndex = 8
+        Me.btnSave.Text = "Save Settings"
+        Me.btnSave.UseVisualStyleBackColor = True
+        '
+        'SettingsForm
+        '
+        Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
+        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+        Me.ClientSize = New System.Drawing.Size(567, 322)
+        Me.Controls.Add(Me.btnSave)
+        Me.Controls.Add(Me.app)
+        Me.Controls.Add(Me.Label4)
+        Me.Controls.Add(Me.org)
+        Me.Controls.Add(Me.Label3)
+        Me.Controls.Add(Me.password)
+        Me.Controls.Add(Me.Label2)
+        Me.Controls.Add(Me.userName)
+        Me.Controls.Add(Me.Label1)
+        Me.Margin = New System.Windows.Forms.Padding(4)
+        Me.Name = "SettingsForm"
+        Me.Text = "Settings"
+        Me.ResumeLayout(False)
+        Me.PerformLayout()
+
+    End Sub
+    Friend WithEvents Label1 As System.Windows.Forms.Label
+    Friend WithEvents userName As System.Windows.Forms.TextBox
+    Friend WithEvents Label2 As System.Windows.Forms.Label
+    Friend WithEvents password As System.Windows.Forms.MaskedTextBox
+    Friend WithEvents Label3 As System.Windows.Forms.Label
+    Friend WithEvents org As System.Windows.Forms.TextBox
+    Friend WithEvents Label4 As System.Windows.Forms.Label
+    Friend WithEvents app As System.Windows.Forms.TextBox
+    Friend WithEvents btnSave As System.Windows.Forms.Button
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/SettingsForm.resx
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/SettingsForm.resx b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.resx
new file mode 100644
index 0000000..85d1d78
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.resx
@@ -0,0 +1,137 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/BooksApp2/SettingsForm.vb
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/BooksApp2/SettingsForm.vb b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.vb
new file mode 100644
index 0000000..cdafe6e
--- /dev/null
+++ b/samples/loginAndCollectionSample/BooksApp2/SettingsForm.vb
@@ -0,0 +1,44 @@
+\ufeff' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements.  See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License.  You may obtain a copy of the License at
+'
+'     http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+
+Imports Usergrid.Sdk
+
+Public Class SettingsForm
+
+    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
+        Settings.userName = userName.Text
+        Settings.password = password.Text
+        Settings.org = org.Text
+        Settings.app = app.Text
+        Settings.client = New Client(Settings.org, Settings.app)
+        Settings.client.Login(Settings.userName, Settings.password, AuthType.User)
+        Me.Close()
+    End Sub
+
+    Private Sub SettingsForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+        If Settings.userName IsNot Nothing Then
+            userName.Text = Settings.userName
+        End If
+        If Settings.password IsNot Nothing Then
+            password.Text = Settings.password
+        End If
+        If Settings.org IsNot Nothing Then
+            org.Text = Settings.org
+        End If
+        If Settings.app IsNot Nothing Then
+            app.Text = Settings.app
+        End If
+    End Sub
+End Class

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/loginAndCollectionSample/Readme.md
----------------------------------------------------------------------
diff --git a/samples/loginAndCollectionSample/Readme.md b/samples/loginAndCollectionSample/Readme.md
new file mode 100644
index 0000000..c705d8f
--- /dev/null
+++ b/samples/loginAndCollectionSample/Readme.md
@@ -0,0 +1,17 @@
+Books Sample Application
+
+Built with Microsoft Visual Studio 2013, but earlier versions (2010 or later) should work
+
+To run the application:
+
+1. Sign up for free App Services account at www.apigee.com
+2. Log in to App Services Admin Portal
+3. Create a new app
+4. Create a new Collection named "books" in the new app
+5. Create a user that has full permissions to the books collection
+6. Open the BooksApp solution file in Visual Studio
+7. Run the application
+8. Click on the Settings button.  Fill in the resulting dialog with the org, app, and user credentials
+9. Click Retrieve Books to get a list of any existing books
+10. Click Add A Book.  Fill out the resulting dialog to add a new entry
+11. Select an entry and click Delete Book.  The entry will be deleted.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-dotnet/blob/94c0483c/samples/messageeTutorial/Messagee.sln
----------------------------------------------------------------------
diff --git a/samples/messageeTutorial/Messagee.sln b/samples/messageeTutorial/Messagee.sln
new file mode 100644
index 0000000..9bd6896
--- /dev/null
+++ b/samples/messageeTutorial/Messagee.sln
@@ -0,0 +1,36 @@
+\ufeff# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.20827.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Messagee", "Messagee\Messagee.vbproj", "{E8C3967E-11F2-49E8-8818-ABF83F9927B2}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{E8C3967E-11F2-49E8-8818-ABF83F9927B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8C3967E-11F2-49E8-8818-ABF83F9927B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E8C3967E-11F2-49E8-8818-ABF83F9927B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E8C3967E-11F2-49E8-8818-ABF83F9927B2}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal