diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index c1167d9d88c7ada30e0958a50fde3c3dd8a4a812..a6d0c8452aacf40ad2e9d421d5884ee4f70a21db 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -7060,17 +7060,17 @@ static void canvas_tidy(t_canvas *x)
     canvas_dirty(x, 1);
 }*/
 
-static void canvas_texteditor(t_canvas *x)
-{
-    t_rtext *foo;
-    char *buf;
-    int bufsize;
-    if (foo = x->gl_editor->e_textedfor)
-        rtext_gettext(foo, &buf, &bufsize);
-    else buf = "", bufsize = 0;
-    sys_vgui("pdtk_pd_texteditor {%.*s}\n", bufsize, buf);
-    
-}
+//static void canvas_texteditor(t_canvas *x)
+//{
+//    t_rtext *foo;
+//    char *buf;
+//    int bufsize;
+//    if (foo = x->gl_editor->e_textedfor)
+//        rtext_gettext(foo, &buf, &bufsize);
+//    else buf = "", bufsize = 0;
+//    sys_vgui("pdtk_pd_texteditor {%.*s}\n", bufsize, buf);
+//    
+//}
 
 void glob_key(void *dummy, t_symbol *s, int ac, t_atom *av)
 {
@@ -7405,8 +7405,8 @@ void g_editor_setup(void)
         gensym("redo"), A_NULL);
     class_addmethod(canvas_class, (t_method)canvas_tidy,
         gensym("tidy"), A_NULL);
-    class_addmethod(canvas_class, (t_method)canvas_texteditor,
-        gensym("texteditor"), A_NULL);
+    //class_addmethod(canvas_class, (t_method)canvas_texteditor,
+    //    gensym("texteditor"), A_NULL);
     class_addmethod(canvas_class, (t_method)canvas_editmode,
         gensym("editmode"), A_DEFFLOAT, A_NULL);
     // jsarlo
diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index 270d6b5d12fb48f37ceb0e8c3daaf15defd411d0..4e7ba86b77cbc9d9c113ec9a53b6baccb8426522 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -142,10 +142,16 @@ static int firstone(char *s, int c, int n)
     int i = 0;
     while (s != s2)
     {
-        if (*s == c) return (i);
+        //fprintf(stderr,"s=<%s> n=%d s=%d c=%d s2=%d\n", s, n, *s, c, *s2);
+        if (*s == c)
+        {
+            //fprintf(stderr,"DONE\n");
+            return (i);
+        }
         i++;
         s++;
     }
+    //fprintf(stderr,"FAILED\n");
     return (-1);
 }
 
@@ -200,7 +206,7 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
     if (x)
     {
         t_float dispx, dispy;
-        char smallbuf[200], *tempbuf;
+        char smallbuf[200] = { '\0' }, *tempbuf;
         int outchars_b = 0, nlines = 0, ncolumns = 0,
             pixwide, pixhigh, font, fontwidth, fontheight, findx, findy;
         int reportedindex = 0;
@@ -212,6 +218,7 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
         int inindex_c = 0; // index location in the u8 chars
         int selstart_b = 0, selend_b = 0; // selection start and end
         // buffer size in u8 chars
+        //fprintf(stderr,"buf = <%s> | last 2 chars = %d %d\n", x->x_buf, x->x_buf[x->x_bufsize-1], x->x_buf[x->x_bufsize]);
         int x_bufsize_c = u8_charnum(x->x_buf, x->x_bufsize);
             /* if we're a GOP (the new, "goprect" style) borrow the font size
             from the inside to preserve the spacing */
@@ -236,6 +243,7 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
                 (inchars_c > widthlimit_c ? widthlimit_c : inchars_c);
             int maxindex_b = u8_offset(x->x_buf + inindex_b, maxindex_c);
             int eatchar = 1;
+            //fprintf(stderr, "firstone <%s> inindex_b=%d maxindex_b=%d\n", x->x_buf + inindex_b, inindex_b, maxindex_b);
             int foundit_b  = firstone(x->x_buf + inindex_b, '\n', maxindex_b);
             int foundit_c;
             //following deals with \v replacement for \n in multiline comments
@@ -318,6 +326,10 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
             }
         }
         else ncolumns = widthspec_c;
+
+        // add a null character at the end of the string (for u8_charnum)
+        tempbuf[outchars_b++] = '\0';
+
         pixwide = ncolumns * fontwidth + (LMARGIN + RMARGIN);
         pixhigh = nlines * fontheight + (TMARGIN + BMARGIN);
         //printf("outchars_b=%d bufsize=%d %d\n", outchars_b, x->x_bufsize, x->x_buf[outchars_b]);
