diff --git a/exec/load/meme_lib.js b/exec/load/meme_lib.js
index e24be7d07375fa55deaf7fb615afde216e3db72b..e6b16ca9f914d8dbc9ebe6fa013ec978d00336e1 100755
--- a/exec/load/meme_lib.js
+++ b/exec/load/meme_lib.js
@@ -14,6 +14,11 @@ var BORDER_ORNATE2 = 7;
 var BORDER_ORNATE3 = 8;
 var BORDER_COUNT = 9;
 
+var JUSTIFY_CENTER = 0;
+var JUSTIFY_LEFT = 1;
+var JUSTIFY_RIGHT = 2;
+var JUSTIFY_COUNT = 3;
+
 // We don't have String.repeat() in ES5
 function repeat(ch, length)
 {
@@ -118,16 +123,19 @@ function bottom_border(border, width)
 	return str + "\x01N\r\n";
 }
 
-function generate(attr, border, text)
+function generate(width, attr, border, text, justify)
 {
-	var width = 39;
 	var msg = attr + top_border(border, width);
 	var array = word_wrap(text, width - 4).split("\n");
 	for (var i in array) {
 		var line = truncsp(array[i]);
 		if (!line && i >= array.length - 1)
 			break;
-		var margin = Math.floor((width - line.length) / 2);
+		var margin = 2;
+		if (justify == JUSTIFY_CENTER)
+			margin = Math.floor((width - line.length) / 2);
+		else if (justify == JUSTIFY_RIGHT)
+			margin = width - (line.length + 2);
 		msg += attr + mid_border(border, width, margin, line);
 	}
 	msg += attr + bottom_border(border, width);
diff --git a/exec/postmeme.js b/exec/postmeme.js
index 83a20d4f09c1bcc652402a9e4c9c31fa8f1b30e6..36766fdea70545b10a7d313706dbe3721d813a7c 100755
--- a/exec/postmeme.js
+++ b/exec/postmeme.js
@@ -6,6 +6,8 @@
 //   border (default: 0)
 //   random (default: false)
 //   max_length (default: 500)
+//   width (default: 39)
+//   justify (default: center)
 
 "use strict";
 require("key_defs.js", "KEY_LEFT");
@@ -17,8 +19,8 @@ var lib = load({}, "meme_lib.js");
 
 function choose(border)
 {
-	console.mnemonics(format("Style: ~Color, ~@Next@, ~@Previous@, or ~@Quit@ [%u]: ", (border % lib.BORDER_COUNT) + 1));
-	var ch = console.getkeys("C" + KEY_LEFT + KEY_RIGHT + "\r" + console.next_key + console.prev_key + console.quit_key, lib.BORDER_COUNT);
+	console.mnemonics(format("~Border, ~Color, ~Justify, ~@Quit@, or [Select]: "));
+	var ch = console.getkeys("BCJ" + KEY_LEFT + KEY_RIGHT + "\r" + console.next_key + console.prev_key + console.quit_key, lib.BORDER_COUNT);
 	if (typeof ch == "number")
 		return ch - 1;
 	switch (ch) {
@@ -27,7 +29,9 @@ function choose(border)
 		case '\r':
 			return true;
 		case 'C':
-			return 'C';
+		case 'J':
+		case 'B':
+			return ch;
 		case KEY_UP:
 		case KEY_LEFT:
 		case console.prev_key:
@@ -50,6 +54,7 @@ var attr = [
 	"\x01H\x01W\x016",
 	"\x01N\x01K\x017",
 ];
+var justify = options.justify || 0;
 var border = options.border || 0;
 var color = options.color || 0;
 if (options.random) {
@@ -58,8 +63,13 @@ if (options.random) {
 }
 var msg;
 while (!js.terminated) {
-	msg = lib.generate(attr[color % attr.length], border  % lib.BORDER_COUNT, text);
+	msg = lib.generate(options.width || 39, attr[color % attr.length], border  % lib.BORDER_COUNT, text, justify % lib.JUSTIFY_COUNT);
 	console.clear();
+	console.attributes = WHITE | HIGH;
+	console.print(format("Meme \x01N\x01C(border \x01H%u \x01N\x01Cof \x01H%u\x01N\x01C, color \x01H%u\x01N\x01C of \x01H%u\x01N\x01C):"
+		, (border % lib.BORDER_COUNT) + 1, lib.BORDER_COUNT
+		, (color % attr.length) + 1, attr.length));
+	console.newline(2);
 	print(msg);
 	var ch = choose(border);
 	if (ch === false)
@@ -70,6 +80,10 @@ while (!js.terminated) {
 		border = ch;
 	else if (ch === 'C')
 		++color;
+	else if (ch === 'J')
+		++justify;
+	else if (ch === 'B')
+		++border;
 	else if (ch == console.next_key && border < lib.BORDER_COUNT - 1)
 		++border;
 	else if (ch == console.prev_key && border > 0)