diff -ur cnxt-boot-ldr/driver.h cnxt-boot-ldr.netboot/driver.h
--- cnxt-boot-ldr/driver.h	2003-10-08 19:42:58.000000000 +0200
+++ cnxt-boot-ldr.netboot/driver.h	2006-08-21 21:37:04.000000000 +0200
@@ -64,6 +64,7 @@
     BYTE *(*tftp_data)(CONTEXT *c, int *blocklen);  	/* Return next TFTP pkt  	*/
     void (*tftp_data_done)(CONTEXT *c, BYTE *data); 	/* Done with packet data 	*/
     void (*tftp_ack)(CONTEXT *c, int block);        	/* Send TFTP ack         	*/
+    char *(*tftp_getfile)(CONTEXT *c);                  /* Get BOOTP supplied filename	*/
     void (*tftp_setfile)(CONTEXT *c, char* filename);   /* Change tftp request file  	*/
     void (*shutdown)(CONTEXT *c);                   	/* Tidy up after driver  	*/
     int tftp_blocksize;                             	/* TFTP block size       	*/
diff -ur cnxt-boot-ldr/driver_stub.c cnxt-boot-ldr.netboot/driver_stub.c
--- cnxt-boot-ldr/driver_stub.c	2003-10-08 19:42:58.000000000 +0200
+++ cnxt-boot-ldr.netboot/driver_stub.c	2006-08-21 21:37:04.000000000 +0200
@@ -492,6 +492,13 @@
     ether_init();
 }
 
