diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c
index 8de04b1bf72562abd0c32bb4b526d47456ccf556..66c96cce690b99c2e8beaa531b9259081bb14711 100644
--- a/ch32v003fun/ch32v003fun.c
+++ b/ch32v003fun/ch32v003fun.c
@@ -13,7 +13,6 @@
 #include <ch32v003fun.h>
 
 int errno;
-int _write(int fd, const char *buf, int size);
 
 int mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va);
 int mini_vpprintf(int (*puts)(char* s, int len, void* buf), void* buf, const char *fmt, va_list va);
diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h
index 34ee9b1d174a26e3361b21a9f5ff701fd564b271..9f0e97aa83bbf2d550ad5bb1735be074a081b745 100644
--- a/ch32v003fun/ch32v003fun.h
+++ b/ch32v003fun/ch32v003fun.h
@@ -4848,11 +4848,11 @@ void SystemInitHSEPLL( int HSEBYP );
 // You can write to this with printf(...) or puts(...)
 // Call with SetupUART( UART_BRR )
 void SetupUART( int uartBRR );
-
 void SetupDebugPrintf();
-
 void WaitForDebuggerToAttach();
 
+// Just a definition to the internal _write function.
+int _write(int fd, const char *buf, int size);
 
 #ifdef __cplusplus
 };
diff --git a/examples/debugprintfdemo/debugprintfdemo.c b/examples/debugprintfdemo/debugprintfdemo.c
index 80ed6830718e8c677691c5e3db2d9e5dd65e2d58..fbb2d1c6935be824f05a89c9021afe870c834965 100644
--- a/examples/debugprintfdemo/debugprintfdemo.c
+++ b/examples/debugprintfdemo/debugprintfdemo.c
@@ -35,6 +35,8 @@ int main()
 		GPIOC->BSHR = (1<<16);
 		printf( "-%d\n", count++ );
 		count++;
+
+//		_write( 0, "xxxxxxx", 7 );
 	}
 }
 
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index adc53f2080029abb2ca988d2f39b653de6a679da..052a162b9f257a9120c7d6195d0ae172e83e12b0 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -158,8 +158,8 @@ keep_going:
 					goto unimplemented;
 				do
 				{
-					uint8_t buffer[128];
-					int r = MCF.PollTerminal( dev, buffer, sizeof( buffer ) );
+					uint8_t buffer[256];
+					int r = MCF.PollTerminal( dev, buffer, sizeof( buffer ), 0, 0 );
 					if( r < 0 )
 					{
 						fprintf( stderr, "Terminal dead.  code %d\n", r );
@@ -1004,7 +1004,7 @@ static int DefaultHaltMode( void * dev, int mode )
 // Returns negative if error.
 // Returns 0 if no text waiting.
 // maxlen MUST be at least 8 characters.  We null terminate.
-int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen )
+int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB )
 {
 	struct InternalState * iss = (struct InternalState*)(((struct ProgrammerStructBase*)dev)->internal);
 
@@ -1021,13 +1021,11 @@ int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen )
 	if( maxlen < 8 ) return -9;
 
 	// DMDATA1:
-	//  bits 0..5 = # printf chars.
-	//  bit  6 = host-wants-to-say-something.
 	//  bit  7 = host-acknowledge.
 	if( rr & 0x80 )
 	{
 		int ret = 0;
-		int num_printf_chars = (rr & 0x3f)-4;  // Actaully can't be more than 32.
+		int num_printf_chars = (rr & 0xf)-4;
 
 		if( num_printf_chars > 0 && num_printf_chars <= 7)
 		{
@@ -1043,7 +1041,8 @@ int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen )
 			buffer[num_printf_chars] = 0;
 			ret = num_printf_chars;
 		}
-		MCF.WriteReg32( dev, DMDATA0, 0x00 ); // Write that we acknowledge the data.
+		if( leaveflagA ) MCF.WriteReg32( dev, DMDATA1, leaveflagB );
+		MCF.WriteReg32( dev, DMDATA0, leaveflagA ); // Write that we acknowledge the data.
 		return ret;
 	}
 	else
diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h
index 100e1270d11d652b69505a4514271dd1a7cc578b..934016e7a926260303532b0398125a79f1ed266f 100644
--- a/minichlink/minichlink.h
+++ b/minichlink/minichlink.h
@@ -50,7 +50,8 @@ struct MiniChlinkFunctions
 	// Returns positive if received text.
 	// Returns negative if error.
 	// Returns 0 if no text waiting.
-	int (*PollTerminal)( void * dev, uint8_t * buffer, int maxlen );
+	// Note: YOU CANNOT make lsb of leaveflagA bit in place 0x80 be high!!!
+	int (*PollTerminal)( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB );
 
 	int (*PerformSongAndDance)( void * dev );
 
diff --git a/minichlink/pgm-esp32s2-ch32xx.c b/minichlink/pgm-esp32s2-ch32xx.c
index 77e2f03a3e65b272ed42590f1660054522d5efc7..212f66f51f83e92089231caefc96deb8b7ce335d 100644
--- a/minichlink/pgm-esp32s2-ch32xx.c
+++ b/minichlink/pgm-esp32s2-ch32xx.c
@@ -313,7 +313,7 @@ int ESPVendorCommand( void * dev, const char * cmd )
 		Write1( dev, 0 ); 
 		Write1( dev, 0 ); 
 		Write1( dev, 0 ); 
-	ESPFlushLLCommands( dev );
+		ESPFlushLLCommands( dev );
 	}
 	else
 	{
@@ -322,6 +322,45 @@ int ESPVendorCommand( void * dev, const char * cmd )
 	return 0;
 }
 
+int ESPPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB )
+{
+	struct ESP32ProgrammerStruct * eps = (struct ESP32ProgrammerStruct *)dev;
+	ESPFlushLLCommands( dev );	
+	Write1( dev, 0xfe );
+	Write1( dev, 0x0d );
+	Write4LE( dev, leaveflagA );
+	Write4LE( dev, leaveflagB );
+	Write1( dev, 0xff );
+
+	ESPFlushLLCommands( dev );
+
+	int rlen = eps->reply[0];
+	if( rlen < 1 ) return -8;
+
+/*
+	int i;
+
+	printf( "RESP (ML %d): %d\n", maxlen,eps->reply[0] );
+
+	for( i = 0; i < eps->reply[0]; i++ )
+	{
+		printf( "%02x ", eps->reply[i+1] );
+		if( (i % 16) == 15 ) printf( "\n" );
+	}
+	printf( "\n" );
+*/
+	int errc = eps->reply[1];
+	if( errc > 7 ) return -7;
+
+	if( rlen - 1 >= maxlen ) return -6; 
+
+	memcpy( buffer, eps->reply + 2, rlen - 1 );
+
+
+	return rlen - 1;
+}
+
+
 void * TryInit_ESP32S2CHFUN()
 {
 	#define VID 0x303a
@@ -343,6 +382,7 @@ void * TryInit_ESP32S2CHFUN()
 	MCF.Control3v3 = ESPControl3v3;
 	MCF.Exit = ESPExit;
 	MCF.VoidHighLevelState = ESPVoidHighLevelState;
+	MCF.PollTerminal = ESPPollTerminal;
 
 	// These are optional. Disabling these is a good mechanismto make sure the core functions still work.
 	MCF.WriteWord = ESPWriteWord;