diff --git a/print-igmp.c b/print-igmp.c
index bc43102..e4808a7 100644
--- a/print-igmp.c
+++ b/print-igmp.c
@@ -19,20 +19,13 @@
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-igmp.c,v 1.15 2004-03-24 00:59:16 guy Exp $ (LBL)";
-#endif
-
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <tcpdump-stdinc.h>
 
-#include <stdio.h>
-#include <string.h>
-
 #include "interface.h"
 #include "addrtoname.h"
 #include "extract.h"            /* must come after interface.h */
@@ -41,16 +34,18 @@
 #define IN_CLASSD(i) (((int32_t)(i) & 0xf0000000) == 0xe0000000)
 #endif
 
+static const char tstr[] = "[|igmp]";
+
 /* (following from ipmulti/mrouted/prune.h) */
 
 /*
  * The packet format for a traceroute request.
  */
 struct tr_query {
-    u_int32_t  tr_src;          /* traceroute source */
-    u_int32_t  tr_dst;          /* traceroute destination */
-    u_int32_t  tr_raddr;        /* traceroute response address */
-    u_int32_t  tr_rttlqid;      /* response ttl and qid */
+    uint32_t  tr_src;          /* traceroute source */
+    uint32_t  tr_dst;          /* traceroute destination */
+    uint32_t  tr_raddr;        /* traceroute response address */
+    uint32_t  tr_rttlqid;      /* response ttl and qid */
 };
 
 #define TR_GETTTL(x)        (int)(((x) >> 24) & 0xff)
@@ -61,17 +56,17 @@
  * beginning, followed by one tr_resp for each hop taken.
  */
 struct tr_resp {
-    u_int32_t tr_qarr;          /* query arrival time */
-    u_int32_t tr_inaddr;        /* incoming interface address */
-    u_int32_t tr_outaddr;       /* outgoing interface address */
-    u_int32_t tr_rmtaddr;       /* parent address in source tree */
-    u_int32_t tr_vifin;         /* input packet count on interface */
-    u_int32_t tr_vifout;        /* output packet count on interface */
-    u_int32_t tr_pktcnt;        /* total incoming packets for src-grp */
-    u_int8_t  tr_rproto;      /* routing proto deployed on router */
-    u_int8_t  tr_fttl;        /* ttl required to forward on outvif */
-    u_int8_t  tr_smask;       /* subnet mask for src addr */
-    u_int8_t  tr_rflags;      /* forwarding error codes */
+    uint32_t tr_qarr;          /* query arrival time */
+    uint32_t tr_inaddr;        /* incoming interface address */
+    uint32_t tr_outaddr;       /* outgoing interface address */
+    uint32_t tr_rmtaddr;       /* parent address in source tree */
+    uint32_t tr_vifin;         /* input packet count on interface */
+    uint32_t tr_vifout;        /* output packet count on interface */
+    uint32_t tr_pktcnt;        /* total incoming packets for src-grp */
+    uint8_t  tr_rproto;      /* routing proto deployed on router */
+    uint8_t  tr_fttl;        /* ttl required to forward on outvif */
+    uint8_t  tr_smask;       /* subnet mask for src addr */
+    uint8_t  tr_rflags;      /* forwarding error codes */
 };
 
 /* defs within mtrace */
@@ -107,118 +102,119 @@
 };
 
 static void
-print_mtrace(register const u_char *bp, register u_int len)
+print_mtrace(netdissect_options *ndo,
+             register const u_char *bp, register u_int len)
 {
     register const struct tr_query *tr = (const struct tr_query *)(bp + 8);
 
-    TCHECK(*tr);
+    ND_TCHECK(*tr);
     if (len < 8 + sizeof (struct tr_query)) {
-	(void)printf(" [invalid len %d]", len);
+	ND_PRINT((ndo, " [invalid len %d]", len));
 	return;
     }
-    printf("mtrace %u: %s to %s reply-to %s",
+    ND_PRINT((ndo, "mtrace %u: %s to %s reply-to %s",
         TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)),
-        ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst),
-        ipaddr_string(&tr->tr_raddr));
+        ipaddr_string(ndo, &tr->tr_src), ipaddr_string(ndo, &tr->tr_dst),
+        ipaddr_string(ndo, &tr->tr_raddr)));
     if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr)))
