diff --git a/ChangeLog b/ChangeLog
index 58a7d78813b367140672df37c0dce76c3c952536..75202c115610ea62a68873124a9913bb9d5d045b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -247,6 +247,7 @@
 0.3.3 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
 
 	* Removed unused uIP files
-	* sched/, mm/, net/ subystem debug can not be selectively enabled/disabled
+	* sched/, mm/, and net/ subystem debug can not be selectively enabled/disabled
 	* Correct socket close logic -- needs to disconnect TCP socket on close
 	* uIP webserver now seems to be fully functional
+	* fs/ and lib/ subystem debug can not be selectively enabled/disabled
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index 969f78cd6af0500a061e7b2c63571a5d134a4d13..954ee19eed52f89ce05c0c82f9651132b0df2dce 100644
--- a/Documentation/NuttX.html
+++ b/Documentation/NuttX.html
@@ -727,9 +727,10 @@ Other memory:
 0.3.3 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
 
 	* Removed unused uIP files
-	* sched/, mm/, net/ subystem debug can not be selectively enabled/disabled
+	* sched/, mm/, and net/ subystem debug can not be selectively enabled/disabled
 	* Correct socket close logic -- needs to disconnect TCP socket on close
 	* uIP webserver now seems to be fully functional
+	* fs/ and lib/ subystem debug can not be selectively enabled/disabled
 </pre></ul>
 
 <table width ="100%">
diff --git a/Documentation/NuttxPortingGuide.html b/Documentation/NuttxPortingGuide.html
index 2aed8d106a3013870a3c08eb80401d22d7e12cfc..fe18ecba8ca8d0ddc3b60ca84c0cc788e292c456 100644
--- a/Documentation/NuttxPortingGuide.html
+++ b/Documentation/NuttxPortingGuide.html
@@ -1196,6 +1196,9 @@ The system can be re-made subsequently by just typing <code>make</code>.
   <li>
     <code>CONFIG_DEBUG</code>: enables built-in debug options
   </li>
+  <li>
+    <code>CONFIG_DEBUG_VERBOSE</code>: enables verbose debug output
+  </li>
   <li>
     <code>CONFIG_DEBUG_SCHED</code>: enable OS debug output (disabled by default)
   </li>
@@ -1203,10 +1206,13 @@ The system can be re-made subsequently by just typing <code>make</code>.
     <code>CONFIG_DEBUG_MM</code>: enable memory management debug output (disabld by default)
   </li>
   <li>
-    <code>CONFIG_DEBUG_NET</code>: enable networkd debug output (disabled by default)
+    <code>CONFIG_DEBUG_NET</code>: enable network debug output (disabled by default)
   </li>
   <li>
-    <code>CONFIG_DEBUG_VERBOSE</code>: enables verbose debug output
+    <code>CONFIG_DEBUG_FS</code>: enable filesystem debug output (disabled by default)
+  </li>
+  <li>
+    <code>CONFIG_DEBUG_LIB</code>: enable C library debug output (disabled by default)
   </li>
   <li>
     <code>CONFIG_HAVE_LOWPUTC</code>: architecture supports low-level, boot
diff --git a/TODO b/TODO
index a9f96642c187acc28f32e42de12e33a86906530e..197a966b00d0861782c1de5b3dd01fd689bb6926 100644
--- a/TODO
+++ b/TODO
@@ -49,6 +49,7 @@ o Network
   is in the subnet served by the driver.
 - uIP/Socket callback logic is not thread safe. This means that a socket cannot be
   used concurrently by two threads.  Minimal fix:  Add mutex to support exclusion.
+- IPv6 support is incomplete
 
 o USB
 - Implement USB device support
diff --git a/configs/README.txt b/configs/README.txt
index 42d5c9055f4319f600d63fc8b091efb4413bf5db..88f6291b637f1dd6af9b50f76e618ab347adabac 100644
--- a/configs/README.txt
+++ b/configs/README.txt
@@ -132,6 +132,10 @@ defconfig -- This is a configuration file similar to the Linux
 		  (disabld by default)
 		CONFIG_DEBUG_NET - enable network debug output (disabled
 		  by default)
+		CONFIG_DEBUG_FS - enable filesystem debug output (disabled
+		  by default)
+		CONFIG_DEBUG_LIB - enable C library debug output (disabled
+		  by default)
 		CONFIG_HAVE_LOWPUTC - architecture supports low-level, boot
 		  time console output
 		CONFIG_MM_REGIONS - If the architecture includes multiple
diff --git a/fs/fs_fat32util.c b/fs/fs_fat32util.c
index bf2df78f689df32584928d901ec34055f7bd279b..ed30970063d78b461b3f4cd8356e55e6bfa3341c 100644
--- a/fs/fs_fat32util.c
+++ b/fs/fs_fat32util.c
@@ -695,22 +695,22 @@ int fat_mount(struct fat_mountpt_s *fs, boolean writeable)
 
   /* We did it! */
 
