diff -Naur netdiscover-0.3-beta6.orig/src/ifaces.c netdiscover-0.3-beta6/src/ifaces.c
--- netdiscover-0.3-beta6.orig/src/ifaces.c	2009-06-24 18:21:11.000000000 -0400
+++ netdiscover-0.3-beta6/src/ifaces.c	2009-06-24 21:44:05.000000000 -0400
@@ -127,6 +127,7 @@
       memcpy(type, packet + 20, 2); 		/* ARP Opcode */
       new_arprep_l->header = new_header;	/* Add header */
       new_arprep_l->count = 1;				/* Count      */
+      new_arprep_l->printed = 0;
       new_arprep_l->next = NULL;
       
       /* Source IP */
diff -Naur netdiscover-0.3-beta6.orig/src/main.c netdiscover-0.3-beta6/src/main.c
--- netdiscover-0.3-beta6.orig/src/main.c	2009-06-24 18:21:11.000000000 -0400
+++ netdiscover-0.3-beta6/src/main.c	2009-06-24 21:34:59.000000000 -0400
@@ -30,6 +30,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <signal.h>
 #include "ifaces.h"
 #include "screen.h"
 
@@ -39,8 +40,17 @@
 	char *disp;
 	char *sip;
 	int autos;
+	int machine;
 };
 
+/* Injection Thread data structure */
+struct t_inject {
+  struct t_data *datos;
+  pthread_t *sniffer;
+  pthread_t *screen;
+  pthread_t *keys;
+  int scan_secs;
+};
 
 void *inject_arp(void *arg);
 void *screen_refresh(void *arg);
@@ -77,7 +87,7 @@
 
 
 pthread_t injection, sniffer, screen, keys;
-int fastmode, pcount, node, ssleep;
+int fastmode, pcount, node, ssleep, nokeywait;
 long sleept;
 
 
@@ -86,7 +96,9 @@
 {
     while ( 1 == 1 )
     {
-        read_key();
+	struct t_data *datos;
+	datos = (struct t_data *)arg;
+        read_key(datos->machine);
     }
 }
 
@@ -97,20 +109,24 @@
 	int c;
 	int esniff = 0;
 	int erange = 0;
+	int scan_secs = 0;
 	struct t_data datos;
-	
+	struct t_inject injectdata;
+
 	datos.sip = NULL;
 	datos.disp = NULL;
+	datos.machine = 0;
 	datos.autos = 0;
 	sleept = 99;
 	node = 67;
 	pcount = 1;
+	nokeywait = 0;
 	
 	current_network = (char *) malloc ((sizeof(char)) * 16);
 	sprintf(current_network,"Starting.");
 	
 	/* Fetch parameters */
-	while ((c = getopt(argc, argv, "i:s:r:n:c:pSfh")) != EOF)
+	while ((c = getopt(argc, argv, "i:s:r:n:c:t:pSfhkm")) != EOF)
 	{
 		switch (c)
 		{
@@ -138,12 +154,20 @@
 			case  'n':
 				node = atoi(optarg);
 				break;
+
+            		case 't':
+		                scan_secs = atoi(optarg);
+                                break;
 			
 			case  'r':
 				datos.sip = (char *) malloc (sizeof(char) * strlen(optarg));
 				sprintf(datos.sip, "%s", optarg);
 				erange = 1;
 				break;
+
+			case 'm':
+			       datos.machine = 1;
+			       break;
 			
 			case  'f':
 				fastmode = 1;
@@ -153,6 +177,10 @@
 				usage(argv[0]);
 				exit(1);
 				break;
+
+               		case 'k':
+			        nokeywait = 1;
+			        break;
 			
 			default:
 				break;
@@ -181,7 +209,7 @@
 	/* Init some stuff */
 	lnet_init(datos.disp);
 	init_lists();
-	system("clear");
+	if (!datos.machine) system("clear");
 	
 	/* If no mode was selected, enable auto scan */
 	if ((erange != 1) && (esniff != 1))
@@ -189,9 +217,15 @@
 		datos.autos = 1;
 	}
 	
+	
 	/* Start the execution */
-	pthread_create(&screen, NULL, screen_refresh, (void *)NULL);
-	pthread_create(&keys, NULL, keys_thread, (void *)NULL);
+	pthread_create(&screen, NULL, screen_refresh, (void *)&datos);
+	if (!nokeywait) {
+	  pthread_create(&keys, NULL, keys_thread, (void *)&datos);
+	  injectdata.keys = &keys;
+	} else {
+	  injectdata.keys = NULL;
+	}
 	pthread_create(&sniffer, NULL, start_sniffer, (void *)&datos);
 	
 	if (esniff == 1)
@@ -201,10 +235,19 @@
 	}
 	else
 	{
-		if (pthread_create(&injection, NULL, inject_arp, (void *)&datos))
+                injectdata.datos = &datos;
+                injectdata.sniffer = &sniffer;
+                injectdata.screen = &screen;
+                injectdata.scan_secs = scan_secs;
+
+		if (pthread_create(&injection, NULL, inject_arp, (void *)&injectdata))
 			perror("Could not create injection thread");
 		
-		pthread_join(sniffer,NULL);
+		if (scan_secs > 0) {
+		  pthread_join(injection,NULL);
+		} else {
+		  pthread_join(sniffer,NULL);
+		}
 	}
 	
 	