-        printf(" with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid)));
+        ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))));
     return;
 trunc:
-    (void)printf("[|igmp]");
-    return;
+    ND_PRINT((ndo, "%s", tstr));
 }
 
 static void
-print_mresp(register const u_char *bp, register u_int len)
+print_mresp(netdissect_options *ndo,
+            register const u_char *bp, register u_int len)
 {
     register const struct tr_query *tr = (const struct tr_query *)(bp + 8);
 
-    TCHECK(*tr);
+    ND_TCHECK(*tr);
     if (len < 8 + sizeof (struct tr_query)) {
-	(void)printf(" [invalid len %d]", len);
+	ND_PRINT((ndo, " [invalid len %d]", len));
 	return;
     }
-    printf("mresp %lu: %s to %s reply-to %s",
+    ND_PRINT((ndo, "mresp %lu: %s to %s reply-to %s",
         (u_long)TR_GETQID(EXTRACT_32BITS(&tr->tr_rttlqid)),
-        ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst),
-        ipaddr_string(&tr->tr_raddr));
+        ipaddr_string(ndo, &tr->tr_src), ipaddr_string(ndo, &tr->tr_dst),
+        ipaddr_string(ndo, &tr->tr_raddr)));
     if (IN_CLASSD(EXTRACT_32BITS(&tr->tr_raddr)))
-        printf(" with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid)));
+        ND_PRINT((ndo, " with-ttl %d", TR_GETTTL(EXTRACT_32BITS(&tr->tr_rttlqid))));
     return;
 trunc:
-    (void)printf("[|igmp]");
-    return;
+    ND_PRINT((ndo, "%s", tstr));
 }
 
 static void
