diff -urN kismet.old/kis_packsources.cc kismet.dev/kis_packsources.cc
--- kismet.old/kis_packsources.cc	2005-08-16 03:22:51.000000000 +0200
+++ kismet.dev/kis_packsources.cc	2005-08-23 00:59:04.465379568 +0200
@@ -192,7 +192,7 @@
                                        chancontrol_wlanng_avs, 1);
     sourcetracker->RegisterPacketsource("wrt54g", 1, "na", 0,
                                         pcapsource_wrt54g_registrant,
-                                        monitor_wrt54g, NULL, NULL, 0);
+										monitor_wrt54g, unmonitor_wrt54g, chancontrol_wext, 0);
 #else
     REG_EMPTY_CARD(sourcetracker, "wlanng");
     REG_EMPTY_CARD(sourcetracker, "wlanng_avs");
diff -urN kismet.old/packetsourcetracker.cc kismet.dev/packetsourcetracker.cc
--- kismet.old/packetsourcetracker.cc	2005-08-16 03:22:51.000000000 +0200
+++ kismet.dev/packetsourcetracker.cc	2005-08-23 00:59:39.969982048 +0200
@@ -986,6 +986,7 @@
                     (meta_packsources[chanpak.meta_num]->device.c_str(), 
                      chanpak.channel, errstr, 
                      (void *) (meta_packsources[chanpak.meta_num]->capsource)) < 0) {
+#if 0
 
 					meta_packsources[chanpak.meta_num]->consec_errors++;
 
@@ -1007,6 +1008,7 @@
 																	 CHANFLAG_FATAL));
 						continue;
 					}
