diff --git a/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/App.xaml.cs b/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/App.xaml.cs
index 40fe792..28bf121 100644
--- a/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/App.xaml.cs
+++ b/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/App.xaml.cs
@@ -24,23 +24,25 @@ public App()
                 {
                     Model = new PlotModel
                     {
-                        Title = "OxyPlot in Xamarin Forms.",
+                        Title = "OxyPlot in Xamarin.Forms",
                         Axes =
                         {
-                            new CategoryAxis {Position = AxisPosition.Bottom},
-                            new LinearAxis {Position = AxisPosition.Left, MinimumPadding = 0}
+                            new CategoryAxis {Position = AxisPosition.Bottom, Key = "Y" },
+                            new LinearAxis {Position = AxisPosition.Left, Key = "X", MinimumPadding = 0}
                         },
                         Series =
                         {
-                            new ColumnSeries
+                            new BarSeries
                             {
+                                XAxisKey = "X",
+                                YAxisKey = "Y",
                                 Items =
                                 {
-                                    new ColumnItem {Value = 3},
-                                    new ColumnItem {Value = 14},
-                                    new ColumnItem {Value = 11},
-                                    new ColumnItem {Value = 12},
-                                    new ColumnItem {Value = 7}
+                                    new BarItem {Value = 3},
+                                    new BarItem {Value = 14},
+                                    new BarItem {Value = 11},
+                                    new BarItem {Value = 12},
+                                    new BarItem {Value = 7}
                                 }
                             }
                         }
diff --git a/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/SimpleDemo.csproj b/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/SimpleDemo.csproj
index 1125e9f..5ce42dc 100644
--- a/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/SimpleDemo.csproj
+++ b/Source/Examples/Xamarin.Forms/SimpleDemo/SimpleDemo/SimpleDemo.csproj
@@ -3,7 +3,7 @@
     netstandard2.0
   
   
-    
+    
     
     
   
diff --git a/Source/OxyPlot.Windows/OxyPlot.Windows.csproj b/Source/OxyPlot.Windows/OxyPlot.Windows.csproj
index 39d0ed0..8b3ad73 100644
--- a/Source/OxyPlot.Windows/OxyPlot.Windows.csproj
+++ b/Source/OxyPlot.Windows/OxyPlot.Windows.csproj
@@ -16,6 +16,6 @@
         
     
     
-      
+      
     
 
diff --git a/Source/OxyPlot.Windows/PlotView.cs b/Source/OxyPlot.Windows/PlotView.cs
index 976d110..03bae3f 100644
--- a/Source/OxyPlot.Windows/PlotView.cs
+++ b/Source/OxyPlot.Windows/PlotView.cs
@@ -914,7 +914,8 @@ private void UpdateVisuals()
 
             if (this.ActualModel != null)
             {
-                ((IPlotModel)this.ActualModel).Render(this.renderContext, this.canvas.ActualWidth, this.canvas.ActualHeight);
+                OxyRect rect = new OxyRect(0, 0, canvas.ActualWidth, canvas.ActualHeight);
+                ((IPlotModel)this.ActualModel).Render(this.renderContext, rect);
             }
         }
 
diff --git a/Source/OxyPlot.Windows/RenderContext.cs b/Source/OxyPlot.Windows/RenderContext.cs
index 5dc685a..1768439 100644
--- a/Source/OxyPlot.Windows/RenderContext.cs
+++ b/Source/OxyPlot.Windows/RenderContext.cs
@@ -29,7 +29,7 @@ namespace OxyPlot.Windows
     /// 
     /// Implements  for .
     /// 
-    public class RenderContext : IRenderContext
+    public class RenderContext : ClippingRenderContext
     {
         /// 
         /// The brush cache.
@@ -102,12 +102,6 @@ public bool PaintBackground
         /// The width.
         public double Width { get; private set; }
 
-        /// 
-        /// Gets or sets a value indicating whether the context renders to screen.
-        /// 
-        /// true if the context renders to screen; otherwise, false.
-        public bool RendersToScreen { get; set; }
-
         /// 
         /// Draws an ellipse.
         /// 
@@ -185,20 +179,14 @@ public void DrawEllipses(IList rectangles, OxyColor fill, OxyColor stro
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// if set to true the shape will be aliased.
-        public void DrawLine(
-            IList points,
-            OxyColor stroke,
-            double thickness,
-            double[] dashArray,
-            LineJoin lineJoin,
-            bool aliased)
+        public override void DrawLine(IList points, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             var e = new Polyline
             {
                 CompositeMode = ElementCompositeMode.SourceOver
             };
 
+            bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
             this.SetStroke(e, stroke, thickness, lineJoin, dashArray, aliased);
 
             var pc = new PointCollection();
@@ -270,20 +258,14 @@ public void DrawLineSegments(
         /// The dash array.
         /// The line join type.
         /// if set to true the shape will be aliased.
-        public void DrawPolygon(
-            IList points,
-            OxyColor fill,
-            OxyColor stroke,
-            double thickness,
-            double[] dashArray,
-            LineJoin lineJoin,
-            bool aliased)
+        public override void DrawPolygon(IList points, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             var po = new Polygon
             {
                 CompositeMode = ElementCompositeMode.SourceOver
             };
 
+            bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
             this.SetStroke(po, stroke, thickness, lineJoin, dashArray, aliased);
 
             if (fill.IsVisible())
@@ -434,7 +416,7 @@ public void DrawRectangles(IList rectangles, OxyColor fill, OxyColor st
         /// The horizontal alignment.
         /// The vertical alignment.
         /// The maximum size of the text.
-        public void DrawText(
+        public override void DrawText(
             ScreenPoint p,
             string text,
             OxyColor fill,
@@ -532,7 +514,7 @@ public void DrawText(
         /// Size of the font.
         /// The font weight.
         /// The text size.
-        public OxySize MeasureText(string text, string fontFamily, double fontSize, double fontWeight)
+        public override OxySize MeasureText(string text, string fontFamily, double fontSize, double fontWeight)
         {
             if (string.IsNullOrEmpty(text))
             {
@@ -562,7 +544,7 @@ public OxySize MeasureText(string text, string fontFamily, double fontSize, doub
         /// Sets the tool tip for the following items.
         /// 
         /// The text in the tooltip.
-        public void SetToolTip(string text)
+        public override void SetToolTip(string text)
         {
             this.currentToolTip = text;
         }
@@ -581,7 +563,7 @@ public void SetToolTip(string text)
         /// The height of the drawn image.
         /// The opacity.
         /// interpolate if set to true.
-        public void DrawImage(
+        public override void DrawImage(
             OxyImage source,
             double srcX,
             double srcY,
@@ -633,17 +615,16 @@ public void DrawImage(
         /// 
         /// The clipping rectangle.
         /// True if the clipping rectangle was set.
-        public bool SetClip(OxyRect clippingRect)
+        protected override void SetClip(OxyRect clippingRect)
         {
             this.clipRect = clippingRect.ToRect(false);
             this.clip = true;
-            return true;
         }
 
         /// 
         /// Resets the clipping rectangle.
         /// 
-        public void ResetClip()
+        protected override void ResetClip()
         {
             this.clip = false;
         }
@@ -652,7 +633,7 @@ public void ResetClip()
         /// Cleans up resources not in use.
         /// 
         /// This method is called at the end of each rendering.
-        public void CleanUp()
+        public override void CleanUp()
         {
             // Find the images in the cache that has not been used since last call to this method
             var imagesToRelease = this.imageCache.Keys.Where(i => !this.imagesInUse.Contains(i)).ToList();
diff --git a/Source/OxyPlot.Xamarin.Android/CanvasRenderContext.cs b/Source/OxyPlot.Xamarin.Android/CanvasRenderContext.cs
index 8ebabea..a14a2d6 100644
--- a/Source/OxyPlot.Xamarin.Android/CanvasRenderContext.cs
+++ b/Source/OxyPlot.Xamarin.Android/CanvasRenderContext.cs
@@ -17,7 +17,7 @@ namespace OxyPlot.Xamarin.Android
     /// 
     /// Provides a render context for Android.Graphics.Canvas.
     /// 
-    public class CanvasRenderContext : RenderContextBase
+    public class CanvasRenderContext : ClippingRenderContext
     {
         /// 
         /// The images in use
@@ -96,10 +96,11 @@ public void SetTarget(Canvas c)
         /// The fill color.
         /// The stroke color.
         /// The thickness.
-        public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
             this.paint.Reset();
             {
+                bool aliased = this.ShouldUseAntiAliasingForEllipse(erm);
                 if (fill.IsVisible())
                 {
                     this.SetFill(fill);
@@ -108,7 +109,7 @@ public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, d
 
                 if (stroke.IsVisible())
                 {
-                    this.SetStroke(stroke, thickness);
+                    this.SetStroke(stroke, thickness, aliased: aliased);
                     this.canvas.DrawOval(this.Convert(rect), this.paint);
                 }
             }
@@ -122,10 +123,11 @@ public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, d
         /// The fill color.
         /// The stroke color.
         /// The stroke thickness.
-        public override void DrawEllipses(IList rectangles, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawEllipses(IList rectangles, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
             this.paint.Reset();
             {
+                bool aliased = this.ShouldUseAntiAliasingForEllipse(erm);
                 foreach (var rect in rectangles)
                 {
                     if (fill.IsVisible())
@@ -136,7 +138,7 @@ public override void DrawEllipses(IList rectangles, OxyColor fill, OxyC
 
                     if (stroke.IsVisible())
                     {
-                        this.SetStroke(stroke, thickness);
+                        this.SetStroke(stroke, thickness, aliased: aliased);
                         this.canvas.DrawOval(this.Convert(rect), this.paint);
                     }
                 }
@@ -151,13 +153,13 @@ public override void DrawEllipses(IList rectangles, OxyColor fill, OxyC
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// if set to true the shape will be aliased.
-        public override void DrawLine(IList points, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawLine(IList points, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             this.paint.Reset();
             {
                 this.path.Reset();
                 {
+                    bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
                     this.SetPath(points, aliased);
                     this.SetStroke(stroke, thickness, dashArray, lineJoin, aliased);
                     this.canvas.DrawPath(this.path, this.paint);
@@ -175,10 +177,11 @@ public override void DrawLine(IList points, OxyColor stroke, double
         /// The dash array.
         /// The line join type.
         /// If set to true the shape will be aliased.
-        public override void DrawLineSegments(IList points, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawLineSegments(IList points, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             this.paint.Reset();
             {
+                bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
                 this.SetStroke(stroke, thickness, dashArray, lineJoin, aliased);
                 this.pts.Clear();
                 if (aliased)
@@ -212,12 +215,13 @@ public override void DrawLineSegments(IList points, OxyColor stroke
         /// The dash array.
         /// The line join type.
         /// If set to true the shape will be aliased.
-        public override void DrawPolygon(IList points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawPolygon(IList points, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             this.paint.Reset();
             {
                 this.path.Reset();
                 {
+                    bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
                     this.SetPath(points, aliased);
                     this.path.Close();
 
@@ -243,20 +247,27 @@ public override void DrawPolygon(IList points, OxyColor fill, OxyCo
         /// The fill color.
         /// The stroke color.
         /// The stroke thickness.
-        public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
             this.paint.Reset();
             {
+                bool aliased = this.ShouldUseAntiAliasingForRect(erm);
                 if (fill.IsVisible())
                 {
                     this.SetFill(fill);
-                    this.canvas.DrawRect(this.ConvertAliased(rect.Left), this.ConvertAliased(rect.Top), this.ConvertAliased(rect.Right), this.ConvertAliased(rect.Bottom), this.paint);
+                    if (aliased) 
+                        this.canvas.DrawRect(this.ConvertAliased(rect.Left), this.ConvertAliased(rect.Top), this.ConvertAliased(rect.Right), this.ConvertAliased(rect.Bottom), this.paint);
+                    else
+                        this.canvas.DrawRect(this.Convert(rect.Left), this.Convert(rect.Top), this.Convert(rect.Right), this.Convert(rect.Bottom), this.paint);
                 }
 
                 if (stroke.IsVisible())
                 {
-                    this.SetStroke(stroke, thickness, aliased: true);
-                    this.canvas.DrawRect(this.ConvertAliased(rect.Left), this.ConvertAliased(rect.Top), this.ConvertAliased(rect.Right), this.ConvertAliased(rect.Bottom), this.paint);
+                    this.SetStroke(stroke, thickness, aliased: aliased);
+                    if (aliased)
+                        this.canvas.DrawRect(this.ConvertAliased(rect.Left), this.ConvertAliased(rect.Top), this.ConvertAliased(rect.Right), this.ConvertAliased(rect.Bottom), this.paint);
+                    else
+                        this.canvas.DrawRect(this.Convert(rect.Left), this.Convert(rect.Top), this.Convert(rect.Right), this.Convert(rect.Bottom), this.paint);
                 }
             }
         }
@@ -366,17 +377,16 @@ public override OxySize MeasureText(string text, string fontFamily, double fontS
         /// 
         /// The clip rectangle.
         /// True if the clip rectangle was set.
-        public override bool SetClip(OxyRect rect)
+        protected override void SetClip(OxyRect rect)
         {
             this.canvas.Save();
             this.canvas.ClipRect(this.Convert(rect));
-            return true;
         }
 
         /// 
         /// Resets the clip rectangle.
         /// 
-        public override void ResetClip()
+        protected override void ResetClip()
         {
             this.canvas.Restore();
         }
diff --git a/Source/OxyPlot.Xamarin.Android/OxyPlot.Xamarin.Android.csproj b/Source/OxyPlot.Xamarin.Android/OxyPlot.Xamarin.Android.csproj
index 6eaa098..e5db9e7 100644
--- a/Source/OxyPlot.Xamarin.Android/OxyPlot.Xamarin.Android.csproj
+++ b/Source/OxyPlot.Xamarin.Android/OxyPlot.Xamarin.Android.csproj
@@ -73,7 +73,7 @@
       all
     
     
-      2.0.0
+      2.1.0
     
     
       4.3.0
diff --git a/Source/OxyPlot.Xamarin.Android/PlotView.cs b/Source/OxyPlot.Xamarin.Android/PlotView.cs
index 68d2183..00aae6a 100644
--- a/Source/OxyPlot.Xamarin.Android/PlotView.cs
+++ b/Source/OxyPlot.Xamarin.Android/PlotView.cs
@@ -354,8 +354,9 @@ protected override void OnDraw(Canvas canvas)
                 }
 
                 this.rc.SetTarget(canvas);
-                
-                ((IPlotModel)actualModel).Render(this.rc, Width / Scale, Height / Scale);
+
+                OxyRect rect = new OxyRect(0, 0, Width / Scale, Height / Scale);
+                ((IPlotModel)actualModel).Render(this.rc, rect);
             }
         }
 
diff --git a/Source/OxyPlot.Xamarin.Forms.Platform.Android/OxyPlot.Xamarin.Forms.Platform.Android.csproj b/Source/OxyPlot.Xamarin.Forms.Platform.Android/OxyPlot.Xamarin.Forms.Platform.Android.csproj
index 471552f..bd851e0 100644
--- a/Source/OxyPlot.Xamarin.Forms.Platform.Android/OxyPlot.Xamarin.Forms.Platform.Android.csproj
+++ b/Source/OxyPlot.Xamarin.Forms.Platform.Android/OxyPlot.Xamarin.Forms.Platform.Android.csproj
@@ -59,7 +59,7 @@
     
   
   
-    
+    
     
     
     
@@ -85,4 +85,4 @@
     
   
   
-
\ No newline at end of file
+
diff --git a/Source/OxyPlot.Xamarin.Forms.Platform.MacOS/OxyPlot.Xamarin.Forms.Platform.MacOS.csproj b/Source/OxyPlot.Xamarin.Forms.Platform.MacOS/OxyPlot.Xamarin.Forms.Platform.MacOS.csproj
index 44f93ba..b2563ab 100644
--- a/Source/OxyPlot.Xamarin.Forms.Platform.MacOS/OxyPlot.Xamarin.Forms.Platform.MacOS.csproj
+++ b/Source/OxyPlot.Xamarin.Forms.Platform.MacOS/OxyPlot.Xamarin.Forms.Platform.MacOS.csproj
@@ -64,6 +64,7 @@
   
     
     
+    
   
   
     
@@ -74,16 +75,14 @@
     
   
   
-    
+    
     
+    
     
       0.2.2
       runtime; build; native; contentfiles; analyzers; buildtransitive
       all
     
-    
-      5.0.0.2545
-    
   
   
     
@@ -100,4 +99,4 @@
     
   
   
-
\ No newline at end of file
+
diff --git a/Source/OxyPlot.Xamarin.Forms.Platform.UWP/OxyPlot.Xamarin.Forms.Platform.UWP.csproj b/Source/OxyPlot.Xamarin.Forms.Platform.UWP/OxyPlot.Xamarin.Forms.Platform.UWP.csproj
index 67170ec..46b7450 100644
--- a/Source/OxyPlot.Xamarin.Forms.Platform.UWP/OxyPlot.Xamarin.Forms.Platform.UWP.csproj
+++ b/Source/OxyPlot.Xamarin.Forms.Platform.UWP/OxyPlot.Xamarin.Forms.Platform.UWP.csproj
@@ -123,7 +123,7 @@
       6.2.12
     
     
-      2.0.0
+      2.1.0
     
     
       5.0.0.2545
diff --git a/Source/OxyPlot.Xamarin.Forms.Platform.iOS/OxyPlot.Xamarin.Forms.Platform.iOS.csproj b/Source/OxyPlot.Xamarin.Forms.Platform.iOS/OxyPlot.Xamarin.Forms.Platform.iOS.csproj
index f33e41c..53c14d2 100644
--- a/Source/OxyPlot.Xamarin.Forms.Platform.iOS/OxyPlot.Xamarin.Forms.Platform.iOS.csproj
+++ b/Source/OxyPlot.Xamarin.Forms.Platform.iOS/OxyPlot.Xamarin.Forms.Platform.iOS.csproj
@@ -63,7 +63,7 @@
     
   
   
-    
+    
     
       0.2.2
       runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Source/OxyPlot.Xamarin.Forms.nuspec b/Source/OxyPlot.Xamarin.Forms.nuspec
index 9010f52..f9a6b00 100644
--- a/Source/OxyPlot.Xamarin.Forms.nuspec
+++ b/Source/OxyPlot.Xamarin.Forms.nuspec
@@ -3,7 +3,7 @@
   
     OxyPlot.Xamarin.Forms
     OxyPlot for Xamarin (Android, iOS, Mac and UWP)
-    2.0.0
+    2.1.0
     Oystein Bjorke, Janus Weil
     OxyPlot is a plotting library for .NET. This package includes a portable library for Xamarin.Forms apps and platform-specific libraries for Android, iOS, Mac and UWP.
     
@@ -16,27 +16,27 @@
     plotting plot charting chart xamarin forms android ios mac uwp
     
       
-        
+        
         
         
       
       
-        
+        
         
         
       
       
-        
+        
         
         
       
       
-        
+        
         
         
       
       
-        
+        
         
         
       
diff --git a/Source/OxyPlot.Xamarin.Forms/OxyPlot.Xamarin.Forms.csproj b/Source/OxyPlot.Xamarin.Forms/OxyPlot.Xamarin.Forms.csproj
index 1785536..3f30d89 100644
--- a/Source/OxyPlot.Xamarin.Forms/OxyPlot.Xamarin.Forms.csproj
+++ b/Source/OxyPlot.Xamarin.Forms/OxyPlot.Xamarin.Forms.csproj
@@ -16,7 +16,7 @@
   
 
   
-    
+    
     
     
     
diff --git a/Source/OxyPlot.Xamarin.Mac/CoreGraphicsRenderContext.cs b/Source/OxyPlot.Xamarin.Mac/CoreGraphicsRenderContext.cs
index 5dab461..668957c 100644
--- a/Source/OxyPlot.Xamarin.Mac/CoreGraphicsRenderContext.cs
+++ b/Source/OxyPlot.Xamarin.Mac/CoreGraphicsRenderContext.cs
@@ -21,7 +21,7 @@ namespace OxyPlot.Xamarin.Mac
     /// 
     /// Implements a  for CoreGraphics.
     /// 
-    public class CoreGraphicsRenderContext : RenderContextBase, IDisposable
+    public class CoreGraphicsRenderContext : ClippingRenderContext, IDisposable
     {
         /// 
         /// The images in use.
@@ -69,10 +69,11 @@ public CoreGraphicsRenderContext (CGContext context)
         /// The fill color.
         /// The stroke color.
         /// The thickness.
-        public override void DrawEllipse (OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawEllipse (OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
-            this.SetAlias (false);
-            var convertedRectangle = rect.Convert ();
+            bool aliased = this.ShouldUseAntiAliasingForEllipse(erm);
+            this.SetAlias (aliased);
+            var convertedRectangle = aliased ? rect.ConvertAliased() : rect.Convert ();
             if (fill.IsVisible ()) {
                 this.SetFill (fill);
                 using (var path = new CGPath ()) {
@@ -150,17 +151,16 @@ public override void CleanUp ()
         /// 
         /// The clip rectangle.
         /// True if the clip rectangle was set.
-        public override bool SetClip (OxyRect rect)
+        protected override void SetClip (OxyRect rect)
         {
             this.gctx.SaveState ();
             this.gctx.ClipToRect (rect.Convert ());
-            return true;
         }
 
         /// 
         /// Resets the clip rectangle.
         /// 
-        public override void ResetClip ()
+        protected override void ResetClip ()
         {
             this.gctx.RestoreState ();
         }
@@ -173,10 +173,10 @@ public override void ResetClip ()
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// if set to true the shape will be aliased.
-        public override void DrawLine (IList points, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawLine (IList points, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             if (stroke.IsVisible () && thickness > 0) {
+                bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
                 this.SetAlias (aliased);
                 this.SetStroke (stroke, thickness, dashArray, lineJoin);
 
@@ -199,9 +199,9 @@ public override void DrawLine (IList points, OxyColor stroke, doubl
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// If set to true the shape will be aliased.
-        public override void DrawPolygon (IList points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawPolygon (IList points, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
+            bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
             this.SetAlias (aliased);
             var convertedPoints = (aliased ? points.Select (p => p.ConvertAliased ()) : points.Select (p => p.Convert ())).ToArray ();
             if (fill.IsVisible ()) {
@@ -235,10 +235,11 @@ public override void DrawPolygon (IList points, OxyColor fill, OxyC
         /// The fill color.
         /// The stroke color.
         /// The stroke thickness.
-        public override void DrawRectangle (OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawRectangle (OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
-            this.SetAlias (true);
-            var convertedRect = rect.ConvertAliased ();
+            bool aliased = this.ShouldUseAntiAliasingForRect(erm);
+            this.SetAlias (aliased);
+            var convertedRect = aliased ? rect.ConvertAliased () : rect.Convert();
 
             if (fill.IsVisible ()) {
                 this.SetFill (fill);
diff --git a/Source/OxyPlot.Xamarin.Mac/OxyPlot.Xamarin.Mac.csproj b/Source/OxyPlot.Xamarin.Mac/OxyPlot.Xamarin.Mac.csproj
index 2163d5f..82c5c3c 100644
--- a/Source/OxyPlot.Xamarin.Mac/OxyPlot.Xamarin.Mac.csproj
+++ b/Source/OxyPlot.Xamarin.Mac/OxyPlot.Xamarin.Mac.csproj
@@ -66,6 +66,7 @@
   
     
     
+    
   
   
     
@@ -88,7 +89,7 @@
       all
     
     
-      2.0.0
+      2.1.0
     
     
       4.3.0
diff --git a/Source/OxyPlot.Xamarin.Mac/PlotView.cs b/Source/OxyPlot.Xamarin.Mac/PlotView.cs
index d25084f..66f1634 100644
--- a/Source/OxyPlot.Xamarin.Mac/PlotView.cs
+++ b/Source/OxyPlot.Xamarin.Mac/PlotView.cs
@@ -300,8 +300,9 @@ public override void DrawRect(CoreGraphics.CGRect dirtyRect)
                 // TODO: scale font matrix??
                 using (var renderer = new CoreGraphicsRenderContext(context))
                 {
-                        ((IPlotModel)this.model).Render(renderer, dirtyRect.Width, dirtyRect.Height);
-                    }
+                    OxyRect orect = new OxyRect(0, 0, dirtyRect.Width, dirtyRect.Height);
+                    ((IPlotModel)this.model).Render(renderer, orect);
+                }
             }
         }
 
diff --git a/Source/OxyPlot.Xamarin.iOS/CoreGraphicsRenderContext.cs b/Source/OxyPlot.Xamarin.iOS/CoreGraphicsRenderContext.cs
index a26d239..78c5ea9 100644
--- a/Source/OxyPlot.Xamarin.iOS/CoreGraphicsRenderContext.cs
+++ b/Source/OxyPlot.Xamarin.iOS/CoreGraphicsRenderContext.cs
@@ -21,7 +21,7 @@ namespace OxyPlot.Xamarin.iOS
     /// 
     /// Implements a  for CoreGraphics.
     /// 
-    public class CoreGraphicsRenderContext : RenderContextBase, IDisposable
+    public class CoreGraphicsRenderContext : ClippingRenderContext, IDisposable
     {
         /// 
         /// The images in use.
@@ -68,10 +68,11 @@ public CoreGraphicsRenderContext(CGContext context)
         /// The fill color.
         /// The stroke color.
         /// The thickness.
-        public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
-            this.SetAlias(false);
-            var convertedRectangle = rect.Convert();
+            bool aliased = this.ShouldUseAntiAliasingForEllipse(erm);
+            this.SetAlias(aliased);
+            var convertedRectangle = aliased ? rect.ConvertAliased() : rect.Convert();
             if (fill.IsVisible())
             {
                 this.SetFill(fill);
@@ -155,17 +156,16 @@ public override void CleanUp()
         /// 
         /// The clip rectangle.
         /// True if the clip rectangle was set.
-        public override bool SetClip(OxyRect rect)
+        protected override void SetClip(OxyRect rect)
         {
             this.gctx.SaveState();
             this.gctx.ClipToRect(rect.Convert());
-            return true;
         }
 
         /// 
         /// Resets the clip rectangle.
         /// 
-        public override void ResetClip()
+        protected override void ResetClip()
         {
             this.gctx.RestoreState();
         }
@@ -178,11 +178,11 @@ public override void ResetClip()
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// if set to true the shape will be aliased.
-        public override void DrawLine(IList points, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawLine(IList points, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
             if (stroke.IsVisible() && thickness > 0)
             {
+                bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
                 this.SetAlias(aliased);
                 this.SetStroke(stroke, thickness, dashArray, lineJoin);
 
@@ -206,9 +206,9 @@ public override void DrawLine(IList points, OxyColor stroke, double
         /// The stroke thickness.
         /// The dash array.
         /// The line join type.
-        /// If set to true the shape will be aliased.
-        public override void DrawPolygon(IList points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, LineJoin lineJoin, bool aliased)
+        public override void DrawPolygon(IList points, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm, double[] dashArray, LineJoin lineJoin)
         {
+            bool aliased = this.ShouldUseAntiAliasingForLine(erm, points);
             this.SetAlias(aliased);
             var convertedPoints = (aliased ? points.Select(p => p.ConvertAliased()) : points.Select(p => p.Convert())).ToArray();
             if (fill.IsVisible())
@@ -246,10 +246,11 @@ public override void DrawPolygon(IList points, OxyColor fill, OxyCo
         /// The fill color.
         /// The stroke color.
         /// The stroke thickness.
-        public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness)
+        public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness, EdgeRenderingMode erm)
         {
-            this.SetAlias(true);
-            var convertedRect = rect.ConvertAliased();
+            bool aliased = this.ShouldUseAntiAliasingForRect(erm);
+            this.SetAlias(aliased);
+            var convertedRect = aliased ? rect.ConvertAliased() : rect.Convert();
 
             if (fill.IsVisible())
             {
diff --git a/Source/OxyPlot.Xamarin.iOS/OxyPlot.Xamarin.iOS.csproj b/Source/OxyPlot.Xamarin.iOS/OxyPlot.Xamarin.iOS.csproj
index 8491c2e..de161d9 100644
--- a/Source/OxyPlot.Xamarin.iOS/OxyPlot.Xamarin.iOS.csproj
+++ b/Source/OxyPlot.Xamarin.iOS/OxyPlot.Xamarin.iOS.csproj
@@ -82,7 +82,7 @@
       all
     
     
-      2.0.0
+      2.1.0
     
     
       4.3.0
diff --git a/Source/OxyPlot.Xamarin.iOS/PlotView.cs b/Source/OxyPlot.Xamarin.iOS/PlotView.cs
index 2944867..0d1a325 100644
--- a/Source/OxyPlot.Xamarin.iOS/PlotView.cs
+++ b/Source/OxyPlot.Xamarin.iOS/PlotView.cs
@@ -313,7 +313,8 @@ public override void Draw(CoreGraphics.CGRect rect)
                         context.FillRect (rect);
                     }
 
-                    actualModel.Render(renderer, rect.Width, rect.Height);
+                    OxyRect orect = new OxyRect(0, 0, rect.Width, rect.Height);
+                    actualModel.Render(renderer, orect);
                 }
             }
         }