diff -urN plex86/Makefile.in plex86.work/Makefile.in
--- plex86/Makefile.in	Sun Aug 13 16:25:19 2000
+++ plex86.work/Makefile.in	Fri Dec 22 12:49:10 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/bin
 
 MDEFINES = CC="$(CC)" CFLAGS="$(CFLAGS)" \
            LDFLAGS="$(LDFLAGS)"
@@ -34,12 +35,14 @@
 # one) don't have to get the tools to compile plex86.  Cd to
 # bios and type 'make' if you want to compile your own.
 all:
+	/bin/mkdir -p $(bindir)
 	$(MAKE) -C user   $(MDEFINES)
 	$(MAKE) -C kernel $(MDEFINES)
 	$(MAKE) -C guest  $(MDEFINES)
 
 
 clean: 
+	/bin/rm -rf $(bindir)
 	$(MAKE) -C user clean
 	$(MAKE) -C kernel clean
 	$(MAKE) -C guest clean
@@ -53,6 +56,7 @@
 	$(MAKE) -C docs dist-clean
 	/bin/rm -f config.status config.cache config.log
 	/bin/rm -f Makefile config.h
+	/bin/rm -rf $(bindir)
 
 Makefile:	Makefile.in config.status
 		CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) config.status
diff -urN plex86/config.h.in plex86.work/config.h.in
--- plex86/config.h.in	Mon Dec 18 15:20:31 2000
+++ plex86.work/config.h.in	Wed Dec 27 16:01:07 2000
@@ -137,5 +137,6 @@
 #define COSIMULATE 0
 #define BX_WITH_SDL 0
 #define SUPPORT_INSTRUMENTATION 0
+#define NEW_CONFIG 0
 
 #define USE_LOADER 0
diff -urN plex86/configure.in plex86.work/configure.in
--- plex86/configure.in	Wed Dec 27 20:40:42 2000
+++ plex86.work/configure.in	Wed Dec 27 21:46:50 2000
@@ -103,7 +103,26 @@
     ]
   )
 
