             }
         }
         
+        var originalMatrix = _viewPortHandler.touchMatrix;
+        
         var matrix = CGAffineTransformMakeTranslation(translation.x, translation.y);
-        matrix = CGAffineTransformConcat(_viewPortHandler.touchMatrix, matrix);
-        
-        _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true);
+        matrix = CGAffineTransformConcat(originalMatrix, matrix);
+        
+        matrix = _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true);
+        
+        // Did we managed to actually drag or did we reach the edge?
+        return matrix.tx != originalMatrix.tx || matrix.ty != originalMatrix.ty;
     }
     
     public func stopDeceleration()

            }
        }
    }

    @objc private func panGestureRecognized(recognizer: UIPanGestureRecognizer)
    {
        if (recognizer.state == UIGestureRecognizerState.Began)
        {
            stopDeceleration();
            
            if (!_dataNotSet && _dragEnabled && !self.hasNoDragOffset || !self.isFullyZoomedOut)
            {
                _isDragging = true;
                
                _closestDataSetToTouch = getDataSetByTouchPoint(recognizer.locationOfTouch(0, inView: self));
                
                _lastPanPoint = recognizer.translationInView(self);
            }
        }
        else if (recognizer.state == UIGestureRecognizerState.Ended || recognizer.state == UIGestureRecognizerState.Cancelled)

                
                _isDragging = false;
            }
            
            if (_outerScrollView !== nil)
            {
                _outerScrollView?.scrollEnabled = true;
                _outerScrollView = nil;
            }
        }
    }
    
    private func performPanChange(var #translation: CGPoint) -> Bool
    {
        if (isAnyAxisInverted && _closestDataSetToTouch !== nil
            && getAxis(_closestDataSetToTouch.axisDependency).isInverted)