+#endif
                 } else {
 					// Otherwise reset the error count
 					meta_packsources[chanpak.meta_num]->consec_errors = 0;
diff -urN kismet.old/pcapsource.cc kismet.dev/pcapsource.cc
--- kismet.old/pcapsource.cc	2005-08-16 03:22:51.000000000 +0200
+++ kismet.dev/pcapsource.cc	2005-08-23 01:03:45.652632608 +0200
@@ -115,6 +115,53 @@
 u_char callback_data[MAX_PACKET_LEN];
 
 // Open a source
+int PcapSourceWrt54g::OpenSource() {
+    channel = 0;
+
+    errstr[0] = '\0';
+
+    char *unconst = strdup("prism0");
+
+    pd = pcap_open_live(unconst, MAX_PACKET_LEN, 1, 1000, errstr);
+
+    #if defined (SYS_OPENBSD) || defined(SYS_NETBSD) && defined(HAVE_RADIOTAP)
+    /* Request desired DLT on multi-DLT systems that default to EN10MB. We do this
+       later anyway but doing it here ensures we have the desired DLT from the get go. */
+     pcap_set_datalink(pd, DLT_IEEE802_11_RADIO);
+    #endif
+
+    free(unconst);
+
+    if (strlen(errstr) > 0)
+        return -1; // Error is already in errstr
+
+    paused = 0;
+
+    errstr[0] = '\0';
+
+    num_packets = 0;
+
+    if (DatalinkType() < 0)
+        return -1;
+
+#ifdef HAVE_PCAP_NONBLOCK
+    pcap_setnonblock(pd, 1, errstr);
+#elif !defined(SYS_OPENBSD)
+    // do something clever  (Thanks to Guy Harris for suggesting this).
+    int save_mode = fcntl(pcap_get_selectable_fd(pd), F_GETFL, 0);
+    if (fcntl(pcap_get_selectable_fd(pd), F_SETFL, save_mode | O_NONBLOCK) < 0) {
+        snprintf(errstr, 1024, "fcntl failed, errno %d (%s)",
+                 errno, strerror(errno));
+    }
+#endif
+
+    if (strlen(errstr) > 0)
+        return -1; // Ditto
+    
+    return 1;
+}
+
+// Open a source
 int PcapSource::OpenSource() {
     channel = 0;
 
@@ -1928,63 +1975,32 @@
 int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
 				   void *in_ext) {
     char cmdline[2048];
-	int mode;
-	int wlmode = 0;
-
-#ifdef HAVE_LINUX_WIRELESS
-    vector<string> devbits = StrTokenize(in_dev, ":");
 
-    if (devbits.size() < 2) {
-		snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
+		snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 1", in_dev);
 		if (RunSysCmd(cmdline) < 0) {
-			snprintf(in_err, 1024, "Unable to set mode using 'wl monitor 1'.  Some "
-					 "custom firmware images require you to specify the origial "
+			snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 1'. "
+					 "Some custom firmware images require you to specify the origial "
 					 "device and a new dynamic device and use the iwconfig controls. "
 					 "see the README for how to configure your capture source.");
 			return -1;
 		}
-    } else {
-		// Get the mode ... If this doesn't work, try the old wl method.
-		if (Iwconfig_Get_Mode(devbits[0].c_str(), in_err, &mode) < 0) {
-			fprintf(stderr, "WARNING:  Getting wireless mode via ioctls failed, "
-					"defaulting to trying the 'wl' command.\n");
-			wlmode = 1;
-		}
 
-		if (wlmode == 1) {
-			snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
-			if (RunSysCmd(cmdline) < 0) {
-				snprintf(in_err, 1024, "Unable to execute '%s'", cmdline);
-				return -1;
-			}
-		} else if (mode != LINUX_WLEXT_MONITOR) {
-			// Set it
-			if (Iwconfig_Set_Mode(devbits[0].c_str(), in_err, 
-								  LINUX_WLEXT_MONITOR) < 0) {
-				snprintf(in_err, STATUS_MAX, "Unable to set iwconfig monitor "
-						 "mode.  If you are using an older wrt54g, try specifying "
-						 "only the ethernet device, not ethX:prismX");
-				return -1;
-			}
+	return 1;
+}
+
+
+int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, 
+				   void *in_ext) {
+    char cmdline[2048];
+
+		snprintf(cmdline, 2048, "/usr/sbin/iwpriv %s set_monitor 0", in_dev);
+		if (RunSysCmd(cmdline) < 0) {
+			snprintf(in_err, 1024, "Unable to set mode using 'iwpriv %s set_monitor 0'. "
+					 "Some custom firmware images require you to specify the origial "
+					 "device and a new dynamic device and use the iwconfig controls. "
+					 "see the README for how to configure your capture source.");
+			return -1;
 		}
-	}
-#else
-	snprintf(cmdline, 2048, "/usr/sbin/wl monitor 1");
-	if (RunSysCmd(cmdline) < 0) {
-		snprintf(in_err, 1024, "Unable to set mode using 'wl monitor 1'.  Some "
-				 "custom firmware images require you to specify the origial "
-				 "device and a new dynamic device and use the iwconfig controls. "
-				 "see the README for how to configure your capture source. "
-				 "Support for wireless extensions was not compiled in, so more "
-				 "advanced modes of setting monitor mode are not available.");
-		return -1;
-	}
-	fprintf(stderr, "WARNING:  Support for wireless extensions was not compiled "
-			"into this binary.  Using the iw* tools to set monitor mode will not "
-			"be available.  This may cause opening the source to fail on some "
-			"firmware versions.  To fix this, make sure wireless extensions are "
-			"available and found by the configure script when building Kismet.");
-#endif
 
 	return 1;
 }
diff -urN kismet.old/pcapsource.h kismet.dev/pcapsource.h
--- kismet.old/pcapsource.h	2005-08-16 03:22:51.000000000 +0200
+++ kismet.dev/pcapsource.h	2005-08-23 01:04:26.057490136 +0200
@@ -265,6 +265,7 @@
     PcapSourceWrt54g(string in_name, string in_dev) : PcapSource(in_name, in_dev) { 
         fcsbytes = 4;
     }
+	int OpenSource();
     int FetchPacket(kis_packet *packet, uint8_t *data, uint8_t *moddata);
 protected:
     carrier_type IEEE80211Carrier();
@@ -412,6 +413,7 @@
 int monitor_wlanng_avs(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
 // linksys wrt54g monitoring
 int monitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
+int unmonitor_wrt54g(const char *in_dev, int initch, char *in_err, void **in_if, void *in_ext);
 #endif
 
 // This should be expanded to handle BSD...