-  dbg("FAT%d:\n", fs->fs_type == 0 ? 12 : fs->fs_type == 1  ? 16 : 32);
-  dbg("\tHW  sector size:     %d\n", fs->fs_hwsectorsize);
-  dbg("\t    sectors:         %d\n", fs->fs_hwnsectors);
-  dbg("\tFAT reserved:        %d\n", fs->fs_fatresvdseccount);
-  dbg("\t    sectors:         %d\n", fs->fs_fattotsec);
-  dbg("\t    start sector:    %d\n", fs->fs_fatbase);
-  dbg("\t    root sector:     %d\n", fs->fs_rootbase);
-  dbg("\t    root entries:    %d\n", fs->fs_rootentcnt);
-  dbg("\t    data sector:     %d\n", fs->fs_database);
-  dbg("\t    FSINFO sector:   %d\n", fs->fs_fsinfo);
-  dbg("\t    Num FATs:        %d\n", fs->fs_fatnumfats);
-  dbg("\t    FAT size:        %d\n", fs->fs_fatsize);
-  dbg("\t    sectors/cluster: %d\n", fs->fs_fatsecperclus);
-  dbg("\t    max clusters:    %d\n", fs->fs_nclusters);
-  dbg("\tFSI free count       %d\n", fs->fs_fsifreecount);
-  dbg("\t    next free        %d\n", fs->fs_fsinextfree);
+  fdbg("FAT%d:\n", fs->fs_type == 0 ? 12 : fs->fs_type == 1  ? 16 : 32);
+  fdbg("\tHW  sector size:     %d\n", fs->fs_hwsectorsize);
+  fdbg("\t    sectors:         %d\n", fs->fs_hwnsectors);
+  fdbg("\tFAT reserved:        %d\n", fs->fs_fatresvdseccount);
+  fdbg("\t    sectors:         %d\n", fs->fs_fattotsec);
+  fdbg("\t    start sector:    %d\n", fs->fs_fatbase);
+  fdbg("\t    root sector:     %d\n", fs->fs_rootbase);
+  fdbg("\t    root entries:    %d\n", fs->fs_rootentcnt);
+  fdbg("\t    data sector:     %d\n", fs->fs_database);
+  fdbg("\t    FSINFO sector:   %d\n", fs->fs_fsinfo);
+  fdbg("\t    Num FATs:        %d\n", fs->fs_fatnumfats);
+  fdbg("\t    FAT size:        %d\n", fs->fs_fatsize);
+  fdbg("\t    sectors/cluster: %d\n", fs->fs_fatsecperclus);
+  fdbg("\t    max clusters:    %d\n", fs->fs_nclusters);
+  fdbg("\tFSI free count       %d\n", fs->fs_fsifreecount);
+  fdbg("\t    next free        %d\n", fs->fs_fsinextfree);
 
   return OK;
 
diff --git a/include/debug.h b/include/debug.h
index 38ec57ba21afdc35e8b1110e72463c426c131530..651b2cbe87145249523ef0d487882ce15dccccb8 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -112,6 +112,26 @@
 # define nvdbg(x...)
 #endif
 
+#ifdef CONFIG_DEBUG_FS
+# define fdbg(format, arg...)   dbg(format, ##arg)
+# define flldbg(format, arg...) lldbg(format, ##arg)
+# define fvdbg(format, arg...)  vdbg(format, ##arg)
+#else
+# define fdbg(x...)
+# define flldbg(x...)
+# define fvdbg(x...)
+#endif
+
+#ifdef CONFIG_DEBUG_LIB
+# define ldbg(format, arg...)   dbg(format, ##arg)
+# define llldbg(format, arg...) lldbg(format, ##arg)
+# define lvdbg(format, arg...)  vdbg(format, ##arg)
+#else
+# define ldbg(x...)
+# define llldbg(x...)
+# define lvdbg(x...)
+#endif
+
 /************************************************************
  * Public Type Declarations
  ************************************************************/
diff --git a/lib/lib_getenv.c b/lib/lib_getenv.c
index dd659393aac8e71dc36816030ee821cee9d48d66..bddd2cb0aafcccf3d18d6ed59e6c8f6f48b4e4d0 100644
--- a/lib/lib_getenv.c
+++ b/lib/lib_getenv.c
@@ -103,7 +103,7 @@ char *getenv(const char *name)
   const char *pend = &environment[size-1];
   const char *ptmp;
 
