diff --git a/README.md b/README.md
index 0a475a2..186d9b0 100644
--- a/README.md
+++ b/README.md
@@ -71,11 +71,14 @@ else
 Static Maps API support allows you to get a valid url or a streamed bitmap which you can use:
 
 ```c#
+using Google.Maps;
+using Google.Maps.Common;
+
 //always need to use YOUR_API_KEY for requests.  Do this in App_Start.
 GoogleSigned.AssignAllServices(new GoogleSigned("YOUR_API_KEY"));
 var map = new StaticMapRequest();
 map.Center = new Location("1600 Pennsylvania Ave NW, Washington, DC 20500");
-map.Size = new System.Drawing.Size(400, 400);
+map.Size = new GSize(400, 400);
 map.Zoom = 14;
 ```
 
@@ -150,6 +153,7 @@ Questions, comments and/or suggestions are welcome! Please raise an [issue](http
 ## Contributors
 A big thank you to all of our [contributors](https://github.com/ericnewton76/gmaps-api-net/graphs/contributors) including:
 
+- [Luis Farzati](https://github.com/luisfarzati)
 - [Eric Newton](https://github.com/ericnewton76)
 - [Sheepzez](https://github.com/Sheepzez)
 - [Mieliespoor](https://github.com/mieliespoor)
diff --git a/src/ConsoleApp1/Program.cs b/src/ConsoleApp1/Program.cs
index d8231a8..74f6458 100644
--- a/src/ConsoleApp1/Program.cs
+++ b/src/ConsoleApp1/Program.cs
@@ -6,6 +6,7 @@
 
 using Google.Maps;
 using Google.Maps.Geocoding;
+using Google.Maps.Common;
 
 namespace ConsoleApp1
 {
diff --git a/src/Google.Maps.Test/Direction/DirectionRequestTests.cs b/src/Google.Maps.Test/Direction/DirectionRequestTests.cs
index 2a00310..29e3938 100644
--- a/src/Google.Maps.Test/Direction/DirectionRequestTests.cs
+++ b/src/Google.Maps.Test/Direction/DirectionRequestTests.cs
@@ -3,6 +3,7 @@
 using System.Collections.Specialized;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.Direction
 {
diff --git a/src/Google.Maps.Test/Direction/DirectionServiceTests.cs b/src/Google.Maps.Test/Direction/DirectionServiceTests.cs
index aa912cf..c29f209 100644
--- a/src/Google.Maps.Test/Direction/DirectionServiceTests.cs
+++ b/src/Google.Maps.Test/Direction/DirectionServiceTests.cs
@@ -21,7 +21,8 @@
 
 using NUnit.Framework;
 
-using Google.Maps.Shared;
+using Google.Maps.Common;
+using Google.Maps.Internal;
 
 namespace Google.Maps.Direction
 {
diff --git a/src/Google.Maps.Test/DistanceMatrix/DistanceMatrixServiceTests.cs b/src/Google.Maps.Test/DistanceMatrix/DistanceMatrixServiceTests.cs
index a38f6f4..6acd222 100644
--- a/src/Google.Maps.Test/DistanceMatrix/DistanceMatrixServiceTests.cs
+++ b/src/Google.Maps.Test/DistanceMatrix/DistanceMatrixServiceTests.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.DistanceMatrix
 {
diff --git a/src/Google.Maps.Test/Elevation/ElevationServiceTests.cs b/src/Google.Maps.Test/Elevation/ElevationServiceTests.cs
index 37e514d..d1203ad 100644
--- a/src/Google.Maps.Test/Elevation/ElevationServiceTests.cs
+++ b/src/Google.Maps.Test/Elevation/ElevationServiceTests.cs
@@ -18,6 +18,7 @@
 using System;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.Elevation
 {
diff --git a/src/Google.Maps.Test/Geocoding/GeocodingServiceTests.cs b/src/Google.Maps.Test/Geocoding/GeocodingServiceTests.cs
index 8dce18b..66d2bf8 100644
--- a/src/Google.Maps.Test/Geocoding/GeocodingServiceTests.cs
+++ b/src/Google.Maps.Test/Geocoding/GeocodingServiceTests.cs
@@ -21,7 +21,8 @@
 
 using NUnit.Framework;
 
-using Google.Maps.Shared;
+using Google.Maps.Common;
+using Google.Maps.Internal;
 
 namespace Google.Maps.Geocoding
 {
diff --git a/src/Google.Maps.Test/GoogleMapsForBusinessTests.cs b/src/Google.Maps.Test/GoogleMapsForBusinessTests.cs
index b512be9..7612afd 100644
--- a/src/Google.Maps.Test/GoogleMapsForBusinessTests.cs
+++ b/src/Google.Maps.Test/GoogleMapsForBusinessTests.cs
@@ -3,6 +3,7 @@
 using NUnit.Framework;
 
 using Google.Maps.Geocoding;
+using Google.Maps.Common;
 
 namespace Google.Maps
 {
diff --git a/src/Google.Maps.Test/LatLngComparerTests.cs b/src/Google.Maps.Test/LatLngComparerTests.cs
index c4edf4e..ce75e1b 100644
--- a/src/Google.Maps.Test/LatLngComparerTests.cs
+++ b/src/Google.Maps.Test/LatLngComparerTests.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 
 using NUnit.Framework;
+using Google.Maps.Internal;
 
 namespace Google.Maps
 {
diff --git a/src/Google.Maps.Test/MapColorTests.cs b/src/Google.Maps.Test/MapColorTests.cs
index afc4f98..ccc3a68 100644
--- a/src/Google.Maps.Test/MapColorTests.cs
+++ b/src/Google.Maps.Test/MapColorTests.cs
@@ -1,4 +1,5 @@
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps
 {
@@ -8,9 +9,9 @@ public class MapColorTests
 		[Test]
 		public void IsUndefined_Works()
 		{
-			var undefined = new MapColor();
-			var definedName = MapColor.FromName("red");
-			var definedRGB = MapColor.FromArgb(255,255,255);
+			var undefined = new GColor();
+			var definedName = GColor.FromName("red");
+			var definedRGB = GColor.FromArgb(255,255,255);
 
 			Assert.AreEqual(true, undefined.IsUndefined);
 			Assert.AreEqual(false, definedName.IsUndefined);
@@ -20,9 +21,9 @@ public void IsUndefined_Works()
 		[Test]
 		public void To24BitColor_Works()
 		{
-			var namedColor = MapColor.FromName("red");
-			var rgbColor = MapColor.FromArgb(255, 0, 0);
-			var rgbaColor = MapColor.FromArgb(255, 255, 0, 0);
+			var namedColor = GColor.FromName("red");
+			var rgbColor = GColor.FromArgb(255, 0, 0);
+			var rgbaColor = GColor.FromArgb(255, 255, 0, 0);
 
 			Assert.AreEqual("red", namedColor.To24BitColorString());
 			Assert.AreEqual("0xFF0000", rgbColor.To24BitColorString());
@@ -32,9 +33,9 @@ public void To24BitColor_Works()
 		[Test]
 		public void To32BitColor_Works()
 		{
-			var namedColor = MapColor.FromName("red");
-			var rgbColor = MapColor.FromArgb(255, 0, 0);
-			var rgbaColor = MapColor.FromArgb(255, 255, 0, 0);
+			var namedColor = GColor.FromName("red");
+			var rgbColor = GColor.FromArgb(255, 0, 0);
+			var rgbaColor = GColor.FromArgb(255, 255, 0, 0);
 
 			Assert.AreEqual("red", namedColor.To32BitColorString());
 			Assert.AreEqual("0xFF0000FF", rgbColor.To32BitColorString());
diff --git a/src/Google.Maps.Test/Places/PlaceDetailsServiceTests.cs b/src/Google.Maps.Test/Places/PlaceDetailsServiceTests.cs
index 3b19293..5a79a4d 100644
--- a/src/Google.Maps.Test/Places/PlaceDetailsServiceTests.cs
+++ b/src/Google.Maps.Test/Places/PlaceDetailsServiceTests.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.Places.Details
 {
diff --git a/src/Google.Maps.Test/Places/PlacesServiceTests.cs b/src/Google.Maps.Test/Places/PlacesServiceTests.cs
index b376b62..4093832 100644
--- a/src/Google.Maps.Test/Places/PlacesServiceTests.cs
+++ b/src/Google.Maps.Test/Places/PlacesServiceTests.cs
@@ -3,6 +3,7 @@
 using System.Threading;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.Places
 {
diff --git a/src/Google.Maps.Test/PolylineEncodingTests.cs b/src/Google.Maps.Test/PolylineEncodingTests.cs
index 10a511e..ba5917d 100644
--- a/src/Google.Maps.Test/PolylineEncodingTests.cs
+++ b/src/Google.Maps.Test/PolylineEncodingTests.cs
@@ -3,6 +3,7 @@
 using System.Linq;
 
 using NUnit.Framework;
+using Google.Maps.Internal;
 
 namespace Google.Maps
 {
diff --git a/src/Google.Maps.Test/QuickExamplesTests.cs b/src/Google.Maps.Test/QuickExamplesTests.cs
index 5e6e0c2..5df2770 100644
--- a/src/Google.Maps.Test/QuickExamplesTests.cs
+++ b/src/Google.Maps.Test/QuickExamplesTests.cs
@@ -7,6 +7,7 @@
 using Google.Maps.Direction;
 using Google.Maps.Geocoding;
 using Google.Maps.StaticMaps;
+using Google.Maps.Common;
 
 namespace Google.Maps
 {
@@ -43,7 +44,7 @@ public void StaticMapRequest_Example()
 		{
 			var map = new StaticMapRequest();
 			map.Center = new Location("1600 Amphitheatre Parkway Mountain View, CA 94043");
-			map.Size = new MapSize(400, 400);
+			map.Size = new GSize(400, 400);
 			map.Zoom = 14;
 
 			var imgTagSrc = map.ToUri();
diff --git a/src/Google.Maps.Test/StaticMaps/StaticMapRequestTests.cs b/src/Google.Maps.Test/StaticMaps/StaticMapRequestTests.cs
index 18bc89a..6f96bfb 100644
--- a/src/Google.Maps.Test/StaticMaps/StaticMapRequestTests.cs
+++ b/src/Google.Maps.Test/StaticMaps/StaticMapRequestTests.cs
@@ -1,6 +1,7 @@
 using System;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.StaticMaps
 {
@@ -14,7 +15,7 @@ public void Invalid_size_propert_set()
 			{
 				StaticMapRequest sm = new StaticMapRequest()
 				{
-					Size = new MapSize(-1, -1)
+					Size = new GSize(-1, -1)
 				};
 			});
 		}
@@ -26,7 +27,7 @@ public void Invalid_size_max()
 			{
 				StaticMapRequest sm = new StaticMapRequest()
 				{
-					Size = new MapSize(4097, 4097)
+					Size = new GSize(4097, 4097)
 				};
 			});
 		}
diff --git a/src/Google.Maps.Test/StaticMaps/StaticMap_Path_Tests.cs b/src/Google.Maps.Test/StaticMaps/StaticMap_Path_Tests.cs
index 11a2bc5..ce3e9b8 100644
--- a/src/Google.Maps.Test/StaticMaps/StaticMap_Path_Tests.cs
+++ b/src/Google.Maps.Test/StaticMaps/StaticMap_Path_Tests.cs
@@ -2,6 +2,7 @@
 using System.Text.RegularExpressions;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.StaticMaps
 {
@@ -46,7 +47,7 @@ public void Path_NonstandardColor_EncodedProperly()
 			var map = new StaticMapRequest();
 			map.Paths.Add(new Path(new LatLng(30.0, -60.0))
 			{
-				Color = MapColor.FromArgb(0x80, 0xA0, 0xC0)
+				Color = GColor.FromArgb(0x80, 0xA0, 0xC0)
 			});
 			string color = ExtractColorFromUri(map.ToUri());
 			Assert.AreEqual("0X80A0C0FF", color.ToUpper());
@@ -89,7 +90,7 @@ private static Path GreenTriangleInAdaMN()
 				new LatLng(47.3017, -96.5299)
 			)
 			{
-				Color =  MapColor.FromName("green")
+				Color =  GColor.FromName("green")
 			};
 		}
 
@@ -102,7 +103,7 @@ private static Path RedTriangleNearAdaMN()
 				new LatLng(47.3105, -96.5326)
 			)
 			{
-				Color = MapColor.FromName("red")
+				Color = GColor.FromName("red")
 			};
 		}
 
diff --git a/src/Google.Maps.Test/StreetView/StreetViewRequestTests.cs b/src/Google.Maps.Test/StreetView/StreetViewRequestTests.cs
index 26a518e..ba009e9 100644
--- a/src/Google.Maps.Test/StreetView/StreetViewRequestTests.cs
+++ b/src/Google.Maps.Test/StreetView/StreetViewRequestTests.cs
@@ -2,6 +2,7 @@
 
 using NUnit.Framework;
 using Google.Maps.StreetView;
+using Google.Maps.Common;
 
 namespace Google.Maps.StreetView
 {
@@ -15,7 +16,7 @@ public void Invalid_size_propert_set()
 			{
 				StreetViewRequest sm = new StreetViewRequest()
 				{
-					Size = new MapSize(-1, -1)
+					Size = new GSize(-1, -1)
 				};
 			});
 		}
@@ -27,7 +28,7 @@ public void Invalid_size_max()
 			{
 				StreetViewRequest sm = new StreetViewRequest()
 				{
-					Size = new MapSize(4097, 4097)
+					Size = new GSize(4097, 4097)
 				};
 			});
 		}
diff --git a/src/Google.Maps.Test/StreetView/StreetView_uribuilding_Tests.cs b/src/Google.Maps.Test/StreetView/StreetView_uribuilding_Tests.cs
index 493d123..6bf6628 100644
--- a/src/Google.Maps.Test/StreetView/StreetView_uribuilding_Tests.cs
+++ b/src/Google.Maps.Test/StreetView/StreetView_uribuilding_Tests.cs
@@ -6,6 +6,7 @@
 using FluentAssertions.Collections;
 using FluentAssertions;
 using Google.Maps.Test;
+using Google.Maps.Common;
 
 namespace Google.Maps.StreetView
 {
@@ -24,7 +25,7 @@ public void BasicUri()
 			StreetViewRequest sm = new StreetViewRequest()
 			{
 				Location = new LatLng(30.1, -60.2)
-				,Size = new MapSize(512, 512)
+				,Size = new GSize(512, 512)
 			};
 
 			//act
@@ -44,7 +45,7 @@ public void BasicUri_heading()
 			StreetViewRequest sm = new StreetViewRequest()
 			{
 				Location = new LatLng(30.1, -60.2)
-				,Size = new MapSize(512, 512)
+				,Size = new GSize(512, 512)
 				,Heading = 15
 			};
 
@@ -65,7 +66,7 @@ public void BasicUri_pitch()
 			StreetViewRequest sm = new StreetViewRequest()
 			{
 				Location = new LatLng(30.1, -60.2)
-				,Size = new MapSize(512, 512)
+				,Size = new GSize(512, 512)
 				,Pitch = 15
 			};
 
diff --git a/src/Google.Maps.Test/TimeZone/TimeZoneServiceTests.cs b/src/Google.Maps.Test/TimeZone/TimeZoneServiceTests.cs
index 168ad41..8a5425f 100644
--- a/src/Google.Maps.Test/TimeZone/TimeZoneServiceTests.cs
+++ b/src/Google.Maps.Test/TimeZone/TimeZoneServiceTests.cs
@@ -19,6 +19,7 @@
 using System.Collections.Generic;
 
 using NUnit.Framework;
+using Google.Maps.Common;
 
 namespace Google.Maps.TimeZone
 {
diff --git a/src/Google.Maps.Test/ValueTextComparer_Tests.cs b/src/Google.Maps.Test/ValueTextComparer_Tests.cs
index 273c541..8612682 100644
--- a/src/Google.Maps.Test/ValueTextComparer_Tests.cs
+++ b/src/Google.Maps.Test/ValueTextComparer_Tests.cs
@@ -5,6 +5,9 @@
 using System.Text;
 using System.Threading.Tasks;
 
+using Google.Maps.Internal;
+using Google.Maps.Common;
+
 namespace Google.Maps.Test
 {
 	[TestFixture]
diff --git a/src/Google.Maps/BaseRequest.cs b/src/Google.Maps/BaseRequest.cs
deleted file mode 100644
index 21c3799..0000000
--- a/src/Google.Maps/BaseRequest.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace Google.Maps
-{
-	public abstract class BaseRequest
-	{
-		[Obsolete("The Google Maps API no longer requires this parameter and it will be removed in the next release")]
-		public bool? Sensor { get; set; }
-
-		public abstract Uri ToUri();
-	}
-}
diff --git a/src/Google.Maps/Shared/AddressComponent.cs b/src/Google.Maps/Common/AddressComponent.cs
similarity index 98%
rename from src/Google.Maps/Shared/AddressComponent.cs
rename to src/Google.Maps/Common/AddressComponent.cs
index 5c91891..bebcc2a 100644
--- a/src/Google.Maps/Shared/AddressComponent.cs
+++ b/src/Google.Maps/Common/AddressComponent.cs
@@ -18,7 +18,7 @@
 using Newtonsoft.Json;
 using System;
 
-namespace Google.Maps.Shared
+namespace Google.Maps.Common
 {
 	public class AddressComponent : IEquatable<AddressComponent>
 	{
diff --git a/src/Google.Maps/Shared/AddressType.cs b/src/Google.Maps/Common/AddressType.cs
similarity index 99%
rename from src/Google.Maps/Shared/AddressType.cs
rename to src/Google.Maps/Common/AddressType.cs
index 818ee8b..493d4da 100644
--- a/src/Google.Maps/Shared/AddressType.cs
+++ b/src/Google.Maps/Common/AddressType.cs
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-namespace Google.Maps.Shared
+namespace Google.Maps.Common
 {
 	public enum AddressType
 	{
diff --git a/src/Google.Maps/Avoid.cs b/src/Google.Maps/Common/Avoid.cs
similarity index 94%
rename from src/Google.Maps/Avoid.cs
rename to src/Google.Maps/Common/Avoid.cs
index dbd32d8..59f7d14 100644
--- a/src/Google.Maps/Avoid.cs
+++ b/src/Google.Maps/Common/Avoid.cs
@@ -1,6 +1,6 @@
 using System;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	/// <summary>
 	/// Directions may be calculated that adhere to certain restrictions.
diff --git a/src/Google.Maps/Common/BaseRequest.cs b/src/Google.Maps/Common/BaseRequest.cs
new file mode 100644
index 0000000..11268db
--- /dev/null
+++ b/src/Google.Maps/Common/BaseRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	public abstract class BaseRequest
+	{
+		public abstract Uri ToUri();
+	}
+}
diff --git a/src/Google.Maps/ComponentFilter.cs b/src/Google.Maps/Common/ComponentFilter.cs
similarity index 99%
rename from src/Google.Maps/ComponentFilter.cs
rename to src/Google.Maps/Common/ComponentFilter.cs
index 3a9d029..f849f25 100644
--- a/src/Google.Maps/ComponentFilter.cs
+++ b/src/Google.Maps/Common/ComponentFilter.cs
@@ -3,7 +3,7 @@
 using System.Linq;
 using System.Text;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	/// <summary>
 	/// In a geocoding response, the Google Maps Geocoding API can return address results restricted to a specific area.
diff --git a/src/Google.Maps/Constants.cs b/src/Google.Maps/Common/Constants.cs
similarity index 96%
rename from src/Google.Maps/Constants.cs
rename to src/Google.Maps/Common/Constants.cs
index 7b4b9f7..c971798 100644
--- a/src/Google.Maps/Constants.cs
+++ b/src/Google.Maps/Common/Constants.cs
@@ -1,94 +1,94 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.Maps
-{
-	internal static class Constants
-	{
-		public const int SIZE_WIDTH_MIN = 1;
-		public const int SIZE_HEIGHT_MIN = 1;
-		public const int SIZE_WIDTH_MAX = 4096;
-		public const int SIZE_HEIGHT_MAX = 4096;
-
-		public const int ZOOM_LEVEL_MIN = 0;
-
-		public const string PATH_ENCODED_PREFIX = "enc:";
-		public const string PIPE_URL_ENCODED = "%7C";
-
-		public const string expectedColors = "black, brown, green, purple, yellow, blue, gray, orange, red, white"; //pasted straight from the website.
-
-		private static string[] S_ExpectedNamedColors;
-		public static bool IsExpectedNamedColor(string value)
-		{
-			if(value == null) return false;
-			return (Contains(S_ExpectedNamedColors, value, true));
-		}
-
-		private static int[] S_ExpectedScaleValues;
-		public static bool IsExpectedScaleValue(int value, bool throwIfOutOfRange)
-		{
-			if(Contains(S_ExpectedScaleValues, value) == true) return true;
-
-			if(throwIfOutOfRange)
-				throw new ArgumentOutOfRangeException("Scale value can only be " + ListValues(S_ExpectedScaleValues));
-			else
-				return false;
-		}
-
-		static Constants()
-		{
-			S_ExpectedNamedColors = expectedColors.Replace(", ", ",").Split(',');  //since we paste straight from the website, we remove spaces, and convert to an array.
-			S_ExpectedScaleValues = new int[] { 1, 2, 4 };
-		}
-
-		#region Pre-Framework v3.0 support
-		private static bool Contains(string[] array, string value, bool ignoreCase)
-		{
-			//TODO: rewrite for speed somehow
-			for(int i = 0; i < array.Length; i++)
-			{
-				if(string.Compare(array[i], value, ignoreCase) == 0) return true;
-			}
-
-			return false;
-		}
-		private static bool Contains(int[] array, int value)
-		{
-			//TODO: rewrite for speed somehow
-			for(int i = 0; i < array.Length; i++)
-			{
-				if(array[i] == value) return true;
-			}
-
-			return false;
-		}
-		private static string ListValues(int[] array)
-		{
-			//TODO: rewrite for speed somehow
-			System.Text.StringBuilder sb = new StringBuilder();
-			for(int i = 0; i < array.Length; i++)
-			{
-				if(sb.Length > 0) sb.Append(",");
-				sb.Append(array[i]);
-			}
-			return sb.ToString();
-		}
-
-		internal static void CheckHeadingRange(short value, string parameterName)
-		{
-			const string HEADING_PARAMETER_RANGE = "Heading value must be greater or equal to 0 and less than or equal to 360";
-			if(value < 0) throw new ArgumentOutOfRangeException(parameterName, HEADING_PARAMETER_RANGE);
-			if(value > 360) throw new ArgumentOutOfRangeException(parameterName, HEADING_PARAMETER_RANGE);
-		}
-
-		internal static void CheckPitchRange(short value, string parameterName)
-		{
-			const string PITCH_PARAMETER_RANGE = "Pitch value must be greater or equal to -90 and less than or equal to 90.";
-			if(value < -90 || value > 90) throw new ArgumentOutOfRangeException(PITCH_PARAMETER_RANGE, parameterName);
-		}
-
-		#endregion
-
-	}
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	internal static class Constants
+	{
+		public const int SIZE_WIDTH_MIN = 1;
+		public const int SIZE_HEIGHT_MIN = 1;
+		public const int SIZE_WIDTH_MAX = 4096;
+		public const int SIZE_HEIGHT_MAX = 4096;
+
+		public const int ZOOM_LEVEL_MIN = 0;
+
+		public const string PATH_ENCODED_PREFIX = "enc:";
+		public const string PIPE_URL_ENCODED = "%7C";
+
+		public const string expectedColors = "black, brown, green, purple, yellow, blue, gray, orange, red, white"; //pasted straight from the website.
+
+		private static string[] S_ExpectedNamedColors;
+		public static bool IsExpectedNamedColor(string value)
+		{
+			if(value == null) return false;
+			return (Contains(S_ExpectedNamedColors, value, true));
+		}
+
+		private static int[] S_ExpectedScaleValues;
+		public static bool IsExpectedScaleValue(int value, bool throwIfOutOfRange)
+		{
+			if(Contains(S_ExpectedScaleValues, value) == true) return true;
+
+			if(throwIfOutOfRange)
+				throw new ArgumentOutOfRangeException("Scale value can only be " + ListValues(S_ExpectedScaleValues));
+			else
+				return false;
+		}
+
+		static Constants()
+		{
+			S_ExpectedNamedColors = expectedColors.Replace(", ", ",").Split(',');  //since we paste straight from the website, we remove spaces, and convert to an array.
+			S_ExpectedScaleValues = new int[] { 1, 2, 4 };
+		}
+
+		#region Pre-Framework v3.0 support
+		private static bool Contains(string[] array, string value, bool ignoreCase)
+		{
+			//TODO: rewrite for speed somehow
+			for(int i = 0; i < array.Length; i++)
+			{
+				if(string.Compare(array[i], value, ignoreCase) == 0) return true;
+			}
+
+			return false;
+		}
+		private static bool Contains(int[] array, int value)
+		{
+			//TODO: rewrite for speed somehow
+			for(int i = 0; i < array.Length; i++)
+			{
+				if(array[i] == value) return true;
+			}
+
+			return false;
+		}
+		private static string ListValues(int[] array)
+		{
+			//TODO: rewrite for speed somehow
+			System.Text.StringBuilder sb = new StringBuilder();
+			for(int i = 0; i < array.Length; i++)
+			{
+				if(sb.Length > 0) sb.Append(",");
+				sb.Append(array[i]);
+			}
+			return sb.ToString();
+		}
+
+		internal static void CheckHeadingRange(short value, string parameterName)
+		{
+			const string HEADING_PARAMETER_RANGE = "Heading value must be greater or equal to 0 and less than or equal to 360";
+			if(value < 0) throw new ArgumentOutOfRangeException(parameterName, HEADING_PARAMETER_RANGE);
+			if(value > 360) throw new ArgumentOutOfRangeException(parameterName, HEADING_PARAMETER_RANGE);
+		}
+
+		internal static void CheckPitchRange(short value, string parameterName)
+		{
+			const string PITCH_PARAMETER_RANGE = "Pitch value must be greater or equal to -90 and less than or equal to 90.";
+			if(value < -90 || value > 90) throw new ArgumentOutOfRangeException(PITCH_PARAMETER_RANGE, parameterName);
+		}
+
+		#endregion
+
+	}
+}
diff --git a/src/Google.Maps/MapColor.cs b/src/Google.Maps/Common/GColor.cs
similarity index 75%
rename from src/Google.Maps/MapColor.cs
rename to src/Google.Maps/Common/GColor.cs
index 79bd294..f1d7464 100644
--- a/src/Google.Maps/MapColor.cs
+++ b/src/Google.Maps/Common/GColor.cs
@@ -1,11 +1,11 @@
 using System;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	/// <summary>
 	/// Represents a Google Maps color.
 	/// </summary>
-	public struct MapColor
+	public struct GColor
 	{
 		UInt32 value;
 		string colorName;
@@ -35,9 +35,9 @@ public string To32BitColorString()
 		/// <summary>
 		/// Create a color froma CSS3 color name
 		/// </summary>
-		public static MapColor FromName(string cssColor)
+		public static GColor FromName(string cssColor)
 		{
-			var color = new MapColor();
+			var color = new GColor();
 			color.colorName = cssColor.ToLower();
 			return color;
 		}
@@ -45,7 +45,7 @@ public static MapColor FromName(string cssColor)
 		/// <summary>
 		/// Create a color from RGB values and a fully opaque alpha
 		/// </summary>
-		public static MapColor FromArgb(int red, int green, int blue)
+		public static GColor FromArgb(int red, int green, int blue)
 		{
 			return FromArgb(255, red, green, blue);
 		}
@@ -53,29 +53,29 @@ public static MapColor FromArgb(int red, int green, int blue)
 		/// <summary>
 		/// Create a color from RGB and alpha values
 		/// </summary>
-		public static MapColor FromArgb(int alpha, int red, int green, int blue)
+		public static GColor FromArgb(int alpha, int red, int green, int blue)
 		{
-			var color = new MapColor();
+			var color = new GColor();
 			color.value = (uint)(((uint)red << 24) + (green << 16) + (blue << 8) + alpha);
 			return color;
 		}
 
-		public static bool operator ==(MapColor a, MapColor b)
+		public static bool operator ==(GColor a, GColor b)
 		{
 			if (a.isNamedColor && b.isNamedColor) return a.colorName == b.colorName;
 			if (a.isNamedColor ^ b.isNamedColor) return false;
 			return a.value == b.value;
 		}
 
-		public static bool operator !=(MapColor a, MapColor b)
+		public static bool operator !=(GColor a, GColor b)
 		{
 			return a != b;
 		}
 
 		public override bool Equals(object obj)
 		{
-			if (!(obj is MapColor)) return false;
-			var o = (MapColor)obj;
+			if (!(obj is GColor)) return false;
+			var o = (GColor)obj;
 			return this == o;
 		}
 
@@ -86,7 +86,7 @@ public override int GetHashCode()
 		}
 
 #if HAS_SYSTEMDRAWING
-		public static implicit operator MapColor(System.Drawing.Color systemColor)
+		public static implicit operator GColor(System.Drawing.Color systemColor)
 		{
 			return FromArgb(systemColor.A, systemColor.R, systemColor.G, systemColor.B);
 		}
diff --git a/src/Google.Maps/Common/GSize.cs b/src/Google.Maps/Common/GSize.cs
new file mode 100644
index 0000000..29b946b
--- /dev/null
+++ b/src/Google.Maps/Common/GSize.cs
@@ -0,0 +1,23 @@
+namespace Google.Maps.Common
+{
+	public struct GSize
+	{
+		public GSize(int width, int height)
+		{
+			this.Width = width;
+			this.Height = height;
+		}
+
+		public int Width { get; set; }
+
+		public int Height { get; set; }
+
+#if HAS_SYSTEMDRAWING
+		public static implicit operator GSize(System.Drawing.Size systemSize)
+		{
+			return new GSize(systemSize.Width, systemSize.Height);
+		}
+#endif
+
+	}
+}
\ No newline at end of file
diff --git a/src/Google.Maps/Shared/Geometry.cs b/src/Google.Maps/Common/Geometry.cs
similarity index 98%
rename from src/Google.Maps/Shared/Geometry.cs
rename to src/Google.Maps/Common/Geometry.cs
index f38039a..b00799c 100644
--- a/src/Google.Maps/Shared/Geometry.cs
+++ b/src/Google.Maps/Common/Geometry.cs
@@ -18,7 +18,7 @@
 using Newtonsoft.Json;
 using System;
 
-namespace Google.Maps.Shared
+namespace Google.Maps.Common
 {
 	[JsonObject(MemberSerialization.OptIn)]
 	public class Geometry
diff --git a/src/Google.Maps/Shared/LocationType.cs b/src/Google.Maps/Common/LocationType.cs
similarity index 98%
rename from src/Google.Maps/Shared/LocationType.cs
rename to src/Google.Maps/Common/LocationType.cs
index 7a47ea7..d4d0f1d 100644
--- a/src/Google.Maps/Shared/LocationType.cs
+++ b/src/Google.Maps/Common/LocationType.cs
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-namespace Google.Maps.Shared
+namespace Google.Maps.Common
 {
 	public enum LocationType
 	{
diff --git a/src/Google.Maps/GMapsImageFormats.cs b/src/Google.Maps/Common/MapImageFormats.cs
similarity index 89%
rename from src/Google.Maps/GMapsImageFormats.cs
rename to src/Google.Maps/Common/MapImageFormats.cs
index 159b41f..749ed98 100644
--- a/src/Google.Maps/GMapsImageFormats.cs
+++ b/src/Google.Maps/Common/MapImageFormats.cs
@@ -1,38 +1,38 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.Maps
-{
-	/// <summary>
-	/// Represents the different image formats available from the Google Maps API.
-	/// </summary>
-	public enum GMapsImageFormats
-	{
-		Unspecified = 0,
-		/// <summary>
-		/// (default) specifies the 8-bit PNG format
-		/// </summary>
-		PNG = 1,
-		/// <summary>
-		/// specifies the 8-bit PNG format
-		/// </summary>
-		PNG8 = 1,
-		/// <summary>
-		/// specifies the 32-bit PNG format
-		/// </summary>
-		PNG32 = 2,
-		/// <summary>
-		/// specifies the GIF format
-		/// </summary>
-		GIF = 4,
-		/// <summary>
-		/// specifies the JPEG compression format
-		/// </summary>
-		JPG = 5,
-		/// <summary>
-		/// specifies a non-progressive JPEG compression format
-		/// </summary>
-		JPGbaseline = 6
-	}
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	/// <summary>
+	/// Represents the different image formats available from the Google Maps API.
+	/// </summary>
+	public enum MapImageFormats
+	{
+		Unspecified = 0,
+		/// <summary>
+		/// (default) specifies the 8-bit PNG format
+		/// </summary>
+		PNG = 1,
+		/// <summary>
+		/// specifies the 8-bit PNG format
+		/// </summary>
+		PNG8 = 1,
+		/// <summary>
+		/// specifies the 32-bit PNG format
+		/// </summary>
+		PNG32 = 2,
+		/// <summary>
+		/// specifies the GIF format
+		/// </summary>
+		GIF = 4,
+		/// <summary>
+		/// specifies the JPEG compression format
+		/// </summary>
+		JPG = 5,
+		/// <summary>
+		/// specifies a non-progressive JPEG compression format
+		/// </summary>
+		JPGbaseline = 6
+	}
+}
diff --git a/src/Google.Maps/RankBy.cs b/src/Google.Maps/Common/RankBy.cs
similarity index 94%
rename from src/Google.Maps/RankBy.cs
rename to src/Google.Maps/Common/RankBy.cs
index a3f0433..3319fe2 100644
--- a/src/Google.Maps/RankBy.cs
+++ b/src/Google.Maps/Common/RankBy.cs
@@ -1,31 +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.
- */
-
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace Google.Maps
-{
-	public enum RankBy
-	{
-		Prominence,
-		Distance
-	}
-}
+/*
+ * 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 System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	public enum RankBy
+	{
+		Prominence,
+		Distance
+	}
+}
diff --git a/src/Google.Maps/ServiceResponseStatus.cs b/src/Google.Maps/Common/ServiceResponseStatus.cs
similarity index 95%
rename from src/Google.Maps/ServiceResponseStatus.cs
rename to src/Google.Maps/Common/ServiceResponseStatus.cs
index 98e69e6..671681d 100644
--- a/src/Google.Maps/ServiceResponseStatus.cs
+++ b/src/Google.Maps/Common/ServiceResponseStatus.cs
@@ -1,64 +1,64 @@
-/*
- * 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 Google.Maps
-{
-	public enum ServiceResponseStatus
-	{
-		Unknown = 0,
-
-		/// <summary>
-		/// Indicates that no errors occurred; the address was successfully 
-		/// parsed and at least one geocode was returned.
-		/// </summary>
-		Ok = -1,
-
-		/// <summary>
-		/// Indicating the service request was malformed.
-		/// </summary>
-		InvalidRequest = 1,
-
-		/// <summary>
-		/// Indicates that the geocode was successful but returned no results.
-		/// This may occur if the geocode was passed a non-existent address or
-		/// a latlng in a remote location.
-		/// </summary>
-		ZeroResults = 2,
-
-		/// <summary>
-		/// Indicates that you are over your quota.
-		/// </summary>
-		OverQueryLimit = 3,
-
-		/// <summary>
-		/// Indicates that your request was denied.
-		/// </summary>
-		RequestDenied = 4,
-
-		/// <summary>
-		/// At least one of the provided locations in the request could not
-		/// be geocoded.
-		/// </summary>
-		NotFound = 5,
-
-		/// <summary>
-		/// Indicates that too many waypoints were provided in the request.
-		/// Without an API key the maximum number is 8.
-		/// </summary>
-		MaxWaypointsExceeded = 6
-	}
-}
+/*
+ * 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 Google.Maps.Common
+{
+	public enum ServiceResponseStatus
+	{
+		Unknown = 0,
+
+		/// <summary>
+		/// Indicates that no errors occurred; the address was successfully 
+		/// parsed and at least one geocode was returned.
+		/// </summary>
+		Ok = -1,
+
+		/// <summary>
+		/// Indicating the service request was malformed.
+		/// </summary>
+		InvalidRequest = 1,
+
+		/// <summary>
+		/// Indicates that the geocode was successful but returned no results.
+		/// This may occur if the geocode was passed a non-existent address or
+		/// a latlng in a remote location.
+		/// </summary>
+		ZeroResults = 2,
+
+		/// <summary>
+		/// Indicates that you are over your quota.
+		/// </summary>
+		OverQueryLimit = 3,
+
+		/// <summary>
+		/// Indicates that your request was denied.
+		/// </summary>
+		RequestDenied = 4,
+
+		/// <summary>
+		/// At least one of the provided locations in the request could not
+		/// be geocoded.
+		/// </summary>
+		NotFound = 5,
+
+		/// <summary>
+		/// Indicates that too many waypoints were provided in the request.
+		/// Without an API key the maximum number is 8.
+		/// </summary>
+		MaxWaypointsExceeded = 6
+	}
+}
diff --git a/src/Google.Maps/TravelMode.cs b/src/Google.Maps/Common/TravelMode.cs
similarity index 95%
rename from src/Google.Maps/TravelMode.cs
rename to src/Google.Maps/Common/TravelMode.cs
index 87ec14f..cf0a838 100644
--- a/src/Google.Maps/TravelMode.cs
+++ b/src/Google.Maps/Common/TravelMode.cs
@@ -1,34 +1,34 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.Maps
-{
-	/// <summary>
-	/// When you calculate directions, you may specify which transportation mode to use. By default, directions are calculated as driving directions. The following travel modes are currently supported:
-	/// Note: Both walking and bicycling directions may sometimes not include clear pedestrian or bicycling paths, so these directions will return warnings in the returned result which you must display to the user.
-	/// </summary>
-	/// <see href="http://code.google.com/apis/maps/documentation/directions/#TravelModes"/>
-	public enum TravelMode
-	{
-		/// <summary>
-		/// (default) indicates standard driving directions using the road network.
-		/// </summary>
-		driving,
-
-		/// <summary>
-		/// requests walking directions via pedestrian paths and sidewalks (where available).
-		/// </summary>
-		walking,
-
-		/// <summary>
-		/// requests bicycling directions via bicycle paths and preferred streets (currently only available in the US).
-		/// </summary>
-		bicycling,
-
-		/// <summary>
-		/// requests public transportation directions (where available).
-		/// </summary>
-		transit
-	}
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	/// <summary>
+	/// When you calculate directions, you may specify which transportation mode to use. By default, directions are calculated as driving directions. The following travel modes are currently supported:
+	/// Note: Both walking and bicycling directions may sometimes not include clear pedestrian or bicycling paths, so these directions will return warnings in the returned result which you must display to the user.
+	/// </summary>
+	/// <see href="http://code.google.com/apis/maps/documentation/directions/#TravelModes"/>
+	public enum TravelMode
+	{
+		/// <summary>
+		/// (default) indicates standard driving directions using the road network.
+		/// </summary>
+		driving,
+
+		/// <summary>
+		/// requests walking directions via pedestrian paths and sidewalks (where available).
+		/// </summary>
+		walking,
+
+		/// <summary>
+		/// requests bicycling directions via bicycle paths and preferred streets (currently only available in the US).
+		/// </summary>
+		bicycling,
+
+		/// <summary>
+		/// requests public transportation directions (where available).
+		/// </summary>
+		transit
+	}
+}
diff --git a/src/Google.Maps/Units.cs b/src/Google.Maps/Common/Units.cs
similarity index 92%
rename from src/Google.Maps/Units.cs
rename to src/Google.Maps/Common/Units.cs
index 67f7d43..9e3d20e 100644
--- a/src/Google.Maps/Units.cs
+++ b/src/Google.Maps/Common/Units.cs
@@ -1,23 +1,23 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.Maps
-{
-	/// <summary>
-	///  When you calculate Directions Matrix, you may specify which Unit system mode to use. 
-	///  By default, directions are showes as metric. The following units system modes are currently supported:
-	/// </summary>
-	public enum Units
-	{
-		/// <summary>
-		/// (default) Returns distances in kilometers and meters
-		/// </summary>
-		metric,
-
-		/// <summary>
-		///  returns distances in miles and feet
-		/// </summary>
-		imperial
-	}
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.Maps.Common
+{
+	/// <summary>
+	///  When you calculate Directions Matrix, you may specify which Unit system mode to use. 
+	///  By default, directions are showes as metric. The following units system modes are currently supported:
+	/// </summary>
+	public enum Units
+	{
+		/// <summary>
+		/// (default) Returns distances in kilometers and meters
+		/// </summary>
+		metric,
+
+		/// <summary>
+		///  returns distances in miles and feet
+		/// </summary>
+		imperial
+	}
+}
diff --git a/src/Google.Maps/ValueText.cs b/src/Google.Maps/Common/ValueText.cs
similarity index 93%
rename from src/Google.Maps/ValueText.cs
rename to src/Google.Maps/Common/ValueText.cs
index 5afe2d0..d990954 100644
--- a/src/Google.Maps/ValueText.cs
+++ b/src/Google.Maps/Common/ValueText.cs
@@ -3,7 +3,7 @@
 using System.Text;
 using Newtonsoft.Json;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	[JsonObject(MemberSerialization.OptIn)]
 	public class ValueText
diff --git a/src/Google.Maps/Shared/Viewport.cs b/src/Google.Maps/Common/Viewport.cs
similarity index 97%
rename from src/Google.Maps/Shared/Viewport.cs
rename to src/Google.Maps/Common/Viewport.cs
index 34a1840..1a2c091 100644
--- a/src/Google.Maps/Shared/Viewport.cs
+++ b/src/Google.Maps/Common/Viewport.cs
@@ -18,7 +18,7 @@
 using Newtonsoft.Json;
 using System;
 
-namespace Google.Maps.Shared
+namespace Google.Maps.Common
 {
 	[JsonObject(MemberSerialization.OptIn)]
 	public class Viewport
diff --git a/src/Google.Maps/Direction/DirectionLeg.cs b/src/Google.Maps/Direction/DirectionLeg.cs
index 7c0e832..b708d18 100644
--- a/src/Google.Maps/Direction/DirectionLeg.cs
+++ b/src/Google.Maps/Direction/DirectionLeg.cs
@@ -1,7 +1,9 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+
 using Newtonsoft.Json;
+using Google.Maps.Common;
 
 namespace Google.Maps.Direction
 {
diff --git a/src/Google.Maps/Direction/DirectionRequest.cs b/src/Google.Maps/Direction/DirectionRequest.cs
index 0e130be..4d91a58 100644
--- a/src/Google.Maps/Direction/DirectionRequest.cs
+++ b/src/Google.Maps/Direction/DirectionRequest.cs
@@ -1,9 +1,12 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
-using Google.Maps;
 using System.ComponentModel;
 
+using Google.Maps;
+using Google.Maps.Common;
+using Google.Maps.Internal;
+
 namespace Google.Maps.Direction
 {
 	public class DirectionRequest : BaseRequest
diff --git a/src/Google.Maps/Direction/DirectionStep.cs b/src/Google.Maps/Direction/DirectionStep.cs
index bc580b9..55ca475 100644
--- a/src/Google.Maps/Direction/DirectionStep.cs
+++ b/src/Google.Maps/Direction/DirectionStep.cs
@@ -1,7 +1,9 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+
 using Newtonsoft.Json;
+using Google.Maps.Common;
 
 namespace Google.Maps.Direction
 {
diff --git a/src/Google.Maps/Direction/GeocodedWaypoint.cs b/src/Google.Maps/Direction/GeocodedWaypoint.cs
index dc6157f..c7f03e3 100644
--- a/src/Google.Maps/Direction/GeocodedWaypoint.cs
+++ b/src/Google.Maps/Direction/GeocodedWaypoint.cs
@@ -1,10 +1,11 @@
-using Google.Maps.Shared;
-using Newtonsoft.Json;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
+using Google.Maps.Common;
+
 namespace Google.Maps.Direction
 {
 	public class GeocodedWaypoint
diff --git a/src/Google.Maps/DistanceMatrix/DistanceMatrixRequest.cs b/src/Google.Maps/DistanceMatrix/DistanceMatrixRequest.cs
index e7b3cdf..906b52b 100644
--- a/src/Google.Maps/DistanceMatrix/DistanceMatrixRequest.cs
+++ b/src/Google.Maps/DistanceMatrix/DistanceMatrixRequest.cs
@@ -18,10 +18,13 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
-using Google.Maps;
 using System.Text;
 using System.Linq;
 
+using Google.Maps;
+using Google.Maps.Common;
+using Google.Maps.Internal;
+
 namespace Google.Maps.DistanceMatrix
 {
 	/// <summary>
diff --git a/src/Google.Maps/DistanceMatrix/DistanceMatrixResponse.cs b/src/Google.Maps/DistanceMatrix/DistanceMatrixResponse.cs
index f40b005..a9d1486 100644
--- a/src/Google.Maps/DistanceMatrix/DistanceMatrixResponse.cs
+++ b/src/Google.Maps/DistanceMatrix/DistanceMatrixResponse.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+
 using Newtonsoft.Json;
 using Google.Maps.Common;
 
diff --git a/src/Google.Maps/Elevation/ElevationRequest.cs b/src/Google.Maps/Elevation/ElevationRequest.cs
index 0d46084..b7f64de 100644
--- a/src/Google.Maps/Elevation/ElevationRequest.cs
+++ b/src/Google.Maps/Elevation/ElevationRequest.cs
@@ -16,6 +16,9 @@
  */
 using System;
 using System.Collections.Generic;
+
+using Google.Maps;
+using Google.Maps.Common;
 using Google.Maps.Internal;
 
 namespace Google.Maps.Elevation
diff --git a/src/Google.Maps/Elevation/ElevationResponse.cs b/src/Google.Maps/Elevation/ElevationResponse.cs
index 2c675f2..664562d 100644
--- a/src/Google.Maps/Elevation/ElevationResponse.cs
+++ b/src/Google.Maps/Elevation/ElevationResponse.cs
@@ -17,6 +17,7 @@
 
 using Google.Maps.Common;
 using Newtonsoft.Json;
+using Google.Maps.Common;
 
 namespace Google.Maps.Elevation
 {
diff --git a/src/Google.Maps/Geocoding/GeocodeResponse.cs b/src/Google.Maps/Geocoding/GeocodeResponse.cs
index 2cd62ef..8064f36 100644
--- a/src/Google.Maps/Geocoding/GeocodeResponse.cs
+++ b/src/Google.Maps/Geocoding/GeocodeResponse.cs
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
+using System;
 using Google.Maps.Common;
 using Newtonsoft.Json;
-using System;
+using Google.Maps.Common;
 
 namespace Google.Maps.Geocoding
 {
diff --git a/src/Google.Maps/Geocoding/GeocodingRequest.cs b/src/Google.Maps/Geocoding/GeocodingRequest.cs
index 4ed8efb..06c769c 100644
--- a/src/Google.Maps/Geocoding/GeocodingRequest.cs
+++ b/src/Google.Maps/Geocoding/GeocodingRequest.cs
@@ -17,7 +17,8 @@
 
 using System;
 
-using Google.Maps.Shared;
+using Google.Maps;
+using Google.Maps.Common;
 
 namespace Google.Maps.Geocoding
 {
diff --git a/src/Google.Maps/Geocoding/Result.cs b/src/Google.Maps/Geocoding/Result.cs
index 7ea5404..80cd24d 100644
--- a/src/Google.Maps/Geocoding/Result.cs
+++ b/src/Google.Maps/Geocoding/Result.cs
@@ -17,7 +17,7 @@
 
 using Newtonsoft.Json;
 using System;
-using Google.Maps.Shared;
+using Google.Maps.Common;
 
 namespace Google.Maps.Geocoding
 {
diff --git a/src/Google.Maps/Google.Maps.csproj b/src/Google.Maps/Google.Maps.csproj
index 8510a41..f366345 100644
--- a/src/Google.Maps/Google.Maps.csproj
+++ b/src/Google.Maps/Google.Maps.csproj
@@ -9,6 +9,11 @@
   <PropertyGroup Condition="'$(TargetFramework)'=='net461'">
     <DefineConstants>HAS_SYSTEMDRAWING</DefineConstants>
   </PropertyGroup>
+  <ItemGroup>
+    <Compile Remove="Shared\**" />
+    <EmbeddedResource Remove="Shared\**" />
+    <None Remove="Shared\**" />
+  </ItemGroup>
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
   </ItemGroup>
diff --git a/src/Google.Maps/AvoidHelper.cs b/src/Google.Maps/Internal/AvoidHelper.cs
similarity index 88%
rename from src/Google.Maps/AvoidHelper.cs
rename to src/Google.Maps/Internal/AvoidHelper.cs
index 2b54214..655e678 100644
--- a/src/Google.Maps/AvoidHelper.cs
+++ b/src/Google.Maps/Internal/AvoidHelper.cs
@@ -3,7 +3,9 @@
 using System.Linq;
 using System.Text;
 
-namespace Google.Maps
+using Google.Maps.Common;
+
+namespace Google.Maps.Internal
 {
 	internal static class AvoidHelper
 	{
diff --git a/src/Google.Maps/LatLngComparer.cs b/src/Google.Maps/Internal/LatLngComparer.cs
similarity index 97%
rename from src/Google.Maps/LatLngComparer.cs
rename to src/Google.Maps/Internal/LatLngComparer.cs
index e75a457..1c5c5a5 100644
--- a/src/Google.Maps/LatLngComparer.cs
+++ b/src/Google.Maps/Internal/LatLngComparer.cs
@@ -3,7 +3,7 @@
 using System.Linq;
 using System.Text;
 
-namespace Google.Maps
+namespace Google.Maps.Internal
 {
 	public class LatLngComparer : IEqualityComparer<LatLng>
 	{
diff --git a/src/Google.Maps/Internal/MapsHttp.cs b/src/Google.Maps/Internal/MapsHttp.cs
index 9b68bc5..7653dd8 100644
--- a/src/Google.Maps/Internal/MapsHttp.cs
+++ b/src/Google.Maps/Internal/MapsHttp.cs
@@ -22,6 +22,7 @@
 using System.IO;
 
 using Newtonsoft.Json;
+using Google.Maps.Internal.Serialization;
 
 namespace Google.Maps.Internal
 {
@@ -29,7 +30,11 @@ public class MapsHttp : IDisposable
 	{
 		JsonSerializerSettings settings = new JsonSerializerSettings
 		{
-			Converters = new List<JsonConverter> { new JsonEnumTypeConverter(), new JsonLocationConverter() }
+			Converters = new List<JsonConverter>
+			{
+				new JsonEnumTypeConverter(),
+				new JsonLatLngConverter()
+			}
 		};
 
 		GoogleSigned signingSvc;
diff --git a/src/Google.Maps/PolylineEncoder.cs b/src/Google.Maps/Internal/PolylineEncoder.cs
similarity index 96%
rename from src/Google.Maps/PolylineEncoder.cs
rename to src/Google.Maps/Internal/PolylineEncoder.cs
index adb6c65..32de408 100644
--- a/src/Google.Maps/PolylineEncoder.cs
+++ b/src/Google.Maps/Internal/PolylineEncoder.cs
@@ -1,145 +1,145 @@
-/* code reused from SoulSolutions */
-/* retrieved from http://briancaos.wordpress.com/2009/10/16/google-maps-polyline-encoding-in-c/ */
-/* implements the Polyline Encoding Algorithm as defined at
- * http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.Maps
-{
-	public class PolylineEncoder
-	{
-		/// <summary>
-		/// Encodes the list of coordinates to a Google Maps encoded coordinate string.
-		/// </summary>
-		/// <param name="coordinates">The coordinates.</param>
-		/// <returns>Encoded coordinate string</returns>
-		public static string EncodeCoordinates(IEnumerable<LatLng> coordinates)
-		{
-			double oneEFive = Convert.ToDouble(1e5);
-
-			int plat = 0;
-			int plng = 0;
-			StringBuilder encodedCoordinates = new StringBuilder();
-
-			foreach(LatLng coordinate in coordinates)
-			{
-				// Round to 5 decimal places and drop the decimal
-				int late5 = (int)(coordinate.Latitude * oneEFive);
-				int lnge5 = (int)(coordinate.Longitude * oneEFive);
-
-				// Encode the differences between the coordinates
-				encodedCoordinates.Append(EncodeSignedNumber(late5 - plat));
-				encodedCoordinates.Append(EncodeSignedNumber(lnge5 - plng));
-
-				// Store the current coordinates
-				plat = late5;
-				plng = lnge5;
-			}
-
-			return encodedCoordinates.ToString();
-		}
-
-		/// <summary>
-		/// Decode encoded polyline information to a collection of <see cref="LatLng"/> instances.
-		/// </summary>
-		/// <param name="value">ASCII string</param>
-		/// <returns></returns>
-		public static IEnumerable<LatLng> Decode(string value)
-		{
-			//decode algorithm adapted from saboor awan via codeproject:
-			//http://www.codeproject.com/Tips/312248/Google-Maps-Direction-API-V3-Polyline-Decoder
-			//note the Code Project Open License at http://www.codeproject.com/info/cpol10.aspx
-
-			if(value == null || value == "") return new List<LatLng>(0);
-
-			char[] polylinechars = value.ToCharArray();
-			int index = 0;
-
-			int currentLat = 0;
-			int currentLng = 0;
-			int next5bits;
-			int sum;
-			int shifter;
-
-			List<LatLng> poly = new List<LatLng>();
-
-			while(index < polylinechars.Length)
-			{
-				// calculate next latitude
-				sum = 0;
-				shifter = 0;
-				do
-				{
-					next5bits = (int)polylinechars[index++] - 63;
-					sum |= (next5bits & 31) << shifter;
-					shifter += 5;
-				} while(next5bits >= 32 && index < polylinechars.Length);
-
-				if(index >= polylinechars.Length)
-					break;
-
-				currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
-
-				//calculate next longitude
-				sum = 0;
-				shifter = 0;
-				do
-				{
-					next5bits = (int)polylinechars[index++] - 63;
-					sum |= (next5bits & 31) << shifter;
-					shifter += 5;
-				} while(next5bits >= 32 && index < polylinechars.Length);
-
-				if(index >= polylinechars.Length && next5bits >= 32)
-					break;
-
-				currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
-				LatLng point = new LatLng(
-					latitude: Convert.ToDouble(currentLat) / 100000.0,
-					longitude: Convert.ToDouble(currentLng) / 100000.0
-				);
-				poly.Add(point);
-			}
-
-			return poly;
-		}
-
-		/// <summary>
-		/// Encode a signed number in the encode format.
-		/// </summary>
-		/// <param name="num">The signed number</param>
-		/// <returns>The encoded string</returns>
-		private static string EncodeSignedNumber(int num)
-		{
-			int sgn_num = num << 1; //shift the binary value
-			if(num < 0) //if negative invert
-			{
-				sgn_num = ~(sgn_num);
-			}
-			return (EncodeNumber(sgn_num));
-		}
-
-		/// <summary>
-		/// Encode an unsigned number in the encode format.
-		/// </summary>
-		/// <param name="num">The unsigned number</param>
-		/// <returns>The encoded string</returns>
-		private static string EncodeNumber(int num)
-		{
-			StringBuilder encodeString = new StringBuilder();
-			while(num >= 0x20)
-			{
-				encodeString.Append((char)((0x20 | (num & 0x1f)) + 63));
-				num >>= 5;
-			}
-			encodeString.Append((char)(num + 63));
-			// All backslashes needs to be replaced with double backslashes
-			// before being used in a Javascript string.
-			return encodeString.ToString();
-		}
-	}
-}
+/* code reused from SoulSolutions */
+/* retrieved from http://briancaos.wordpress.com/2009/10/16/google-maps-polyline-encoding-in-c/ */
+/* implements the Polyline Encoding Algorithm as defined at
+ * http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.Maps.Internal
+{
+	public class PolylineEncoder
+	{
+		/// <summary>
+		/// Encodes the list of coordinates to a Google Maps encoded coordinate string.
+		/// </summary>
+		/// <param name="coordinates">The coordinates.</param>
+		/// <returns>Encoded coordinate string</returns>
+		public static string EncodeCoordinates(IEnumerable<LatLng> coordinates)
+		{
+			double oneEFive = Convert.ToDouble(1e5);
+
+			int plat = 0;
+			int plng = 0;
+			StringBuilder encodedCoordinates = new StringBuilder();
+
+			foreach(LatLng coordinate in coordinates)
+			{
+				// Round to 5 decimal places and drop the decimal
+				int late5 = (int)(coordinate.Latitude * oneEFive);
+				int lnge5 = (int)(coordinate.Longitude * oneEFive);
+
+				// Encode the differences between the coordinates
+				encodedCoordinates.Append(EncodeSignedNumber(late5 - plat));
+				encodedCoordinates.Append(EncodeSignedNumber(lnge5 - plng));
+
+				// Store the current coordinates
+				plat = late5;
+				plng = lnge5;
+			}
+
+			return encodedCoordinates.ToString();
+		}
+
+		/// <summary>
+		/// Decode encoded polyline information to a collection of <see cref="LatLng"/> instances.
+		/// </summary>
+		/// <param name="value">ASCII string</param>
+		/// <returns></returns>
+		public static IEnumerable<LatLng> Decode(string value)
+		{
+			//decode algorithm adapted from saboor awan via codeproject:
+			//http://www.codeproject.com/Tips/312248/Google-Maps-Direction-API-V3-Polyline-Decoder
+			//note the Code Project Open License at http://www.codeproject.com/info/cpol10.aspx
+
+			if(value == null || value == "") return new List<LatLng>(0);
+
+			char[] polylinechars = value.ToCharArray();
+			int index = 0;
+
+			int currentLat = 0;
+			int currentLng = 0;
+			int next5bits;
+			int sum;
+			int shifter;
+
+			List<LatLng> poly = new List<LatLng>();
+
+			while(index < polylinechars.Length)
+			{
+				// calculate next latitude
+				sum = 0;
+				shifter = 0;
+				do
+				{
+					next5bits = (int)polylinechars[index++] - 63;
+					sum |= (next5bits & 31) << shifter;
+					shifter += 5;
+				} while(next5bits >= 32 && index < polylinechars.Length);
+
+				if(index >= polylinechars.Length)
+					break;
+
+				currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
+
+				//calculate next longitude
+				sum = 0;
+				shifter = 0;
+				do
+				{
+					next5bits = (int)polylinechars[index++] - 63;
+					sum |= (next5bits & 31) << shifter;
+					shifter += 5;
+				} while(next5bits >= 32 && index < polylinechars.Length);
+
+				if(index >= polylinechars.Length && next5bits >= 32)
+					break;
+
+				currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
+				LatLng point = new LatLng(
+					latitude: Convert.ToDouble(currentLat) / 100000.0,
+					longitude: Convert.ToDouble(currentLng) / 100000.0
+				);
+				poly.Add(point);
+			}
+
+			return poly;
+		}
+
+		/// <summary>
+		/// Encode a signed number in the encode format.
+		/// </summary>
+		/// <param name="num">The signed number</param>
+		/// <returns>The encoded string</returns>
+		private static string EncodeSignedNumber(int num)
+		{
+			int sgn_num = num << 1; //shift the binary value
+			if(num < 0) //if negative invert
+			{
+				sgn_num = ~(sgn_num);
+			}
+			return (EncodeNumber(sgn_num));
+		}
+
+		/// <summary>
+		/// Encode an unsigned number in the encode format.
+		/// </summary>
+		/// <param name="num">The unsigned number</param>
+		/// <returns>The encoded string</returns>
+		private static string EncodeNumber(int num)
+		{
+			StringBuilder encodeString = new StringBuilder();
+			while(num >= 0x20)
+			{
+				encodeString.Append((char)((0x20 | (num & 0x1f)) + 63));
+				num >>= 5;
+			}
+			encodeString.Append((char)(num + 63));
+			// All backslashes needs to be replaced with double backslashes
+			// before being used in a Javascript string.
+			return encodeString.ToString();
+		}
+	}
+}
diff --git a/src/Google.Maps/Internal/RequestUtils.cs b/src/Google.Maps/Internal/RequestUtils.cs
index 467bcca..ed8e1ab 100644
--- a/src/Google.Maps/Internal/RequestUtils.cs
+++ b/src/Google.Maps/Internal/RequestUtils.cs
@@ -3,6 +3,8 @@
 using System.Linq;
 using System.Text;
 
+using Google.Maps.Common;
+
 namespace Google.Maps.Internal
 {
 	internal static class RequestUtils
diff --git a/src/Google.Maps/JsonCreationConverter.cs b/src/Google.Maps/Internal/Serialization/JsonCreationConverter.cs
similarity index 75%
rename from src/Google.Maps/JsonCreationConverter.cs
rename to src/Google.Maps/Internal/Serialization/JsonCreationConverter.cs
index d498832..2d2e2c6 100644
--- a/src/Google.Maps/JsonCreationConverter.cs
+++ b/src/Google.Maps/Internal/Serialization/JsonCreationConverter.cs
@@ -4,7 +4,7 @@
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 
-namespace Google.Maps
+namespace Google.Maps.Internal.Serialization
 {
 	public abstract class JsonCreationConverter<T> : JsonConverter
 	{
@@ -31,11 +31,5 @@ public override void WriteJson(JsonWriter writer, object value,
 		}
 	}
 
-	public class JsonLocationConverter : JsonCreationConverter<Location>
-	{
-		protected override Location Create(Type objectType, JObject jsonObject)
-		{
-			return new LatLng(jsonObject.Value<double>("lat"), jsonObject.Value<double>("lng"));
-		}
-	}
+
 }
diff --git a/src/Google.Maps/JsonEnumTypeConverter.cs b/src/Google.Maps/Internal/Serialization/JsonEnumTypeConverter.cs
similarity index 95%
rename from src/Google.Maps/JsonEnumTypeConverter.cs
rename to src/Google.Maps/Internal/Serialization/JsonEnumTypeConverter.cs
index 31de9c0..9f6d9b4 100644
--- a/src/Google.Maps/JsonEnumTypeConverter.cs
+++ b/src/Google.Maps/Internal/Serialization/JsonEnumTypeConverter.cs
@@ -1,568 +1,569 @@
-/*
- * 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 Google.Maps.Geocoding;
-using Google.Maps.Shared;
-using Newtonsoft.Json;
-
-namespace Google.Maps
-{
-
-	public class JsonEnumTypeConverter : JsonConverter
-	{
-		public static ServiceResponseStatus AsResponseStatus(string s)
-		{
-			var result = ServiceResponseStatus.Unknown;
-
-			switch(s)
-			{
-				case "OK":
-					result = ServiceResponseStatus.Ok;
-					break;
-				case "ZERO_RESULTS":
-					result = ServiceResponseStatus.ZeroResults;
-					break;
-				case "OVER_QUERY_LIMIT":
-					result = ServiceResponseStatus.OverQueryLimit;
-					break;
-				case "REQUEST_DENIED":
-					result = ServiceResponseStatus.RequestDenied;
-					break;
-				case "INVALID_REQUEST":
-					result = ServiceResponseStatus.InvalidRequest;
-					break;
-				case "MAX_WAYPOINTS_EXCEEDED":
-					result = ServiceResponseStatus.MaxWaypointsExceeded;
-					break;
-				case "NOT_FOUND":
-					result = ServiceResponseStatus.NotFound;
-					break;
-			}
-
-			return result;
-		}
-
-		public static AddressType AsAddressType(string s)
-		{
-			var result = AddressType.Unknown;
-
-			switch(s)
-			{
-				case "street_address":
-					result = AddressType.StreetAddress;
-					break;
-				case "route":
-					result = AddressType.Route;
-					break;
-				case "intersection":
-					result = AddressType.Intersection;
-					break;
-				case "political":
-					result = AddressType.Political;
-					break;
-				case "country":
-					result = AddressType.Country;
-					break;
-				case "administrative_area_level_1":
-					result = AddressType.AdministrativeAreaLevel1;
-					break;
-				case "administrative_area_level_2":
-					result = AddressType.AdministrativeAreaLevel2;
-					break;
-				case "administrative_area_level_3":
-					result = AddressType.AdministrativeAreaLevel3;
-					break;
-				case "colloquial_area":
-					result = AddressType.ColloquialArea;
-					break;
-				case "locality":
-					result = AddressType.Locality;
-					break;
-				case "sublocality":
-					result = AddressType.Sublocality;
-					break;
-				case "neighborhood":
-					result = AddressType.Neighborhood;
-					break;
-				case "premise":
-					result = AddressType.Premise;
-					break;
-				case "subpremise":
-					result = AddressType.Subpremise;
-					break;
-				case "postal_code":
-					result = AddressType.PostalCode;
-					break;
-				case "postal_town":
-					result = AddressType.PostalTown;
-					break;
-				case "postal_code_prefix":
-					result = AddressType.PostalCodePrefix;
-					break;
-				case "natural_feature":
-					result = AddressType.NaturalFeature;
-					break;
-				case "airport":
-					result = AddressType.Airport;
-					break;
-				case "park":
-					result = AddressType.Park;
-					break;
-				case "point_of_interest":
-					result = AddressType.PointOfInterest;
-					break;
-				case "post_box":
-					result = AddressType.PostBox;
-					break;
-				case "street_number":
-					result = AddressType.StreetNumber;
-					break;
-				case "floor":
-					result = AddressType.Floor;
-					break;
-				case "room":
-					result = AddressType.Room;
-					break;
-			}
-
-			return result;
-		}
-
-		private static Places.PlaceType AsPlaceType(string s)
-		{
-			var result = Places.PlaceType.Unknown;
-			switch(s)
-			{
-				case "accounting":
-					result = Places.PlaceType.Accounting;
-					break;
-				case "airport":
-					result = Places.PlaceType.Airport;
-					break;
-				case "amusement_park":
-					result = Places.PlaceType.AmusementPark;
-					break;
-				case "aquarium":
-					result = Places.PlaceType.Aquarium;
-					break;
-				case "art_gallery":
-					result = Places.PlaceType.ArtGallery;
-					break;
-				case "atm":
-					result = Places.PlaceType.ATM;
-					break;
-				case "bakery":
-					result = Places.PlaceType.Bakery;
-					break;
-				case "bank":
-					result = Places.PlaceType.Bank;
-					break;
-				case "bar":
-					result = Places.PlaceType.Bar;
-					break;
-				case "beauty_salon":
-					result = Places.PlaceType.BeautySalon;
-					break;
-				case "bicycle_store":
-					result = Places.PlaceType.BicycleStore;
-					break;
-				case "book_store":
-					result = Places.PlaceType.BookStore;
-					break;
-				case "bowling_alley":
-					result = Places.PlaceType.BowlingAlley;
-					break;
-				case "bus_station":
-					result = Places.PlaceType.BusStation;
-					break;
-				case "cafe":
-					result = Places.PlaceType.Cafe;
-					break;
-				case "campground":
-					result = Places.PlaceType.Campground;
-					break;
-				case "car_dealer":
-					result = Places.PlaceType.CarDealer;
-					break;
-				case "car_rental":
-					result = Places.PlaceType.CarRental;
-					break;
-				case "car_repair":
-					result = Places.PlaceType.CarRepair;
-					break;
-				case "car_wash":
-					result = Places.PlaceType.CarRepair;
-					break;
-				case "casino":
-					result = Places.PlaceType.Casino;
-					break;
-				case "cemetery":
-					result = Places.PlaceType.Cemetery;
-					break;
-				case "church":
-					result = Places.PlaceType.Church;
-					break;
-				case "city_hall":
-					result = Places.PlaceType.CityHall;
-					break;
-				case "clothing_store":
-					result = Places.PlaceType.ClothingStore;
-					break;
-				case "convenience_store":
-					result = Places.PlaceType.ConvenienceStore;
-					break;
-				case "courthouse":
-					result = Places.PlaceType.CourtHouse;
-					break;
-				case "dentist":
-					result = Places.PlaceType.Dentist;
-					break;
-				case "department_store":
-					result = Places.PlaceType.DepartmentStore;
-					break;
-				case "doctor":
-					result = Places.PlaceType.Doctor;
-					break;
-				case "electrician":
-					result = Places.PlaceType.Electrician;
-					break;
-				case "electronics_store":
-					result = Places.PlaceType.ElectronicsStore;
-					break;
-				case "embassy":
-					result = Places.PlaceType.Embassy;
-					break;
-				case "fire_station":
-					result = Places.PlaceType.FireStation;
-					break;
-				case "florist":
-					result = Places.PlaceType.Florist;
-					break;
-				case "funeral_home":
-					result = Places.PlaceType.FuneralHome;
-					break;
-				case "furniture_store":
-					result = Places.PlaceType.FurnitureStore;
-					break;
-				case "gas_station":
-					result = Places.PlaceType.GasStation;
-					break;
-				case "gym":
-					result = Places.PlaceType.Gym;
-					break;
-				case "hair_care":
-					result = Places.PlaceType.HairCare;
-					break;
-				case "hardware_store":
-					result = Places.PlaceType.HardwareStore;
-					break;
-				case "hindu_temple":
-					result = Places.PlaceType.HinduTemple;
-					break;
-				case "home_goods_store":
-					result = Places.PlaceType.HomeGoodsStore;
-					break;
-				case "hospital":
-					result = Places.PlaceType.Hospital;
-					break;
-				case "insurance_agency":
-					result = Places.PlaceType.InsuranceAgency;
-					break;
-				case "jewelry_store":
-					result = Places.PlaceType.JewelryStore;
-					break;
-				case "laundry":
-					result = Places.PlaceType.Laundry;
-					break;
-				case "lawyer":
-					result = Places.PlaceType.Lawyer;
-					break;
-				case "library":
-					result = Places.PlaceType.Library;
-					break;
-				case "liquor_store":
-					result = Places.PlaceType.LiquorStore;
-					break;
-				case "local_government_office":
-					result = Places.PlaceType.LocalGovermentOffice;
-					break;
-				case "locksmith":
-					result = Places.PlaceType.Locksmith;
-					break;
-				case "lodging":
-					result = Places.PlaceType.Lodging;
-					break;
-				case "meal_delivery":
-					result = Places.PlaceType.MealDelivery;
-					break;
-				case "meal_takeaway":
-					result = Places.PlaceType.MealTakeaway;
-					break;
-				case "mosque":
-					result = Places.PlaceType.Mosque;
-					break;
-				case "movie_rental":
-					result = Places.PlaceType.MovieRental;
-					break;
-				case "movie_theater":
-					result = Places.PlaceType.MovieTheater;
-					break;
-				case "moving_company":
-					result = Places.PlaceType.MovingCompany;
-					break;
-				case "museum":
-					result = Places.PlaceType.Museum;
-					break;
-				case "night_club":
-					result = Places.PlaceType.NightClub;
-					break;
-				case "painter":
-					result = Places.PlaceType.Painter;
-					break;
-				case "park":
-					result = Places.PlaceType.Park;
-					break;
-				case "parking":
-					result = Places.PlaceType.Parking;
-					break;
-				case "pet_store":
-					result = Places.PlaceType.PetStore;
-					break;
-				case "pharmacy":
-					result = Places.PlaceType.Pharmacy;
-					break;
-				case "physiotherapist":
-					result = Places.PlaceType.Physiotherapist;
-					break;
-				case "plumber":
-					result = Places.PlaceType.Plumber;
-					break;
-				case "police":
-					result = Places.PlaceType.Police;
-					break;
-				case "post_office":
-					result = Places.PlaceType.PostOffice;
-					break;
-				case "real_estate_agency":
-					result = Places.PlaceType.RealEstateAgency;
-					break;
-				case "restaurant":
-					result = Places.PlaceType.Restaurant;
-					break;
-				case "roofing_contractor":
-					result = Places.PlaceType.RoofingContractor;
-					break;
-				case "rv_park":
-					result = Places.PlaceType.RVPark;
-					break;
-				case "school":
-					result = Places.PlaceType.School;
-					break;
-				case "shoe_store":
-					result = Places.PlaceType.ShoeStore;
-					break;
-				case "shopping_mall":
-					result = Places.PlaceType.ShoppingMall;
-					break;
-				case "spa":
-					result = Places.PlaceType.Spa;
-					break;
-				case "stadium":
-					result = Places.PlaceType.Stadium;
-					break;
-				case "storage":
-					result = Places.PlaceType.Storage;
-					break;
-				case "store":
-					result = Places.PlaceType.Store;
-					break;
-				case "subway_station":
-					result = Places.PlaceType.SubwayStation;
-					break;
-				case "synagogue":
-					result = Places.PlaceType.Synagogue;
-					break;
-				case "taxi_stand":
-					result = Places.PlaceType.TaxiStand;
-					break;
-				case "train_station":
-					result = Places.PlaceType.TrainStation;
-					break;
-				case "travel_agency":
-					result = Places.PlaceType.TravelAgency;
-					break;
-				case "university":
-					result = Places.PlaceType.University;
-					break;
-				case "veterinary_care":
-					result = Places.PlaceType.VeterinaryCare;
-					break;
-				case "zoo":
-					result = Places.PlaceType.Zoo;
-					break;
-				case "administrative_area_level_1":
-					result = Places.PlaceType.AdministrativeAreaLevel1;
-					break;
-				case "administrative_area_level_2":
-					result = Places.PlaceType.AdministrativeAreaLevel2;
-					break;
-				case "administrative_area_level_3":
-					result = Places.PlaceType.AdministrativeAreaLevel3;
-					break;
-				case "colloquial_area":
-					result = Places.PlaceType.ColloquialArea;
-					break;
-				case "country":
-					result = Places.PlaceType.Country;
-					break;
-				case "floor":
-					result = Places.PlaceType.Floor;
-					break;
-				case "geocode":
-					result = Places.PlaceType.Geocode;
-					break;
-				case "intersection":
-					result = Places.PlaceType.Intersection;
-					break;
-				case "locality":
-					result = Places.PlaceType.Locality;
-					break;
-				case "natural_feature":
-					result = Places.PlaceType.NaturalFeature;
-					break;
-				case "neighborhood":
-					result = Places.PlaceType.Neighborhood;
-					break;
-				case "political":
-					result = Places.PlaceType.Political;
-					break;
-				case "point_of_interest":
-					result = Places.PlaceType.PointOfInterest;
-					break;
-				case "post_box":
-					result = Places.PlaceType.PostBox;
-					break;
-				case "postal_code":
-					result = Places.PlaceType.PostalCode;
-					break;
-				case "postal_code_prefix":
-					result = Places.PlaceType.PostalCodePrefix;
-					break;
-				case "postal_town":
-					result = Places.PlaceType.PostalTown;
-					break;
-				case "premise":
-					result = Places.PlaceType.Premise;
-					break;
-				case "room":
-					result = Places.PlaceType.Room;
-					break;
-				case "route":
-					result = Places.PlaceType.Route;
-					break;
-				case "street_address":
-					result = Places.PlaceType.StreetAddress;
-					break;
-				case "street_number":
-					result = Places.PlaceType.StreetNumber;
-					break;
-				case "sublocality":
-					result = Places.PlaceType.Sublocality;
-					break;
-				case "sublocality_level_4":
-					result = Places.PlaceType.SublocalityLevel4;
-					break;
-				case "sublocality_level_5":
-					result = Places.PlaceType.SublocalityLevel5;
-					break;
-				case "sublocality_level_3":
-					result = Places.PlaceType.SublocalityLevel3;
-					break;
-				case "sublocality_level_2":
-					result = Places.PlaceType.SublocalityLevel2;
-					break;
-				case "sublocality_level_1":
-					result = Places.PlaceType.SublocalityLevel1;
-					break;
-				case "subpremise":
-					result = Places.PlaceType.Subpremise;
-					break;
-				case "transit_station":
-					result = Places.PlaceType.TransitStation;
-					break;
-			}
-			return result;
-		}
-
-		public static LocationType AsLocationType(string s)
-		{
-			var result = LocationType.Unknown;
-
-			switch(s)
-			{
-				case "ROOFTOP":
-					result = LocationType.Rooftop;
-					break;
-				case "RANGE_INTERPOLATED":
-					result = LocationType.RangeInterpolated;
-					break;
-				case "GEOMETRIC_CENTER":
-					result = LocationType.GeometricCenter;
-					break;
-				case "APPROXIMATE":
-					result = LocationType.Approximate;
-					break;
-			}
-
-			return result;
-		}
-
-		public override bool CanConvert(Type objectType)
-		{
-			return
-				objectType == typeof(ServiceResponseStatus)
-				|| objectType == typeof(AddressType)
-				|| objectType == typeof(LocationType)
-				|| objectType == typeof(Places.PlaceType);
-		}
-
-		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
-		{
-			object result = null;
-
-			if(objectType == typeof(ServiceResponseStatus))
-				result = AsResponseStatus(reader.Value.ToString());
-
-			if(objectType == typeof(AddressType))
-				result = AsAddressType(reader.Value.ToString());
-
-			if(objectType == typeof(LocationType))
-				result = AsLocationType(reader.Value.ToString());
-
-			if(objectType == typeof(Places.PlaceType))
-				result = AsPlaceType(reader.Value.ToString());
-
-			return result;
-		}
-
-		public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
-		{
-			throw new System.NotImplementedException();
-		}
-	}
-}
+/*
+ * 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 Google.Maps;
+using Google.Maps.Common;
+
+namespace Google.Maps.Internal.Serialization
+{
+
+	public class JsonEnumTypeConverter : JsonConverter
+	{
+		public static ServiceResponseStatus AsResponseStatus(string s)
+		{
+			var result = ServiceResponseStatus.Unknown;
+
+			switch(s)
+			{
+				case "OK":
+					result = ServiceResponseStatus.Ok;
+					break;
+				case "ZERO_RESULTS":
+					result = ServiceResponseStatus.ZeroResults;
+					break;
+				case "OVER_QUERY_LIMIT":
+					result = ServiceResponseStatus.OverQueryLimit;
+					break;
+				case "REQUEST_DENIED":
+					result = ServiceResponseStatus.RequestDenied;
+					break;
+				case "INVALID_REQUEST":
+					result = ServiceResponseStatus.InvalidRequest;
+					break;
+				case "MAX_WAYPOINTS_EXCEEDED":
+					result = ServiceResponseStatus.MaxWaypointsExceeded;
+					break;
+				case "NOT_FOUND":
+					result = ServiceResponseStatus.NotFound;
+					break;
+			}
+
+			return result;
+		}
+
+		public static AddressType AsAddressType(string s)
+		{
+			var result = AddressType.Unknown;
+
+			switch(s)
+			{
+				case "street_address":
+					result = AddressType.StreetAddress;
+					break;
+				case "route":
+					result = AddressType.Route;
+					break;
+				case "intersection":
+					result = AddressType.Intersection;
+					break;
+				case "political":
+					result = AddressType.Political;
+					break;
+				case "country":
+					result = AddressType.Country;
+					break;
+				case "administrative_area_level_1":
+					result = AddressType.AdministrativeAreaLevel1;
+					break;
+				case "administrative_area_level_2":
+					result = AddressType.AdministrativeAreaLevel2;
+					break;
+				case "administrative_area_level_3":
+					result = AddressType.AdministrativeAreaLevel3;
+					break;
+				case "colloquial_area":
+					result = AddressType.ColloquialArea;
+					break;
+				case "locality":
+					result = AddressType.Locality;
+					break;
+				case "sublocality":
+					result = AddressType.Sublocality;
+					break;
+				case "neighborhood":
+					result = AddressType.Neighborhood;
+					break;
+				case "premise":
+					result = AddressType.Premise;
+					break;
+				case "subpremise":
+					result = AddressType.Subpremise;
+					break;
+				case "postal_code":
+					result = AddressType.PostalCode;
+					break;
+				case "postal_town":
+					result = AddressType.PostalTown;
+					break;
+				case "postal_code_prefix":
+					result = AddressType.PostalCodePrefix;
+					break;
+				case "natural_feature":
+					result = AddressType.NaturalFeature;
+					break;
+				case "airport":
+					result = AddressType.Airport;
+					break;
+				case "park":
+					result = AddressType.Park;
+					break;
+				case "point_of_interest":
+					result = AddressType.PointOfInterest;
+					break;
+				case "post_box":
+					result = AddressType.PostBox;
+					break;
+				case "street_number":
+					result = AddressType.StreetNumber;
+					break;
+				case "floor":
+					result = AddressType.Floor;
+					break;
+				case "room":
+					result = AddressType.Room;
+					break;
+			}
+
+			return result;
+		}
+
+		private static Places.PlaceType AsPlaceType(string s)
+		{
+			var result = Places.PlaceType.Unknown;
+			switch(s)
+			{
+				case "accounting":
+					result = Places.PlaceType.Accounting;
+					break;
+				case "airport":
+					result = Places.PlaceType.Airport;
+					break;
+				case "amusement_park":
+					result = Places.PlaceType.AmusementPark;
+					break;
+				case "aquarium":
+					result = Places.PlaceType.Aquarium;
+					break;
+				case "art_gallery":
+					result = Places.PlaceType.ArtGallery;
+					break;
+				case "atm":
+					result = Places.PlaceType.ATM;
+					break;
+				case "bakery":
+					result = Places.PlaceType.Bakery;
+					break;
+				case "bank":
+					result = Places.PlaceType.Bank;
+					break;
+				case "bar":
+					result = Places.PlaceType.Bar;
+					break;
+				case "beauty_salon":
+					result = Places.PlaceType.BeautySalon;
+					break;
+				case "bicycle_store":
+					result = Places.PlaceType.BicycleStore;
+					break;
+				case "book_store":
+					result = Places.PlaceType.BookStore;
+					break;
+				case "bowling_alley":
+					result = Places.PlaceType.BowlingAlley;
+					break;
+				case "bus_station":
+					result = Places.PlaceType.BusStation;
+					break;
+				case "cafe":
+					result = Places.PlaceType.Cafe;
+					break;
+				case "campground":
+					result = Places.PlaceType.Campground;
+					break;
+				case "car_dealer":
+					result = Places.PlaceType.CarDealer;
+					break;
+				case "car_rental":
+					result = Places.PlaceType.CarRental;
+					break;
+				case "car_repair":
+					result = Places.PlaceType.CarRepair;
+					break;
+				case "car_wash":
+					result = Places.PlaceType.CarRepair;
+					break;
+				case "casino":
+					result = Places.PlaceType.Casino;
+					break;
+				case "cemetery":
+					result = Places.PlaceType.Cemetery;
+					break;
+				case "church":
+					result = Places.PlaceType.Church;
+					break;
+				case "city_hall":
+					result = Places.PlaceType.CityHall;
+					break;
+				case "clothing_store":
+					result = Places.PlaceType.ClothingStore;
+					break;
+				case "convenience_store":
+					result = Places.PlaceType.ConvenienceStore;
+					break;
+				case "courthouse":
+					result = Places.PlaceType.CourtHouse;
+					break;
+				case "dentist":
+					result = Places.PlaceType.Dentist;
+					break;
+				case "department_store":
+					result = Places.PlaceType.DepartmentStore;
+					break;
+				case "doctor":
+					result = Places.PlaceType.Doctor;
+					break;
+				case "electrician":
+					result = Places.PlaceType.Electrician;
+					break;
+				case "electronics_store":
+					result = Places.PlaceType.ElectronicsStore;
+					break;
+				case "embassy":
+					result = Places.PlaceType.Embassy;
+					break;
+				case "fire_station":
+					result = Places.PlaceType.FireStation;
+					break;
+				case "florist":
+					result = Places.PlaceType.Florist;
+					break;
+				case "funeral_home":
+					result = Places.PlaceType.FuneralHome;
+					break;
+				case "furniture_store":
+					result = Places.PlaceType.FurnitureStore;
+					break;
+				case "gas_station":
+					result = Places.PlaceType.GasStation;
+					break;
+				case "gym":
+					result = Places.PlaceType.Gym;
+					break;
+				case "hair_care":
+					result = Places.PlaceType.HairCare;
+					break;
+				case "hardware_store":
+					result = Places.PlaceType.HardwareStore;
+					break;
+				case "hindu_temple":
+					result = Places.PlaceType.HinduTemple;
+					break;
+				case "home_goods_store":
+					result = Places.PlaceType.HomeGoodsStore;
+					break;
+				case "hospital":
+					result = Places.PlaceType.Hospital;
+					break;
+				case "insurance_agency":
+					result = Places.PlaceType.InsuranceAgency;
+					break;
+				case "jewelry_store":
+					result = Places.PlaceType.JewelryStore;
+					break;
+				case "laundry":
+					result = Places.PlaceType.Laundry;
+					break;
+				case "lawyer":
+					result = Places.PlaceType.Lawyer;
+					break;
+				case "library":
+					result = Places.PlaceType.Library;
+					break;
+				case "liquor_store":
+					result = Places.PlaceType.LiquorStore;
+					break;
+				case "local_government_office":
+					result = Places.PlaceType.LocalGovermentOffice;
+					break;
+				case "locksmith":
+					result = Places.PlaceType.Locksmith;
+					break;
+				case "lodging":
+					result = Places.PlaceType.Lodging;
+					break;
+				case "meal_delivery":
+					result = Places.PlaceType.MealDelivery;
+					break;
+				case "meal_takeaway":
+					result = Places.PlaceType.MealTakeaway;
+					break;
+				case "mosque":
+					result = Places.PlaceType.Mosque;
+					break;
+				case "movie_rental":
+					result = Places.PlaceType.MovieRental;
+					break;
+				case "movie_theater":
+					result = Places.PlaceType.MovieTheater;
+					break;
+				case "moving_company":
+					result = Places.PlaceType.MovingCompany;
+					break;
+				case "museum":
+					result = Places.PlaceType.Museum;
+					break;
+				case "night_club":
+					result = Places.PlaceType.NightClub;
+					break;
+				case "painter":
+					result = Places.PlaceType.Painter;
+					break;
+				case "park":
+					result = Places.PlaceType.Park;
+					break;
+				case "parking":
+					result = Places.PlaceType.Parking;
+					break;
+				case "pet_store":
+					result = Places.PlaceType.PetStore;
+					break;
+				case "pharmacy":
+					result = Places.PlaceType.Pharmacy;
+					break;
+				case "physiotherapist":
+					result = Places.PlaceType.Physiotherapist;
+					break;
+				case "plumber":
+					result = Places.PlaceType.Plumber;
+					break;
+				case "police":
+					result = Places.PlaceType.Police;
+					break;
+				case "post_office":
+					result = Places.PlaceType.PostOffice;
+					break;
+				case "real_estate_agency":
+					result = Places.PlaceType.RealEstateAgency;
+					break;
+				case "restaurant":
+					result = Places.PlaceType.Restaurant;
+					break;
+				case "roofing_contractor":
+					result = Places.PlaceType.RoofingContractor;
+					break;
+				case "rv_park":
+					result = Places.PlaceType.RVPark;
+					break;
+				case "school":
+					result = Places.PlaceType.School;
+					break;
+				case "shoe_store":
+					result = Places.PlaceType.ShoeStore;
+					break;
+				case "shopping_mall":
+					result = Places.PlaceType.ShoppingMall;
+					break;
+				case "spa":
+					result = Places.PlaceType.Spa;
+					break;
+				case "stadium":
+					result = Places.PlaceType.Stadium;
+					break;
+				case "storage":
+					result = Places.PlaceType.Storage;
+					break;
+				case "store":
+					result = Places.PlaceType.Store;
+					break;
+				case "subway_station":
+					result = Places.PlaceType.SubwayStation;
+					break;
+				case "synagogue":
+					result = Places.PlaceType.Synagogue;
+					break;
+				case "taxi_stand":
+					result = Places.PlaceType.TaxiStand;
+					break;
+				case "train_station":
+					result = Places.PlaceType.TrainStation;
+					break;
+				case "travel_agency":
+					result = Places.PlaceType.TravelAgency;
+					break;
+				case "university":
+					result = Places.PlaceType.University;
+					break;
+				case "veterinary_care":
+					result = Places.PlaceType.VeterinaryCare;
+					break;
+				case "zoo":
+					result = Places.PlaceType.Zoo;
+					break;
+				case "administrative_area_level_1":
+					result = Places.PlaceType.AdministrativeAreaLevel1;
+					break;
+				case "administrative_area_level_2":
+					result = Places.PlaceType.AdministrativeAreaLevel2;
+					break;
+				case "administrative_area_level_3":
+					result = Places.PlaceType.AdministrativeAreaLevel3;
+					break;
+				case "colloquial_area":
+					result = Places.PlaceType.ColloquialArea;
+					break;
+				case "country":
+					result = Places.PlaceType.Country;
+					break;
+				case "floor":
+					result = Places.PlaceType.Floor;
+					break;
+				case "geocode":
+					result = Places.PlaceType.Geocode;
+					break;
+				case "intersection":
+					result = Places.PlaceType.Intersection;
+					break;
+				case "locality":
+					result = Places.PlaceType.Locality;
+					break;
+				case "natural_feature":
+					result = Places.PlaceType.NaturalFeature;
+					break;
+				case "neighborhood":
+					result = Places.PlaceType.Neighborhood;
+					break;
+				case "political":
+					result = Places.PlaceType.Political;
+					break;
+				case "point_of_interest":
+					result = Places.PlaceType.PointOfInterest;
+					break;
+				case "post_box":
+					result = Places.PlaceType.PostBox;
+					break;
+				case "postal_code":
+					result = Places.PlaceType.PostalCode;
+					break;
+				case "postal_code_prefix":
+					result = Places.PlaceType.PostalCodePrefix;
+					break;
+				case "postal_town":
+					result = Places.PlaceType.PostalTown;
+					break;
+				case "premise":
+					result = Places.PlaceType.Premise;
+					break;
+				case "room":
+					result = Places.PlaceType.Room;
+					break;
+				case "route":
+					result = Places.PlaceType.Route;
+					break;
+				case "street_address":
+					result = Places.PlaceType.StreetAddress;
+					break;
+				case "street_number":
+					result = Places.PlaceType.StreetNumber;
+					break;
+				case "sublocality":
+					result = Places.PlaceType.Sublocality;
+					break;
+				case "sublocality_level_4":
+					result = Places.PlaceType.SublocalityLevel4;
+					break;
+				case "sublocality_level_5":
+					result = Places.PlaceType.SublocalityLevel5;
+					break;
+				case "sublocality_level_3":
+					result = Places.PlaceType.SublocalityLevel3;
+					break;
+				case "sublocality_level_2":
+					result = Places.PlaceType.SublocalityLevel2;
+					break;
+				case "sublocality_level_1":
+					result = Places.PlaceType.SublocalityLevel1;
+					break;
+				case "subpremise":
+					result = Places.PlaceType.Subpremise;
+					break;
+				case "transit_station":
+					result = Places.PlaceType.TransitStation;
+					break;
+			}
+			return result;
+		}
+
+		public static LocationType AsLocationType(string s)
+		{
+			var result = LocationType.Unknown;
+
+			switch(s)
+			{
+				case "ROOFTOP":
+					result = LocationType.Rooftop;
+					break;
+				case "RANGE_INTERPOLATED":
+					result = LocationType.RangeInterpolated;
+					break;
+				case "GEOMETRIC_CENTER":
+					result = LocationType.GeometricCenter;
+					break;
+				case "APPROXIMATE":
+					result = LocationType.Approximate;
+					break;
+			}
+
+			return result;
+		}
+
+		public override bool CanConvert(Type objectType)
+		{
+			return
+				objectType == typeof(ServiceResponseStatus)
+				|| objectType == typeof(AddressType)
+				|| objectType == typeof(LocationType)
+				|| objectType == typeof(Places.PlaceType);
+		}
+
+		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+		{
+			object result = null;
+
+			if(objectType == typeof(ServiceResponseStatus))
+				result = AsResponseStatus(reader.Value.ToString());
+
+			if(objectType == typeof(AddressType))
+				result = AsAddressType(reader.Value.ToString());
+
+			if(objectType == typeof(LocationType))
+				result = AsLocationType(reader.Value.ToString());
+
+			if(objectType == typeof(Places.PlaceType))
+				result = AsPlaceType(reader.Value.ToString());
+
+			return result;
+		}
+
+		public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+		{
+			throw new System.NotImplementedException();
+		}
+	}
+}
diff --git a/src/Google.Maps/Internal/Serialization/JsonLocationConverter.cs b/src/Google.Maps/Internal/Serialization/JsonLocationConverter.cs
new file mode 100644
index 0000000..46111ac
--- /dev/null
+++ b/src/Google.Maps/Internal/Serialization/JsonLocationConverter.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Newtonsoft.Json.Linq;
+
+namespace Google.Maps.Internal.Serialization
+{
+	public class JsonLatLngConverter : JsonCreationConverter<Location>
+	{
+		protected override Location Create(Type objectType, JObject jsonObject)
+		{
+			return new LatLng(jsonObject.Value<double>("lat"), jsonObject.Value<double>("lng"));
+		}
+	}
+
+}
diff --git a/src/Google.Maps/Internal/ValueTextComparer.cs b/src/Google.Maps/Internal/ValueTextComparer.cs
index 1dc5a15..aea1af9 100644
--- a/src/Google.Maps/Internal/ValueTextComparer.cs
+++ b/src/Google.Maps/Internal/ValueTextComparer.cs
@@ -3,7 +3,10 @@
 using System.Linq;
 using System.Text;
 
-namespace Google.Maps
+using Newtonsoft.Json;
+using Google.Maps.Common;
+
+namespace Google.Maps.Internal
 {
 	public class ValueTextComparer : IComparer<ValueText>
 	{
diff --git a/src/Google.Maps/MapMarker.cs b/src/Google.Maps/MapMarker.cs
index d89aaf4..e01e5b6 100644
--- a/src/Google.Maps/MapMarker.cs
+++ b/src/Google.Maps/MapMarker.cs
@@ -3,6 +3,8 @@
 using System.Text;
 using System.ComponentModel;
 
+using Google.Maps.Common;
+
 namespace Google.Maps
 {
 
@@ -45,7 +47,7 @@ public MapMarkers(params Location[] locations)
 		/// or a predefined color from the set {black, brown, green, purple, yellow, blue, gray, orange, red, white}.
 		/// (optional)
 		/// </summary>
-		public MapColor Color { get; set; }
+		public GColor Color { get; set; }
 
 
 		/// <summary>
diff --git a/src/Google.Maps/MapSize.cs b/src/Google.Maps/MapSize.cs
deleted file mode 100644
index b909e38..0000000
--- a/src/Google.Maps/MapSize.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Google.Maps
-{
-	public struct MapSize
-	{
-		public MapSize(int width, int height)
-		{
-			this.Width = width;
-			this.Height = height;
-		}
-
-		public int Width { get; set; }
-
-		public int Height { get; set; }
-
-#if HAS_SYSTEMDRAWING
-		public static implicit operator MapSize(System.Drawing.Size systemSize)
-		{
-			return new MapSize(systemSize.Width, systemSize.Height);
-		}
-#endif
-
-	}
-}
\ No newline at end of file
diff --git a/src/Google.Maps/MapTypes.cs b/src/Google.Maps/MapTypes.cs
index f795241..dedaab3 100644
--- a/src/Google.Maps/MapTypes.cs
+++ b/src/Google.Maps/MapTypes.cs
@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	/// <summary>
 	/// The available map types for the current Google Maps API.
diff --git a/src/Google.Maps/MarkerSizes.cs b/src/Google.Maps/MarkerSizes.cs
index 31e49e7..698b8f9 100644
--- a/src/Google.Maps/MarkerSizes.cs
+++ b/src/Google.Maps/MarkerSizes.cs
@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace Google.Maps
+namespace Google.Maps.Common
 {
 	/// <summary>
 	/// The set of marker sizes available for the current Google Maps API.
diff --git a/src/Google.Maps/Path.cs b/src/Google.Maps/Path.cs
index f67eddb..1195274 100644
--- a/src/Google.Maps/Path.cs
+++ b/src/Google.Maps/Path.cs
@@ -3,6 +3,8 @@
 using System.Text;
 using System.ComponentModel;
 
+using Google.Maps.Common;
+
 namespace Google.Maps
 {
 	public class Path
@@ -31,7 +33,7 @@ public Path(params Location[] locations)
 		/// (optional) specifies a color either as a 24-bit (example: color=0xFFFFCC) or 32-bit hexadecimal value (example: color=0xFFFFCCFF), 
 		/// or from the set {black, brown, green, purple, yellow, blue, gray, orange, red, white}.  Default opacity appears to be 50%. 
 		/// </summary>
-		public MapColor Color { get; set; }
+		public GColor Color { get; set; }
 
 		/// <summary>
 		/// indicates both that the path marks off a polygonal area and specifies the fill color to use as an overlay within that area. The 
@@ -39,7 +41,7 @@ public Path(params Location[] locations)
 		/// Note, however, that any stroke on the exterior of the filled area will not be closed unless you specifically provide the same 
 		/// beginning and end location.
 		/// </summary>
-		public MapColor FillColor { get; set; }
+		public GColor FillColor { get; set; }
 
 		/// <summary>
 		/// Gets or sets the collection of points for this path
diff --git a/src/Google.Maps/Places/Autocomplete/AutocompleteRequest.cs b/src/Google.Maps/Places/Autocomplete/AutocompleteRequest.cs
index 42b30b7..aea88df 100644
--- a/src/Google.Maps/Places/Autocomplete/AutocompleteRequest.cs
+++ b/src/Google.Maps/Places/Autocomplete/AutocompleteRequest.cs
@@ -4,6 +4,9 @@
 using System.Text;
 using Google.Maps.Internal;
 
+using Google.Maps;
+using Google.Maps.Common;
+
 namespace Google.Maps.Places
 {
 	public class AutocompleteRequest : BaseRequest {
diff --git a/src/Google.Maps/Places/Autocomplete/AutocompleteResponse.cs b/src/Google.Maps/Places/Autocomplete/AutocompleteResponse.cs
index 9b72a35..64b7959 100644
--- a/src/Google.Maps/Places/Autocomplete/AutocompleteResponse.cs
+++ b/src/Google.Maps/Places/Autocomplete/AutocompleteResponse.cs
@@ -1,9 +1,11 @@
-using Newtonsoft.Json;
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
+using Newtonsoft.Json;
+using Google.Maps.Common;
+
 namespace Google.Maps.Places
 {
 	public class AutocompleteResponse
diff --git a/src/Google.Maps/Places/Details/PlaceDetailsRequest.cs b/src/Google.Maps/Places/Details/PlaceDetailsRequest.cs
index 0f9f8b8..f6f557f 100644
--- a/src/Google.Maps/Places/Details/PlaceDetailsRequest.cs
+++ b/src/Google.Maps/Places/Details/PlaceDetailsRequest.cs
@@ -3,6 +3,9 @@
 using System.Linq;
 using System.Text;
 
+using Google.Maps;
+using Google.Maps.Common;
+
 namespace Google.Maps.Places.Details
 {
 	public class PlaceDetailsRequest : BaseRequest
diff --git a/src/Google.Maps/Places/Details/PlaceDetailsResponse.cs b/src/Google.Maps/Places/Details/PlaceDetailsResponse.cs
index 4a64671..69b26bf 100644
--- a/src/Google.Maps/Places/Details/PlaceDetailsResponse.cs
+++ b/src/Google.Maps/Places/Details/PlaceDetailsResponse.cs
@@ -1,9 +1,11 @@
-using Newtonsoft.Json;
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
+using Newtonsoft.Json;
+using Google.Maps.Common;
+
 namespace Google.Maps.Places.Details
 {
 	public class PlaceDetailsResponse
diff --git a/src/Google.Maps/Places/Details/PlaceDetailsResult.cs b/src/Google.Maps/Places/Details/PlaceDetailsResult.cs
index bd135ad..17a9ae0 100644
--- a/src/Google.Maps/Places/Details/PlaceDetailsResult.cs
+++ b/src/Google.Maps/Places/Details/PlaceDetailsResult.cs
@@ -1,5 +1,6 @@
-using Google.Maps.Shared;
+
 using Newtonsoft.Json;
+using Google.Maps.Common;
 
 namespace Google.Maps.Places.Details
 {
diff --git a/src/Google.Maps/Places/NearbySearchRequest.cs b/src/Google.Maps/Places/NearbySearchRequest.cs
index fec1359..c4ed36e 100644
--- a/src/Google.Maps/Places/NearbySearchRequest.cs
+++ b/src/Google.Maps/Places/NearbySearchRequest.cs
@@ -18,6 +18,8 @@
 using System;
 using System.Linq;
 
+using Google.Maps.Common;
+
 namespace Google.Maps.Places
 {
 	/// <summary>
@@ -77,7 +79,7 @@ public override Uri ToUri()
 
 			qsb.Append("location", Location.GetAsUrlParameter());
 
-			if(RankBy.GetValueOrDefault(Maps.RankBy.Prominence) != Maps.RankBy.Distance)
+			if(RankBy.GetValueOrDefault(Google.Maps.Common.RankBy.Prominence) != Google.Maps.Common.RankBy.Distance)
 			{
 				// Note that radius must not be included if rankby=distance
 				qsb.Append("radius", Radius.ToString());
@@ -142,11 +144,11 @@ protected override void ValidateRequest()
 
 			if(Location == null) throw new InvalidOperationException("Location property is not set");
 
-			if(RankBy != null && RankBy != Maps.RankBy.Distance)
+			if(RankBy != null && RankBy != Google.Maps.Common.RankBy.Distance)
 			{
 				if(!Radius.HasValue) throw new ArgumentException("Radius property is not set.");
 			}
-			else if(RankBy != null && RankBy == Maps.RankBy.Distance)
+			else if(RankBy != null && RankBy == Google.Maps.Common.RankBy.Distance)
 			{
 				if(string.IsNullOrEmpty(Keyword) && string.IsNullOrEmpty(Name) && (Types == null || !Types.Any()))
 				{
diff --git a/src/Google.Maps/Places/PlacesRequest.cs b/src/Google.Maps/Places/PlacesRequest.cs
index 3fe23ca..ab41469 100644
--- a/src/Google.Maps/Places/PlacesRequest.cs
+++ b/src/Google.Maps/Places/PlacesRequest.cs
@@ -18,6 +18,10 @@
 using System;
 using System.Linq;
 
+using Google.Maps;
+using Google.Maps.Common;
+
+
 namespace Google.Maps.Places
 {
 	public abstract class PlacesRequest : BaseRequest
diff --git a/src/Google.Maps/Places/PlacesResponse.cs b/src/Google.Maps/Places/PlacesResponse.cs
index 0e8c2e5..855fb5f 100644
--- a/src/Google.Maps/Places/PlacesResponse.cs
+++ b/src/Google.Maps/Places/PlacesResponse.cs
@@ -17,6 +17,7 @@
 
 using Google.Maps.Common;
 using Newtonsoft.Json;
+using Google.Maps.Common;
 
 namespace Google.Maps.Places
 {
diff --git a/src/Google.Maps/Places/PlacesResult.cs b/src/Google.Maps/Places/PlacesResult.cs
index 315948c..41cf49c 100644
--- a/src/Google.Maps/Places/PlacesResult.cs
+++ b/src/Google.Maps/Places/PlacesResult.cs
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-using Google.Maps.Shared;
 using Newtonsoft.Json;
 using System;
+using Google.Maps.Common;
 
 namespace Google.Maps.Places
 {
diff --git a/src/Google.Maps/Places/TextSearchRequest.cs b/src/Google.Maps/Places/TextSearchRequest.cs
index 7baed48..519c23f 100644
--- a/src/Google.Maps/Places/TextSearchRequest.cs
+++ b/src/Google.Maps/Places/TextSearchRequest.cs
@@ -18,6 +18,9 @@
 using System;
 using System.Linq;
 
+using Google.Maps;
+using Google.Maps.Common;
+
 namespace Google.Maps.Places
 {
 	/// <summary>
diff --git a/src/Google.Maps/Roads/SnapToRoadsRequest.cs b/src/Google.Maps/Roads/SnapToRoadsRequest.cs
index 2beefc0..7de659d 100644
--- a/src/Google.Maps/Roads/SnapToRoadsRequest.cs
+++ b/src/Google.Maps/Roads/SnapToRoadsRequest.cs
@@ -1,10 +1,13 @@
 using System;
 using System.Linq;
 
+using Google.Maps;
+using Google.Maps.Common;
+
 namespace Google.Maps.Roads
 {
 	public class SnapToRoadsRequest: BaseRequest
-	{
+	{ 
 		/// <summary>
 		/// The path to be snapped.
 		/// </summary>
diff --git a/src/Google.Maps/StaticMaps/StaticMapRequest.cs b/src/Google.Maps/StaticMaps/StaticMapRequest.cs
index aa46397..18e2ae3 100644
--- a/src/Google.Maps/StaticMaps/StaticMapRequest.cs
+++ b/src/Google.Maps/StaticMaps/StaticMapRequest.cs
@@ -20,6 +20,8 @@
 using System.Collections.Generic;
 
 using Google.Maps.Internal;
+using Google.Maps;
+using Google.Maps.Common;
 
 namespace Google.Maps.StaticMaps
 {
@@ -34,7 +36,7 @@ public class StaticMapRequest : BaseRequest
 	{
 		public StaticMapRequest()
 		{
-			this.Size = new MapSize(512, 512); //default size is 512x512
+			this.Size = new GSize(512, 512); //default size is 512x512
 			this.Visible = new List<Location>(1);
 			this.Markers = new MapMarkersCollection();
 			this.Paths = new List<Path>();
@@ -82,7 +84,7 @@ public int? Zoom
 		/// create a static map that is 100 pixels wide or smaller, the
 		/// "Powered by Google" logo is automatically reduced in size. (required)
 		/// </summary>
-		public MapSize Size
+		public GSize Size
 		{
 			get { return _size; }
 			set
@@ -94,7 +96,7 @@ public MapSize Size
 				this._size = value;
 			}
 		}
-		private MapSize _size;
+		private GSize _size;
 
 		/// <summary>
 		/// affects the number of pixels that are returned. scale=2 returns twice as many pixels as scale=1
@@ -126,7 +128,7 @@ public int? Scale
 		/// greater compression, while GIF and PNG provide greater detail. (optional)
 		/// </summary>
 		/// <remarks>http://code.google.com/apis/maps/documentation/staticmaps/#ImageFormats</remarks>
-		public GMapsImageFormats Format { get; set; }
+		public MapImageFormats Format { get; set; }
 
 		/// <summary>
 		/// Defines the type of map to construct. There are several possible
@@ -205,8 +207,8 @@ public override Uri ToUri()
 			string formatStr = null;
 			switch(this.Format)
 			{
-				case GMapsImageFormats.Unspecified: break;
-				case GMapsImageFormats.JPGbaseline: formatStr = "jpg-baseline"; break;
+				case MapImageFormats.Unspecified: break;
+				case MapImageFormats.JPGbaseline: formatStr = "jpg-baseline"; break;
 				default: formatStr = this.Format.ToString().ToLower(); break;
 			}
 
diff --git a/src/Google.Maps/StreetView/StreetViewRequest.cs b/src/Google.Maps/StreetView/StreetViewRequest.cs
index 17f3d52..0bdf810 100644
--- a/src/Google.Maps/StreetView/StreetViewRequest.cs
+++ b/src/Google.Maps/StreetView/StreetViewRequest.cs
@@ -19,9 +19,12 @@
 using System.Linq;
 using System.Collections.Generic;
 
+using Google.Maps;
+using Google.Maps.Common;
 using Google.Maps.Internal;
 using System.ComponentModel;
 
+
 namespace Google.Maps.StreetView
 {
 	/// <summary>
@@ -35,7 +38,7 @@ public class StreetViewRequest : BaseRequest
 	{
 		public StreetViewRequest()
 		{
-			this.Size = new MapSize(512, 512); //default size is 512x512
+			this.Size = new GSize(512, 512); //default size is 512x512
 		}
 
 		/// <summary>
@@ -58,7 +61,7 @@ public StreetViewRequest()
 		/// Size specifies the output size of the image in pixels.
 		/// For example Size = new MapSize(600,400) returns an image 600 pixels wide, and 400 high.
 		/// </summary>
-		public MapSize Size
+		public GSize Size
 		{
 			get { return _size; }
 			set
@@ -70,7 +73,7 @@ public MapSize Size
 				this._size = value;
 			}
 		}
-		private MapSize _size;
+		private GSize _size;
 
 		/// <summary>
 		/// Defines the format of the resulting image. By default, the Static
@@ -80,7 +83,7 @@ public MapSize Size
 		/// greater compression, while GIF and PNG provide greater detail. (optional)
 		/// </summary>
 		/// <remarks>http://code.google.com/apis/maps/documentation/staticmaps/#ImageFormats</remarks>
-		public GMapsImageFormats Format { get; set; }
+		public MapImageFormats Format { get; set; }
 
 		/// <summary>
 		/// Heading indicates the compass heading of the camera. Accepted values are from 0 to 360
@@ -180,8 +183,8 @@ private void WriteBitmapOutputParameters(QueryStringBuilder qs)
 			string formatStr = null;
 			switch(this.Format)
 			{
-				case GMapsImageFormats.Unspecified: break;
-				case GMapsImageFormats.JPGbaseline: formatStr = "jpg-baseline"; break;
+				case MapImageFormats.Unspecified: break;
+				case MapImageFormats.JPGbaseline: formatStr = "jpg-baseline"; break;
 				default: formatStr = this.Format.ToString().ToLower(); break;
 			}
 
diff --git a/src/Google.Maps/TimeZone/TimeZoneRequest.cs b/src/Google.Maps/TimeZone/TimeZoneRequest.cs
index e4c65fb..f0e4231 100644
--- a/src/Google.Maps/TimeZone/TimeZoneRequest.cs
+++ b/src/Google.Maps/TimeZone/TimeZoneRequest.cs
@@ -16,6 +16,9 @@
 */
 using System;
 
+using Google.Maps;
+using Google.Maps.Common;
+
 namespace Google.Maps.TimeZone
 {
 	/// <summary>
diff --git a/src/Google.Maps/TimeZone/TimeZoneResponse.cs b/src/Google.Maps/TimeZone/TimeZoneResponse.cs
index e28636c..dc04dd9 100644
--- a/src/Google.Maps/TimeZone/TimeZoneResponse.cs
+++ b/src/Google.Maps/TimeZone/TimeZoneResponse.cs
@@ -15,10 +15,12 @@
  * limitations under the License.
  */
 
-using Newtonsoft.Json;
 using System;
 using Google.Maps.Common;
 
+using Newtonsoft.Json;
+using Google.Maps.Common;
+
 namespace Google.Maps.TimeZone
 {
 	[JsonObject(MemberSerialization.OptIn)]
diff --git a/src/Samples/SearchAddressMap/Window1.xaml.cs b/src/Samples/SearchAddressMap/Window1.xaml.cs
index 5b305a5..7c54140 100644
--- a/src/Samples/SearchAddressMap/Window1.xaml.cs
+++ b/src/Samples/SearchAddressMap/Window1.xaml.cs
@@ -12,6 +12,8 @@
 using System.Net.Http;
 using System.IO;
 
+using Google.Maps.Common;
+
 namespace SearchAddressMap
 {
 	/// <summary>
@@ -46,7 +48,7 @@ private void refreshMap(Location location, Image imageControl)
 			{
 				Center = location
 				,Zoom = Convert.ToInt32(zoomSlider.Value)
-				,Size = new MapSize(Convert.ToInt32(imageControl.Width), Convert.ToInt32(imageControl.Height))
+				,Size = new GSize(Convert.ToInt32(imageControl.Width), Convert.ToInt32(imageControl.Height))
 				,MapType = (MapTypes)Enum.Parse(typeof(MapTypes), ((ComboBoxItem)mapTypeComboBox.SelectedItem).Content.ToString(), true)
 			};
 			request.Markers.Add(request.Center);
@@ -68,7 +70,7 @@ private void refreshStreetView(Location location, Image imageControl)
 			{
 				Location = location
 				//,Zoom = Convert.ToInt32(zoomSlider.Value),
-				, Size = new MapSize(Convert.ToInt32(imageControl.Width), Convert.ToInt32(imageControl.Height))
+				, Size = new GSize(Convert.ToInt32(imageControl.Width), Convert.ToInt32(imageControl.Height))
 				//,MapType = (MapTypes)Enum.Parse(typeof(MapTypes), ((ComboBoxItem)mapTypeComboBox.SelectedItem).Content.ToString(), true)
 				, Heading = Convert.ToInt16(Convert.ToInt16(headingSlider.Value) + 180)
 				, Pitch = Convert.ToInt16(Convert.ToInt16(pitchSlider.Value))