@@ -523,7 +535,7 @@ void rtext_activate(t_rtext *x, int state)
     t_canvas *canvas = glist_getcanvas(glist);
     //if (state && x->x_active) printf("duplicate rtext_activate\n");
     // the following prevents from selecting all when inside an
-    // object that is already being text for... please *test*
+    // object that is already being texted for... please *test*
     // "fixes" before committing them
     //if (state == x->x_active) return; // avoid excess calls
     if (state)
@@ -583,11 +595,14 @@ void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
         }
         
         ndel = x->x_selend - x->x_selstart;
-        for (i = x->x_selend; i < x->x_bufsize; i++)
-            x->x_buf[i- ndel] = x->x_buf[i];
-        newsize = x->x_bufsize - ndel;
-        x->x_buf = resizebytes(x->x_buf, x->x_bufsize, newsize);
-        x->x_bufsize = newsize;
+        if (ndel)
+        {
+            for (i = x->x_selend; i < x->x_bufsize; i++)
+                x->x_buf[i- ndel] = x->x_buf[i];
+            newsize = x->x_bufsize - ndel;
+            x->x_buf = resizebytes(x->x_buf, x->x_bufsize, newsize);
+            x->x_bufsize = newsize;
+        }
 
 /* at Guenter's suggestion, use 'n>31' to test wither a character might
 be printable in whatever 8-bit character set we find ourselves. */
@@ -616,8 +631,12 @@ be printable in whatever 8-bit character set we find ourselves. */
             int ch_nbytes = u8_wc_nbytes(n);
             newsize = x->x_bufsize + ch_nbytes;
             x->x_buf = resizebytes(x->x_buf, x->x_bufsize, newsize);
-            for (i = newsize-1; i > x->x_selstart; i--)
-                x->x_buf[i] = x->x_buf[i-ch_nbytes];
+            //fprintf(stderr,"x->x_bufsize=%d newsize=%d\n", x->x_bufsize, newsize);
+            //for (i = newsize-1; i >= x->x_selstart; i--)
+            //{
+                //fprintf(stderr,"%d-%d <%d>\n", i, i-ch_nbytes, x->x_buf[i-ch_nbytes]);
+                //x->x_buf[i] = '\0';
+            //}
             x->x_bufsize = newsize;
             /*-- moo: assume canvas_key() has encoded keysym as UTF-8 */
             strncpy(x->x_buf+x->x_selstart, keysym->s_name, ch_nbytes);
