diff --git a/ipaacatools/scripts/ipaaca-iu-sniffer.py b/ipaacatools/scripts/ipaaca-iu-sniffer.py
index 9d9d1ba6ed61a9a5fd27b02f3b33a65bdbcaa5cc..c7034c1d7a49e872946efd13848bf271f0e9fbe0 100755
--- a/ipaacatools/scripts/ipaaca-iu-sniffer.py
+++ b/ipaacatools/scripts/ipaaca-iu-sniffer.py
@@ -33,23 +33,70 @@
 import logging
 import sys
 import time
-
 import ipaaca
 
+color = False
+max_size = 2048
+
+def highlight_if_color(s, c='1'):
+	return s if not color else '['+c+'m'+s+''
+
+def pretty_printed_iu_payload(iu):
+	s='{ '
+	for k,v in iu.payload.items():
+		v2 = (('\''+v+'\'') if len(v)<=max_size else ('\''+v[:max_size]+'\'<excess length omitted>')).replace('\\','\\\\').replace('\n',highlight_if_color('\\n'))
+		s += '\n' + '\t\t\'' + highlight_if_color(unicode(k),'1')+'\': '+unicode(v2)+', '
+	s+=' }'
+	return s
+
+def event_type_color(typ):
+	colors={'ADDED':'32;1', 'RETRACTED':'31;1', 'UPDATED':'33;1', 'MESSAGE':'34;1'}
+	return '1' if typ not in colors else colors[typ]
+
+def pretty_printed_iu_event(iu, event_type, local):
+	s=''
+	t=time.time()
+	lt=time.localtime(t)
+	s += highlight_if_color('%.3f'%t, '1')+' '+"%02d:%02d:%02d"%(lt.tm_hour, lt.tm_min, lt.tm_sec)
+	s += ' '+highlight_if_color('%-9s'%event_type,event_type_color(event_type))+' category='+highlight_if_color(iu.category,event_type_color(event_type))+' uid='+iu.uid+' owner='+iu.owner_name+' payload='+pretty_printed_iu_payload(iu)
+	return s
+
 def my_update_handler(iu, event_type, local):
 	t=time.localtime()
-	print "%02d:%02d:%02d"%(t.tm_hour, t.tm_min,t.tm_sec),
-	print time.time(),
-	print(event_type+': '+unicode(iu))
+	print pretty_printed_iu_event(iu, event_type, local)
 
 cats = []
-if len(sys.argv)>1:
-	cats = sys.argv[1:]
+
+keep_going=True
+idx = 1
+while keep_going:
+	opt = sys.argv[idx] if idx<len(sys.argv) else None
+	if opt=='--help':
+		print('IU sniffer - usage:')
+		print('  '+sys.argv[0]+' [--options] [<category1> [<category2 ...]]')
+		print('         Listen to specified categories (default: all)')
+		print('         Option --color : colorize output')
+		print('         Option --size-limit <size> : limit payload display, chars (def: 2048)')
+		sys.exit(0)
+	elif opt=='--color':
+		color = True
+		idx += 1
+	elif opt=='--size-limit':
+		if len(sys.argv)<idx+2:
+			print('Please specify a max size')
+			sys.exit(1)
+		max_size = int(sys.argv[idx+1])
+		idx += 2
+	else:
+		cats = sys.argv[idx:]
+		keep_going = False
 
 ib = ipaaca.InputBuffer('SnifferIn', [''] if len(cats)==0 else cats)
 ib.register_handler(my_update_handler)
 
-print("Listening for IU events of "+("any category..." if len(cats)==0 else "categories: "+' '.join(cats)))
+print('')
+print('Ipaaca IU Sniffer - run with --help to see options')
+print('Listening for IU events of '+('any category...' if len(cats)==0 else 'categories: '+' '.join(cats)))
 print('')
 while True:
 	time.sleep(1)