diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5fe9df3ad96267f08b378c2ad17f281d9080d390..c6d67ebdb6b1fbc66c1e462e90661b98bb506514 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,6 +11,7 @@ debian_stable_i386_deb:
      - ./tar_em_up.sh -B
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -31,6 +32,7 @@ debian_stable_amd64_deb:
      - ./tar_em_up.sh -B
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -51,6 +53,7 @@ debian_stretch_amd64_deb:
      - ./tar_em_up.sh -B
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -72,6 +75,7 @@ ubuntu_14.04_i386_deb:
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
      - cd scripts
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -93,6 +97,7 @@ ubuntu_14.04_amd64_deb:
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
      - cd scripts
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -114,6 +119,7 @@ ubuntu_16.04_amd64_deb:
      - cd ..
      - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
      - cd scripts
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -131,6 +137,7 @@ osx_amd64_dmg:
      - cd l2ork_addons
      - ./tar_em_up.sh -X
      - cd ../scripts
+     - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nostdpath -nogui -noaudio external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
@@ -163,6 +170,7 @@ windows_i386_installer:
     - cd l2ork_addons
     - ./tar_em_up.sh -Z
     - cd ../scripts
+     - ../packages/win32_inno/build/bin/pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
     - ../packages/win32_inno/build/bin/pd.exe -noprefs -nostdpath -nogui -noaudio external-tests.pd
   artifacts:
     name: "$CI_RUNNER_DESCRIPTION"
@@ -180,6 +188,7 @@ debian_stable_arm_deb:
      - cd l2ork_addons
      - ./tar_em_up.sh -r
      - cd ..
+     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
      - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
