Do proper logging rather than fprintf(stderr, ...)
diff --git a/common/rfb/CMsgHandler.cxx b/common/rfb/CMsgHandler.cxx
index 4fe5041..c009067 100644
--- a/common/rfb/CMsgHandler.cxx
+++ b/common/rfb/CMsgHandler.cxx
@@ -19,9 +19,12 @@
 #include <stdio.h>
 
 #include <rfb/Exception.h>
+#include <rfb/LogWriter.h>
 #include <rfb/CMsgHandler.h>
 #include <rfb/screenTypes.h>
 
+static rfb::LogWriter vlog("CMsgHandler");
+
 using namespace rfb;
 
 CMsgHandler::CMsgHandler()
diff --git a/common/rfb/CMsgReader.cxx b/common/rfb/CMsgReader.cxx
index e8e7afb..2b5b9fb 100644
--- a/common/rfb/CMsgReader.cxx
+++ b/common/rfb/CMsgReader.cxx
@@ -23,10 +23,13 @@
 #include <rfb/msgTypes.h>
 #include <rdr/InStream.h>
 #include <rfb/Exception.h>
+#include <rfb/LogWriter.h>
 #include <rfb/util.h>
 #include <rfb/CMsgHandler.h>
 #include <rfb/CMsgReader.h>
 
+static rfb::LogWriter vlog("CMsgReader");
+
 using namespace rfb;
 
 CMsgReader::CMsgReader(CMsgHandler* handler_, rdr::InStream* is_)
@@ -74,7 +77,7 @@
       readEndOfContinuousUpdates();
       break;
     default:
-      fprintf(stderr, "unknown message type %d\n", type);
+      vlog.error("unknown message type %d", type);
       throw Exception("unknown message type");
     }
   } else {
@@ -151,7 +154,7 @@
   rdr::U32 len = is->readU32();
   if (len > 256*1024) {
     is->skip(len);
-    fprintf(stderr,"cut text too long (%d bytes) - ignoring\n",len);
+    vlog.error("cut text too long (%d bytes) - ignoring",len);
     return;
   }
   CharArray ca(len+1);
@@ -172,7 +175,7 @@
 
   len = is->readU8();
   if (len > sizeof(data)) {
-    fprintf(stderr, "Ignoring fence with too large payload\n");
+    vlog.error("Ignoring fence with too large payload");
     is->skip(len);
     return;
   }
@@ -198,14 +201,14 @@
 {
   if ((r.br.x > handler->server.width()) ||
       (r.br.y > handler->server.height())) {
-    fprintf(stderr, "Rect too big: %dx%d at %d,%d exceeds %dx%d\n",
+    vlog.error("Rect too big: %dx%d at %d,%d exceeds %dx%d",
 	    r.width(), r.height(), r.tl.x, r.tl.y,
             handler->server.width(), handler->server.height());
     throw Exception("Rect too big");
   }
 
   if (r.is_empty())
-    fprintf(stderr, "Warning: zero size rect\n");
+    vlog.error("zero size rect");
 
   handler->dataRect(r, encoding);
 }
@@ -449,7 +452,7 @@
   char* name = is->readString();
 
   if (x || y || w || h) {
-    fprintf(stderr, "Ignoring DesktopName rect with non-zero position/size\n");
+    vlog.error("Ignoring DesktopName rect with non-zero position/size");
   } else {
     handler->setName(name);
   }
diff --git a/common/rfb/Configuration.cxx b/common/rfb/Configuration.cxx
index 619c4d5..ea00060 100644
--- a/common/rfb/Configuration.cxx
+++ b/common/rfb/Configuration.cxx
@@ -379,7 +379,7 @@
   : VoidParameter(name_, desc_, co), value(strDup(v)), def_value(v)
 {
   if (!v) {
-    fprintf(stderr,"Default value <null> for %s not allowed\n",name_);
+    vlog.error("Default value <null> for %s not allowed",name_);
     throw rfb::Exception("Default value <null> not allowed");
   }
 }
diff --git a/common/rfb/Region.cxx b/common/rfb/Region.cxx
index c17c5d4..beca482 100644
--- a/common/rfb/Region.cxx
+++ b/common/rfb/Region.cxx
@@ -24,6 +24,7 @@
 //
 
 #include <rfb/Region.h>
+#include <rfb/LogWriter.h>
 #include <assert.h>
 #include <stdio.h>
 
@@ -33,6 +34,8 @@
 #include <Xregion/Xregion.h>
 }
 
+static rfb::LogWriter vlog("Region");
+
 // A _RectRegion must never be passed as a return parameter to the Xlib region
 // operations.  This is because for efficiency its "rects" member has not been
 // allocated with Xmalloc.  It is however safe to pass it as an input
@@ -123,7 +126,7 @@
     BOX* prevRects = xrgn->rects;
     xrgn->rects = (BOX*)Xrealloc((char*)xrgn->rects, nRects * sizeof(BOX));
     if (!xrgn->rects) {
-      fprintf(stderr,"Xrealloc failed\n");
+      vlog.error("Xrealloc failed");
       Xfree(prevRects);
       return;
     }
@@ -234,13 +237,13 @@
 
 void rfb::Region::debug_print(const char* prefix) const
 {
-  fprintf(stderr,"%s num rects %3ld extents %3d,%3d %3dx%3d\n",
+  vlog.debug("%s num rects %3ld extents %3d,%3d %3dx%3d",
           prefix, xrgn->numRects, xrgn->extents.x1, xrgn->extents.y1,
           xrgn->extents.x2-xrgn->extents.x1,
           xrgn->extents.y2-xrgn->extents.y1);
 
   for (int i = 0; i < xrgn->numRects; i++) {
-    fprintf(stderr,"    rect %3d,%3d %3dx%3d\n",
+    vlog.debug("    rect %3d,%3d %3dx%3d",
             xrgn->rects[i].x1, xrgn->rects[i].y1,
             xrgn->rects[i].x2-xrgn->rects[i].x1,
             xrgn->rects[i].y2-xrgn->rects[i].y1);
diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx
index cb71ac8..200350c 100644
--- a/common/rfb/SMsgReader.cxx
+++ b/common/rfb/SMsgReader.cxx
@@ -83,7 +83,7 @@
     readQEMUMessage();
     break;
   default:
-    fprintf(stderr, "unknown message type %d\n", msgType);
+    vlog.error("unknown message type %d", msgType);
     throw Exception("unknown message type");
   }
 }
@@ -173,7 +173,7 @@
 
   len = is->readU8();
   if (len > sizeof(data)) {
-    fprintf(stderr, "Ignoring fence with too large payload\n");
+    vlog.error("Ignoring fence with too large payload");
     is->skip(len);
     return;
   }