-
+AC_MSG_CHECKING(for new config format)
+AC_ARG_ENABLE(newconfig,
+  [  --enable-newconfig                new config format],
+  [if test "$enableval" = yes; then
+    AC_MSG_RESULT(yes)
+    AC_DEFINE(NEW_CONFIG, 1)
+   elif test "$enableval" = no; then
+    AC_MSG_RESULT(no)
+    AC_DEFINE(NEW_CONFIG, 0)
+   else
+    echo "============================================"
+    echo "ERROR: bad argument to --enable-newconfig   "
+    echo "============================================"
+    exit 1
+   fi],
+  [
+    AC_MSG_RESULT(no)
+    AC_DEFINE(NEW_CONFIG, 0)
+    ]
+  )
 
 AC_ARG_WITH(WinNT,
   [  --with-WinNT                      WinNT host],
diff -urN plex86/kernel/Makefile.in plex86.work/kernel/Makefile.in
--- plex86/kernel/Makefile.in	Mon Dec 18 15:20:34 2000
+++ plex86.work/kernel/Makefile.in	Fri Dec 22 13:15:46 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../bin
 
 LD = ld
 
@@ -64,6 +65,8 @@
 		emulation/emu.o
 	$(MAKE) -C emulation $(MDEFINES)
 	$(LD) $(KLDFLAGS) $^ -o $@
+	mkdir -p $(bindir)
+	cp $@ $(bindir)
 
 emulation/emu.o:
 	$(MAKE) -C emulation $(MDEFINES)
diff -urN plex86/misc/createdisk.sh plex86.work/misc/createdisk.sh
--- plex86/misc/createdisk.sh	Sat Nov 25 19:21:16 2000
+++ plex86.work/misc/createdisk.sh	Wed Dec 27 21:25:49 2000
@@ -7,10 +7,10 @@
 # *                                 *
 # *          Eric Laberge           *
 # *                                 *
-# *          v. 20001125            *
+# *          v. 20001227            *
 # ***********************************
 
-MBR_DATA="mbrdata"
+MBR_DATA="`dirname $0`/mbrdata"
 
 # *** Standard CHS, limit 504MB ***
 
diff -urN plex86/run.sh plex86.work/run.sh
--- plex86/run.sh	Wed Dec 31 19:00:00 1969
+++ plex86.work/run.sh	Mon Dec 25 23:38:19 2000
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+CONF=/home/dlord/programmation/Plex86OS/freedos
+misc/load_module.sh
+cd bin 
+./plex86 -f $CONF
+cd ..
+misc/unload_module.sh
+
diff -urN plex86/user/Makefile.in plex86.work/user/Makefile.in
--- plex86/user/Makefile.in	Mon Dec 18 15:20:43 2000
+++ plex86.work/user/Makefile.in	Tue Dec 26 00:18:56 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../bin
 
 BOCHSDIR = /home/kpl/bochs/bochs-2000_0325a
 BOCHSLIBS = \
@@ -51,12 +52,16 @@
 .c.o:
 	$(CC) -I.. -I$(srcdir)/.. -I$(srcdir) $(CFLAGS) -c  $<
 
-plex86: plex86.o user.o decode.o plugin.o $(COSIM_O)
-	$(CC) -o plex86 plex86.o user.o decode.o plugin.o $(COSIM_O) \
+plex86: plex86.o user.o decode.o plugin.o parse.o $(COSIM_O)
+	$(CC) -o plex86 plex86.o user.o decode.o plugin.o parse.o $(COSIM_O) \
 	  @LIBDL@ -rdynamic $(COSIM_EXTERNAL_LIBS)
+	mkdir -p $(bindir)
+	cp plex86 $(bindir)
 
 resetmod: resetmod.o
 	$(CC) -o resetmod resetmod.o
+	mkdir -p $(bindir)
+	cp resetmod $(bindir)
 
 clean:
 	$(MAKE) -C plugins clean
diff -urN plex86/user/parse.c plex86.work/user/parse.c
--- plex86/user/parse.c	Wed Dec 31 19:00:00 1969
+++ plex86.work/user/parse.c	Wed Dec 27 16:15:09 2000
@@ -0,0 +1,93 @@
+/*
+ *  plex86: run multiple x86 operating systems concurrently
+ *  Copyright (C) 1999-2000  The plex86 developers team
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#include "plex86.h"
+
+#if NEW_CONFIG
+
+#include "parse.h"
+#include <stdio.h>
+
+
+const char stopChar[STOP_CHAR_NUM] = {'=','[',']',' ','\\','#','"',0x0D,0x0A,0x09,0};
+const char spaceChar[SPACE_CHAR_NUM] = {' ',0x0D,0x0A,0x09,0};
+
+Boolean string = 0;
+char terminator = '"';
+
+Boolean CheckStopChar(char toCheck)
+{
+  int a;
+  for (a = 0; a < STOP_CHAR_NUM; a++)
+    if (toCheck == stopChar[a])
+      return 1;
+  return 0;
+}
+
+Boolean CheckSpaceChar(char toCheck)
+{
+  int a;
+  for (a = 0; a < SPACE_CHAR_NUM; a++)
+    if (toCheck == spaceChar[a])
+      return 1;
+  return 0;
+}
+
+char SetStringTerminator(char term)
+{
+  return terminator = term;
+}
+
+Boolean SetStringMode(Boolean stringMode)
+{
+  return string = stringMode;
+}
+
+/*
+O  buf: Buffer to contain the keyword
+O  term: Pointer to a char to hold the terminating char
+I  data: Data to parse
+IO handle: handle to store location in memory
+
+returns buf
+*/
+
+char* Parse(char *buf, char *term, char *data, unsigned int *handle)
+{
+  unsigned int a = 0;
+  char *temp = data;
+
+  while (CheckSpaceChar(temp[*handle]))
+    (*handle)++;
+
+  while (string || !CheckStopChar(temp[*handle]))
+  {
+    if (temp[*handle] == terminator)
+    {
+      string = 0;
+      continue;
+    }
+    buf[a++] = temp[(*handle)++];
+  }
+  buf[a] = 0;
+  *term = temp[(*handle)++];
+  return buf;
+}
+
+#endif
\ No newline at end of file
diff -urN plex86/user/parse.h plex86.work/user/parse.h
--- plex86/user/parse.h	Wed Dec 31 19:00:00 1969
+++ plex86.work/user/parse.h	Tue Dec 26 02:02:36 2000
@@ -0,0 +1,35 @@
+/*
+ *  plex86: run multiple x86 operating systems concurrently
+ *  Copyright (C) 1999-2000  The plex86 developers team
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#ifndef __PARSE_H
+#define __PARSE_H
+
+#define STOP_CHAR_NUM	11
+#define SPACE_CHAR_NUM	5
+
+extern const char stopChar[STOP_CHAR_NUM];
+extern const char spaceChar[SPACE_CHAR_NUM];
+
+char SetStringTerminator(char term);
+Boolean SetStringMode(Boolean stringMode);
+Boolean CheckStopChar(char toCheck);
+Boolean CheckSpaceChar(char toCheck);
+char* Parse(char *buf, char *term, char *data, unsigned int *handle);
+
+#endif /* __PARSE_H */
\ No newline at end of file
diff -urN plex86/user/plex86.c plex86.work/user/plex86.c
--- plex86/user/plex86.c	Mon Dec 18 15:20:43 2000
+++ plex86.work/user/plex86.c	Wed Dec 27 16:08:09 2000
@@ -31,7 +31,9 @@
 #include "user.h"
 #include "plugin.h"
 
-
+#if NEW_CONFIG
+ #include "parse.h"
+#endif
 
 /************************************************************************/
 /* Declarations                                                         */
@@ -62,9 +64,17 @@
 static int lineno;
 static FILE *config_fd;
 static char *save_current;
+static char conf_section[256] = {0};
+static void *conf_tempdata = NULL;
 
 char *argv0 = NULL;
 
+/* Structures */
+typedef struct _loadrom_data_t {
+  char file[256];
+  Bit32u address;
+} loadrom_data_t;
+
 
 /************************************************************************/
 /* Main code                                                            */
@@ -298,13 +308,20 @@
 parse_plex86_option(unsigned linelen)
 {
         char *current;
-
+#if NEW_CONFIG
+        char buf[256];
+        char term;
+        unsigned int handle = 0;
+        plugin_t *plugin;
+        Boolean stringMode = 0;
+#endif
         current = line;
         /* If option comming from config file, increment line number */
         if (lineno >= 0)
           lineno++;
 
-        current = eat_whitespace(current); /* Eat initial whitespace */
+        if (!strlen(line))
+          return;
 
         /* If continuation character, then keep going. */
         if (line[linelen-1] == '\\') {
@@ -312,6 +329,201 @@
           exit(0);
           }
 
+#if NEW_CONFIG
+        SetStringMode(0);
+        do
+        {
+          Parse(buf, &term, line, &handle);
+          if (strlen(buf))
+          {
+            if (!strcmp(buf, "message"))
+            {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                Parse(buf, &term, line, &handle);
+                if (term == '"')              /* String */
+                {
+                  stringMode = SetStringMode(!stringMode);
+                  Parse(buf, &term, line, &handle);
+                }
+                fprintf(stderr, "%s\n", buf);
+            }
+
+            else if (!strcmp(conf_section, "general"))
+            {
+              if (!strcmp(buf, "memory"))
+              {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                vm_conf.max_memory = atoi(Parse(buf, &term, line, &handle));
+                vm_init_memory(vm_conf.max_memory);
+              }
+              else if (!strcmp(buf, "db_syntax"))
+              {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                Parse(buf, &term, line, &handle);
+                if (!strcmp(buf, "intel"))
+                  vm_conf.syntax = SX_INTEL;
+                else if (!strcmp(buf, "at&t"))
+                  vm_conf.syntax = SX_ATT;
+                else
+                  confFileError(current, "Expecting 'intel' or 'at&t'");
+              }
+              else if (!strcmp(buf, "exit_wait"))
+              {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                vm_conf.exit_wait = atoi(Parse(buf, &term, line, &handle));
+              }
+              else
+                confFileError(current, "Expecting recognized directive");
+            }
+
+            else if (!strcmp(conf_section, "plugins"))
+            {
+               char file[256];
+               char id[256];
+
+               strcpy(id, buf);
+               if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+               if (term != '=') confFileError(current, "Expecting '='");
+               Parse(file, &term, line, &handle);
+               plugin_load(file, "", id);
+            }
+
+            else if (!strcmp(conf_section, "load-rom"))
+            {
+              loadrom_data_t *tempdat;
+              if (!conf_tempdata)
+              {
+                conf_tempdata = (void*) malloc(sizeof(loadrom_data_t));
+                memset(conf_tempdata, 0, sizeof(loadrom_data_t));
+              }
+              tempdat = (loadrom_data_t*) conf_tempdata;
+              if (!strcmp(buf, "file"))
+              {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                Parse(tempdat->file, &term, line, &handle);
+              }
+              else if (!strcmp(buf, "address"))
+              {
+                if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                if (term != '=') confFileError(current, "Expecting '='");
+                tempdat->address = strtoul(Parse(buf, &term, line, &handle), NULL, 0);
+              }
+              else
+                confFileError(current, "Expecting recognized directive");
+
+              if (strlen(tempdat->file) && tempdat->address)
+                if (vm_load_rom(tempdat->file, tempdat->address))
+                {
+                  fprintf(stderr, "load-rom '%s' @ 0x%x failed.\n", tempdat->file, tempdat->address);
+                  exit(0);
+                }
+            }
+
+            else if (!strcmp(conf_section, "prescan"))
+            {
+               if (!strcmp(buf, "depth"))
+               {
+                 if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                 if (term != '=') confFileError(current, "Expecting '='");
+                 vm_conf.prescanDepth = atoi(Parse(buf, &term, line, &handle));
+                 vm_init_prescan_depth(vm_conf.prescanDepth);
+               }
+               else if (!strcmp(buf, "ring3"))
+               {
+                 if (CheckSpaceChar(term)) Parse(buf, &term, line, &handle);
+                 if (term != '=') confFileError(current, "Expecting '='");
+                 Parse(buf, &term, line, &handle);
+                 if (!strcmp(buf, "on"))
+                 {
+                   fprintf(stderr, "prescan on\n");
+                   vm_conf.prescanRing3 = PrescanRing3On;
+                   vm_init_prescan_ring3(vm_conf.prescanRing3);
+                 }
+                 else if (!strcmp(buf, "auto"))
+                 {
+                   fprintf(stderr, "prescan auto\n");
+                   vm_conf.prescanRing3 = PrescanRing3Auto;
+                   vm_init_prescan_ring3(vm_conf.prescanRing3);
+                 }
+                 else if (!strcmp(buf, "off"))
+                 {
+                   fprintf(stderr, "prescan off\n");
+                   vm_conf.prescanRing3 = PrescanRing3Off;
+                   vm_init_prescan_ring3(vm_conf.prescanRing3);
+                 }
+                 else
+                   confFileError(current, "Expecting {on,auto,off}");
+               }
+               else
+                 confFileError(current, "Expecting recognized directive");
+            }
+
+            else if ((plugin = plugin_find(conf_section)))
+            {
+              /* Command is not one of the predefined ones.  Check */
+              /* list of registered commands from the plugin modules. */
+              callback_command_t *command = callback_command_list;
+              unsigned found = 0;
+              while (command) {
+                if ( !strncmp(current, command->command,
+                              strlen(command->command)) ) {
+                  found = 1;
+                  /* Scan past plug callback command */
+                  while ( (*current!=' ') && (*current!=0) )
+                    current++;
+                  current = eat_whitespace(current);
+                  command->f(current);
+                  return;
+                  }
+                command = command->next;
+                }
+            }
+
+            else
+            {
+              fprintf(stderr, "Line %u: Section %s unknown\n", lineno, conf_section);
+              exit(1);
+            }
+          }
+
+          if (!term) break;
+          if (CheckSpaceChar(term))
+            Parse(buf, &term, line, &handle);
+          if (!term) break;
+          if (term == '"')              /* String */
+            stringMode = SetStringMode(!stringMode);
+          else if (term == '#')         /* Comment */
+            break;
+          else if (term == '[')         /* Section */
+          {
+            Parse(buf, &term, line, &handle);
+            if (!term) return;
+            if (!strlen(buf))
+              confFileError(current, "Expecting section name");
+            strcpy(conf_section, buf);
+            if (conf_tempdata) free(conf_tempdata);
+            conf_tempdata = NULL;
+            if (CheckSpaceChar(term))
+              Parse(buf, &term, line, &handle);
+            if (term != ']')
+              confFileError(current, "Expecting ']'");
+          }
+          else
+          {
+            fprintf(stderr, "Line %u: Don't know what to do with '%c'", lineno, term);
+            exit(1);
+          }
+        }
+        while (term);
+
+#else
+        current = eat_whitespace(current); /* Eat initial whitespace */
+
         /* Eat blank and comment lines */
         if ( (*current == 0) || (*current == '#') )
           return;
@@ -424,7 +636,7 @@
             plugin_args = eat_whitespace(plugin_args);
             }
           plugin_args = strdup(plugin_args);
-          plugin_load(plugin_name, plugin_args);
+          plugin_load(plugin_name, plugin_args, "");
           }
         else if (!strncmp (line, "load-rom", strlen("load-rom"))) {
           Bit32u address;
@@ -489,6 +701,7 @@
           if (!found)
             confFileError(current, "Expecting recognized directive");
           }
