Index: orange/OrangeWidgets/plot/owplot.py
===================================================================
--- orange/OrangeWidgets/plot/owplot.py	(revision 8693)
+++ orange/OrangeWidgets/plot/owplot.py	(revision 8694)
@@ -341,5 +341,5 @@
         
         self.auto_adjust_performance = True
-        self.disable_animations_threshold = 2000
+        self.disable_animations_threshold = 5000
      #   self.setInteractive(False)
         
@@ -1461,4 +1461,5 @@
                 self.animate_plot = True
                 self.antialias_lines = True
+            qDebug(repr(self.animate_points))
         
     def animate(self, target, prop_name, end_val, duration = None):
Index: source/orangeqt/curve.cpp
===================================================================
--- source/orangeqt/curve.cpp	(revision 8692)
+++ source/orangeqt/curve.cpp	(revision 8694)
@@ -51,4 +51,5 @@
 Curve::Curve(QGraphicsItem* parent): PlotItem(parent)
 {
+    m_continuous = false;
     m_autoUpdate = true;
     m_style = NoCurve;
@@ -77,4 +78,5 @@
   if (m > n)
   {
+      qDebug() << "Deleting" << (m-n) << "points";
     qDeleteAll(m_pointItems.constBegin() + n, m_pointItems.constEnd());
     m_pointItems.erase(m_pointItems.begin() + n, m_pointItems.end());
@@ -82,4 +84,6 @@
   else if (m < n)
   {  
+    qDebug() << "Creating" << (n-m) << "points";
+    m_pointItems.reserve(n);
     Plot* p = plot();
     int delta = n - m;
@@ -155,17 +159,10 @@
   {
     cancelAllUpdates();
-    QPointF p;
-    for (int i = 0; i < n; ++i)
-    {
-        
-      m_pointItems[i]->set_coordinates(m_data[i]);
-    }
-    register_points();
-    update_items(m_pointItems, AnimatedPointPosUpdater(m_graphTransform), UpdatePosition);
+    update_point_coordinates();
   } 
   
-  if (m_needsUpdate & (UpdateZoom | UpdateBrush | UpdatePen | UpdateSize | UpdateSymbol) )
-  {
-    update_items(m_pointItems, PointUpdater(m_symbol, m_color, m_pointSize, Point::DisplayPath, point_transform()), UpdateSymbol);
+  if (m_needsUpdate & (UpdateBrush | UpdatePen | UpdateSize | UpdateSymbol) )
+  {
+    update_items(m_pointItems, PointUpdater(m_symbol, m_color, m_pointSize, Point::DisplayPath), UpdateSymbol);
   }
   m_needsUpdate = 0;
@@ -406,4 +403,8 @@
     }
     m_currentUpdate.clear();
+    m_coords_watcher.future().cancel();
+    m_pos_watcher.future().cancel();
+    m_coords_watcher.waitForFinished();
+    m_pos_watcher.waitForFinished();
 }
 
@@ -418,10 +419,4 @@
 }
 
-QTransform Curve::point_transform()
-{
-    const QTransform i = m_zoom_transform.inverted();
-    return QTransform(i.m11(), 0, 0, 0, i.m22(), 0, 0, 0, 1.0);
-}
-
 Curve::UpdateFlags Curve::needs_update()
 {
@@ -466,5 +461,9 @@
         m_pos_watcher.future().waitForFinished();
     }
-    if (plot() && plot()->animate_points)
+    if (m_pointItems.isEmpty())
+    {
+        return;
+    }
+    if (use_animations())
     {
         m_pos_watcher.setFuture(QtConcurrent::mapped(m_pointItems, PointPosMapper(m_graphTransform)));
@@ -514,5 +513,5 @@
     else
     {
-        QtConcurrent::map(m_pointItems, PointPropertyUpdater(property, value));
+        m_property_updates[property] = QtConcurrent::map(m_pointItems, PointPropertyUpdater(property, value));
     }
 }
Index: source/orangeqt/curve.h
===================================================================
--- source/orangeqt/curve.h	(revision 8692)
+++ source/orangeqt/curve.h	(revision 8694)
@@ -35,5 +35,5 @@
   result_type operator()(Point* p)
   {
-      return t.map(p->coordinates());
+    return t.map(p->coordinates());
   }
   
@@ -42,20 +42,7 @@
 };
 
