diff -Naur jbase.c.orig jbase.c
--- jbase.c.orig
+++ jbase.c
@@ -26,5 +26,5 @@ char	pcap_errbuf[PCAP_ERRBUF_SIZE];
 
 gchar 	*JBASE_PROTOCOLS[] = { "UNK.", "IP", "TCP", "UDP", "ARP", "ETHER", 
                               "SLL", "AGGR.", "ICMP", "IP6", "TCP6", "UDP6", "ICMP6" };
-gchar 	*JBASE_AGGREGATION[] = { "none", "port", "host" };
+gchar 	*JBASE_AGGREGATION[] = { "none", "port", "host", "host+port" };
 
diff -Naur jbase.h.orig jbase.h
--- jbase.h.orig
+++ jbase.h
@@ -250,12 +250,11 @@ typedef struct _jbase_network_mask_list {
 
 #define JBASE_AF_SIZE(a)	(a == AF_INET6 ? sizeof(struct in6_addr) : sizeof(struct in_addr))
 
-extern gchar  *JBASE_PROTOCOLS[];
-
 #define AGG_UNKNOWN		(-1)
 #define AGG_NONE		0
 #define AGG_PORT		1
 #define AGG_HOST		2
+#define AGG_BOTH		3
 
 extern gchar *JBASE_PROTOCOLS[];
 extern gchar *JBASE_AGGREGATION[];
diff -Naur jconfig.c.orig jconfig.c
--- jconfig.c.orig
+++ jconfig.c
@@ -115,6 +115,10 @@ gboolean jconfig_ParseFile(char *configFileName) {
 	}
 
 	s = g_scanner_new(NULL);
+	/* Add + to accepted identifier characters: */
+	s->config->cset_identifier_nth = g_strjoin(NULL,
+		s->config->cset_identifier_nth, "+", NULL);
+
 	g_scanner_input_file(s, fileno(f));
 	while (!g_scanner_eof(s)) {
 		GTokenType tt;
@@ -211,7 +215,7 @@ gboolean jconfig_ParseFile(char *configFileName) {
 		if (!g_ascii_strcasecmp(s->value.v_identifier, "local_aggregation")) {
 			int val = parse_aggregation(s);
 			if (val == AGG_UNKNOWN) {
-				fprintf(stderr, "Parse error on line %d: expecting none or host or port.\n", line);
+				fprintf(stderr, "Parse error on line %d: expecting none, host, port, or host+port.\n", line);
 				return FALSE;
 			}
 			if (jconfig_Settings.localAggregation == AGG_UNKNOWN)
diff -Naur jcursesdisplay.c.orig jcursesdisplay.c
--- jcursesdisplay.c.orig
+++ jcursesdisplay.c
@@ -84,7 +84,7 @@ static void drawScreen() {
 		attrset(A_NORMAL);
 
 		mvprintw(0, 0, "run XXX:XX:XX device XXXXXXXXXX pkt[f]ilter: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-		mvprintw(1, 0, "[c]ntfilter: XXX [b]ps=XXXXXXX [l]ocal aggr.: XXXX [r]emote aggr.: XXXX   ");
+		mvprintw(1, 0, "[c]ntfilter: XXX [b]ps=XXXXXXX [l]ocal aggr: XXXX      [r]emote aggr: XXXX     ");
 		mvprintw(0, activeColumns-1, ".");
 
 		{
@@ -138,8 +138,8 @@ static void drawHeader() {
 	mvprintw(0, 45, "%-29.29s", jconfig_GetSelectedBpfFilterName());
 	mvprintw(1, 13, "%s", jprocessor_ContentFiltering?"on ":"off");
 	mvprintw(1, 23, "%s", onoffPackets ? "pckts/s" : (onoffBitValues?"bits/s ":"bytes/s"));
-	mvprintw(1, 46, "%s", JBASE_AGGREGATION[jprocessor_LocalAggregation]);
-	mvprintw(1, 67, "%s", JBASE_AGGREGATION[jprocessor_RemoteAggregation]);
+	mvprintw(1, 45, "%-9s", JBASE_AGGREGATION[jprocessor_LocalAggregation]);
+	mvprintw(1, 70, "%-9s", JBASE_AGGREGATION[jprocessor_RemoteAggregation]);
 
 	attroff(A_BOLD);
 
@@ -340,10 +340,10 @@ static void displayLoop() {
 						displayMode = DISPLAYMODE_HELP;
 						break;
 					case 'l':
-						jprocessor_SetLocalAggregation((jprocessor_LocalAggregation + 1) % 3);
+						jprocessor_SetLocalAggregation((jprocessor_LocalAggregation + 1) % 4);
 						break;
 					case 'r':
-						jprocessor_SetRemoteAggregation((jprocessor_RemoteAggregation + 1) % 3);
+						jprocessor_SetRemoteAggregation((jprocessor_RemoteAggregation + 1) % 4);
 						break;
 					case '0':
 					case '1':
diff -Naur jnettop.c.orig jnettop.c
--- jnettop.c.orig
+++ jnettop.c
@@ -90,10 +90,10 @@ void parseCommandLineAndConfig(int argc, char ** argv) {
 				"    -f, --config-file name reads configuration from file. defaults to ~/.jnettop\n"
 				"    --format format        list of fields to list in text output\n"
 				"    -i, --interface name   capture packets on specified interface\n"
-				"    --local-aggr arg       set local aggregation to none/host/port\n"
+				"    --local-aggr arg       set local aggregation to none/host/port/host+port\n"
 				"    -n, --no-resolver      disable resolving of addresses\n"
 				"    -p, --promiscuous      enable promisc mode on the devices\n"
-				"    --remote-aggr arg      set remote aggregation to none/host/port\n"
+				"    --remote-aggr arg      set remote aggregation to none/host/port/host+port\n"
 				"    -s, --select-rule rule selects one of the rules defined in config file\n"
 				"                           by it's name\n"
 				"    -t, --timeout sec      timeout in seconds after which jnettop ends (text display)\n"
@@ -215,14 +215,14 @@ void parseCommandLineAndConfig(int argc, char ** argv) {
 		}
 		if (!strcmp(argv[a], "--local-aggr")) {
 			if (a+1>=argc || (jconfig_Settings.localAggregation = jutil_ParseAggregation(argv[++a]))==-1) {
-				fprintf(stderr, "%s switch requires none, host or port as an argument\n", argv[a]);
+				fprintf(stderr, "%s switch requires none, host, port, or host+port as an argument\n", argv[a]);
 				exit(255);
 			}
 			continue;
 		}
 		if (!strcmp(argv[a], "--remote-aggr")) {
 			if (a+1>=argc || (jconfig_Settings.remoteAggregation = jutil_ParseAggregation(argv[++a]))==-1) {
-				fprintf(stderr, "%s switch requires none, host or port as an argument\n", argv[a]);
+				fprintf(stderr, "%s switch requires none, host, port, or host+port as an argument\n", argv[a]);
 				exit(255);
 			}
 			continue;
diff -Naur jprocessor.c.ori jprocessor.c
--- jprocessor.c.orig
+++ jprocessor.c
@@ -211,14 +211,26 @@ static void	aggregateStream(jbase_stream *stream) {
 	switch (jprocessor_LocalAggregation) {
 		case AGG_HOST:
 			setToHostAggregation(JBASE_AF(stream->proto), &stream->src);
+			break;
 		case AGG_PORT:
 			stream->srcport = -1;
+			break;
+		case AGG_BOTH:
+			setToHostAggregation(JBASE_AF(stream->proto), &stream->src);
+			stream->srcport = -1;
+			break;
 	}
 	switch (jprocessor_RemoteAggregation) {
 		case AGG_HOST:
 			setToHostAggregation(JBASE_AF(stream->proto), &stream->dst);
+			break;
 		case AGG_PORT:
 			stream->dstport = -1;
+			break;
+		case AGG_BOTH:
+			setToHostAggregation(JBASE_AF(stream->proto), &stream->dst);
+			stream->dstport = -1;
+			break;
 	}
 }
 
diff -Naur jutil.c.orig jutil.c
--- jutil.c.orig
+++ jutil.c
@@ -98,15 +98,16 @@ const char * jutil_Address2String(int af, const jbase_mutableaddress *src, char
 }
 
 guint     jutil_ParseAggregation(const char *agg) {
-	if (strcmp(agg, "none") && strcmp(agg,"host") && strcmp(agg,"port")) {
+	if (strcmp(agg, "none") == 0)
+		return AGG_NONE;
+	else if (strcmp(agg,"host") == 0)
+		return AGG_HOST;
+	else if (strcmp(agg,"port") == 0)
+		return AGG_PORT;
+	else if (strcmp(agg,"host+port") == 0)
+		return AGG_BOTH;
+	else
 		return AGG_UNKNOWN;
-	}
-	switch (*agg) {
-		case 'n': return AGG_NONE;
-		case 'h': return AGG_HOST;
-		case 'p': return AGG_PORT;
-	}
-	return AGG_UNKNOWN;
 }
 
 void memand(char *buf1, const char *buf2, int length) {
-- 