+#endif
 }
 
 
diff -urN plex86/user/plugin.c plex86.work/user/plugin.c
--- plex86/user/plugin.c	Wed Dec 27 20:40:44 2000
+++ plex86.work/user/plugin.c	Wed Dec 27 21:39:01 2000
@@ -22,11 +22,12 @@
 #include <ctype.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <string.h>
 
 #include "plex86.h"
 #include "user.h"
 #include "plugin.h"
-
+#include "plugin_query.h"
 
 
 /************************************************************************/
@@ -50,9 +51,8 @@
 
 plugin_t *plugins = NULL;      /* Head of the linked list of plugins  */
 
-
   void
-plugin_load (char *name, char *args)
+plugin_load (char *name, char *args, char *id)
 {
     plugin_t *plugin;
     const char *plug_err;
@@ -66,6 +66,7 @@
 
     plugin->name = name;
     plugin->args = args;
+    plugin->id = id;
     plugin->initialized = 0;
 
     plugin->handle = dlopen (name, RTLD_LAZY);
@@ -89,6 +90,31 @@
         exit (1);
     }
 
+    plugin->get_integers = dlsym (plugin->handle, PLUGIN_GET_INTEGERS);
+    if ((plug_err = dlerror ()) != NULL)
+    {
+        plugin->get_integers = plugin_get_integers;
+    }
+
+    plugin->get_bools = dlsym (plugin->handle, PLUGIN_GET_BOOLS);
+    if ((plug_err = dlerror ()) != NULL)
+    {
+        plugin->get_bools = plugin_get_bools;
+    }
+
+    plugin->get_strings = dlsym (plugin->handle, PLUGIN_GET_STRINGS);
+    if ((plug_err = dlerror ()) != NULL)
+    {
+        plugin->get_strings = plugin_get_strings;
+    }
+
+    plugin->get_function = dlsym (plugin->handle, PLUGIN_GET_FUNCTION);
+    if ((plug_err = dlerror ()) != NULL)
+    {
+        plugin->get_function = plugin_get_function;
+    }
+
+
     /* Insert plugin at the _end_ of the plugin linked list. */
     plugin->next = NULL;
 