-  dbg("name=\"%s\"\n", name);
+  ldbg("name=\"%s\"\n", name);
 
   if (name)
     {
@@ -111,7 +111,7 @@ char *getenv(const char *name)
 
       while (penv < pend)
         {
-          vdbg("Compare to=\"%s\"\n", penv);
+          lvdbg("Compare to=\"%s\"\n", penv);
 
           /* The logic below basically implements a version of
            * strcmp where the strings may be terminated with = signs.
@@ -130,7 +130,7 @@ char *getenv(const char *name)
                     {
                       /* Yes.. return the pointer to the value. */
 
-                      dbg("Returning \"%s\"\n", penv+1);
+                      ldbg("Returning \"%s\"\n", penv+1);
                       return ((char*)penv+1);
                     }
                   else
@@ -165,6 +165,6 @@ char *getenv(const char *name)
 
   /* If we got here, then no matching string was found. */
 
-  dbg("Returning NULL\n");
+  ldbg("Returning NULL\n");
   return NULL;
 }
diff --git a/lib/lib_sscanf.c b/lib/lib_sscanf.c
index af3193e44d9e131d826776d476ef9bf66e4b15b2..e06839f4770955d1c42be24f83958f66f1921e02 100644
--- a/lib/lib_sscanf.c
+++ b/lib/lib_sscanf.c
@@ -121,7 +121,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
   const char     *tc;
   char            tmp[MAXLN];
 
-  vdbg("vsscanf: buf=\"%s\" fmt=\"%s\"\n", buf, s);
+  lvdbg("vsscanf: buf=\"%s\" fmt=\"%s\"\n", buf, s);
 
   count = noassign = width = lflag = 0;
   while (*s && *buf)
@@ -135,13 +135,13 @@ int vsscanf(char *buf, const char *s, va_list ap)
 
       if (*s == '%')
         {
-          vdbg("vsscanf: Specifier found\n");
+          lvdbg("vsscanf: Specifier found\n");
 
           /* Check for qualifiers on the conversion specifier */
           s++;
           for (; *s; s++)
             {
-              vdbg("vsscanf: Processing %c\n", *s);
+              lvdbg("vsscanf: Processing %c\n", *s);
 
               if (strchr("dibouxcsefg%", *s))
                 break;
@@ -163,7 +163,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
 
           if (*s == 's')
             {
-              vdbg("vsscanf: Performing string conversion\n");
+              lvdbg("vsscanf: Performing string conversion\n");
 
               while (isspace(*buf))
                 buf++;
@@ -184,7 +184,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
 
           else if (*s == 'c')
             {
-              vdbg("vsscanf: Performing character conversion\n");
+              lvdbg("vsscanf: Performing character conversion\n");
 
               if (!width)
                 width = 1;
@@ -201,7 +201,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
 
           else if (strchr("dobxu", *s))
             {
-              vdbg("vsscanf: Performing integer conversion\n");
+              lvdbg("vsscanf: Performing integer conversion\n");
 
               /* Skip over any white space before the integer string */
 
@@ -237,7 +237,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
               strncpy(tmp, buf, width);
               tmp[width] = '\0';
 
-              vdbg("vsscanf: tmp[]=\"%s\"\n", tmp);
+              lvdbg("vsscanf: tmp[]=\"%s\"\n", tmp);
 
               /* Perform the integer conversion */
 
@@ -251,7 +251,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
 #else
                   int tmpint = strtol(tmp, NULL, base);
 #endif
-                  vdbg("vsscanf: Return %d to 0x%p\n", tmpint, pint);
+                  lvdbg("vsscanf: Return %d to 0x%p\n", tmpint, pint);
                   *pint = tmpint;
                 }
             }
@@ -264,10 +264,10 @@ int vsscanf(char *buf, const char *s, va_list ap)
 # warning "No floating point conversions"
               void *pv = va_arg(ap, void*);
 
-              vdbg("vsscanf: Return 0.0 to %p\n", pv);
+              lvdbg("vsscanf: Return 0.0 to %p\n", pv);
               *((double_t*)pv) = 0.0;
 #else
-              vdbg("vsscanf: Performing floating point conversion\n");
+              lvdbg("vsscanf: Performing floating point conversion\n");
 
               /* Skip over any white space before the real string */
 
@@ -293,7 +293,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
               tmp[width] = '\0';
               buf += width;
 
-              vdbg("vsscanf: tmp[]=\"%s\"\n", tmp);
+              lvdbg("vsscanf: tmp[]=\"%s\"\n", tmp);
 
               /* Perform the floating point conversion */
 
@@ -308,7 +308,7 @@ int vsscanf(char *buf, const char *s, va_list ap)
 #endif
                   void *pv = va_arg(ap, void*);
 
-                  vdbg("vsscanf: Return %f to %p\n", dvalue, pv);
+                  lvdbg("vsscanf: Return %f to %p\n", dvalue, pv);
 
                   /* But we have to check whether we need to return a
                    * float or a double.