Index: src/django_gheat/gheat/management/commands/import_kismet.py
===================================================================
--- src/django_gheat/gheat/management/commands/import_kismet.py	(revision 9561)
+++ src/django_gheat/gheat/management/commands/import_kismet.py	(revision 9562)
@@ -36,5 +36,6 @@
   netxml_doc = etree.parse(open_file(netxml_file))
 
-  counters = { 'ap_added' : 0, 'ap_total' : 0, 'ap_failed' : 0, 'ap_ignored' : 0}
+  counters = { 'ap_added' : 0, 'ap_total' : 0, 'ap_failed' : 0, 'ap_ignored' : 0,
+               'client_added' : 0, 'client_total' : 0, 'client_failed' : 0, 'client_ignored' : 0}
 
   # Prepare new accespoints and measurements
@@ -43,13 +44,14 @@
   # Temponary holders
   ap_pool = {}
+  client_pool = {}
 
   # Create all accesspoints and for caching validation purposes store them
   # locally as well
   for wnetwork in wnetworks:
-    counters['ap_total'] += 1
     bssid = wnetwork.find('BSSID').text
-    # Only store access points
     ap_type = wnetwork.attrib['type']
+    # Only access points and clients (for ignore listings)
     if ap_type in ['infrastructure', 'data']:
+      counters['ap_total'] += 1
       encryption = (wnetwork.find('SSID/encryption') != None)
       ssid_node = wnetwork.find('SSID/essid[@cloaked="false"]')
@@ -58,11 +60,11 @@
       ap_pool[bssid] = (ssid, encryption)
     elif ap_type in ['probe', 'ad-hoc']:
-      counters['ap_ignored'] += 1
-      continue
+      counters['client_total'] += 1
+      client_pool[bssid] = True
     else:
       logger.error('Unknown type %s - %s',bssid, wnetwork.attrib['type'])
 
 
-  # Determine which entries we need to add
+  # Determine which Accespoints to add
   bssid_list_present = Accespoint.objects.filter(mac__in=ap_pool.keys()).values_list('mac', flat=True)
   bssid_list_insert = set(ap_pool.keys()) - set(bssid_list_present)
@@ -77,4 +79,15 @@
       sql_values.append(item)
     counters['ap_added'] = bulk_sql('gheat_accespoint (`mac`, `ssid`, `encryptie`)',sql_values)
+
+  # Determine which Wireless to add
+  bssid_list_present = WirelessClient.objects.filter(mac__in=client_pool.keys()).values_list('mac', flat=True)
+  bssid_list_insert = set(client_pool.keys()) - set(bssid_list_present)
+
+  # Create a bulk import list and import
+  if bssid_list_insert:
+    sql_values = []
+    for bssid in bssid_list_insert:
+      sql_values.append("('%s')" % bssid)
+    counters['client_added'] = bulk_sql('gheat_wirelessclient (`mac`)',sql_values)
 
   return counters
@@ -118,17 +131,24 @@
     meting_pool[key].append(signaal)
 
+  bssid_list = [x[0] for x in meting_pool.keys()]
   # Build mapping for meting import
   mac2id = {}
-  for mac,id in Accespoint.objects.filter(mac__in=meting_pool.keys()).values_list('mac','id'):
+  for mac,id in Accespoint.objects.filter(mac__in=bssid_list).values_list('mac','id'):
     mac2id[mac] = int(id)
+
+  clients = {}
+  for mac in WirelessClient.objects.filter(mac__in=bssid_list).values_list('mac',flat=True):
+    clients[mac] = True
 
   sql_values = []
   for (bssid,lat,lon),signals in meting_pool.iteritems():
-    if not mac2id.has_key(bssid):
+    if clients.has_key(bssid):
+      counters['meting_ignored'] += len(signals)
+    elif not mac2id.has_key(bssid):
       counters['meting_failed'] += len(signals)
       bssid_failed[bssid] += len(signals)
-      continue
-    item = str((int(meetrondje.id),mac2id[bssid],float(lat),float(lon),max(signaal)))
-    sql_values.append(item)
+    else:
+      item = str((int(meetrondje.id),mac2id[bssid],float(lat),float(lon),max(signals)))
+      sql_values.append(item)
 
   for bssid,count in sorted(bssid_failed.items(),
@@ -168,4 +188,5 @@
         counters = import_kismet_netxml(xml_file)
         logger.info("summary accespoints: total:%(ap_total)-6s added:%(ap_added)-6s failed:%(ap_failed)-6s ignored:%(ap_ignored)-6s" % counters)
+        logger.info("summary client     : total:%(client_total)-6s added:%(client_added)-6s failed:%(client_failed)-6s ignored:%(client_ignored)-6s" % counters)
       elif 'gpsxml' in xml_file:
         if options['datum'] == None:
@@ -192,5 +213,5 @@
         if not created:
           logger.error("Meetrondje '%s' already imported" % mr)
-          sys.exit(1)
+          continue
         counters = import_kismet_gpsxml(xml_file, mr)
         logger.info("summary metingen   : total:%(meting_total)-6s added:%(meting_added)-6s failed:%(meting_failed)-6s ignored:%(meting_ignored)-6s" % counters)
Index: src/django_gheat/gheat/models.py
===================================================================
--- src/django_gheat/gheat/models.py	(revision 9561)
+++ src/django_gheat/gheat/models.py	(revision 9562)
@@ -52,4 +52,8 @@
     return hashlib.md5(source).hexdigest()
 
+class WirelessClient(models.Model):
+  mac = models.CharField(max_length=17, unique=True)
+  def __unicode__(self):
+    return self.mac
 
 class Accespoint(models.Model):
@@ -57,4 +61,6 @@
   ssid = models.CharField(max_length=64)
   encryptie = models.BooleanField()
+  class Meta:
+    unique_together = ('mac', 'ssid')
   def __unicode__(self):
     return "%s - %s" % (self.mac, self.ssid)