@@ -215,10 +258,11 @@
 /* Refresh screen function called by screen thread */
 void *screen_refresh(void *arg)
 {
-	
+	struct t_data *datos;
+	datos = (struct t_data *)arg;
 	while (1==1)
 	{
-		print_screen();
+		print_screen(datos->machine);
 		sleep(1);
 	}
 	
@@ -228,9 +272,11 @@
 /* Inject ARP Replys to the network */
 void *inject_arp(void *arg)
 {	
+        struct t_inject *inject;
 	struct t_data *datos;
 		
-	datos = (struct t_data *)arg;
+	inject = (struct t_inject *)arg;
+	datos = inject->datos;
 	sleep(2);
 	
 	if ( datos->autos != 1 )
@@ -251,6 +297,12 @@
 	
 	sprintf(current_network,"Finished!");
 	lnet_destroy();
+	if (inject->scan_secs > 0) {
+ 		sleep(inject->scan_secs);  
+		pthread_kill(*(inject->sniffer), SIGKILL);
+		pthread_kill(*(inject->screen), SIGKILL);
+		pthread_kill(*(inject->keys), SIGKILL);
+	}
 	
 	return NULL;
 }
@@ -400,6 +452,9 @@
 		"  -n node: last ip octet used for scanning (from 2 to 253)\n"
 		"  -S enable sleep time supression betwen each request (hardcore mode)\n"
 		"  -f enable fastmode scan, saves a lot of time, recommended for auto\n\n"
+	        "  -k nokeywait: Don't wait for keypress\n"
+		"  -t time: maximum time to listen after last arp request sent (seconds)\n"
+	        "  -m don't clear and format screen, just output replies\n"
 		"If -p or -r arent enabled, netdiscover will scan for common lan addresses\n",
 		VERSION, comando);
 }
diff -Naur netdiscover-0.3-beta6.orig/src/screen.c netdiscover-0.3-beta6/src/screen.c
--- netdiscover-0.3-beta6.orig/src/screen.c	2009-06-24 18:21:11.000000000 -0400
+++ netdiscover-0.3-beta6/src/screen.c	2009-06-25 19:15:24.000000000 -0400
@@ -114,7 +114,7 @@
 
 
 /* Read input keys */
-void read_key()
+void read_key(int machine)
 {
     int ch;
     ch = getchar();
@@ -162,12 +162,12 @@
        smode = 2;
     }
 	 
-	 print_screen();
+	 print_screen(machine);
 }
 
 
 /* Clear and fill the screen */
-void print_screen()
+void print_screen(int machine)
 {
 	/* Get Console Size */
    if (ioctl(0, TIOCGWINSZ, &win_sz) < 0)
@@ -177,16 +177,16 @@
    }
 	 
 	/* Flush and print screen */
-	fprintf( stderr, "\33[1;1H" );
-	fill_screen();
-	fprintf( stderr, "\33[J" );
+        if (!machine) fprintf( stderr, "\33[1;1H" );
+	fill_screen(machine);
+	if (!machine) fprintf( stderr, "\33[J" );
 	fflush(stdout);
 }
 
 
 /* Fills the screen using white spaces to avoid refresh problems  *
  * not a very smart way, but it works :)                          */
