diff --git a/ilp-measurement.scm b/ilp-measurement.scm
index 2813013a28923bf4d48e7336114978cfaa70a389..4bfb748554cbf5cb0f7fe095f1d1ab89693dcc44 100644
--- a/ilp-measurement.scm
+++ b/ilp-measurement.scm
@@ -1,5 +1,13 @@
 #!r6rs
 
+; Measurement definitions
+; To add a new measurement FOO:
+;   1) define a new scheme symbol (define foo-test 'foo-test)
+;   2) reuse or define a new set of raw parameters
+;   3) append raw parameters to params
+;   4) define a method (define (run-foo-test id-s specs) to run the measurement, taking two input parameters (id and parameters)
+;   5) append (cons foo-test run-foo-test) to tests
+
 (library
  (mquat ilp-measurement)
  (export measurement-cli-call)
@@ -17,11 +25,25 @@
  (define update-test 'update-test)
  (define complex-test 'complex-test)
  (define mixed-test 'mixed-test)
+ (define scaling-test 'scaling-test)
  (define raw-mixed-params
    ; HW = number hw. S = number of sub-per-hw. #C[omp], #I[mpl], #M[ode]
    ;           ID  HW  S #C #I #M
    (list (list  1 300  0 10  2  2)
          (list  2 400  0 10  2  2)))
+ (define raw-scaling-params
+   ; HW = number hw. S = number of sub-per-hw. #C[omp], #I[mpl], #M[ode]
+   ;           ID  HW  S #C #I #M
+   (list (list  1     10  0 10  2  2)
+         (list  2     50  0 10  2  2)
+         (list  2    100  0 10  2  2)
+         (list  2    500  0 10  2  2)
+         (list  2   1000  0 10  2  2)
+         (list  2   5000  0 10  2  2)
+         (list  2  10000  0 10  2  2)
+         (list  2  50000  0 10  2  2)
+         (list  2 100000  0 10  2  2)
+         (list  2 500000  0 10  2  2)))
  (define raw-short-params
    ; HW = number hw. S = number of sub-per-hw. #C[omp], #I[mpl], #M[ode]
    ;           ID  HW  S #C #I #M
@@ -72,7 +94,7 @@
          (list 31  10  0 80  2  2)))
  (define params
    (append
-     ; res and sw params
+     ; update, res and sw params
      (reverse
       (fold-left
        (lambda (all l) (let ([rest (append (cdr l) (list (list (lambda _ #t) #f #f #f)))])
@@ -85,6 +107,10 @@
      (map (lambda (l) (append (cons* (dirname "mixed-" (car l)) mixed-test (cdr l))
                               (list (list (lambda _ #t) #f #f #f))))
           raw-mixed-params)
+     ; scaling params
+     (map (lambda (l) (append (cons* (dirname "scaling-" (car l)) mixed-test (cdr l))
+                              (list (list (lambda _ #t) #f #f #f))))
+          raw-scaling-params)
           ))
 
  (define (valf val) (lambda _ val))
@@ -335,11 +361,52 @@
       (add-new-resource) (sit id-s (make-step-name outer 17 "-add-new-pes") ast) (display+flush ".")
       (update-change outer (list 18 19 20))) (list 0 1 2 3 4)))
 
+ ; make change kind frequency according to some measure, e.g. 80% update, 10% res, 5% sw, 5% no change
+ ; = 16 update, 2 res, 1 sw, 1 no
+ (define (run-scaling-test id-s specs)
+   (define ast (cst id-s specs))
+   (define rt (ast-child 1 (->ResourceType* (->HWRoot ast))))
+   (define pe+parent (lambda (pe) (cons pe (<- pe))))
+   (define odd-pes (map pe+parent (ret-odds (=every-container ast))))
+   (define (make-step-name step suffix) (string-append (string-pad (number->string step) 2 #\0) suffix))
+   (define (add-new-resource)
+     (let* ([max-id (apply max (map (lambda (pe) (string->number (substring (->name pe) 2))) (=every-container ast)))]
+            [first-clauses (->* (->ProvClause* (car (=every-container ast))))]
+            [new-clauses (map (lambda (cl) (make-prov (->return-type cl) (->comparator cl) (rand 50 2 0))) first-clauses)] ;TODO
+            [new-res (:Resource mquat-spec (string-append "r-" (number->string (+ 1 max-id))) rt online (list) new-clauses)])
+        (rewrite-add (->SubResources (->HWRoot ast)) new-res)))
+   (define (update-change steps)
+     (for-each
+       (lambda (step)
+         (when (not (= step 20))
+           (rw* rt "load" #f ast) (sit id-s (make-step-name step "-every-comp-rand") ast) (display+flush "."))) steps))
+   (rewrite-terminal 'config ast id-s)
+   (display+flush id-s)
+
+;   (info (map (lambda (pe) (string->number (substring (->name pe) 2))) (=every-container ast)))
+   (add-new-resource) ;; <- just for testing
+
+   (sit id-s "00-init" ast)
+   (update-change (list 1 2 3))
+;       (let ([removed (map (lambda (pp) (cons (rewrite-delete (car pp)) (cdr pp))) odd-pes)])
+;         (sit id-s (make-step-name 4 "-del-odd-pes") ast) (display+flush ".")
+     (add-new-resource) (sit id-s (make-step-name 4 "-add-new-pes") ast) (display+flush ".")
+     (update-change (list 5 6 7))
+     (make-new-modes ast) (sit id-s (make-step-name 8 "-new-modes") ast) (display+flush ".")
+     (update-change (list 9 10 11 12))
+     (sit id-s (make-step-name 13 "-no-change") ast)
+     (update-change (list 14 15 16))
+;        (for-each (lambda (rp) (rewrite-add (cdr rp) (car rp))) (reverse removed))
+;        (rw* rt "load" #f ast) (sit id-s (make-step-name 17 "-add-odd-pes") ast) (display+flush "."))
+   (add-new-resource) (sit id-s (make-step-name 17 "-add-new-pes") ast) (display+flush ".")
+   (update-change (list 18 19 20)))
+
  (define tests (list (cons resource-test run-resource-test)
                      (cons sw-test run-sw-test)
                      (cons update-test run-update-test)
                      (cons complex-test run-complex-test)
-                     (cons mixed-test run-mixed-test)))
+                     (cons mixed-test run-mixed-test)
+                     (cons scaling-test run-scaling-test)))
 
  (define (run-test id-s specs)
    (when profiling? (reset-counts))