 }
 
 public class StackView : UIView {
-    public var axis: UILayoutConstraintAxis = .Horizontal
-    public var distribution: StackViewDistribution = .Fill
-    public var alignment: StackViewAlignment = .Fill
-    public var spacing: CGFloat = 0.0
-    
-    // FIXME:
-    public var baselineRelativeArrangement = false
-    public var layoutMarginsRelativeArrangement = false
+    public var axis: UILayoutConstraintAxis = .Horizontal {
+        didSet { if axis != oldValue { self.invalidateLayout() } }
+    }
+    public var distribution: StackViewDistribution = .Fill {
+        didSet { if distribution != oldValue { self.invalidateLayout() } }
+    }
+    public var alignment: StackViewAlignment = .Fill {
+        didSet { if alignment != oldValue { self.invalidateLayout() } }
+    }
+    public var spacing: CGFloat = 0.0 {
+        didSet { if spacing != oldValue { self.invalidateLayout() } }
+    }
+    // FIXME: Implement
+    public var baselineRelativeArrangement = false {
+        didSet { if baselineRelativeArrangement != oldValue { self.invalidateLayout() } }
+    }
+    // FIXME: Implement
+    public var layoutMarginsRelativeArrangement = false {
+        didSet { if layoutMarginsRelativeArrangement != oldValue { self.invalidateLayout() } }
+    }
     
     private var stackConstraints = [NSLayoutConstraint]()
     private var invalidated = false

public enum StackViewDistribution {
    case Fill
    case FillEqually
    case FillProportionally
    case EqualSpacing
    case EqualCentering
}


    }
    
    private func addSpacingConstraints() -> [NSLayoutConstraint] {
        // FIXME: Don't create spacers when not necessary
        /*
        var constraints2 = [NSLayoutConstraint]()
        let _ = self.arrangedSubviews.reduce(nil as UIView?) { previous, current in