-
-struct ZoomUpdater
-{
-    ZoomUpdater(const QTransform& inv_zoom) : transform(inv_zoom) {}
-    void operator()(QGraphicsItem* item)
-    {
-        item->setTransform(transform);
-    }
-    
-private:
-    QTransform transform;
-};
-
 struct PointUpdater
 {
-    PointUpdater(int symbol, QColor color, int size, Point::DisplayMode mode, const QTransform& scale)
+    PointUpdater(int symbol, QColor color, int size, Point::DisplayMode mode)
     {
         m_symbol = symbol;
@@ -63,5 +50,4 @@
         m_size = size;
         m_mode = mode;
-        m_scale = scale;
     }
     
@@ -72,5 +58,4 @@
         point->set_size(m_size);
         point->set_display_mode(m_mode);
-        point->setTransform(m_scale);
     }
     
@@ -225,5 +210,4 @@
   
 protected:
-  QTransform point_transform();
   Curve::UpdateFlags needs_update();
   void set_updated(Curve::UpdateFlags flags);
@@ -261,4 +245,5 @@
   QTransform m_zoom_transform;
   QMap<UpdateFlag, QFuture<void> > m_currentUpdate;
+  QMap<QByteArray, QFuture<void> > m_property_updates;
   QFutureWatcher<QPointF> m_pos_watcher;
   QFutureWatcher<void> m_coords_watcher;
@@ -274,5 +259,8 @@
         m_currentUpdate[flag].waitForFinished();
     }
-    m_currentUpdate[flag] = QtConcurrent::map(sequence, updater);
+    if (!sequence.isEmpty())
+    {
+        m_currentUpdate[flag] = QtConcurrent::map(sequence, updater);
+    }
 }
 
@@ -280,4 +268,10 @@
 void Curve::update_point_properties(const QByteArray& property, const QList< T >& values, bool animate)
 {
+    if (m_property_updates.contains(property))
+    {
+        m_property_updates[property].cancel();
+        m_property_updates[property].waitForFinished();
+    }
+
     int n = m_pointItems.size();
     if (n != values.size())
@@ -308,5 +302,5 @@
     else
     {
-        QtConcurrent::run(this, &Curve::update_point_properties_threaded<T>, property, values);
+        m_property_updates[property] = QtConcurrent::run(this, &Curve::update_point_properties_threaded<T>, property, values);
     }
 }
Index: source/orangeqt/curve.sip
===================================================================
--- source/orangeqt/curve.sip	(revision 8680)
+++ source/orangeqt/curve.sip	(revision 8694)
@@ -100,5 +100,4 @@
   
 protected:
-  QTransform point_transform();
   void set_updated(Curve::UpdateFlags flags);
   Curve::UpdateFlags needs_update();
Index: source/orangeqt/multicurve.cpp
===================================================================
--- source/orangeqt/multicurve.cpp	(revision 8692)
+++ source/orangeqt/multicurve.cpp	(revision 8694)
@@ -59,12 +59,5 @@
 {
     updateNumberOfItems();
-    
-    const Data d = data();
-    const int n = d.size();
-    const QTransform t = graph_transform();
-    const QList<Point*> p = points();
-    
     update_point_coordinates();
-    update_items(points(), ZoomUpdater(point_transform()), UpdateZoom);
 }
 
@@ -72,8 +65,5 @@
 {
     updateNumberOfItems();
-    foreach (Point* p, points())
-    {
-        p->setZValue(qrand() * 1.0 / RAND_MAX);
-    }
+    update_items(points(), PointShuffler(), UpdateContinuous);
 }
 
@@ -86,21 +76,5 @@
 {
     updateNumberOfItems();
-    QList<Point*> p = points();
-    const int n = p.size();
-    if (marked.size() == n)
-    {
-        for (int i = 0; i < n; ++i)
-        {
-            p[i]->set_marked(marked[i]);
-        }
-    }
-    else 
-    {
-        bool m = marked.isEmpty() ? false : marked.first();
-        foreach (Point* point, p)
-        {
-            point->set_marked(m);
-        }
-    }
+    update_point_properties("marked", marked, false);
 }
 