-print_igmpv3_report(register const u_char *bp, register u_int len)
+print_igmpv3_report(netdissect_options *ndo,
+                    register const u_char *bp, register u_int len)
 {
     u_int group, nsrcs, ngroups;
     register u_int i, j;
 
     /* Minimum len is 16, and should be a multiple of 4 */
     if (len < 16 || len & 0x03) {
-	(void)printf(" [invalid len %d]", len);
+	ND_PRINT((ndo, " [invalid len %d]", len));
 	return;
     }
-    TCHECK2(bp[6], 2);
+    ND_TCHECK2(bp[6], 2);
     ngroups = EXTRACT_16BITS(&bp[6]);
-    (void)printf(", %d group record(s)", ngroups);
-    if (vflag > 0) {
+    ND_PRINT((ndo, ", %d group record(s)", ngroups));
+    if (ndo->ndo_vflag > 0) {
 	/* Print the group records */
 	group = 8;
         for (i=0; i<ngroups; i++) {
 	    if (len < group+8) {
-		(void)printf(" [invalid number of groups]");
+		ND_PRINT((ndo, " [invalid number of groups]"));
 		return;
 	    }
-	    TCHECK2(bp[group+4], 4);
-            (void)printf(" [gaddr %s", ipaddr_string(&bp[group+4]));
-	    (void)printf(" %s", tok2str(igmpv3report2str, " [v3-report-#%d]",
-								bp[group]));
+	    ND_TCHECK2(bp[group+4], 4);
+            ND_PRINT((ndo, " [gaddr %s", ipaddr_string(ndo, &bp[group+4])));
+	    ND_PRINT((ndo, " %s", tok2str(igmpv3report2str, " [v3-report-#%d]",
+								bp[group])));
             nsrcs = EXTRACT_16BITS(&bp[group+2]);
 	    /* Check the number of sources and print them */
 	    if (len < group+8+(nsrcs<<2)) {
-		(void)printf(" [invalid number of sources %d]", nsrcs);
+		ND_PRINT((ndo, " [invalid number of sources %d]", nsrcs));
 		return;
 	    }
-            if (vflag == 1)
-                (void)printf(", %d source(s)", nsrcs);
+            if (ndo->ndo_vflag == 1)
+                ND_PRINT((ndo, ", %d source(s)", nsrcs));
             else {
 		/* Print the sources */
-                (void)printf(" {");
+                ND_PRINT((ndo, " {"));
                 for (j=0; j<nsrcs; j++) {
-		    TCHECK2(bp[group+8+(j<<2)], 4);
-		    (void)printf(" %s", ipaddr_string(&bp[group+8+(j<<2)]));
+		    ND_TCHECK2(bp[group+8+(j<<2)], 4);
+		    ND_PRINT((ndo, " %s", ipaddr_string(ndo, &bp[group+8+(j<<2)])));
 		}
-                (void)printf(" }");
+                ND_PRINT((ndo, " }"));
             }
 	    /* Next group record */
             group += 8 + (nsrcs << 2);
-	    (void)printf("]");
+	    ND_PRINT((ndo, "]"));
         }
     }
     return;
 trunc:
-    (void)printf("[|igmp]");
-    return;
+    ND_PRINT((ndo, "%s", tstr));
 }
 
 static void
-print_igmpv3_query(register const u_char *bp, register u_int len)
+print_igmpv3_query(netdissect_options *ndo,
+                   register const u_char *bp, register u_int len)
 {
     u_int mrc;
     int mrt;
     u_int nsrcs;
     register u_int i;
 
-    (void)printf(" v3");
+    ND_PRINT((ndo, " v3"));
     /* Minimum len is 12, and should be a multiple of 4 */
     if (len < 12 || len & 0x03) {
-	(void)printf(" [invalid len %d]", len);
+	ND_PRINT((ndo, " [invalid len %d]", len));
 	return;
     }
-    TCHECK(bp[1]);
+    ND_TCHECK(bp[1]);
     mrc = bp[1];
     if (mrc < 128) {
 	mrt = mrc;
@@ -226,119 +222,119 @@
         mrt = ((mrc & 0x0f) | 0x10) << (((mrc & 0x70) >> 4) + 3);
     }
     if (mrc != 100) {
-	(void)printf(" [max resp time ");
+	ND_PRINT((ndo, " [max resp time "));
         if (mrt < 600) {
-            (void)printf("%.1fs", mrt * 0.1);
+            ND_PRINT((ndo, "%.1fs", mrt * 0.1));
         } else {
-            relts_print(mrt / 10);
+            relts_print(ndo, mrt / 10);
         }
-	(void)printf("]");
+	ND_PRINT((ndo, "]"));
     }
-    TCHECK2(bp[4], 4);
+    ND_TCHECK2(bp[4], 4);
     if (EXTRACT_32BITS(&bp[4]) == 0)
 	return;
-    (void)printf(" [gaddr %s", ipaddr_string(&bp[4]));
-    TCHECK2(bp[10], 2);
+    ND_PRINT((ndo, " [gaddr %s", ipaddr_string(ndo, &bp[4])));
+    ND_TCHECK2(bp[10], 2);
     nsrcs = EXTRACT_16BITS(&bp[10]);
     if (nsrcs > 0) {
 	if (len < 12 + (nsrcs << 2))
-	    (void)printf(" [invalid number of sources]");
-	else if (vflag > 1) {
-	    (void)printf(" {");
+	    ND_PRINT((ndo, " [invalid number of sources]"));
+	else if (ndo->ndo_vflag > 1) {
+	    ND_PRINT((ndo, " {"));
 	    for (i=0; i<nsrcs; i++) {
-		TCHECK2(bp[12+(i<<2)], 4);
-		(void)printf(" %s", ipaddr_string(&bp[12+(i<<2)]));
+		ND_TCHECK2(bp[12+(i<<2)], 4);
+		ND_PRINT((ndo, " %s", ipaddr_string(ndo, &bp[12+(i<<2)])));
 	    }
-	    (void)printf(" }");
+	    ND_PRINT((ndo, " }"));
 	} else
-	    (void)printf(", %d source(s)", nsrcs);
+	    ND_PRINT((ndo, ", %d source(s)", nsrcs));
     }
-    (void)printf("]");
+    ND_PRINT((ndo, "]"));
     return;
 trunc:
-    (void)printf("[|igmp]");
-    return;
+    ND_PRINT((ndo, "%s", tstr));
 }
 
 void
-igmp_print(register const u_char *bp, register u_int len)
+igmp_print(netdissect_options *ndo,
+           register const u_char *bp, register u_int len)
 {
     struct cksum_vec vec[1];
 
-    if (qflag) {
-        (void)printf("igmp");
+    if (ndo->ndo_qflag) {
+        ND_PRINT((ndo, "igmp"));
         return;
     }
 
-    TCHECK(bp[0]);
+    ND_TCHECK(bp[0]);
     switch (bp[0]) {
     case 0x11:
-        (void)printf("igmp query");
+        ND_PRINT((ndo, "igmp query"));
 	if (len >= 12)
-	    print_igmpv3_query(bp, len);
+	    print_igmpv3_query(ndo, bp, len);
 	else {
-            TCHECK(bp[1]);
+            ND_TCHECK(bp[1]);
 	    if (bp[1]) {
-		(void)printf(" v2");
+		ND_PRINT((ndo, " v2"));
 		if (bp[1] != 100)
-		    (void)printf(" [max resp time %d]", bp[1]);
+		    ND_PRINT((ndo, " [max resp time %d]", bp[1]));
 	    } else
-		(void)printf(" v1");
-            TCHECK2(bp[4], 4);
+		ND_PRINT((ndo, " v1"));
+            ND_TCHECK2(bp[4], 4);
 	    if (EXTRACT_32BITS(&bp[4]))
-                (void)printf(" [gaddr %s]", ipaddr_string(&bp[4]));
+                ND_PRINT((ndo, " [gaddr %s]", ipaddr_string(ndo, &bp[4])));
             if (len != 8)
-                (void)printf(" [len %d]", len);
+                ND_PRINT((ndo, " [len %d]", len));
 	}
         break;
     case 0x12:
-        TCHECK2(bp[4], 4);
-        (void)printf("igmp v1 report %s", ipaddr_string(&bp[4]));
+        ND_TCHECK2(bp[4], 4);
+        ND_PRINT((ndo, "igmp v1 report %s", ipaddr_string(ndo, &bp[4])));
         if (len != 8)
-            (void)printf(" [len %d]", len);
+            ND_PRINT((ndo, " [len %d]", len));
         break;
     case 0x16:
-        TCHECK2(bp[4], 4);
-        (void)printf("igmp v2 report %s", ipaddr_string(&bp[4]));
+        ND_TCHECK2(bp[4], 4);
+        ND_PRINT((ndo, "igmp v2 report %s", ipaddr_string(ndo, &bp[4])));
         break;
     case 0x22:
-        (void)printf("igmp v3 report");
-	print_igmpv3_report(bp, len);
+        ND_PRINT((ndo, "igmp v3 report"));
+	print_igmpv3_report(ndo, bp, len);
         break;
     case 0x17:
-        TCHECK2(bp[4], 4);
-        (void)printf("igmp leave %s", ipaddr_string(&bp[4]));
+        ND_TCHECK2(bp[4], 4);
+        ND_PRINT((ndo, "igmp leave %s", ipaddr_string(ndo, &bp[4])));
         break;
     case 0x13:
-        (void)printf("igmp dvmrp");
+        ND_PRINT((ndo, "igmp dvmrp"));
         if (len < 8)
-            (void)printf(" [len %d]", len);
+            ND_PRINT((ndo, " [len %d]", len));
         else
-            dvmrp_print(bp, len);
+            dvmrp_print(ndo, bp, len);
         break;
     case 0x14:
-        (void)printf("igmp pimv1");
-        pimv1_print(bp, len);
+        ND_PRINT((ndo, "igmp pimv1"));
+        pimv1_print(ndo, bp, len);
         break;
     case 0x1e:
-        print_mresp(bp, len);
+        print_mresp(ndo, bp, len);
         break;
     case 0x1f:
-        print_mtrace(bp, len);
+        print_mtrace(ndo, bp, len);
         break;
     default:
-        (void)printf("igmp-%d", bp[0]);
+        ND_PRINT((ndo, "igmp-%d", bp[0]));
         break;
     }
 
-    if (vflag && TTEST2(bp[0], len)) {
+    if (ndo->ndo_vflag && ND_TTEST2(bp[0], len)) {
         /* Check the IGMP checksum */
         vec[0].ptr = bp;
         vec[0].len = len;
         if (in_cksum(vec, 1))
-            printf(" bad igmp cksum %x!", EXTRACT_16BITS(&bp[2]));
+            ND_PRINT((ndo, " bad igmp cksum %x!", EXTRACT_16BITS(&bp[2])));
     }
     return;
 trunc:
-    fputs("[|igmp]", stdout);
+    ND_PRINT((ndo, "%s", tstr));
 }
