diff --git a/second/cfg.c b/second/cfg.c
index 4167582..a500216 100644
--- a/second/cfg.c
+++ b/second/cfg.c
@@ -350,6 +350,30 @@ static void check_for_obsolete(const char *label)
 	}
 }
 
+static int cfg_reset ()
+{
+    CONFIG *walk;
+#if DEBUG
+    prom_printf("Resetting image table\n");
+#endif
+    line_num = 0;
+    images = NULL;
+    curr_table = NULL;
+    curr_table = cf_options;
+    for (walk = curr_table; walk->type != cft_end; walk++) {
+#if DEBUG
+        prom_printf("ItemA %s = %s\n", walk->name, walk->data);
+#endif
+        if (walk->data != NULL)
+            walk->data = NULL;
+#if DEBUG
+        prom_printf("ItemB %s = %s\n\n", walk->name, walk->data);
+#endif
+    }   
+
+    return 0;
+}
+
 static int cfg_set (char *item, char *value)
 {
      CONFIG *walk;
@@ -429,6 +453,8 @@ int cfg_parse (char *cfg_file, char *buff, int len)
      currp = buff;
      endp = currp + len;
 
+     cfg_reset();
+
      if (setjmp (env))
 	  return -1;
      while (1) {
diff --git a/second/yaboot.c b/second/yaboot.c
index 3fbb103..7012f66 100644
--- a/second/yaboot.c
+++ b/second/yaboot.c
@@ -345,9 +345,12 @@ load_config_file(struct boot_fspec_t *orig_fspec)
      else
 	  conf_path[0] = 0;
      if (fspec.file && *fspec.file)
-	  strcat(conf_path, fspec.file);
+      if (!strncmp (fspec.file, "/", 1))
+       strcpy(conf_path, fspec.file);
+      else
+       strcat(conf_path, fspec.file);
      else
-     strcat(conf_path, CONFIG_FILE_NAME);
+      strcat(conf_path, CONFIG_FILE_NAME);
 
      /* Open it */
      fspec.file = conf_path;
@@ -874,6 +877,24 @@ int get_params(struct boot_param_t* params)
 	  return 1;
      }
 
+     if (!strncmp (imagename, "conf", 4)) {
+         DEBUG_F("Loading user-specified config file: %s\n",imagename);
+         if (password) {
+             check_password ("Restricted command.");
+             return 1;
+         }
+         strcpy(boot.file, imagename+5);
+         if (strlen(boot.file)){
+             useconf = load_config_file(&boot);
+             DEBUG_F("Config file loaded\n");
+             if (useconf && (q = cfg_get_strg(0, "timeout")) != 0 && *q != 0)
+                 timeout = simple_strtol(q, NULL, 0);
+         } else {
+             DEBUG_F("empty config file name\n");
+         }
+         return 0;
+     }
+
      if (imagename[0] == '$') {
 	  /* forth command string */
 	  if (password)
diff --git a/util/addnote.c b/util/addnote.c
index 351c4fc..56de0c7 100644
--- a/util/addnote.c
+++ b/util/addnote.c
@@ -105,12 +105,12 @@ main(int ac, char **av)
 
      if (ac != 2) {
 	  fprintf(stderr, "Usage: %s elf-file\n", av[0]);
-	  exit(1);
+	  return(1);
      }
      fd = open(av[1], O_RDWR);
      if (fd < 0) {
 	  perror(av[1]);
-	  exit(1);
+	  return(1);
      }
 
      nnote = 12 + ROUNDUP(strlen(arch) + 1) + sizeof(descr);
@@ -119,7 +119,7 @@ main(int ac, char **av)
      n = read(fd, buf, sizeof(buf));
      if (n < 0) {
 	  perror("read");
-	  exit(1);
+	  return(1);
      }
 
      if (n < E_HSIZE || memcmp(&buf[E_IDENT+EI_MAGIC], elf_magic, 4) != 0)
@@ -129,7 +129,7 @@ main(int ac, char **av)
 	 || buf[E_IDENT+EI_DATA] != ELFDATA2MSB) {
 	  fprintf(stderr, "%s is not a big-endian 32-bit ELF image\n",
 		  av[1]);
-	  exit(1);
+	  return(1);
      }
 
      ph = GET_32BE(E_PHOFF);
@@ -144,7 +144,7 @@ main(int ac, char **av)
 	  if (GET_32BE(ph + PH_TYPE) == PT_NOTE) {
 	       fprintf(stderr, "%s already has a note entry\n",
 		       av[1]);
-	       exit(0);
+	       return(0);
 	  }
 	  ph += ps;
      }
@@ -193,23 +193,23 @@ main(int ac, char **av)
      i = write(fd, buf, n);
      if (i < 0) {
 	  perror("write");
-	  exit(1);
+	  return(1);
      }
      if (i < n) {
 	  fprintf(stderr, "%s: write truncated\n", av[1]);
-	  exit(1);
+	  return(1);
      }
 
-     exit(0);
+     return(0);
 
 notelf:
      fprintf(stderr, "%s does not appear to be an ELF file\n", av[1]);
-     exit(1);
+     return(1);
 
 nospace:
      fprintf(stderr, "sorry, I can't find space in %s to put the note\n",
 	     av[1]);
-     exit(1);
+     return(1);
 }
 
 /*