@@ -230,6 +256,51 @@
 }
 
 
+  plugin_t *
+plugin_find(char *id)
+{
+    plugin_t *plugin = plugins;
+
+    while (plugin)
+    {
+        if (!strcmp(id, plugin->id))
+            return plugin;
+
+        plugin = plugin->next;
+    }
+
+    return NULL;
+}
+
+
+/* Default query functions */
+
+  int
+plugin_get_integers(int request, int *data)
+{
+    return PL_RET_UNKNOWN;
+}
+
+
+  int
+plugin_get_bools(int request, Boolean *data)
+{
+    return PL_RET_UNKNOWN;
+}
+
+
+  int
+plugin_get_strings(int request, char **data)
+{
+    return PL_RET_UNKNOWN;
+}
+
+
+  int
+plugin_get_function(int request, void*(*function)(void*))
+{
+    return PL_RET_UNKNOWN;
+}
 
 /************************************************************************/
 /* I/O port handling                                                    */
diff -urN plex86/user/plugin.h plex86.work/user/plugin.h
--- plex86/user/plugin.h	Wed Dec 27 20:40:44 2000
+++ plex86.work/user/plugin.h	Wed Dec 27 21:39:59 2000
@@ -29,6 +29,10 @@
 
 #define PLUGIN_INIT  "plugin_init"
 #define PLUGIN_FINI  "plugin_fini"
