diff --git a/TODO b/TODO
index 5f8dc8c93..11994d6a9 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,5 @@
 *) put some sort of error reporting for streaming/inputStream!
 
-*) Fix charset errors so they don't goto stderr/out
-
 Post-1.0
 --------
 1) crosslink "list" stuff, for example, artists are crosslinked to alubms and 
diff --git a/src/audio.c b/src/audio.c
index afea52734..e677f8768 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -256,7 +256,7 @@ int playAudio(char * playChunk, int size) {
 	int send;
 
 	if(audio_device==NULL) {
-		ERROR("trying to play w/ the audio device being open!\n");
+		ERROR("trying to play w/o the audio device being open!\n");
 		return -1;
 	}
 	
@@ -302,4 +302,3 @@ void audioError() {
 	}
 #endif
 }
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
diff --git a/src/directory.c b/src/directory.c
index 959ade487..0d1b0ee2b 100644
--- a/src/directory.c
+++ b/src/directory.c
@@ -931,7 +931,7 @@ int readDirectoryDB() {
 					char * tempCharset; 
 
 					if(foundFsCharset) {
-						ERROR("already found "
+						WARNING("already found "
 							"fs charset in db\n");
 						exit(EXIT_FAILURE);
 					}
@@ -944,11 +944,11 @@ int readDirectoryDB() {
 						getConf()[CONF_FS_CHARSET]) && 
 						strcmp(fsCharset,tempCharset))
 					{
-						ERROR("Using \"%s\" for the "
+						WARNING("Using \"%s\" for the "
 							"filesystem charset "
 							"instead of \"%s\"\n",
 							fsCharset,tempCharset);
-						ERROR("maybe you need to "
+						WARNING("maybe you need to "
 							"recreate the db?\n");
 						setFsCharset(fsCharset);
 					}
@@ -1275,4 +1275,3 @@ Song * getSongFromDB(char * file) {
 time_t getDbModTime() {
 	return directory_dbModTime;
 }
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
diff --git a/src/log.c b/src/log.c
index bdc7cf935..835fa9e00 100644
--- a/src/log.c
+++ b/src/log.c
@@ -20,10 +20,16 @@
 
 #include "conf.h"
 #include "myfprintf.h"
+#include "utils.h"
 
+#include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 
 int logLevel = LOG_LEVEL_LOW;
+short warningFlushed = 0;
+
+static char * warningBuffer = NULL;
 
 void initLog() {
 	if(strcmp(getConf()[CONF_LOG_LEVEL],"default")==0) {
@@ -37,4 +43,37 @@ void initLog() {
 	}
 	else ERROR("unknown log level \"%s\"\n",getConf()[CONF_LOG_LEVEL]);
 }
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
+
+#define BUFFER_LENGTH	4096
+
+void bufferWarning(char * format, ... ) {
+	va_list arglist;
+	char temp[BUFFER_LENGTH+1];
+
+	memset(temp, 0, BUFFER_LENGTH+1);
+
+	va_start(arglist, format);
+
+	vsnprintf(temp, BUFFER_LENGTH, format, arglist);
+
+	warningBuffer = appendToString(warningBuffer, temp);
+
+	va_end(arglist);
+}
+void flushWarningLog() {
+	char * s;
+
+	if(warningBuffer == NULL) return;
+
+	s = strtok(warningBuffer, "\n");
+	while ( s != NULL ) {
+		myfprintf(stderr, "%s\n", s);
+
+		s = strtok(NULL, "\n");
+	}
+
+	free(warningBuffer);
+	warningBuffer = NULL;
+
+	warningFlushed = 1;
+}
diff --git a/src/log.h b/src/log.h
index ccb407a07..3bda616b6 100644
--- a/src/log.h
+++ b/src/log.h
@@ -28,6 +28,7 @@
 #define LOG_LEVEL_DEBUG		2
 
 extern int logLevel;
+extern short warningFlushed;
 
 #define ERROR(...) myfprintf(stderr, __VA_ARGS__)
 
@@ -40,7 +41,15 @@ extern int logLevel;
 #define DEBUG(...) if(logLevel>=LOG_LEVEL_DEBUG) \
 				myfprintf(stdout, __VA_ARGS__)
 
+#define WARNING(...) { \
+	if(warningFlushed) myfprintf(stderr, __VA_ARGS__); \
+	else bufferWarning(__VA_ARGS__); \
+}
+
 void initLog();
 
+void bufferWarning(char * format, ... );
+
+void flushWarningLog();
+
 #endif
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
diff --git a/src/main.c b/src/main.c
index 58eb8d98a..c65d00e1c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -289,7 +289,10 @@ void changeToUser(Options * options) {
 }
 
 void openLogFiles(Options * options, FILE ** out, FILE ** err) {
-        if(options->stdOutput) return;
+        if(options->stdOutput) {
+                flushWarningLog();
+                return;
+        }
 
         if(NULL==(*out=fopen(options->logFile,"a"))) {
                 ERROR("problem opening file \"%s\" for writing\n",
@@ -316,6 +319,7 @@ void openDB(Options * options, char * argv0) {
 					argv0);
                         exit(EXIT_FAILURE);
                 }
+                flushWarningLog();
                 initMp3Directory();
                 if(writeDirectoryDB()<0) {
                         ERROR("problem opening db for reading or writing\n");
@@ -324,6 +328,7 @@ void openDB(Options * options, char * argv0) {
 		if(options->createDB) exit(EXIT_SUCCESS);
         }
 	if(options->updateDB) {
+                flushWarningLog();
 		updateMp3Directory();
 		exit(EXIT_SUCCESS);
 	}
@@ -379,6 +384,7 @@ void setupLogOutput(Options * options, FILE * out, FILE * err) {
 
                 myfprintfStdLogMode(out, err, options->logFile,
                                 options->errorFile);
+                flushWarningLog();
         }
 
         /* lets redirect stdin to dev null as a work around for libao bug */
diff --git a/src/myfprintf.h b/src/myfprintf.h
index 31d1c88c0..ad42ec794 100644
--- a/src/myfprintf.h
+++ b/src/myfprintf.h
@@ -31,4 +31,3 @@ void myfprintf(FILE * fp, char * format, ... );
 int myfprintfCloseAndOpenLogFile();
 
 #endif
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
diff --git a/src/path.c b/src/path.c
index d7b08d6be..61c9f7040 100644
--- a/src/path.c
+++ b/src/path.c
@@ -86,13 +86,13 @@ void setFsCharset(char * charset) {
 	DEBUG("setFsCharset: fs charset is: %s\n",fsCharset);
 	
 	if(setCharSetConversion("UTF-8",fsCharset)!=0) {
-		ERROR("fs charset conversion problem: "
+		WARNING("fs charset conversion problem: "
 			"not able to convert from \"%s\" to \"%s\"\n",
 			fsCharset,"UTF-8");
 		error = 1;
 	}
 	if(setCharSetConversion(fsCharset,"UTF-8")!=0) {
-		ERROR("fs charset conversion problem: "
+		WARNING("fs charset conversion problem: "
 			"not able to convert from \"%s\" to \"%s\"\n",
 			"UTF-8",fsCharset);
 		error = 1;
@@ -100,7 +100,7 @@ void setFsCharset(char * charset) {
 	
 	if(error) {
 		free(fsCharset);
-		ERROR("setting fs charset to ISO-8859-1!\n");
+		WARNING("setting fs charset to ISO-8859-1!\n");
 		fsCharset = strdup("ISO-8859-1");
 	}
 }
@@ -145,28 +145,28 @@ void initPaths(char * playlistDirArg, char * musicDirArg) {
 		originalLocale = strdup(originalLocale);
 
 		if(!(currentLocale = setlocale(LC_CTYPE,""))) {
-			ERROR("problems setting current locale with "
+			WARNING("problems setting current locale with "
 					"setlocale()\n");
 		}
 		else {
 			if(strcmp(currentLocale,"C")==0 ||
 					strcmp(currentLocale,"POSIX")==0) 
 			{
-				ERROR("current locale is \"%s\"\n",
+				WARNING("current locale is \"%s\"\n",
 						currentLocale);
 			}
 			else if((temp = nl_langinfo(CODESET))) {
 				charset = strdup(temp);
 			}
-			else ERROR("problems getting charset for locale\n");
+			else WARNING("problems getting charset for locale\n");
 			if(!setlocale(LC_CTYPE,originalLocale)) {
-				ERROR("problems resetting locale with setlocale()\n");
+				WARNING("problems resetting locale with setlocale()\n");
 			}
 		}
 
 		free(originalLocale);
 	}
-	else ERROR("problems getting locale with setlocale()\n");
+	else WARNING("problems getting locale with setlocale()\n");
 #endif
 #endif
 
@@ -175,7 +175,7 @@ void initPaths(char * playlistDirArg, char * musicDirArg) {
 		free(charset);
 	}
 	else {
-		ERROR("setting filesystem charset to ISO-8859-1\n");
+		WARNING("setting filesystem charset to ISO-8859-1\n");
 		setFsCharset("ISO-8859-1");
 	}
 }
diff --git a/src/utils.c b/src/utils.c
index ece410b2c..fbcf3d9dd 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -70,4 +70,22 @@ int ipv6Supported() {
         return 0;
 }
 
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
+char * appendToString(char * dest, const char * src) {
+        int destlen;
+        int srclen = strlen(src);
+                                                                                
+        if(dest == NULL) {
+                dest = malloc(srclen+1);
+                memset(dest, 0, srclen+1);
+                destlen = 0;
+        }
+        else {
+                destlen = strlen(dest);
+                dest = realloc(dest, destlen+srclen+1);
+        }
+                                                                                
+        memcpy(dest+destlen, src, srclen);
+        dest[destlen+srclen] = '\0';
+                                                                                
+        return dest;
+}
diff --git a/src/utils.h b/src/utils.h
index fd03915f9..545f1653d 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -33,5 +33,6 @@ void my_usleep(long usec);
 
 int ipv6Supported();
 
+char * appendToString(char * dest, const char * src);
+
 #endif
-/* vim:set shiftwidth=4 tabstop=8 expandtab: */
diff --git a/src/volume.c b/src/volume.c
index 42f72ba48..4a1370b2f 100644
--- a/src/volume.c
+++ b/src/volume.c
@@ -68,7 +68,7 @@ int prepOssMixer(char * device) {
 	int devmask = 0;
 
 	if((volume_ossFd = open(device,O_RDONLY))<0) {
-		ERROR("unable to open oss mixer \"%s\"\n",device);
+		WARNING("unable to open oss mixer \"%s\"\n",device);
 		return -1;
 	}
 
@@ -78,7 +78,7 @@ int prepOssMixer(char * device) {
 		int i,j;
 
 		if(ioctl(volume_ossFd,SOUND_MIXER_READ_DEVMASK,&devmask)<0) {
-			ERROR("errors getting read_devmask for oss mixer\n");
+			WARNING("errors getting read_devmask for oss mixer\n");
 			close(volume_ossFd);
 			return -1;
 		}
@@ -96,13 +96,13 @@ int prepOssMixer(char * device) {
 		}
 
 		if(i>=SOUND_MIXER_NRDEVICES) {
-			ERROR("mixer control \"%s\" not found\n",
+			WARNING("mixer control \"%s\" not found\n",
 					getConf()[CONF_MIXER_CONTROL]);
 			close(volume_ossFd);
 			return -1;
 		}
 		else if(!( ( 1 << i ) & devmask )) {
-			ERROR("mixer control \"%s\" not usable\n",
+			WARNING("mixer control \"%s\" not usable\n",
 					getConf()[CONF_MIXER_CONTROL]);
 			close(volume_ossFd);
 			return -1;
@@ -122,7 +122,7 @@ int getOssVolumeLevel() {
 	int left, right, level;
 
 	if(ioctl(volume_ossFd,MIXER_READ(volume_ossControl),&level) < 0) {
-		ERROR("unable to read volume\n");
+		WARNING("unable to read volume\n");
 		return -1;
 	}
 
@@ -130,7 +130,7 @@ int getOssVolumeLevel() {
 	right = (level & 0xff00) >> 8;
 
 	if(left!=right) {
-		ERROR("volume for left and right is not the same, \"%i\" and "
+		WARNING("volume for left and right is not the same, \"%i\" and "
 			"\"%i\"\n",left,right);
 	}
 
@@ -174,27 +174,27 @@ int prepAlsaMixer(char * card) {
 	char * controlName = VOLUME_MIXER_ALSA_CONTROL_DEFAULT;
 
 	if((err = snd_mixer_open(&volume_alsaMixerHandle,0))<0) {
-		ERROR("problems opening alsa mixer: %s\n",snd_strerror(err));
+		WARNING("problems opening alsa mixer: %s\n",snd_strerror(err));
 		return -1;
 	}
 	
 	if((err = snd_mixer_attach(volume_alsaMixerHandle,card))<0) {
 		snd_mixer_close(volume_alsaMixerHandle);
-		ERROR("problems problems attaching alsa mixer: %s\n",
+		WARNING("problems problems attaching alsa mixer: %s\n",
 			snd_strerror(err));
 		return -1;
 	}
 	
 	if((err = snd_mixer_selem_register(volume_alsaMixerHandle,NULL,NULL))<0) {
 		snd_mixer_close(volume_alsaMixerHandle);
-		ERROR("problems snd_mixer_selem_register'ing: %s\n",
+		WARNING("problems snd_mixer_selem_register'ing: %s\n",
 			snd_strerror(err));
 		return -1;
 	}
 	
 	if((err = snd_mixer_load(volume_alsaMixerHandle))<0) {
 		snd_mixer_close(volume_alsaMixerHandle);
-		ERROR("problems snd_mixer_selem_register'ing: %s\n",
+		WARNING("problems snd_mixer_selem_register'ing: %s\n",
 			snd_strerror(err));
 		return -1;
 	}
@@ -223,7 +223,7 @@ int prepAlsaMixer(char * card) {
 		return 0;
 	}
 
-	ERROR("can't find alsa mixer_control \"%s\"\n",controlName);
+	WARNING("can't find alsa mixer_control \"%s\"\n",controlName);
 
 	snd_mixer_close(volume_alsaMixerHandle);
 	return -1;
@@ -244,7 +244,7 @@ int getAlsaVolumeLevel() {
 
 	if((err = snd_mixer_selem_get_playback_volume(volume_alsaElem,
 		SND_MIXER_SCHN_FRONT_LEFT,&level))<0) {
-		ERROR("problems getting alsa volume: %s\n",snd_strerror(err));
+		WARNING("problems getting alsa volume: %s\n",snd_strerror(err));
 		return -1;
 	}
 
@@ -272,7 +272,7 @@ int changeAlsaVolumeLevel(FILE * fp, int change, int rel) {
 	if((err = snd_mixer_selem_get_playback_volume(volume_alsaElem,
 		SND_MIXER_SCHN_FRONT_LEFT,&level))<0) {
 		commandError(fp, ACK_ERROR_SYSTEM, "problems getting volume");
-		ERROR("problems getting alsa volume: %s\n",snd_strerror(err));
+		WARNING("problems getting alsa volume: %s\n",snd_strerror(err));
 		return -1;
 	}
 
@@ -298,7 +298,7 @@ int changeAlsaVolumeLevel(FILE * fp, int change, int rel) {
 	if((err = snd_mixer_selem_set_playback_volume_all(
 				volume_alsaElem,level))<0) {
 		commandError(fp, ACK_ERROR_SYSTEM, "problems setting volume");
-		ERROR("problems setting alsa volume: %s\n",snd_strerror(err));
+		WARNING("problems setting alsa volume: %s\n",snd_strerror(err));
 		return -1;
 	}
 
@@ -365,7 +365,7 @@ void initVolume() {
 
 void openVolumeDevice() {
 	if(prepMixer(volume_mixerDevice)<0) {
-		ERROR("using software volume\n");
+		WARNING("using software volume\n");
 		volume_mixerType = VOLUME_MIXER_TYPE_SOFTWARE;
 	}
 }