+static char *eth_tftp_getfile(CONTEXT *c)
+{
+    PRIVATE_CONTEXT *pc = (PRIVATE_CONTEXT *)(c->private);
+
+    return pc->file;
+}
+
 static void eth_tftp_setfile(CONTEXT *c, char *filename)
 {
     PRIVATE_CONTEXT *pc = (PRIVATE_CONTEXT *)(c->private);
@@ -855,6 +862,7 @@
     eth_tftp_data,
     eth_tftp_data_done,
     eth_tftp_ack,
+    eth_tftp_getfile,
     eth_tftp_setfile,
     eth_shutdown,
     512
diff -ur cnxt-boot-ldr/init.c cnxt-boot-ldr.netboot/init.c
--- cnxt-boot-ldr/init.c	2005-07-25 20:29:18.000000000 +0200
+++ cnxt-boot-ldr.netboot/init.c	2006-08-21 21:49:10.000000000 +0200
@@ -13,7 +13,7 @@
 
 #include "std_defines.h"
 #include "hstif.h"
-
+#include "driver.h" /* For BOOL... */
 
 struct uart_regs
 {
@@ -213,14 +213,14 @@
 //        return 0;
 //    return ch; 
 }
-extern int tftp_download (unsigned char *mem_start, unsigned char *mem_end, unsigned int  *image_len) ;
+extern int tftp_download (unsigned char *mem_start, unsigned char *mem_end, BOOL *netboot) ;
 #endif ACTION_TEC
 
 void init_all(void)
 {
 #ifdef ACTION_TEC
 	unsigned char *mem_start, *mem_end;
-	unsigned int image_len;
+	BOOL netboot=0;
 #endif ACTION_TEC
 
 	uart= (struct uart_regs*)UART0_Base_Addr;
@@ -230,12 +230,13 @@
 #ifdef ACTION_TEC
     TIMER1_LIMIT = 0xffff;
 
-	keyPressed = waitforKeypress ();
+//JH	keyPressed = waitforKeypress ();
+keyPressed = 0; /* for now, always behave like the button was pressed */
 	if (keyPressed == 0) {
 	    prints("reset key pressed, begin tftp bootup.\n");
 	    mem_start = (unsigned char *)0x800000;
 	    mem_end =   (unsigned char *)0xb00000;
-	    if (tftp_download (mem_start, mem_end, &image_len) == -1)
+	    if (tftp_download (mem_start, mem_end, &netboot) == -1)
             prints ("No network connection found. tftp download failed.\n");;
 	}
 	else
@@ -244,7 +245,9 @@
 
 	HSTInit();
 
-	decompress_kernel((unsigned long)kernel_start);
+	if (!netboot) {
+	    decompress_kernel((unsigned long)kernel_start);
+	}
 	return;
 }
 
diff -ur cnxt-boot-ldr/tftp.c cnxt-boot-ldr.netboot/tftp.c
--- cnxt-boot-ldr/tftp.c	2003-10-08 19:42:58.000000000 +0200
+++ cnxt-boot-ldr.netboot/tftp.c	2006-08-21 21:46:16.000000000 +0200
@@ -261,7 +261,7 @@
  ***********************************************************************/
 //static  U8 FIXED_MAC[6]={0x00,0x20,0xe0,0x00,0x00,0x00};	//Justin 09-25
 static  U8 FIXED_MAC[6]={0x84,0xdb,0xe0,0x00,0x74,0xa3};
-int tftp_download (BYTE *mem_start, BYTE *mem_end, unsigned int  *image_len)
+int tftp_download (BYTE *mem_start, BYTE *mem_end, BOOL *netboot)
 {
     int     i, j;
     U8 *    mac;
@@ -272,6 +272,9 @@
     U32     timeout;
     BOOL    ESCPressed;
     BYTE    *pEnd = mem_end;
+    unsigned int image_len;
+
+    *netboot = FALSE;
 
     mac = FIXED_MAC;
     /* Show the MAC address: */
@@ -333,43 +336,65 @@
     notFoundBootldr = FALSE;
     if (ESUCCESS == rc)
     {
-        for (i=0; i<MAX_DOWNLOADFILES; i++) {
-            boot_device->tftp_setfile (context, downloadfiles[i].name);
-//            prints ("--------------tftp filename=%s, mem=%x, flash=%x\n", 
-//	    	downloadfiles[i].name, downloadfiles[i].mem_start, downloadfiles[i].flash_start);
-            /* Do TFTP: */
-            do
-            {
-                *image_len = do_tftp (boot_device, context, downloadfiles[i].mem_start);
-                if (uart_getc () == CHAR_ESC)
+        if (boot_device->tftp_getfile(context)[0]!='\0') {
+            /* JH: If the bootp server supplied a filename, we assume that
+               this is a valid, UNCOMPRESSED kernel image which we will
+               try to load and boot */
+
+            *netboot = TRUE;
+
+            prints("Trying to load uncompressed kernel image '%s' via tftp\n", 
+                   boot_device->tftp_getfile(context));
+
+            do_tftp (boot_device, context, 0x800000);
+            rc = ESUCCESS;
+
+        } else {
+            /* JH: If the bootp server did not suppy a filename, we will
+               try to do a flash recovery */
+
+            prints("Trying to perform a flash recovery\n");
+
+            for (i=0; i<MAX_DOWNLOADFILES; i++) {
+                boot_device->tftp_setfile (context, downloadfiles[i].name);
+//                prints ("--------------tftp filename=%s, mem=%x, flash=%x\n", 
+//	    	    downloadfiles[i].name, downloadfiles[i].mem_start, downloadfiles[i].flash_start);
+                /* Do TFTP: */
+                do
                 {
-                    prints ("Esc pressed, aborting download");
-                    rc = EIO;
-		    downloadOK = FALSE;
-                    break;
-                } 
-            }
-            while (*image_len == 1);
-	    if (downloadOK && (*image_len!=0)) {
-	        downloadfiles[i].image_len = *image_len;
-	    }
-	    else {
-    	    if (downloadfiles[i].isBootldr) {
-                notFoundBootldr = TRUE;
-            }
-            else {
- 	            downloadOK = FALSE;
-	            break;
+                    image_len = do_tftp (boot_device, context, downloadfiles[i].mem_start);
+                    if (uart_getc () == CHAR_ESC)
+                    {
+                        prints ("Esc pressed, aborting download");
+                        rc = EIO;
+		        downloadOK = FALSE;
+                        break;
+                    } 
+                }
+
+                while (image_len == 1)
+                  ; /* JH: Endless loop??? */
+
+                if (downloadOK && (image_len!=0)) {
+                    downloadfiles[i].image_len = image_len;
+                } else {
+                    if (downloadfiles[i].isBootldr) {
+                        notFoundBootldr = TRUE;
+                    } else {
+                        downloadOK = FALSE;
+                        break;
+                    }
+                }
             }
-	    }
-	}
-	    
+
+        }
+
     }
 
     /* Shutdown driver: */
     boot_device->shutdown (context);
 
-    if (ESUCCESS == rc)
+    if (ESUCCESS == rc && !(*netboot))
     {
         if (!downloadOK) {
             prints ("Tftp download failed\n");
