diff -r -u uartbuf.orig/UART0.C uartbuf/UART0.C
--- uartbuf.orig/UART0.C	2008-05-31 14:25:10.000000000 +0200
+++ uartbuf/UART0.C	2009-11-30 23:31:59.000000000 +0100
@@ -49,7 +49,7 @@
 
   while( !ukbhit0() );			// until at least one byte in
   data = rx_buff[rx_out];		// get byte
-  ROLLOVER( rx_out, RX0_SIZE );
+  ROLLOVER( vu8(rx_out), RX0_SIZE );
   URX0_IEN = 1;				// enable RX interrupt
   return data;
 }
@@ -97,7 +97,7 @@
   tx_buff[tx_in] = c;
   while( i == vu8(tx_out));		// until at least one byte free
 					// tx_out modified by interrupt !
-  tx_in = i;
+  vu8(tx_in) = i;
   UTX0_IEN = 1;                         // enable TX interrupt
 }
 
@@ -107,3 +107,10 @@
   while( *s )
     uputchar0( *s++ );
 }
+
+void uputs0_pgm( PGM_P s )
+{
+  u8 b;
+  while( (b=pgm_read_byte(s++)) != 0 )
+    uputchar0(b);
+}
diff -r -u uartbuf.orig/UART0.H uartbuf/UART0.H
--- uartbuf.orig/UART0.H	2008-05-31 14:25:32.000000000 +0200
+++ uartbuf/UART0.H	2009-11-30 23:33:41.000000000 +0100
@@ -8,6 +8,8 @@
 #ifndef _uart0_h_
 #define _uart0_h_
 
+#include <avr/pgmspace.h>
+
 					// size must be in range 2 .. 256
 #define RX0_SIZE	10		// usable: RX0_SIZE + 2 (4 .. 258)
 #define TX0_SIZE	8		// usable: TX0_SIZE + 1 (3 .. 257)
@@ -22,6 +24,9 @@
 void uputs0_( u8 *s );			// send string from SRAM
 void init_uart0( u16 bauddivider );
 
+void uputs0_pgm( PGM_P s );     // send string from program memory
+#define uputs0_pgm_P(__s) uputs0_pgm(PSTR(__s))
+
 
 #define	UTX0_IEN	SBIT( UCSR0B, UDRIE0 )
 #define	URX0_IEN	SBIT( UCSR0B, RXCIE0 )