+#define PLUGIN_GET_INTEGERS     "plugin_get_integers"
+#define PLUGIN_GET_BOOLS        "plugin_get_bools"
+#define PLUGIN_GET_STRINGS      "plugin_get_strings"
+#define PLUGIN_GET_FUNCTION     "plugin_get_function"
 
 #define MAX_ARGC     10
 
@@ -45,19 +49,29 @@
     int  initialized;
     void *handle;
     int  argc;
-    char *name, *args, *argv[MAX_ARGC];
+    char *name, *args, *argv[MAX_ARGC], *id;
     int  (*init)(struct _plugin_t *plugin, int argc, char *argv[]);
     void (*fini)(void);
+    int  (*get_integers)(int request, int *data);
+    int  (*get_bools)(int request, Boolean *data);
+    int  (*get_strings)(int request, char **data);
+    int  (*get_function)(int request, void*(*function)(void*));
     struct _plugin_t *next;
 } plugin_t;
 
 extern plugin_t *plugins;
 
 void plugin_startup (void);
-void plugin_load (char *name, char *args);
+void plugin_load (char *name, char *args, char *id);
 plugin_t *plugin_unload (plugin_t *plugin);
 void plugin_init_all (void);
 void plugin_fini_all (void);
+
+plugin_t *plugin_find(char *id);
+int plugin_get_integers(int request, int *data);
+int plugin_get_bools(int request, Boolean *data);
+int plugin_get_strings(int request, char **data);
+int plugin_get_function(int request, void*(*function)(void*));
 
 int plugin_alloc_inp (plugin_t *plugin, handler_t handler, int base, int  range);
 int plugin_alloc_outp (plugin_t *plugin, handler_t handler, int base, int  range);
