Index: uspace/drv/bus/isa/isa.c
===================================================================
--- uspace/drv/bus/isa/isa.c	(revision ef1ddad20408830a360e344025b7a34ea5111d52)
+++ uspace/drv/bus/isa/isa.c	(revision ee3f6f6d3d003ebc47b38e91f789327c8d9b1ab2)
@@ -355,5 +355,5 @@
 
 	/* Get the name part of the rest of the line. */
-	strtok(line, ":");
+	str_tok(line, ":", NULL);
 	return line;
 }
Index: uspace/lib/c/generic/str.c
===================================================================
--- uspace/lib/c/generic/str.c	(revision ef1ddad20408830a360e344025b7a34ea5111d52)
+++ uspace/lib/c/generic/str.c	(revision ee3f6f6d3d003ebc47b38e91f789327c8d9b1ab2)
@@ -1360,30 +1360,44 @@
 }
 
-char *strtok(char *s, const char *delim)
-{
-	static char *next;
-
-	return strtok_r(s, delim, &next);
-}
-
-char *strtok_r(char *s, const char *delim, char **next)
+/** Split string by delimiters.
+ *
+ * @param s             String to be tokenized. May not be NULL.
+ * @param delim		String with the delimiters.
+ * @param next		Variable which will receive the pointer to the
+ *                      continuation of the string following the first
+ *                      occurrence of any of the delimiter characters.
+ *                      May be NULL.
+ * @return              Pointer to the prefix of @a s before the first
+ *                      delimiter character. NULL if no such prefix
+ *                      exists.
+ */
+char *str_tok(char *s, const char *delim, char **next)
 {
 	char *start, *end;
 
-	if (s == NULL)
-		s = *next;
+	if (!s)
+		return NULL;
+	
+	size_t len = str_size(s);
+	size_t cur;
+	size_t tmp;
+	wchar_t ch;
 
 	/* Skip over leading delimiters. */
-	while (*s && (str_chr(delim, *s) != NULL)) ++s;
-	start = s;
+	for (tmp = cur = 0;
+	    (ch = str_decode(s, &tmp, len)) && str_chr(delim, ch); /**/)
+		cur = tmp;
+	start = &s[cur];
 
 	/* Skip over token characters. */
-	while (*s && (str_chr(delim, *s) == NULL)) ++s;
-	end = s;
-	*next = (*s ? s + 1 : s);
-
-	if (start == end) {
+	for (tmp = cur;
+	    (ch = str_decode(s, &tmp, len)) && !str_chr(delim, ch); /**/)
+		cur = tmp;
+	end = &s[cur];
+	if (next)
+		*next = (ch ? &s[tmp] : &s[cur]);
+
+	if (start == end)
 		return NULL;	/* No more tokens. */
-	}
 
 	/* Overwrite delimiter with NULL terminator. */
Index: uspace/lib/c/include/str.h
===================================================================
--- uspace/lib/c/include/str.h	(revision ef1ddad20408830a360e344025b7a34ea5111d52)
+++ uspace/lib/c/include/str.h	(revision ee3f6f6d3d003ebc47b38e91f789327c8d9b1ab2)
@@ -109,4 +109,6 @@
 extern char *str_ndup(const char *, size_t max_size);
 
+extern char *str_tok(char *, const char *, char **);
+
 extern int str_uint8_t(const char *, const char **, unsigned int, bool,
     uint8_t *);
@@ -132,7 +134,4 @@
 extern unsigned long strtoul(const char *, char **, int);
 
-extern char * strtok_r(char *, const char *, char **);
-extern char * strtok(char *, const char *);
-
 #endif
 
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision ef1ddad20408830a360e344025b7a34ea5111d52)
+++ uspace/srv/fs/fat/fat_ops.c	(revision ee3f6f6d3d003ebc47b38e91f789327c8d9b1ab2)
@@ -930,12 +930,10 @@
 	/* Parse mount options. */
 	char *mntopts = (char *) opts;
-	char *saveptr;
 	char *opt;
-	while ((opt = strtok_r(mntopts, " ,", &saveptr)) != NULL) {
+	while ((opt = str_tok(mntopts, " ,", &mntopts)) != NULL) {
 		if (str_cmp(opt, "wtcache") == 0)
 			cmode = CACHE_MODE_WT;
 		else if (str_cmp(opt, "nolfn") == 0)
 			instance->lfn_enabled = false;
-		mntopts = NULL;
 	}
 
Index: uspace/srv/logger/initlvl.c
===================================================================
--- uspace/srv/logger/initlvl.c	(revision ef1ddad20408830a360e344025b7a34ea5111d52)
+++ uspace/srv/logger/initlvl.c	(revision ee3f6f6d3d003ebc47b38e91f789327c8d9b1ab2)
@@ -44,6 +44,6 @@
 {
 	char *tmp;
-	char *key = strtok_r(setting, "=", &tmp);
-	char *value = strtok_r(NULL, "=", &tmp);
+	char *key = str_tok(setting, "=", &tmp);
+	char *value = str_tok(tmp, "=", &tmp);
 	if (key == NULL)
 		return;
@@ -76,8 +76,8 @@
 {
 	char *tmp;
-	char *single_setting = strtok_r(settings, " ", &tmp);
+	char *single_setting = str_tok(settings, " ", &tmp);
 	while (single_setting != NULL) {
 		parse_single_level_setting(single_setting);
-		single_setting = strtok_r(NULL, " ", &tmp);
+		single_setting = str_tok(tmp, " ", &tmp);
 	}
 }