diff --git a/scripts/manual_tests/message-perf.pd b/scripts/manual_tests/message-perf.pd
new file mode 100644
index 0000000000000000000000000000000000000000..59146ecd8f34c7598e371e47aa66f0fb38197dd1
--- /dev/null
+++ b/scripts/manual_tests/message-perf.pd
@@ -0,0 +1,72 @@
+#N canvas 219 60 984 603 10;
+#X msg 272 255 10000;
+#X obj 272 277 until;
+#X obj 207 206 t b b b;
+#X obj 211 256 realtime;
+#X obj 211 329 +;
+#X obj 211 384 /;
+#X obj 211 299 t a b;
+#X obj 238 330 f;
+#X obj 238 352 + 1;
+#X obj 211 351 t a;
+#X obj 173 384 t a;
+#X obj 196 464 f;
+#X obj 68 464 f;
+#X obj 180 176 t b b;
+#X obj 68 382 t b b;
+#X floatatom 68 486 5 0 0 0 worst - -, f 5;
+#X floatatom 196 486 5 0 0 0 average - -, f 5;
+#X obj 125 384 moses;
+#X obj 243 26 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 243 46 metro 150;
+#X obj 272 299 list append one two three;
+#X text 312 92 nothing;
+#X text 632 92 \$0;
+#X text 605 138 set/unsetcurrent: 13/36;
+#X text 285 138 set/unsetcurrent:11.5/32;
+#X text 792 92 list one two three four \$0 \$1;
+#X text 765 138 set/unsetcurrent: 17/37;
+#X text 765 118 nothing: 14.5/35.5;
+#X text 605 118 nothing: 8/17;
+#X text 285 118 nothing: 5/12;
+#X text 472 92 42;
+#X text 445 118 nothing: 7/17;
+#X text 445 138 set/unsetcurrent:14/35;
+#X text 285 158 cached glist:4.5/11;
+#X text 605 158 cached glist: 8.7/19;
+#X text 445 158 cached glist:5.6/15;
+#X text 765 158 cached glist: 13/32;
+#X text 285 178 semicolon fix: 4/12.5;
+#X text 445 178 semicolon fix: 6/17;
+#X text 605 178 cached glist: 6.5/19;
+#X msg 272 321 list one two three four \$0 \$1;
+#X text 765 178 cached glist: 13/35;
+#X connect 0 0 1 0;
+#X connect 1 0 20 0;
+#X connect 2 0 3 1;
+#X connect 2 1 0 0;
+#X connect 2 2 3 0;
+#X connect 3 0 6 0;
+#X connect 4 0 9 0;
+#X connect 5 0 11 1;
+#X connect 6 0 4 0;
+#X connect 6 0 17 0;
+#X connect 6 1 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 7 1;
+#X connect 8 0 5 1;
+#X connect 9 0 5 0;
+#X connect 9 0 4 1;
+#X connect 10 0 12 1;
+#X connect 10 0 17 1;
+#X connect 11 0 16 0;
+#X connect 12 0 15 0;
+#X connect 13 0 14 0;
+#X connect 13 1 2 0;
+#X connect 14 0 12 0;
+#X connect 14 1 11 0;
+#X connect 17 1 10 0;
+#X connect 18 0 19 0;
+#X connect 19 0 13 0;
+#X connect 20 0 40 0;
diff --git a/scripts/manual_tests/message_errors.pd b/scripts/manual_tests/message_errors.pd
new file mode 100644
index 0000000000000000000000000000000000000000..aef80b9f6c22eb8b0371dde6f48b657f61ffccf9
--- /dev/null
+++ b/scripts/manual_tests/message_errors.pd
@@ -0,0 +1,37 @@
+#N canvas 3 60 508 425 10;
+#X msg 21 41 \; \$1;
+#X msg 21 131 \; \$0;
+#X msg 21 220 42;
+#X msg 21 251 \; \$1;
+#X text 21 11 1) dollar target is out of range;
+#X text 21 101 2) dollar target is dollar zero;
+#X text 21 191 3) dollar target isn't a symbol;
+#X text 251 11 4) not enough args to dollsym;
+#X msg 251 67 \; \$1-foo;
+#X msg 251 36 bang;
+#X text 299 59 ERROR: double doll sign;
+#X msg 251 130 bang;
+#X text 251 101 5) no such object;
+#X msg 251 161 \; 42;
+#X msg 251 230 bang;
+#X msg 251 261 \; foo \$1;
+#X obj 329 228 r foo;
+#X obj 329 250 == 0;
+#X floatatom 329 272 5 0 0 0 - - -, f 5;
+#X msg 251 340 bang;
+#X text 251 201 6) dollar argument number out of range;
+#X text 251 311 7) dollsym argument number out of range;
+#X obj 379 360 sel 0-foo;
+#X obj 379 338 r seven;
+#X msg 251 371 \; seven symbol \$1-foo;
+#X obj 430 382 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X connect 2 0 3 0;
+#X connect 9 0 8 0;
+#X connect 11 0 13 0;
+#X connect 14 0 15 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 19 0 24 0;
+#X connect 22 1 25 0;
+#X connect 23 0 22 0;
diff --git a/scripts/manual_tests/trigger-perf.pd b/scripts/manual_tests/trigger-perf.pd
new file mode 100644
index 0000000000000000000000000000000000000000..c2d7b121142cd4c1f4f29412833edc202ece6f8b
--- /dev/null
+++ b/scripts/manual_tests/trigger-perf.pd
@@ -0,0 +1,116 @@
+#N canvas 311 60 867 603 10;
+#X msg 712 255 10000;
+#X obj 712 277 until;
+#X obj 712 299 f;
+#X obj 712 380 f;
+#X obj 742 380 f;
+#X msg 620 154 bang;
+#X obj 647 206 t b b b;
+#X obj 651 256 realtime;
+#X obj 651 329 +;
+#X obj 651 384 /;
+#X obj 651 299 t a b;
+#X obj 678 330 f;
+#X obj 678 352 + 1;
+#X obj 651 351 t a;
+#X obj 613 384 t a;
+#X obj 636 464 f;
+#X obj 508 464 f;
+#X obj 620 176 t b b;
+#X obj 508 382 t b b;
+#X floatatom 508 486 5 0 0 0 worst - -, f 5;
+#X floatatom 636 486 5 0 0 0 average - -, f 5;
+#X obj 565 384 moses;
+#X msg 272 255 10000;
+#X obj 272 277 until;
+#X obj 272 299 f;
+#X obj 272 380 f;
+#X obj 302 380 f;
+#X msg 180 154 bang;
+#X obj 207 206 t b b b;
+#X obj 211 256 realtime;
+#X obj 211 329 +;
+#X obj 211 384 /;
+#X obj 211 299 t a b;
+#X obj 238 330 f;
+#X obj 238 352 + 1;
+#X obj 211 351 t a;
+#X obj 173 384 t a;
+#X obj 196 464 f;
+#X obj 68 464 f;
+#X obj 180 176 t b b;
+#X obj 68 382 t b b;
+#X floatatom 68 486 5 0 0 0 worst - -, f 5;
+#X floatatom 196 486 5 0 0 0 average - -, f 5;
+#X obj 125 384 moses;
+#X obj 243 26 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 243 46 metro 150;
+#X obj 293 535 /;
+#X floatatom 293 557 5 0 0 0 ratio - -, f 5;
+#X obj 243 68 t b b;
+#X obj 272 321 t f f;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 5 0 17 0;
+#X connect 6 0 7 1;
+#X connect 6 1 0 0;
+#X connect 6 2 7 0;
+#X connect 7 0 10 0;
+#X connect 8 0 13 0;
+#X connect 9 0 15 1;
+#X connect 10 0 8 0;
+#X connect 10 0 21 0;
+#X connect 10 1 11 0;
+#X connect 11 0 12 0;
+#X connect 12 0 11 1;
+#X connect 12 0 9 1;
+#X connect 13 0 9 0;
+#X connect 13 0 8 1;
+#X connect 14 0 16 1;
+#X connect 14 0 21 1;
+#X connect 15 0 20 0;
+#X connect 15 0 46 1;
+#X connect 16 0 19 0;
+#X connect 17 0 18 0;
+#X connect 17 1 6 0;
+#X connect 18 0 16 0;
+#X connect 18 1 15 0;
+#X connect 21 1 14 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 49 0;
+#X connect 27 0 39 0;
+#X connect 28 0 29 1;
+#X connect 28 1 22 0;
+#X connect 28 2 29 0;
+#X connect 29 0 32 0;
+#X connect 30 0 35 0;
+#X connect 31 0 37 1;
+#X connect 32 0 30 0;
+#X connect 32 0 43 0;
+#X connect 32 1 33 0;
+#X connect 33 0 34 0;
+#X connect 34 0 33 1;
+#X connect 34 0 31 1;
+#X connect 35 0 31 0;
+#X connect 35 0 30 1;
+#X connect 36 0 38 1;
+#X connect 36 0 43 1;
+#X connect 37 0 42 0;
+#X connect 37 0 46 0;
+#X connect 38 0 41 0;
+#X connect 39 0 40 0;
+#X connect 39 1 28 0;
+#X connect 40 0 38 0;
+#X connect 40 1 37 0;
+#X connect 43 1 36 0;
+#X connect 44 0 45 0;
+#X connect 45 0 48 0;
+#X connect 46 0 47 0;
+#X connect 48 0 27 0;
+#X connect 48 1 5 0;
+#X connect 49 0 25 0;
+#X connect 49 1 26 0;
diff --git a/scripts/regression_tests.pd b/scripts/regression_tests.pd
new file mode 100644
index 0000000000000000000000000000000000000000..da194f7fac14624f708cce6d880440d88e1c431c
--- /dev/null
+++ b/scripts/regression_tests.pd
@@ -0,0 +1,43 @@
+#N canvas 55 176 582 396 12;
+#X obj 395 186 r \$0-result;
+#X obj 395 251 route 0;
+#X obj 427 305 print failure;
+#X obj 441 213 tgl 28 0 empty empty force\ failure 31 11 0 10 -262144
+-1 -1 0 1;
+#X obj 159 79 bng 31 250 50 0 empty empty Run_all 39 13 0 10 -262144
+-1 -1;
+#X obj 56 25 r init;
+#X obj 355 96 route dollarzero;
+#X text 117 25 <- we start Pd with a message \$0 for the binbuf test
+;
+#X obj 395 276 t b a;
+#X obj 395 356 s pd;
+#X obj 56 50 trigger bang bang anything;
+#X msg 56 75 gui;
+#X obj 56 100 pdinfo;
+#X obj 56 125 sel 0;
+#X obj 56 175 s pd;
+#X msg 395 331 quit 1;
+#X msg 56 150 quit;
+#X obj 145 121 rtest msg_dollarzero;
+#X obj 145 176 rtest msg_dollarzero_semi;
+#X obj 145 232 rtest msg_click;
+#X obj 355 121 rtest binbuf_dollarzero;
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 3 0 1 1;
+#X connect 4 0 17 0;
+#X connect 5 0 10 0;
+#X connect 6 0 20 0;
+#X connect 8 0 15 0;
+#X connect 8 1 2 0;
+#X connect 10 0 11 0;
+#X connect 10 1 17 0;
+#X connect 10 2 6 0;
+#X connect 11 0 12 0;
+#X connect 12 0 13 0;
+#X connect 13 0 16 0;
+#X connect 15 0 9 0;
+#X connect 16 0 14 0;
+#X connect 17 0 18 0;
+#X connect 18 0 19 0;
diff --git a/scripts/regression_tests/binbuf_dollarzero.pd b/scripts/regression_tests/binbuf_dollarzero.pd
new file mode 100644
index 0000000000000000000000000000000000000000..cce3d20d63db6da5bfde2c6715ed7b1428553916
--- /dev/null
+++ b/scripts/regression_tests/binbuf_dollarzero.pd
@@ -0,0 +1,9 @@
+#N canvas 335 192 582 396 10;
+#X obj 31 21 inlet;
+#X obj 31 121 outlet;
+#X obj 31 49 == 0;
+#X obj 31 81 list append dollarzero in a binbuf with no target should
+expand to 0;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
diff --git a/scripts/regression_tests/msg_click.pd b/scripts/regression_tests/msg_click.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0a958585d82900cee8445c47652c3a05c0f4fd52
--- /dev/null
+++ b/scripts/regression_tests/msg_click.pd
@@ -0,0 +1,20 @@
+#N canvas 596 176 582 396 10;
+#X obj 31 21 inlet;
+#X msg 31 83 click 0 0 0 0 0;
+#X msg 31 105 \$1;
+#X obj 31 43 trigger bang bang;
+#X obj 150 83 f 0;
+#X msg 150 105 \$1;
+#X obj 31 132 ==;
+#X obj 31 161 list append clicking a msg box should send a single "0"
+as an argument;
+#X obj 31 196 outlet;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
+#X connect 2 0 6 0;
+#X connect 3 0 1 0;
+#X connect 3 1 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
diff --git a/scripts/regression_tests/msg_dollarzero.pd b/scripts/regression_tests/msg_dollarzero.pd
new file mode 100644
index 0000000000000000000000000000000000000000..0170933326bd803a0c45c33d2454b628b2314360
--- /dev/null
+++ b/scripts/regression_tests/msg_dollarzero.pd
@@ -0,0 +1,16 @@
+#N canvas 341 250 582 396 10;
+#X obj 31 21 inlet;
+#X obj 31 46 t b b;
+#X obj 31 77 f \$0;
+#X msg 73 77 \$0;
+#X obj 31 166 outlet;
+#X obj 31 131 list append dollarzero should function the same in a
+message box as it does in an object box;
+#X obj 31 109 ==;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 6 1;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
diff --git a/scripts/regression_tests/msg_dollarzero_semi.pd b/scripts/regression_tests/msg_dollarzero_semi.pd
new file mode 100644
index 0000000000000000000000000000000000000000..6f06c20de1bdf419775c8705543e8e1b7b87f148
--- /dev/null
+++ b/scripts/regression_tests/msg_dollarzero_semi.pd
@@ -0,0 +1,17 @@
+#N canvas 626 167 582 396 10;
+#X obj 31 21 inlet;
+#X obj 31 46 t b b;
+#X obj 31 226 outlet;
+#X obj 31 167 f 0;
+#X obj 46 116 r \$0-dollsym;
+#X msg 58 77 \; \$0-dollsym bang;
+#X obj 46 138 f 1;
+#X obj 31 191 list append dollarzero in symbol should expand properly
+after semicolon;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 1 1 5 0;
+#X connect 3 0 7 0;
+#X connect 4 0 6 0;
+#X connect 6 0 3 1;
+#X connect 7 0 2 0;
diff --git a/scripts/rtest.pd b/scripts/rtest.pd
new file mode 100644
index 0000000000000000000000000000000000000000..1472f601283a998a3289e928960d0293bebba4a8
--- /dev/null
+++ b/scripts/rtest.pd
@@ -0,0 +1,22 @@
+#N canvas 120 270 353 357 12;
+#X obj 36 60 inlet;
+#X obj 36 85 t b b;
+#X obj 36 296 outlet;
+#X obj 68 267 send;
+#X obj 93 152 loadbang;
+#X msg 93 178 dollarzero;
+#X obj 93 204 canvasinfo 1;
+#X msg 93 229 symbol \$1-result;
+#X obj 106 63 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 68 124 regression_tests/\$1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 1 1 9 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 1;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X coords 0 -1 1 1 158 46 1 99 42;