Index: source/orangeqt/multicurve.h
===================================================================
--- source/orangeqt/multicurve.h	(revision 8669)
+++ source/orangeqt/multicurve.h	(revision 8694)
@@ -21,4 +21,5 @@
 
 #include "curve.h"
+#include <QtCore/QTime>
 
 struct PointAlphaUpdater
@@ -34,4 +35,13 @@
 private:
     int alpha;
+};
+
+struct PointShuffler
+{
+    PointShuffler() {qsrand(QTime(0,0,0).msecsTo(QTime::currentTime())); }
+    void operator()(Point* p)
+    {
+        p->setZValue(1.0 * qrand() / RAND_MAX);
+    }
 };
 
Index: source/orangeqt/networkcurve.h
===================================================================
--- source/orangeqt/networkcurve.h	(revision 8680)
+++ source/orangeqt/networkcurve.h	(revision 8694)
@@ -177,18 +177,4 @@
 };
 
-class NodeUpdater
-{
-public:
-    NodeUpdater(const QTransform& t, const QTransform& zoom) : m_t(t), m_zoom(zoom) {}
-    void operator()(NodeItem* item) 
-    { 
-        item->set_graph_transform(m_t); 
-        item->setTransform(m_zoom);
-    }
-private:
-    QTransform m_t;
-    QTransform m_zoom;
-};
-
 class EdgeUpdater
 {
Index: source/orangeqt/point.cpp
===================================================================
--- source/orangeqt/point.cpp	(revision 8681)
+++ source/orangeqt/point.cpp	(revision 8694)
@@ -69,4 +69,5 @@
     m_display_mode = DisplayPath;
     m_transparent = true;
+    setFlag(ItemIgnoresTransformations);
 }
 
@@ -78,7 +79,7 @@
     m_display_mode = DisplayPath;
     m_transparent = true;
-}
-
-
+    setFlag(ItemIgnoresTransformations);
+}
+  
 void Point::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
@@ -141,5 +142,4 @@
         painter->drawText(r, Qt::AlignHCenter, m_label);
     }
-
 }
 
@@ -151,5 +151,4 @@
 Point::~Point()
 {
-
 }
 
@@ -338,5 +337,6 @@
 }
 
-void Point::set_state_flag(Point::StateFlag flag, bool on) {
+void Point::set_state_flag(Point::StateFlag flag, bool on) 
+{
     if (on)
     {
@@ -350,5 +350,6 @@
 }
 
-bool Point::state_flag(Point::StateFlag flag) const {
+bool Point::state_flag(Point::StateFlag flag) const 
+{
     return m_state & flag;
 }
@@ -376,9 +377,9 @@
 bool Point::is_transparent()
 {
-	return m_transparent;
+    return m_transparent;
 }
 void Point::set_transparent(bool transparent)
 {
-	m_transparent = transparent;
+    m_transparent = transparent;
 }
 
Index: source/orangeqt/point.h
===================================================================
--- source/orangeqt/point.h	(revision 8692)
+++ source/orangeqt/point.h	(revision 8694)
@@ -23,5 +23,4 @@
 #include <QtCore/QDebug>
 #include <QtCore/QPropertyAnimation>
-
 
 struct DataPoint
@@ -56,5 +55,4 @@
     Q_PROPERTY(QString label READ label WRITE set_label)
     Q_PROPERTY(DataPoint coordinates READ coordinates WRITE set_coordinates)
-    
     
 public:
@@ -192,24 +190,4 @@
 };
 
-struct AnimatedPointPosUpdater
-{
-    AnimatedPointPosUpdater(const QTransform& t) : t(t) {}
-    void operator()(Point* point)
-    {
-        QPointF endPos = t.map(point->coordinates());
-        if (endPos == point->pos())
-        {
-            return;
-        }
-        QPropertyAnimation* animation = new QPropertyAnimation(point, "pos", point);
-        qDebug() << animation->startValue() << point->property("pos");
-        animation->setEndValue(endPos);
-        animation->setDuration(100);
-        animation->start(QPropertyAnimation::DeleteWhenStopped);
-    }
-private:
-    QTransform t;
-};
-
 struct PointPropertyUpdater
 {