@@ -957,21 +976,37 @@ void rtext_mouse(t_rtext *x, int xval, int yval, int flag)
     }
     else if (flag == RTEXT_DBL)
     {
-        int ws, ns;
+        int whereseparator, newseparator;
         x->x_dragfrom = -1;
-        ws = 0;
-        if ((ns = lastone(x->x_buf, ' ' , indx)) > ws) ws = ns+1;
-        if ((ns = lastone(x->x_buf, '\n', indx)) > ws) ws = ns+1;
-        if ((ns = lastone(x->x_buf, ';' , indx)) > ws) ws = ns+1;
-        if ((ns = lastone(x->x_buf, ',' , indx)) > ws) ws = ns+1;
-        x->x_selstart = ws;
+        whereseparator = 0;
+        if ((newseparator = lastone(x->x_buf, ' ', indx)) > whereseparator)
+            whereseparator = newseparator+1;
+        if ((newseparator = lastone(x->x_buf, '\n', indx)) > whereseparator)
+            whereseparator = newseparator+1;
+        if ((newseparator = lastone(x->x_buf, ';', indx)) > whereseparator)
+            whereseparator = newseparator+1;
+        if ((newseparator = lastone(x->x_buf, ',', indx)) > whereseparator)
+            whereseparator = newseparator+1;
+        x->x_selstart = whereseparator;
         
-        int i = ws = x->x_bufsize - indx;
-        if ((ns = firstone(x->x_buf+indx, ' ' , i)) >= 0 && ns < ws) ws = ns;
-        if ((ns = firstone(x->x_buf+indx, '\n', i)) >= 0 && ns < ws) ws = ns;
-        if ((ns = firstone(x->x_buf+indx, ';',  i)) >= 0 && ns < ws) ws = ns;
-        if ((ns = firstone(x->x_buf+indx, ',',  i)) >= 0 && ns < ws) ws = ns;
-        x->x_selend = indx + ws;
+        whereseparator = x->x_bufsize - indx;
+        if ((newseparator =
+            firstone(x->x_buf+indx, ' ', x->x_bufsize - indx)) >= 0 &&
+                newseparator < whereseparator)
+                    whereseparator = newseparator;
+        if ((newseparator =
+            firstone(x->x_buf+indx, '\n', x->x_bufsize - indx)) >= 0 &&
+                newseparator < whereseparator)
+                    whereseparator = newseparator;
+        if ((newseparator =
+            firstone(x->x_buf+indx, ';', x->x_bufsize - indx)) >= 0 &&
+                newseparator < whereseparator)
+                    whereseparator = newseparator;
+        if ((newseparator =
+            firstone(x->x_buf+indx, ',', x->x_bufsize - indx)) >= 0 &&
+                newseparator < whereseparator)
+                    whereseparator = newseparator;
+        x->x_selend = indx + whereseparator;
     }
     else if (flag == RTEXT_SHIFT)
     {
diff --git a/pd/src/m_memory.c b/pd/src/m_memory.c
index 2b2530017428f305feb92119d487275b272ff0dc..4e16f8134b1d6dda944f89549d767ad1a74f6eee 100644
--- a/pd/src/m_memory.c
+++ b/pd/src/m_memory.c
@@ -22,7 +22,7 @@ void *getbytes(size_t nbytes)
     void *ret;
 
     if (nbytes < 1) nbytes = 1;
-    ret = (void *)calloc(nbytes, 1);
+    ret = (void *)calloc(nbytes, sizeof(char*));
 
 #ifdef LOUD
     fprintf(stderr, "new  %lx %d\n", (int)ret, nbytes);
@@ -55,9 +55,9 @@ void *resizebytes(void *old, size_t oldsize, size_t newsize)
     void *ret;
     if (newsize < 1) newsize = 1;
     if (oldsize < 1) oldsize = 1;
-    ret = (void *)realloc((char *)old, newsize * sizeof(char *));
+    ret = (void *)realloc((char *)old, newsize * sizeof(char*));
     if (newsize > oldsize && ret)
-        memset(((char *)ret) + oldsize, 0, newsize - oldsize);
+        memset(((char *)ret) + oldsize, 0, (newsize - oldsize) * sizeof(char*));
 #ifdef LOUD
     fprintf(stderr, "resize %lx %d --> %lx %d\n", (int)old, oldsize, (int)ret, newsize);
 #endif /* LOUD */
diff --git a/pd/src/s_main.c b/pd/src/s_main.c
index 85eaf34a72284997f03bd47e93d55c6a29ceb7a9..e00b17d703c4c891653829f3194905bb252cf043 100644
--- a/pd/src/s_main.c
+++ b/pd/src/s_main.c
@@ -314,9 +314,8 @@ int sys_main(int argc, char **argv)
             // character, we add 3 additional characters per entry
             length = length + strlen(nl->nl_string) + 3;
         }
-        if((filenames = malloc(length)) != NULL)
+        if(length && (filenames = (char*) calloc(length, sizeof(char*)) ) != NULL)
         {
-            filenames[0] = '\0';   // ensures the memory is an empty string
             strcat(filenames,"\"");
             if (sys_openlist)
             {
@@ -328,7 +327,7 @@ int sys_main(int argc, char **argv)
                     else strcat(filenames,"\"\0"); // ensures proper termination
                 }
             }
-            //fprintf(stderr,"final list: <%s>\n", filenames);
+            //fprintf(stderr,"final list: <%s> <%c> %d\n", filenames, filenames[0], length);
         }
         else
         {
@@ -338,6 +337,7 @@ int sys_main(int argc, char **argv)
     }
     sys_vgui("pdtk_check_unique %d {%s}\n", sys_unique,
         (filenames ? filenames : "0"));
+    if (filenames != NULL) free(filenames);
     if (sys_externalschedlib)
         return (sys_run_scheduler(sys_externalschedlibname,
             sys_extraflagsstring));
diff --git a/pd/src/s_utf8.c b/pd/src/s_utf8.c
index fd3081b6b62bf495f77d77b1508810f70b3ccdf5..6f5e0d7ac6b3e78991d34fc9193798c30812a642 100644
--- a/pd/src/s_utf8.c
+++ b/pd/src/s_utf8.c
@@ -230,12 +230,12 @@ int u8_charnum(char *s, int offset)
     char *const end = string + offset;
 
     while (string < end && *string != '\0') {
-        if (*string++ & 0x80) {
-            if (!isutf(*string)) {
+        if (*string++ & 0x80 && string != end) {
+            if (string < end && !isutf(*string)) {
                 ++string;
-                if (!isutf(*string)) {
+                if (string < end && !isutf(*string)) {
                     ++string;
-                    if (!isutf(*string)) {
+                    if (string < end && !isutf(*string)) {
                         ++string;
                     }
                 }