diff -ru grub-2.00/grub-core/gfxmenu/view.c grub-2.00.patched/grub-core/gfxmenu/view.c
--- grub-2.00/grub-core/gfxmenu/view.c	2012-02-24 11:19:45.000000000 +0100
+++ grub-2.00.patched/grub-core/gfxmenu/view.c	2013-03-03 16:36:08.945858667 +0100
@@ -42,6 +42,7 @@
 init_terminal (grub_gfxmenu_view_t view);
 static grub_video_rect_t term_rect;
 static grub_gfxmenu_view_t term_view;
+static grub_video_rect_t title_rect;
 
 /* Create a new view object, loading the theme specified by THEME_PATH and
    associating MODEL with the view.  */
@@ -141,18 +142,69 @@
 static void
 draw_title (grub_gfxmenu_view_t view)
 {
-  if (! view->title_text)
+  const char *env_title;
+  const char *title;
+  char *title_formatted;
+  const char *env_posx;
+  const char *env_posy;
+  int title_width;
+  int title_height;
+  int x;
+  int y;
+  int ybase;
+
+  env_title = grub_env_get ("title");
+  if (env_title)
+  {
+    title = env_title;
+  }
+  else if (view->title_text)
+  {
+    title = view->title_text;
+  }
+  if (! title)
     return;
-
-  /* Center the title. */
-  int title_width = grub_font_get_string_width (view->title_font,
-                                                view->title_text);
-  int x = (view->screen.width - title_width) / 2;
-  int y = 40 + grub_font_get_ascent (view->title_font);
-  grub_font_draw_string (view->title_text,
+  if (grub_strstr(title, "%s"))
+  {
+    title_formatted = grub_xasprintf (title, PACKAGE_VERSION);
+    if (!title_formatted)
+      return;
+  }
+  else
+  {
+    title_formatted = grub_strdup (title);
+  }
+  title_width = grub_font_get_string_width (view->title_font, title_formatted);
+  env_posx = grub_env_get ("title_posx");
+  if (env_posx)
+  {
+    x = (int) grub_strtol (env_posx, (char**) &env_posx, 0);
+  }
+  else
+  {
+    /* Center the title. */
+    x = (view->screen.width - title_width) / 2;
+  }
+  env_posy = grub_env_get ("title_posy");
+  if (env_posy)
+  {
+    y = (int) grub_strtol (env_posy, (char**) &env_posy, 0);
+  }
+  else
+  {
+    y = 40;
+  }
+  title_height = grub_font_get_ascent (view->title_font);
+  ybase = y + title_height;
+  grub_font_draw_string (title_formatted,
                          view->title_font,
                          grub_video_map_rgba_color (view->title_color),
-                         x, y);
+                         x, ybase);
+  grub_free (title_formatted);
+  title_rect.x = x;
+  title_rect.y = y;
+  title_rect.width = title_width;
+  title_rect.height = title_height;
 }
 
 struct progress_value_data
@@ -324,11 +376,13 @@
 
   grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
                                 redraw_menu_visit, view);
+  grub_gfxmenu_view_redraw (view, &title_rect);
   grub_video_swap_buffers ();
   if (view->double_repaint)
     {
       grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
 				    redraw_menu_visit, view);
+      grub_gfxmenu_view_redraw (view, &title_rect);
     }
 }
 
diff -ru grub-2.00/grub-core/normal/main.c grub-2.00.patched/grub-core/normal/main.c
--- grub-2.00/grub-core/normal/main.c	2012-06-26 03:59:57.000000000 +0200
+++ grub-2.00.patched/grub-core/normal/main.c	2013-03-02 18:00:52.297175990 +0100
@@ -226,28 +226,49 @@
 {
   grub_ssize_t msg_len;
   int posx;
-  const char *msg = _("GNU GRUB  version %s");
+  const char *msg;
   char *msg_formatted;
   grub_uint32_t *unicode_msg;
+  const char *position;
   grub_uint32_t *last_position;
+
+  msg = grub_env_get ("title");
+  if (!msg)
+  {
+    msg = _("GNU GRUB  version %s");
+  }
+  if (grub_strstr(msg, "%s"))
+  {
+    msg_formatted = grub_xasprintf (msg, PACKAGE_VERSION);
+    if (!msg_formatted)
+      return;
+  }
+  else
+  {
+    msg_formatted = grub_strdup (msg);
+  }
  
   grub_term_cls (term);
-
-  msg_formatted = grub_xasprintf (msg, PACKAGE_VERSION);
-  if (!msg_formatted)
-    return;
  
   msg_len = grub_utf8_to_ucs4_alloc (msg_formatted,
   				     &unicode_msg, &last_position);
   grub_free (msg_formatted);
  
   if (msg_len < 0)
-    {
-      return;
-    }
+  {
+    return;
+  }
 
-  posx = grub_getstringwidth (unicode_msg, last_position, term);
-  posx = (grub_term_width (term) - posx) / 2;
+  position = grub_env_get ("title_posx");
+  if (position)
+  {
+    posx = (int) grub_strtol (position, (char**) &position, 0);
+  }
+  else
+  {
+    posx = grub_getstringwidth (unicode_msg, last_position, term);
+    posx = (grub_term_width (term) - posx) / 2;
+  }
   grub_term_gotoxy (term, posx, 1);
 
   grub_print_ucs4 (unicode_msg, last_position, 0, 0, term);
diff -ru grub-2.00/grub-core/normal/menu.c grub-2.00.patched/grub-core/normal/menu.c
--- grub-2.00/grub-core/normal/menu.c	2012-05-17 14:55:37.000000000 +0200
+++ grub-2.00.patched/grub-core/normal/menu.c	2013-03-05 21:50:02.095248560 +0100
@@ -158,7 +158,7 @@
   grub_err_t err = GRUB_ERR_NONE;
   int errs_before;
   grub_menu_t menu = NULL;
-  char *optr, *buf, *oldchosen = NULL, *olddefault = NULL;
+  char *optr, *buf, *oldchosen = NULL, *olddefault = NULL, *multimenu = NULL;
   const char *ptr, *chosen, *def;
   grub_size_t sz = 0;
 
@@ -263,15 +263,19 @@
 	}
       grub_env_context_close ();
     }
-  if (oldchosen)
-    grub_env_set ("chosen", oldchosen);
-  else
-    grub_env_unset ("chosen");
-  if (olddefault)
-    grub_env_set ("default", olddefault);
-  else
-    grub_env_unset ("default");
-  grub_env_unset ("timeout");
+  multimenu = grub_env_get ("multimenu");
+  if (! multimenu)
+  {
+    if (oldchosen)
+      grub_env_set ("chosen", oldchosen);
+    else
+      grub_env_unset ("chosen");
+    if (olddefault)
+      grub_env_set ("default", olddefault);
+    else
+      grub_env_unset ("default");
+    grub_env_unset ("timeout");
+  }
 }
 
 /* Execute ENTRY from the menu MENU, falling back to entries specified