-void fill_screen()
+void fill_screen(int machine)
 {
    int x, j;
    struct arp_rep_l *arprep_l;
@@ -196,40 +196,42 @@
    
    pthread_mutex_lock(listm);	
 	
-   sprintf(line, " Currently scanning: %s   |   Our Mac is: %s - %i", 
-           current_network, ourmac, scroll);
-   printf("%s", line);
-	
-   /* Fill with spaces */
-   for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-         printf(" ");
-   printf("\n");
-	
-	/* Print blank line with spaces */
-   for (j=0; j<win_sz.ws_col - 1; j++)
-         printf(" ");
-   printf("\n");
-
-
-   sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts.   Total size: %d", 
-           arprep_count->count, arprep_count->hosts, arprep_count->length);
-   printf("%s", line);
-	
-   /* Fill with spaces */
-   for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-         printf(" ");
-   printf("\n");
-	
-	
-   /* Print Header and counters */
-   printf(" _____________________________________________________________________________\n");
-   if (smode == 0 || (oldmode == 0 && smode == 2))
-   	printf("   IP            At MAC Address      Count  Len   MAC Vendor                   \n");
-   else if (smode == 1 || (oldmode == 1 && smode == 2))
-   	printf("   IP            At MAC Address      Requests IP     Count                     \n");
-   printf(" ----------------------------------------------------------------------------- \n");
-
-
+   
+   if (!machine) {
+     sprintf(line, " Currently scanning: %s   |   Our Mac is: %s - %i", 
+	     current_network, ourmac, scroll);
+     printf("%s", line);
+	
+     /* Fill with spaces */
+     for (j=strlen(line); j<win_sz.ws_col - 1; j++)
+       printf(" ");
+     printf("\n");
+     
+     /* Print blank line with spaces */
+     for (j=0; j<win_sz.ws_col - 1; j++)
+       printf(" ");
+     printf("\n");
+     
+
+     sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts.   Total size: %d", 
+	     arprep_count->count, arprep_count->hosts, arprep_count->length);
+     printf("%s", line);
+     
+     /* Fill with spaces */
+     for (j=strlen(line); j<win_sz.ws_col - 1; j++)
+       printf(" ");
+     printf("\n");
+	
+     
+     /* Print Header and counters */
+     printf(" _____________________________________________________________________________\n");
+     if (smode == 0 || (oldmode == 0 && smode == 2))
+       printf("   IP            At MAC Address      Count  Len   MAC Vendor                   \n");
+     else if (smode == 1 || (oldmode == 1 && smode == 2))
+       printf("   IP            At MAC Address      Requests IP     Count                     \n");
+     printf(" ----------------------------------------------------------------------------- \n");
+   }
+   
    /* Print each found station trough arp reply */
    if (smode == 0)
    {
@@ -243,12 +245,12 @@
             sprintf(tline, " ");
             
             /* Set IP */
-            sprintf(tline, "%s ", arprep_l->sip);
+            sprintf(tline, "%s ", arprep_l->sip);	    
             strcat(line, tline);
-            
-            /* Fill with spaces */
-            for (j=strlen(line); j<17; j++)
-               strcat(line, blank);
+   
+	    /* Fill with spaces */
+	    for (j=strlen(line); j<17; j++)
+	      strcat(line, blank);
             
             /* IP & MAC */
             sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x    ",
@@ -260,21 +262,29 @@
             /* Count, Length & Vendor */
             sprintf(tline, "%02d    %03d   %s", arprep_l->count, 
                     arprep_l->header->length, arprep_l->vendor );
-            strcat(line, tline);
-            
-            /* Fill again with spaces */
-            for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-               strcat(line, blank);
+	    strcat(line, tline);
             
-            printf("%s\n", line);
+	    /* Fill again with spaces */
+	    for (j=strlen(line); j<win_sz.ws_col - 1; j++)
+	      strcat(line, blank);
+
+	    if (!arprep_l->printed) {
+	      printf("%s\n", line);	    
+	      arprep_l->printed = 1;
+	      if (!machine) {
+		arprep_l->printed = 0;
+	      }
+	    }
          }
          
          arprep_l = arprep_l->next;
          x += 1;
-      
-         /* Check if end of screen was reached */
-         if (x >= ( (win_sz.ws_row + scroll) - 7))
-            break;
+
+	 if (!machine) {
+	   /* Check if end of screen was reached */
+	   if (x >= ( (win_sz.ws_row + scroll) - 7))
+	     break;
+	 }
       }
       
    } /* Print only arp request */
@@ -292,10 +302,10 @@
             /* Get source IP */
             sprintf(tline, "%s ", arprep_l->sip);
             strcat(line, tline);
-            
-            /* Fill with spaces */
-            for (j=strlen(line); j<17; j++)
-               strcat(line, blank);
+
+	    /* Fill with spaces */
+	    for (j=strlen(line); j<17; j++)
+	      strcat(line, blank);
             
             /* Get source MAC */
             sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x   ",
@@ -308,27 +318,29 @@
             sprintf(tline, "%s", arprep_l->dip);
             strcat(line, tline);
             
-            /* Fill with spaces */
-            for (j=strlen(line); j<54; j++)
-               strcat(line, blank);
+	    /* Fill with spaces */
+	    for (j=strlen(line); j<54; j++)
+	      strcat(line, blank);
             
             /* Count, Length & Vendor */
             sprintf(tline, "%02d", arprep_l->count);
             strcat(line, tline);
             
-            /* Fill again with spaces */
-            for (j=strlen(line); j<win_sz.ws_col - 1; j++)
-               strcat(line, blank);
+	    /* Fill again with spaces */
+	    for (j=strlen(line); j<win_sz.ws_col - 1; j++)
+	      strcat(line, blank);
             
             printf("%s\n", line);
          }
          
          arprep_l = arprep_l->next;
          x += 1;
-      
-         /* Check if end of screen was reached */
-         if (x >= ( (win_sz.ws_row + scroll) - 7))
-            break;
+
+	 if (!machine) {
+	   /* Check if end of screen was reached */
+	   if (x >= ( (win_sz.ws_row + scroll) - 7))
+	     break;
+	 }
       }
    }
    else if(smode == 2)
diff -Naur netdiscover-0.3-beta6.orig/src/screen.h netdiscover-0.3-beta6/src/screen.h
--- netdiscover-0.3-beta6.orig/src/screen.h	2009-06-24 18:21:11.000000000 -0400
+++ netdiscover-0.3-beta6/src/screen.h	2009-06-24 21:42:13.000000000 -0400
@@ -60,6 +60,7 @@
 	char *vendor;
 	short type;
 	unsigned int count;
+        int printed;
 	struct arp_rep_l *next;
 };