diff --git a/config.def.h b/config.def.h
index d1c20bd..ed19d04 100644
--- a/config.def.h
+++ b/config.def.h
@@ -13,6 +13,9 @@ static char shell[] = "/bin/sh";
 static unsigned int doubleclicktimeout = 300;
 static unsigned int tripleclicktimeout = 600;
 
+/* 8bit meta */
+static bool meta8 = true;
+
 /* alt screens */
 static bool allowaltscreen = true;
 
diff --git a/st.c b/st.c
index 71e5b83..3a87f0a 100644
--- a/st.c
+++ b/st.c
@@ -3228,7 +3228,8 @@ kpress(XEvent *ev) {
 	XKeyEvent *e = &ev->xkey;
 	KeySym ksym;
 	char xstr[31], buf[32], *customkey, *cp = buf;
-	int len;
+	int len, ret;
+	long c;
 	Status status;
 	Shortcut *bp;
 
@@ -3254,8 +3255,18 @@ kpress(XEvent *ev) {
 		if(len == 0)
 			return;
 
-		if(len == 1 && e->state & Mod1Mask)
-			*cp++ = '\033';
+		if(len == 1 && e->state & Mod1Mask) {
+			if(meta8) {
+				if(*xstr < 0177) {
+					c = *xstr | B7;
+					ret = utf8encode(&c, cp);
+					cp += ret;
+					len = 0;
+				}
+			} else
+				*cp++ = '\033';
+		}
+
 
 		memcpy(cp, xstr, len);
 		len = cp - buf + len;
@@ -3380,6 +3391,9 @@ main(int argc, char *argv[]) {
 	xw.isfixed = False;
 
 	ARGBEGIN {
+	case '8':
+		meta8 = false;
+		break;
 	case 'a':
 		allowaltscreen = false;
 		break;
