use print_mac_and_mask()
diff --git a/ebtables.c b/ebtables.c
index 21a9a47..29bccfe 100644
--- a/ebtables.c
+++ b/ebtables.c
@@ -79,6 +79,7 @@
 	{ "Lc"            , no_argument      , 0, 4   },
 	{ "Ln"            , no_argument      , 0, 5   },
 	{ "Lx"            , no_argument      , 0, 6   },
+	{ "Lmac2"         , no_argument      , 0, 12  },
 	{ "zero"          , optional_argument, 0, 'Z' },
 	{ "flush"         , optional_argument, 0, 'F' },
 	{ "policy"        , required_argument, 0, 'P' },
@@ -465,9 +466,33 @@
  * we use replace.flags, so we can't use the following values:
  * 0x01 == OPT_COMMAND, 0x02 == OPT_TABLE, 0x100 == OPT_ZERO
  */
-#define LIST_N 0x04
-#define LIST_C 0x08
-#define LIST_X 0x10
+#define LIST_N    0x04
+#define LIST_C    0x08
+#define LIST_X    0x10
+#define LIST_MAC2 0x20
+
+void print_mac(const char *mac)
+{
+	if (replace.flags & LIST_MAC2) {
+		int j;
+		for (j = 0; j < ETH_ALEN; j++)
+			printf("%02x%s", (unsigned char)mac[j],
+				(j==ETH_ALEN-1) ? "" : ":");
+	} else
+		printf("%s", ether_ntoa((struct ether_addr *) mac));
+}
+
+void print_mac_and_mask(const char *mac, const char *mask)
+{
+	char hlpmsk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+	print_mac(mac);
+	if (memcmp(mask, hlpmsk, 6)) {
+		printf("/");
+		print_mac(mask);
+	}
+}
+
 /*
  * helper function for list_rules()
  */
@@ -535,8 +560,6 @@
 			}
 		}
 		if (hlp->bitmask & EBT_SOURCEMAC) {
-			char hlpmsk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-
 			printf("-s ");
 			if (hlp->invflags & EBT_ISOURCE)
 				printf("! ");
@@ -555,19 +578,11 @@
 				printf("Broadcast");
 				goto endsrc;
 			}
-			printf("%s", ether_ntoa((struct ether_addr *)
-			   hlp->sourcemac));
-			if (memcmp(hlp->sourcemsk, hlpmsk, 6)) {
-				printf("/");
-				printf("%s", ether_ntoa((struct ether_addr *)
-				   hlp->sourcemsk));
-			}
+			print_mac_and_mask(hlp->sourcemac, hlp->sourcemsk);
 endsrc:
 			printf(" ");
 		}
 		if (hlp->bitmask & EBT_DESTMAC) {
-			char hlpmsk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-
 			printf("-d ");
 			if (hlp->invflags & EBT_IDEST)
 				printf("! ");
@@ -586,13 +601,7 @@
 				printf("Broadcast");
 				goto enddst;
 			}
-			printf("%s", ether_ntoa((struct ether_addr *)
-			   hlp->destmac));
-			if (memcmp(hlp->destmsk, hlpmsk, 6)) {
-				printf("/");
-				printf("%s", ether_ntoa((struct ether_addr *)
-				   hlp->destmsk));
-			}
+			print_mac_and_mask(hlp->destmac, hlp->destmsk);
 enddst:
 			printf(" ");
 		}
@@ -2118,6 +2127,12 @@
 				print_error("--Lx not compatible with --Ln");
 			replace.flags |= LIST_X;
 			break;
+		case 12 : /* Lmac2 */
+			check_option(&replace.flags, LIST_MAC2);
+			if (replace.command != 'L')
+				print_error("Use --Lmac2 with -L");
+			replace.flags |= LIST_MAC2;
+			break;
 		case 8 : /* atomic-commit */
 			replace.command = c;
 			if (replace.flags & OPT_COMMAND)
diff --git a/extensions/ebt_arp.c b/extensions/ebt_arp.c
index 4df650b..13cbc7b 100644
--- a/extensions/ebt_arp.c
+++ b/extensions/ebt_arp.c
@@ -284,41 +284,16 @@
 		printf("%s ", mask_to_dotted(arpinfo->dmsk));
 	}
 	if (arpinfo->bitmask & EBT_ARP_SRC_MAC) {
-		int verdict;
 		printf("--arp-mac-src ");
 		if (arpinfo->invflags & EBT_ARP_SRC_MAC)
 			printf("! ");
-		for (i = 0; i < 6; i++)
-			printf("%x%s", ((unsigned char *)&arpinfo->smaddr)[i],
-			   (i == 5) ? "" : ":");
-		verdict = 0;
-		for (i = 0; i < 6; i++)
-			verdict = (arpinfo->smmsk[i] ^ 0xFF);
-		if (verdict != 0) {
-			printf("%s", "/");
-			for (i = 0; i < 6; i++)
-				printf("%x%s", ((unsigned char *)&arpinfo->smmsk)[i],
-				   (i == 5) ? "" : ":");
-			printf("%s", " ");
-		}
+		print_mac_and_mask(arpinfo->smaddr, arpinfo->smmsk);
 	}
 	if (arpinfo->bitmask & EBT_ARP_DST_MAC) {
-		int verdict;
 		printf("--arp-mac-dst ");
 		if (arpinfo->invflags & EBT_ARP_DST_MAC)
 			printf("! ");
-		for (i = 0; i < 6; i++)
-			printf("%x%s", ((unsigned char *)&arpinfo->dmaddr)[i],
-			   (i == 5) ? "" : ":");
-		verdict = 0;
-		for (i = 0; i < 6; i++)
-			verdict = (arpinfo->dmmsk[i] ^ 0xFF);
-		if (verdict != 0) {
-			printf("%s", "/");
-			for (i = 0; i < 6; i++)
-				printf("%x%s", ((unsigned char *)&arpinfo->dmmsk)[i],
-				   (i == 5) ? "" : ":");
-		}
+		print_mac_and_mask(arpinfo->dmaddr, arpinfo->dmmsk);
 	}
 }
 
diff --git a/include/ebtables_u.h b/include/ebtables_u.h
index 3fb9a5c..741b00d 100644
--- a/include/ebtables_u.h
+++ b/include/ebtables_u.h
@@ -208,6 +208,8 @@
 void deliver_table(struct ebt_u_replace *repl);
 void check_option(unsigned int *flags, unsigned int mask);
 int check_inverse(const char option[]);
+void print_mac(const char *mac);
+void print_mac_and_mask(const char *mac, const char *mask);
 void __print_bug(char *file, int line, char *format, ...);
 #define print_bug(format, args...) \
    __print_bug(__FILE__, __LINE__, format, ##args)