diff --git a/bundles/runtime/org.eclipse.fx.core/src/org/eclipse/fx/core/text/TextUtil.java b/bundles/runtime/org.eclipse.fx.core/src/org/eclipse/fx/core/text/TextUtil.java
index 8be46e4..bb01e03 100644
--- a/bundles/runtime/org.eclipse.fx.core/src/org/eclipse/fx/core/text/TextUtil.java
+++ b/bundles/runtime/org.eclipse.fx.core/src/org/eclipse/fx/core/text/TextUtil.java
@@ -30,6 +30,8 @@
 import org.apache.commons.lang.text.StrSubstitutor;
 import org.eclipse.fx.core.IntTuple;
 import org.eclipse.fx.core.Triple;
+import org.eclipse.fx.core.function.BiIntPredicate;
+import org.eclipse.fx.core.function.BiIntToIntFunction;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -349,7 +351,7 @@
 	 * <li>{@link Triple#value3}: the new indices where a "tab" is starts
 	 * now</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param source
 	 *            the source array
 	 * @param tabAdvance
@@ -393,4 +395,94 @@
 
 		return new Triple<>(rv, tabPositions, newTabPositions);
 	}
+
+	/**
+	 * Replaces all occurences of the provided character in the source
+	 *
+	 * @param source
+	 *            the source
+	 * @param c
+	 *            the character to replace
+	 * @param newChar
+	 *            the replacement
+	 * @return a new array with all character replaced
+	 */
+	public static char[] replaceAll(char[] source, char c, char[] newChar) {
+		StringBuilder b = new StringBuilder(source.length);
+
+		for (int i = 0; i < source.length; i++) {
+			if (source[i] == c) {
+				b.append(newChar);
+			} else {
+				b.append(source[i]);
+			}
+		}
+
+		char[] rv = new char[b.length()];
+		b.getChars(0, b.length(), rv, 0);
+		return rv;
+	}
+
+	/**
+	 * Transform the provided source array by applying the provided function
+	 *
+	 * @param source
+	 *            the source
+	 * @param transformer
+	 *            the transformation function, first argument is the character
+	 *            index, second argument is the character
+	 * @return transformed character array
+	 */
+	public static char[] transform(char[] source, BiIntToIntFunction transformer) {
+		char[] rv = new char[source.length];
+		for (int i = 0; i < source.length; i++) {
+			rv[i] = (char) transformer.apply(i, source[i]);
+		}
+		return rv;
+	}
+
+	/**
+	 * Replace entries matching the provided predicate with the provided char
+	 *
+	 * @param source
+	 *            the source array
+	 * @param c
+	 *            the replacement character
+	 * @param predicate
+	 *            the predicate to decided if a character is replaced, first
+	 *            argument is the character index, second argument is the
+	 *            character
+	 * @return transformed character array
+	 */
+	public static char[] replace(char[] source, char c, BiIntPredicate predicate) {
+		char[] rv = new char[source.length];
+		for (int i = 0; i < source.length; i++) {
+			rv[i] = predicate.test(i, source[i]) ? c : source[i];
+		}
+		return rv;
+	}
+
+	private static String[] BASIC_STRING_CACHE = new String[256];
+
+	/**
+	 * Get the matching string for the char. The string object returned might be
+	 * the same instance.
+	 *
+	 * @param c
+	 *            the character
+	 * @return a (cached) string object
+	 */
+	public static String toString(char c) {
+		String rv = null;
+		if (c < BASIC_STRING_CACHE.length) {
+			rv = BASIC_STRING_CACHE[c];
+			if (rv == null) {
+				BASIC_STRING_CACHE[c] = String.valueOf(c);
+			}
+		}
+		if (rv == null) {
+			rv = String.valueOf(c);
+		}
+		return rv;
+	}
 }