diff -urN plex86/user/plugin_query.h plex86.work/user/plugin_query.h
--- plex86/user/plugin_query.h	Wed Dec 31 19:00:00 1969
+++ plex86.work/user/plugin_query.h	Mon Dec 25 23:21:52 2000
@@ -0,0 +1,55 @@
+/*
+ *  plex86: run multiple x86 operating systems concurrently
+ *  Copyright (C) 1999-2000  The plex86 developers team
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#ifndef __PLUGIN_QUERY_H
+#define __PLUGIN_QUERY_H
+
+/**** Return codes ****/
+#define PL_RET_OK               0
+#define PL_RET_UNKNOWN          -1
+#define PL_RET_NOT_IMPLEMENTED  -2
+#define PL_RET_UNSUPPORTED      -3
+
+/**** General data ****/
+/* 0x00000000 - 0x00000FFF */
+#define PL_UNUSED       0x00000000
+
+/*--- Integers ---*/
+#define PL_NAME_LENGTH  0x00000001
+#define PL_EXINFO_LENGTH 0x00000002
+#define PL_ORG_LENGTH   0x00000003
+#define PL_CONTACT_LENGTH 0x00000004
+#define PL_N_IOPORTS    0x00000011
+#define PL_IOPORTS      0x00000012
+#define PL_IORANGES     0x00000013
+#define PL_N_INTERRUPTS 0x00000018
+#define PL_INTERRUPTS   0x00000019
+#define PL_N_MMIO       0x00000020
+#define PL_MMIO         0x00000021
+
+/*--- Strings ---*/
+#define PL_NAME         0x00000001
+#define PL_EXINFO       0x00000002
+#define PL_ORG          0x00000003
+#define PL_CONTACT      0x00000004
+
+/*--- Bool ---*/
+#define PL_CAN_RESUME   0x00000001
+
+#endif /* __PLUGIN_QUERY_H */
\ No newline at end of file
diff -urN plex86/user/plugins/bochs/Makefile.in plex86.work/user/plugins/bochs/Makefile.in
--- plex86/user/plugins/bochs/Makefile.in	Thu Dec 21 19:14:48 2000
+++ plex86.work/user/plugins/bochs/Makefile.in	Fri Dec 22 13:07:17 2000
@@ -29,6 +29,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../../../bin
 
 X_LIBS = @X_LIBS@
 X_PRE_LIBS = @X_PRE_LIBS@
