diff --git a/require.c b/require.c
index 5a63e5379251601b602e2f37e7ad88b30ef2b1b9..a2ce2aecfaccb6f88b2f1e65f07288bb7cdc7548 100644
--- a/require.c
+++ b/require.c
@@ -36,21 +36,24 @@ int require(char* lib, char* version)
         printf("Directory is LIB = %s\n", *path);
         return ERROR;
     }
-    loaded = getLibVersion(lib);
+    loaded = getLibversion(lib);
     if (!loaded)
     {
         char libname[256];
         char dbdname[256];
+        char depname[256];
 
         /* first try local library */
         if (version)
         {
             sprintf(libname, "bin/%sLib-%s.munch", lib, version);
+            sprintf(depname, "bin/%s-%s.dep", lib, version);
             sprintf(dbdname, "dbd/%s-%s.dbd", lib, version);
         }
         else
         {
             sprintf(libname, "bin/%sLib.munch", lib);
+            sprintf(depname, "bin/%s.dep", lib);
             sprintf(dbdname, "dbd/%s.dbd", lib);
         }
         if (stat(libname, &filestat) == ERROR)
@@ -65,11 +68,13 @@ int require(char* lib, char* version)
             if (version)
             {
                 sprintf(libname, "%s/%sLib-%s.munch", *path, lib, version);
+                sprintf(depname, "%s/%s-%s.dep", *path, lib, version);
                 sprintf(dbdname, "%s/dbd/%s-%s.dbd", *path, lib, version);
             }
             else
             {
                 sprintf(libname, "%s/%sLib.munch", *path, lib);
+                sprintf(depname, "%s/%s.dep", *path, lib);
                 sprintf(dbdname, "%s/dbd/%s.dbd", *path, lib);
             }
             if (stat(libname, &filestat) == ERROR)
@@ -87,7 +92,33 @@ int require(char* lib, char* version)
             }
         }
         errno = 0;
-        printf("loading %s\n", libname);
+        
+        /* check dependencies */
+        if (stat(depname, &filestat) != ERROR)
+        {
+            FILE* depfile;
+            char buffer[40];
+            char *v;
+            
+            depfile = fopen(depname, "r");
+            while (fgets(buffer, sizeof(buffer), depfile))
+            {
+                if (buffer[0] == '#' || buffer[0] == 0) continue;
+                buffer[strlen(buffer)-1] = 0;
+                v = strchr(buffer, ' ');
+                if (v) *v++ = 0;
+                printf ("%s depends on %s %s\n", lib, buffer, v);
+                if (require(buffer,v) != OK)
+                {
+                    fclose(depfile);
+                    return ERROR;
+                }
+            }
+            fclose(depfile);
+        }
+        
+        /* load library */
+        printf("Loading %s\n", libname);
         if (ld(0, 0, libname) == NULL)
         {
             printf("Aborting startup stript.\n");
@@ -96,16 +127,18 @@ int require(char* lib, char* version)
         }
         if (errno == S_symLib_SYMBOL_NOT_FOUND)
         {
-            printf("Library requires some other library\n");
+            printf("Library requires some other functions.\n");
             printf("Aborting startup stript.\n");
             shellScriptAbort();
             return ERROR;
         }
-        loaded = getLibVersion(lib);
+        loaded = getLibversion(lib);
+        
+        /* load dbd file */
         if (stat(dbdname, &filestat) != ERROR)
         {
             /* If file exists */
-            printf("loading %s\n", dbdname);
+            printf("Loading %s\n", dbdname);
             if (dbLoadDatabase(dbdname, NULL, NULL) != OK)
             {
                 taskDelay(sysClkRateGet());
@@ -114,6 +147,7 @@ int require(char* lib, char* version)
                 return ERROR;
             }
 #ifndef BASE_VERSION
+            /* call register function for R3.14 */
             {
                 char initfunc[256];
 
@@ -155,7 +189,7 @@ int require(char* lib, char* version)
     }
 }
 
-char* getLibVersion(char* lib)
+char* getLibversion(char* lib)
 {
     char symbol[256];
     char* loaded;
@@ -166,4 +200,23 @@ char* getLibVersion(char* lib)
     return loaded;
 }
 
+static BOOL printIfLibversion(char* name, int val,
+    SYM_TYPE type, int arg, UINT16 group)
+{
+    int l;
+    char* pattern = (char*) arg;
+    
+    l = strlen(name);
+    if (l > 10 && strcmp(name+l-10, "LibRelease") == 0)
+    {
+        if (pattern && !strstr(name, pattern)) return TRUE;
+        printf("%15.*s %s\n", l-11, name+1, (char*)val);
+    }
+    return TRUE;
+}
 
+int libversionShow(char* pattern)
+{
+    symEach(sysSymTbl, (FUNCPTR)printIfLibversion, (int)pattern);
+    return OK;
+}
diff --git a/require.h b/require.h
index 461dabe0298b6776666a7fcb75f71de12d9fb126..c69bfbeddb0d22ba9f47b38b2e5ae8f971e999fb 100644
--- a/require.h
+++ b/require.h
@@ -2,6 +2,7 @@
 #define require_h
 
 int require(char* lib, char* version);
-char* getLibVersion(char* lib);
+char* getLibversion(char* lib);
+int libversionShow(char* pattern);
 
 #endif