`Solver.flushParameterUpdates` returns the a collection of updated parameters
diff --git a/lib/param.dart b/lib/param.dart
index 0705d0e..0b2b5c1 100644
--- a/lib/param.dart
+++ b/lib/param.dart
@@ -7,8 +7,13 @@
 class Param extends _EquationMember {
   final Variable variable;
 
-  Param.withVariable(this.variable);
-  Param([double value = 0.0]) : this.variable = new Variable(value);
+  Param.withVariable(this.variable) {
+    variable._owner = this;
+  }
+
+  Param([double value = 0.0]) : this.variable = new Variable(value) {
+    variable._owner = this;
+  }
 
   bool get isConstant => false;
 
diff --git a/lib/solver.dart b/lib/solver.dart
index c0ce826..59ee312 100644
--- a/lib/solver.dart
+++ b/lib/solver.dart
@@ -168,16 +168,20 @@
     return _dualOptimize();
   }
 
-  void flushVariableUpdates() {
+  List<Param> flushParameterUpdates() {
+    List<Param> updates = new List<Param>();
+
     for (Variable variable in _vars.keys) {
       _Symbol symbol = _vars[variable];
       _Row row = _rows[symbol];
-      if (row == null) {
-        variable.value = 0.0;
-      } else {
-        variable.value = row.constant;
+
+      double updatedValue = row == null ? 0.0 : row.constant;
+
+      if (variable._applyUpdate(updatedValue) && variable._owner != null) {
+        updates.add(variable._owner);
       }
     }
+    return updates;
   }
 
   _Symbol _symbolForVariable(Variable variable) {
diff --git a/lib/variable.dart b/lib/variable.dart
index 3192601..40219f7 100644
--- a/lib/variable.dart
+++ b/lib/variable.dart
@@ -8,12 +8,18 @@
   double value = 0.0;
   String name;
 
+  Param _owner;
+
   int _tick;
   static int _total = 0;
 
   Variable(this.value) : _tick = _total++;
 
-  // TODO(csg): Add external variable update callbacks here
+  bool _applyUpdate(double updated) {
+    bool res = updated != value;
+    value = updated;
+    return res;
+  }
 
   String get debugName => _elvis(name, "variable${_tick}");
 
diff --git a/test/cassowary_test.dart b/test/cassowary_test.dart
index 854b23b..7c2e60d 100644
--- a/test/cassowary_test.dart
+++ b/test/cassowary_test.dart
@@ -427,7 +427,7 @@
     var left = new Param(-20.0);
     Solver s = new Solver();
     s.addConstraint(left >= CM(0.0));
-    s.flushVariableUpdates();
+    s.flushParameterUpdates();
     expect(left.value, 0.0);
   });
 
@@ -443,7 +443,7 @@
     expect(s.addConstraint(right - left >= CM(100.0)), Result.success);
     expect(s.addConstraint(left >= CM(0.0)), Result.success);
 
-    s.flushVariableUpdates();
+    s.flushParameterUpdates();
 
     expect(left.value, 0.0);
     expect(mid.value, 50.0);
@@ -484,7 +484,7 @@
     expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
     expect(s.suggestValueForVariable(mid.variable, 300.0), Result.success);
 
-    s.flushVariableUpdates();
+    s.flushParameterUpdates();
 
     expect(left.value, 0.0);
     expect(mid.value, 300.0);
@@ -494,10 +494,14 @@
   test('test_description', () {
     var left = new Param(0.0);
     var right = new Param(100.0);
-    var c = right >= left;
+    var c1 = right >= left;
+    var c2 = right <= left;
+    var c3 = (right == left) as Constraint;
 
     Solver s = new Solver();
-    expect(s.addConstraint(c), Result.success);
+    expect(s.addConstraint(c1), Result.success);
+    expect(s.addConstraint(c2), Result.success);
+    expect(s.addConstraint(c3), Result.success);
 
     expect(s.toString() != null, true);
   });
@@ -519,7 +523,7 @@
     solver.addConstraint((p2 == CM(2.0) * p1) as Constraint);
     solver.addConstraint((container == (p1 + p2 + p3)) as Constraint);
 
-    solver.flushVariableUpdates();
+    solver.flushParameterUpdates();
 
     expect(container.value, 100.0);
 
@@ -527,4 +531,29 @@
     expect(p2.value, 60.0);
     expect(p3.value, 10.0);
   });
+
+  test('test_updates_collection', () {
+    Param left = new Param();
+    Param mid = new Param();
+    Param right = new Param();
+
+    Solver s = new Solver();
+
+    expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
+
+    expect(s.addConstraint((mid * CM(2.0) == left + right) as Constraint),
+        Result.success);
+    expect(s.addConstraint(left >= CM(0.0)), Result.success);
+
+    expect(s.suggestValueForVariable(mid.variable, 50.0), Result.success);
+
+    var updates = s.flushParameterUpdates();
+
+    expect(updates.length, 2);
+    expect(updates[0] is Param, true);
+
+    expect(left.value, 0.0);
+    expect(mid.value, 50.0);
+    expect(right.value, 100.0);
+  });
 }