diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index bec7ab168f163e0b9ad42b87df089dca2d7708c9..023c622f56e73e5106a4d67b5c1581e83431f94d 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -599,28 +599,44 @@ static void messresponder_anything(t_messresponder *x,
 
 static void message_bang(t_message *x)
 {
+    /*  we do canvas_setcurrent/unsetcurrent to substitute canvas
+        instance number for $0 */
+    canvas_setcurrent((t_canvas *)x->m_glist);
     binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 0, 0);
+    canvas_unsetcurrent((t_canvas *)x->m_glist);
 }
 
 static void message_float(t_message *x, t_float f)
 {
     t_atom at;
     SETFLOAT(&at, f);
+    /*  we do canvas_setcurrent/unsetcurrent to substitute canvas
+        instance number for $0 */
+    canvas_setcurrent((t_canvas *)x->m_glist);
     binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 1, &at);
+    canvas_unsetcurrent((t_canvas *)x->m_glist);
 }
 
 static void message_symbol(t_message *x, t_symbol *s)
 {
     t_atom at;
     SETSYMBOL(&at, s);
+    /*  we do canvas_setcurrent/unsetcurrent to substitute canvas
+        instance number for $0 */
+    canvas_setcurrent((t_canvas *)x->m_glist);
     binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 1, &at);
+    canvas_unsetcurrent((t_canvas *)x->m_glist);
 }
 
 static void message_blob(t_message *x, t_blob *st)
 {
     t_atom at;
     SETBLOB(&at, st);
+    /*  we do canvas_setcurrent/unsetcurrent to substitute canvas
+        instance number for $0 */
+    canvas_setcurrent((t_canvas *)x->m_glist);
     binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 1, &at);
+    canvas_unsetcurrent((t_canvas *)x->m_glist);
 }
 
 static void message_list(t_message *x, t_symbol *s, int argc, t_atom *argv)
@@ -628,9 +644,11 @@ static void message_list(t_message *x, t_symbol *s, int argc, t_atom *argv)
     // TODO: here and elsewhere in the message, do we want $0 to be parsed
     // into canvas instance? Makes sense since there is no such argument,
     // but will this break anything?
-    //canvas_setcurrent(x->m_glist);
+    /*  we do canvas_setcurrent/unsetcurrent to substitute canvas
+        instance number for $0 */
+    canvas_setcurrent((t_canvas *)x->m_glist);
     binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, argc, argv);
-    //canvas_unsetcurrent(x->m_glist);
+    canvas_unsetcurrent(x->m_glist);
 }
 
 static void message_set(t_message *x, t_symbol *s, int argc, t_atom *argv)