diff --git a/share/man/man5/loader.conf.5 b/share/man/man5/loader.conf.5
index dd99b1a..1e16ef1 100644
--- a/share/man/man5/loader.conf.5
+++ b/share/man/man5/loader.conf.5
@@ -185,6 +185,9 @@ To make his life a bit more colorful, consider setting
 .Pa loader_color
 to
 .Dq YES .
+.It Va fred_on_left
+.Pq Dq NO
+Shows Fred on the left side of the menu rather than the right side.
 .It Va kernel
 .Pq Dq kernel
 .It Va loader_color
diff --git a/sys/boot/dloader/cmds.c b/sys/boot/dloader/cmds.c
index 5f27974..105a8f9 100644
--- a/sys/boot/dloader/cmds.c
+++ b/sys/boot/dloader/cmds.c
@@ -431,17 +431,144 @@ command_menu(int ac, char **av)
 	return (res);
 }
 
+#define LOGO_LINES 17
+#define FRED_LEFT 0
+#define FRED_RIGHT 1
+static char *logo_blank_line = "                                 ";
+static char *menu_header_left = "============================ DragonFly BSD ====================================\n";
+static char *menu_header_right = "==================================== DragonFly BSD ============================\n";
+static char *menu_footer = "===============================================================================\n";
+
+static char *logo_color[LOGO_LINES] = {
+	"                                 ",
+	"[37m ,--,           [31m|           [37m,--, [0m",
+	"[37m |   `-,       [31m,^,       [37m,-'   | [0m",
+	"[37m  `,    `-,   [32m([31m/ \\[32m)   [37m,-'    ,'  [0m",
+	"[37m    `-,    `-,[31m/   \\[37m,-'    ,-'    [0m",
+	"[37m       `------[31m(   )[37m------'       [0m",
+	"[37m   ,----------[31m(   )[37m----------,   [0m",
+	"[37m  |        _,-[31m(   )[37m-,_        |  [0m",
+	"[37m   `-,__,-'   [31m\\   /   [37m`-,__,-'   [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m| |               [0m",
+	"[37m               [31m`|'               [0m",
+	"                                 " };
+
+static char *logo_mono[LOGO_LINES] =  {
+	"                                 ",
+	" ,--,           |           ,--, ",
+	" |   `-,       ,^,       ,-'   | ",
+	"  `,    `-,   (/ \\)   ,-'    ,'  ",
+	"    `-,    `-,/   \\,-'    ,-'    ",
+	"       `------(   )------'       ",
+	"   ,----------(   )----------,   ",
+	"  |        _,-(   )-,_        |  ",
+	"   `-,__,-'   \\   /   `-,__,-'   ",
+	"               | |               ",
+	"               | |               ",
+	"               | |               ",
+	"               | |               ",
+	"               | |               ",
+	"               | |               ",
+	"               `|'               ",
+	"                                 " };
+
+static char *logo_blank[LOGO_LINES] =  {
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 ",
+	"                                 " };
+
+static void
+logo_display(char **logo, int line, int orientation)
+{
+	const char *fmt;
+
+	if (orientation == FRED_LEFT)
+		fmt = "%s  | ";
+	else
+		fmt = " |  %s";
+
+	if (logo != NULL) {
+		if (line < LOGO_LINES)
+			printf(fmt, logo[line]);
+		else
+			printf(fmt, logo_blank_line);
+	}
+}
+
 static void
 menu_display(void)
 {
 	dvar_t dvar;
+	int i;
+	int logo_left = 0;		/* default to fred on right */
+	char **logo = logo_mono;
+	const char *fmt;
 
-	for (dvar = dvar_first(); dvar; dvar = dvar_next(dvar)) {
-		if (strncmp(dvar->name, "menu_", 5) == 0) {
-			printf("%c. %s\n", dvar->name[5], dvar->data[0]);
+	if (dvar_istrue(dvar_get("loader_color")))
+		logo = logo_color;
+
+	if (dvar_istrue(dvar_get("fred_disable")))
+		logo = NULL;
+
+	if (dvar_istrue(dvar_get("fred_on_left")))
+		logo_left = 1;
+
+	dvar = dvar_first();
+	i = 0;
+	
+	if (logo != NULL) {
+		printf(logo_left ? menu_header_left : menu_header_right);
+		printf(logo_left ? "%35s|%43s\n" : "%43s|%35s\n", " ", " ");
+	}
+
+	while (dvar || i < LOGO_LINES) {
+		if (logo_left)
+			logo_display(logo, i, FRED_LEFT);
+		i++;
+
+		while (dvar) {
+			if (strncmp(dvar->name, "menu_", 5) == 0) {
+				printf(" %c. %-38.38s", dvar->name[5], dvar->data[0]);
+				dvar = dvar_next(dvar);
+				break;
+			}
+			dvar = dvar_next(dvar);
+		}
+		/*
+		 * Pad when the number of menu entries is less than
+                 * LOGO_LINES.
+		 */
+		if (dvar == NULL) {
+			printf("    %38.38s", " ");
 		}
+
+		if (!logo_left)
+			logo_display(logo, i, FRED_RIGHT);
+		printf("\n");
+	}
+
+	if (logo != NULL) {
+		printf(menu_footer);
 	}
-	printf("\n");
 }
 
 static int
diff --git a/sys/boot/dloader/subs.c b/sys/boot/dloader/subs.c
index a9577c4..ee5fc50 100644
--- a/sys/boot/dloader/subs.c
+++ b/sys/boot/dloader/subs.c
@@ -136,3 +136,17 @@ dvar_free(dvar_t *lastp)
 	free(dvar->data);
 	free(dvar);
 }
+
+int
+dvar_istrue(dvar_t var)
+{
+	int retval = 0;
+
+	if (var != NULL && (strcasecmp(var->data[0], "yes") == 0 ||
+			strcasecmp(var->data[0], "true") == 0 ||
+			strcasecmp(var->data[0], "on") == 0 ||
+			strcasecmp(var->data[0], "1") == 0))
+		retval = 1;
+
+	return (retval);
+}