@@ -52,6 +53,8 @@
 	$(CXX) -shared -o plugin-bochs.so io.o pc_system.o state_file.o \
 	                 iodev/libiodev.a gui/libgui.a \
 	                 @GUI_LINK_OPTS@
+	mkdir -p $(bindir)/plugins
+	cp plugin-bochs.so $(bindir)/plugins
 
 iodev/libiodev.a:
 	cd iodev @COMMAND_SEPARATOR@
diff -urN plex86/user/plugins/ice/Makefile.in plex86.work/user/plugins/ice/Makefile.in
--- plex86/user/plugins/ice/Makefile.in	Sun Mar 26 17:03:42 2000
+++ plex86.work/user/plugins/ice/Makefile.in	Fri Dec 22 13:07:05 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../../../bin
 
 ALL: plugin-ice.so
 
@@ -34,6 +35,8 @@
 plugin-ice.so: server.o utils.o remote-utils.o low-plex86.o
 	$(CC) -shared -o plugin-ice.so server.o utils.o \
 		remote-utils.o low-plex86.o
+	mkdir -p $(bindir)/plugins
+	cp plugin-ice.so $(bindir)/plugins
 
 clean:
 	/bin/rm -f *.o plugin-ice.so core
diff -urN plex86/user/plugins/loader/Makefile.in plex86.work/user/plugins/loader/Makefile.in
--- plex86/user/plugins/loader/Makefile.in	Sun Aug 13 16:51:01 2000
+++ plex86.work/user/plugins/loader/Makefile.in	Fri Dec 22 13:08:49 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../../../bin
 
 ALL: load-kernel.so
 
@@ -36,6 +37,8 @@
 
 load-kernel.so: kernel.o bin.o hack-linux.o
 	$(CC) -shared -o load-kernel.so kernel.o bin.o hack-linux.o
+	mkdir -p $(bindir)/plugins
+	cp load-kernel.so $(bindir)/plugins
 
 clean:
 	/bin/rm -f *.o *.so core
diff -urN plex86/user/plugins/misc/Makefile.in plex86.work/user/plugins/misc/Makefile.in
--- plex86/user/plugins/misc/Makefile.in	Sun Jul  9 10:32:42 2000
+++ plex86.work/user/plugins/misc/Makefile.in	Fri Dec 22 13:10:06 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir	= @srcdir@/../../../bin
 
 ALL: replay_io.so
 
@@ -36,6 +37,8 @@
 
 replay_io.so: replay.o
 	$(CC) -shared -o replay_io.so replay.o
+	mkdir -p $(bindir)/plugins
+	cp replay_io.so $(bindir)/plugins
 
 clean:
 	/bin/rm -f *.o *.so core
diff -urN plex86/user/plugins/write-cache/Makefile.in plex86.work/user/plugins/write-cache/Makefile.in
--- plex86/user/plugins/write-cache/Makefile.in	Tue Dec 26 16:42:18 2000
+++ plex86.work/user/plugins/write-cache/Makefile.in	Wed Dec 27 21:05:07 2000
@@ -25,6 +25,7 @@
 
 srcdir	= @srcdir@
 VPATH	= @srcdir@
+bindir  = @srcdir@/../../../bin
 
 ALL: write-cache.so
 
@@ -36,6 +37,8 @@
 
 write-cache.so: write-cache.o
 	$(CC) -shared -o write-cache.so write-cache.o
+	mkdir -p $(bindir)/plugins
+	cp write-cache.so $(bindir)/plugins
 
 clean:
 	/bin/rm -f *.o *.so core
