diff --git a/programs/test/udp_proxy.c b/programs/test/udp_proxy.c
index 586a1b2..cddc142 100644
--- a/programs/test/udp_proxy.c
+++ b/programs/test/udp_proxy.c
@@ -69,17 +69,6 @@
 #define DFL_LISTEN_ADDR         "localhost"
 #define DFL_LISTEN_PORT         5556
 
-/*
- * global options
- */
-struct options
-{
-    const char *server_addr;    /* address to forward packets to            */
-    int server_port;            /* port to forward packets to               */
-    const char *listen_addr;    /* address for accepting client connections */
-    int listen_port;            /* port for accepting client connections    */
-} opt;
-
 #define USAGE                                                               \
     "\n usage: udp_proxy param=<>...\n"                                     \
     "\n acceptable parameters:\n"                                           \
@@ -89,8 +78,24 @@
     "    listen_port=%%d      default: 4433\n"                              \
     "\n"
 
-static void exit_usage( void )
+/*
+ * global options
+ */
+static struct options
 {
+    const char *server_addr;    /* address to forward packets to            */
+    int server_port;            /* port to forward packets to               */
+    const char *listen_addr;    /* address for accepting client connections */
+    int listen_port;            /* port for accepting client connections    */
+} opt;
+
+static void exit_usage( const char *name, const char *value )
+{
+    if( value == NULL )
+        printf( " unknown option: %s\n", name );
+    else
+        printf( " option %s: illegal value: %s\n", name, value );
+
     printf( USAGE );
     exit( 1 );
 }
@@ -109,7 +114,7 @@
     {
         p = argv[i];
         if( ( q = strchr( p, '=' ) ) == NULL )
-            exit_usage();
+            exit_usage( p, NULL );
         *q++ = '\0';
 
         if( strcmp( p, "server_addr" ) == 0 )
@@ -118,7 +123,7 @@
         {
             opt.server_port = atoi( q );
             if( opt.server_port < 1 || opt.server_port > 65535 )
-                exit_usage();
+                exit_usage( p, q );
         }
         else if( strcmp( p, "listen_addr" ) == 0 )
             opt.listen_addr = q;
@@ -126,10 +131,41 @@
         {
             opt.listen_port = atoi( q );
             if( opt.listen_port < 1 || opt.listen_port > 65535 )
-                exit_usage();
+                exit_usage( p, q );
         }
         else
-            exit_usage();
+            exit_usage( p, NULL );
+    }
+}
+
+static const char *msg_type( unsigned char *msg, size_t len )
+{
+    if( len < 1 )                           return( "Invalid" );
+    switch( msg[0] )
+    {
+        case SSL_MSG_CHANGE_CIPHER_SPEC:    return( "ChangeCipherSpec" );
+        case SSL_MSG_ALERT:                 return( "Alert" );
+        case SSL_MSG_APPLICATION_DATA:      return( "ApplicationData" );
+        case SSL_MSG_HANDSHAKE:             break; /* See below */
+        default:                            return( "Unknown" );
+    }
+
+    if( len < 13 )                          return( "Invalid handshake" );
+    switch( msg[13] )
+    {
+        case SSL_HS_HELLO_REQUEST:          return( "HelloRequest" );
+        case SSL_HS_CLIENT_HELLO:           return( "ClientHello" );
+        case SSL_HS_SERVER_HELLO:           return( "ServerHello" );
+        case SSL_HS_HELLO_VERIFY_REQUEST:   return( "HelloVerifyRequest" );
+        case SSL_HS_NEW_SESSION_TICKET:     return( "NewSessionTicket" );
+        case SSL_HS_CERTIFICATE:            return( "Certificate" );
+        case SSL_HS_SERVER_KEY_EXCHANGE:    return( "ServerKeyExchange" );
+        case SSL_HS_CERTIFICATE_REQUEST:    return( "CertificateRequest" );
+        case SSL_HS_SERVER_HELLO_DONE:      return( "ServerHelloDone" );
+        case SSL_HS_CERTIFICATE_VERIFY:     return( "CertificateVerify" );
+        case SSL_HS_CLIENT_KEY_EXCHANGE:    return( "ClientKeyExchange" );
+        case SSL_HS_FINISHED:               return( "Finished" );
+        default:                            return( "Unkown handshake" );
     }
 }
 
@@ -145,10 +181,12 @@
         return( ret );
     }
 
-    printf( "  .. %s: %d bytes forwarded\n", way, ret );
+    len = ret;
+    type = msg_type( buf, len );
+    printf( "  > %s: %s (%u bytes)\n", way, type, len );
 
-    len = (size_t) ret;
 
+    printf( "  < %s: %s (%u bytes): forwarded\n", way, type, len );
     if( ( ret = net_send( &dst, buf, len ) ) <= 0 )
     {
         printf( "  ! net_send returned %d\n", ret );
@@ -173,7 +211,7 @@
     get_options( argc, argv );
 
     /*
-     * 0. Connect to the server
+     * 0. "Connect" to the server
      */
     printf( "  . Connect to server on UDP/%s/%d ...",
             opt.server_addr, opt.server_port );
