         
         var movingAverage: [Double] = [0, 0, 0, 0, 0]
         var movingAverageTotal = Double(0.0)
+        var velocityRange: [Double] = []
         
         if self.points?.count > 0 {
+            
+            // Find outliers.
+            for p in self.points! {
+                if let point = p as? Route {
+                    // Track the range of velocity points.
+                    velocityRange.append(point.velocity.doubleValue)
+                }
+            }
+            
+            // Determine inner fences.
+            velocityRange.sort { $0 < $1 }
+            let q25 = locateQuantile(0.25, values: velocityRange)
+            let q75 = locateQuantile(0.75, values: velocityRange)
+            let qr = 1.5 * (q75 - q25)
+            let bl = q25 - qr
+            let bu = q75 + qr
+            
             for p in self.points! {
                 if let point = p as? Route {
                     if !started {

                        }
                        
                        if point.velocity.doubleValue > Double(0.0) {
                            if point.velocity.doubleValue < self.velocity_low || self.velocity_low == Double(0) {
                                // @todo low is always 0.
                                self.velocity_low = point.velocity.doubleValue

                            count++
                        }
                    }
                    
                    
                    // Track the miles.
                    if Int(self.distance_total * self.milesPerMeter) > mileCount {
