diff --git a/ip/Makefile b/ip/Makefile
index 8735b8e4706b..8a43e37b0654 100644
--- a/ip/Makefile
+++ b/ip/Makefile
@@ -7,8 +7,8 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \
     iplink_vlan.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \
     iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o link_xfrm.o \
     iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \
-    link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \
-    iplink_bridge.o iplink_bridge_slave.o ipfou.o iplink_ipvlan.o \
+    link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_subport.o iplink_hsr.o \
+    iplink_bridge.o iplink_bridge_subport.o ipfou.o iplink_ipvlan.o \
     iplink_geneve.o iplink_vrf.o iproute_lwtunnel.o ipmacsec.o ipila.o \
     ipvrf.o iplink_xstats.o ipseg6.o iplink_netdevsim.o iplink_rmnet.o \
     ipnexthop.o ipmptcp.o
diff --git a/ip/ip_common.h b/ip/ip_common.h
index 7d0c9f57745a..cf6710a2f5c2 100644
--- a/ip/ip_common.h
+++ b/ip/ip_common.h
@@ -23,7 +23,7 @@ struct link_filter {
 	int group;
 	int master;
 	char *kind;
-	char *sub_kind;
+	char *subport_kind;
 	int target_nsid;
 };
 
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 4cbff38c9834..26cfd30b2c8c 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -78,7 +78,7 @@ static void usage(void)
 		"TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |\n"
 		"          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |\n"
 		"          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |\n"
-		"          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |\n"
+		"          nlmon | can | bond_subport | ipvlan | geneve | bridge_subport |\n"
 		"          hsr | macsec | netdevsim }\n");
 
 	exit(-1);
@@ -209,10 +209,10 @@ static void print_linkmode(FILE *f, struct rtattr *tb)
 			     , link_modes[mode]);
 }
 
-static char *parse_link_kind(struct rtattr *tb, bool slave)
+static char *parse_link_kind(struct rtattr *tb, bool subport)
 {
 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
-	int attr = slave ? IFLA_INFO_SLAVE_KIND : IFLA_INFO_KIND;
+	int attr = subport ? IFLA_INFO_SLAVE_KIND : IFLA_INFO_KIND;
 
 	parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
 
@@ -222,20 +222,20 @@ static char *parse_link_kind(struct rtattr *tb, bool slave)
 	return "";
 }
 
-static int match_link_kind(struct rtattr **tb, const char *kind, bool slave)
+static int match_link_kind(struct rtattr **tb, const char *kind, bool subport)
 {
 	if (!tb[IFLA_LINKINFO])
 		return -1;
 
-	return strcmp(parse_link_kind(tb[IFLA_LINKINFO], slave), kind);
+	return strcmp(parse_link_kind(tb[IFLA_LINKINFO], subport), kind);
 }
 
 static void print_linktype(FILE *fp, struct rtattr *tb)
 {
 	struct rtattr *linkinfo[IFLA_INFO_MAX+1];
 	struct link_util *lu;
-	struct link_util *slave_lu;
-	char slave[32];
+	struct link_util *subport_lu;
+	char subport[32];
 
 	parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb);
 	open_json_object("linkinfo");
@@ -270,28 +270,28 @@ static void print_linktype(FILE *fp, struct rtattr *tb)
 	}
 
 	if (linkinfo[IFLA_INFO_SLAVE_KIND]) {
-		const char *slave_kind
+		const char *subport_kind
 			= rta_getattr_str(linkinfo[IFLA_INFO_SLAVE_KIND]);
 
 		print_nl();
 		print_string(PRINT_ANY,
-			     "info_slave_kind",
-			     "    %s_slave ",
-			     slave_kind);
+			     "info_subport_kind",
+			     "    %s_subport ",
+			     subport_kind);
 
-		snprintf(slave, sizeof(slave), "%s_slave", slave_kind);
+		snprintf(subport, sizeof(subport), "%s_subport", subport_kind);
 
-		slave_lu = get_link_kind(slave);
-		if (slave_lu && slave_lu->print_opt) {
-			struct rtattr *attr[slave_lu->maxattr+1], **data = NULL;
+		subport_lu = get_link_kind(subport);
+		if (subport_lu && subport_lu->print_opt) {
+			struct rtattr *attr[subport_lu->maxattr+1], **data = NULL;
 
 			if (linkinfo[IFLA_INFO_SLAVE_DATA]) {
-				parse_rtattr_nested(attr, slave_lu->maxattr,
+				parse_rtattr_nested(attr, subport_lu->maxattr,
 						    linkinfo[IFLA_INFO_SLAVE_DATA]);
 				data = attr;
 			}
-			open_json_object("info_slave_data");
-			slave_lu->print_opt(slave_lu, fp, data);
+			open_json_object("info_subport_data");
+			subport_lu->print_opt(subport_lu, fp, data);
 			close_json_object();
 		}
 	}
@@ -924,7 +924,7 @@ int print_linkinfo(struct nlmsghdr *n, void *arg)
 	if (filter.kind && match_link_kind(tb, filter.kind, 0))
 		return -1;
 
-	if (filter.sub_kind && match_link_kind(tb, filter.sub_kind, 1))
+	if (filter.subport_kind && match_link_kind(tb, filter.subport_kind, 1))
 		return -1;
 
 	if (n->nlmsg_type == RTM_DELLINK)
@@ -2009,10 +2009,10 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
 			int soff;
 
 			NEXT_ARG();
-			soff = strlen(*argv) - strlen("_slave");
-			if (!strcmp(*argv + soff, "_slave")) {
+			soff = strlen(*argv) - strlen("_subport");
+			if (!strcmp(*argv + soff, "_subport")) {
 				(*argv)[soff] = '\0';
-				filter.sub_kind = *argv;
+				filter.subport_kind = *argv;
 			} else {
 				filter.kind = *argv;
 			}
diff --git a/ip/iplink.c b/ip/iplink.c
index 47f73988c2d5..722416ffc43d 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -123,7 +123,7 @@ void iplink_usage(void)
 			"TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |\n"
 			"	   bridge | bond | team | ipoib | ip6tnl | ipip | sit | vxlan |\n"
 			"	   gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan |\n"
-			"	   vti | nlmon | team_slave | bond_slave | bridge_slave |\n"
+			"	   vti | nlmon | team_subport | bond_subport | bridge_subport |\n"
 			"	   ipvlan | ipvtap | geneve | vrf | macsec | netdevsim | rmnet |\n"
 			"	   xfrm }\n");
 	}
@@ -1052,7 +1052,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
 			 strlen(type));
 
 		lu = get_link_kind(type);
-		if (ulinep && !strcmp(ulinep, "_slave"))
+		if (ulinep && !strcmp(ulinep, "_subport"))
 			iflatype = IFLA_INFO_SLAVE_DATA;
 		else
 			iflatype = IFLA_INFO_DATA;
diff --git a/ip/iplink_bond.c b/ip/iplink_bond.c
index 585b6be14c81..33c99a311e18 100644
--- a/ip/iplink_bond.c
+++ b/ip/iplink_bond.c
@@ -117,8 +117,8 @@ static int get_index(const char **tbl, char *name)
 static void print_explain(FILE *f)
 {
 	fprintf(f,
-		"Usage: ... bond [ mode BONDMODE ] [ active_slave SLAVE_DEV ]\n"
-		"                [ clear_active_slave ] [ miimon MIIMON ]\n"
+		"Usage: ... bond [ mode BONDMODE ] [ active_subport SLAVE_DEV ]\n"
+		"                [ clear_active_subport ] [ miimon MIIMON ]\n"
 		"                [ updelay UPDELAY ] [ downdelay DOWNDELAY ]\n"
 		"                [ peer_notify_delay DELAY ]\n"
 		"                [ use_carrier USE_CARRIER ]\n"
@@ -132,10 +132,10 @@ static void print_explain(FILE *f)
 		"                [ xmit_hash_policy XMIT_HASH_POLICY ]\n"
 		"                [ resend_igmp RESEND_IGMP ]\n"
 		"                [ num_grat_arp|num_unsol_na NUM_GRAT_ARP|NUM_UNSOL_NA ]\n"
-		"                [ all_slaves_active ALL_SLAVES_ACTIVE ]\n"
+		"                [ all_subports_active ALL_SLAVES_ACTIVE ]\n"
 		"                [ min_links MIN_LINKS ]\n"
 		"                [ lp_interval LP_INTERVAL ]\n"
-		"                [ packets_per_slave PACKETS_PER_SLAVE ]\n"
+		"                [ packets_per_subport PACKETS_PER_SLAVE ]\n"
 		"                [ tlb_dynamic_lb TLB_DYNAMIC_LB ]\n"
 		"                [ lacp_rate LACP_RATE ]\n"
 		"                [ ad_select AD_SELECT ]\n"
@@ -163,12 +163,12 @@ static int bond_parse_opt(struct link_util *lu, int argc, char **argv,
 			  struct nlmsghdr *n)
 {
 	__u8 mode, use_carrier, primary_reselect, fail_over_mac;
-	__u8 xmit_hash_policy, num_peer_notif, all_slaves_active;
+	__u8 xmit_hash_policy, num_peer_notif, all_subports_active;
 	__u8 lacp_rate, ad_select, tlb_dynamic_lb;
 	__u16 ad_user_port_key, ad_actor_sys_prio;
 	__u32 miimon, updelay, downdelay, peer_notify_delay, arp_interval, arp_validate;
 	__u32 arp_all_targets, resend_igmp, min_links, lp_interval;
-	__u32 packets_per_slave;
+	__u32 packets_per_subport;
 	unsigned int ifindex;
 
 	while (argc > 0) {
@@ -178,13 +178,13 @@ static int bond_parse_opt(struct link_util *lu, int argc, char **argv,
 				invarg("invalid mode", *argv);
 			mode = get_index(mode_tbl, *argv);
 			addattr8(n, 1024, IFLA_BOND_MODE, mode);
-		} else if (matches(*argv, "active_slave") == 0) {
+		} else if (matches(*argv, "active_subport") == 0) {
 			NEXT_ARG();
 			ifindex = ll_name_to_index(*argv);
 			if (!ifindex)
 				return nodev(*argv);
 			addattr32(n, 1024, IFLA_BOND_ACTIVE_SLAVE, ifindex);
-		} else if (matches(*argv, "clear_active_slave") == 0) {
+		} else if (matches(*argv, "clear_active_subport") == 0) {
 			addattr32(n, 1024, IFLA_BOND_ACTIVE_SLAVE, 0);
 		} else if (matches(*argv, "miimon") == 0) {
 			NEXT_ARG();
@@ -289,13 +289,13 @@ static int bond_parse_opt(struct link_util *lu, int argc, char **argv,
 
 			addattr8(n, 1024, IFLA_BOND_NUM_PEER_NOTIF,
 				 num_peer_notif);
-		} else if (matches(*argv, "all_slaves_active") == 0) {
+		} else if (matches(*argv, "all_subports_active") == 0) {
 			NEXT_ARG();
-			if (get_u8(&all_slaves_active, *argv, 0))
-				invarg("invalid all_slaves_active", *argv);
+			if (get_u8(&all_subports_active, *argv, 0))
+				invarg("invalid all_subports_active", *argv);
 
 			addattr8(n, 1024, IFLA_BOND_ALL_SLAVES_ACTIVE,
-				 all_slaves_active);
+				 all_subports_active);
 		} else if (matches(*argv, "min_links") == 0) {
 			NEXT_ARG();
 			if (get_u32(&min_links, *argv, 0))
@@ -308,13 +308,13 @@ static int bond_parse_opt(struct link_util *lu, int argc, char **argv,
 				invarg("invalid lp_interval", *argv);
 
 			addattr32(n, 1024, IFLA_BOND_LP_INTERVAL, lp_interval);
-		} else if (matches(*argv, "packets_per_slave") == 0) {
+		} else if (matches(*argv, "packets_per_subport") == 0) {
 			NEXT_ARG();
-			if (get_u32(&packets_per_slave, *argv, 0))
-				invarg("invalid packets_per_slave", *argv);
+			if (get_u32(&packets_per_subport, *argv, 0))
+				invarg("invalid packets_per_subport", *argv);
 
 			addattr32(n, 1024, IFLA_BOND_PACKETS_PER_SLAVE,
-				  packets_per_slave);
+				  packets_per_subport);
 		} else if (matches(*argv, "lacp_rate") == 0) {
 			NEXT_ARG();
 			if (get_index(lacp_rate_tbl, *argv) < 0)
@@ -392,8 +392,8 @@ static void bond_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 
 		if (ifindex) {
 			print_string(PRINT_ANY,
-				     "active_slave",
-				     "active_slave %s ",
+				     "active_subport",
+				     "active_subport %s ",
 				     ll_index_to_name(ifindex));
 		}
 	}
@@ -538,8 +538,8 @@ static void bond_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 
 	if (tb[IFLA_BOND_ALL_SLAVES_ACTIVE])
 		print_uint(PRINT_ANY,
-			   "all_slaves_active",
-			   "all_slaves_active %u ",
+			   "all_subports_active",
+			   "all_subports_active %u ",
 			   rta_getattr_u8(tb[IFLA_BOND_ALL_SLAVES_ACTIVE]));
 
 	if (tb[IFLA_BOND_MIN_LINKS])
@@ -556,8 +556,8 @@ static void bond_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 
 	if (tb[IFLA_BOND_PACKETS_PER_SLAVE])
 		print_uint(PRINT_ANY,
-			   "packets_per_slave",
-			   "packets_per_slave %u ",
+			   "packets_per_subport",
+			   "packets_per_subport %u ",
 			   rta_getattr_u32(tb[IFLA_BOND_PACKETS_PER_SLAVE]));
 
 	if (tb[IFLA_BOND_AD_LACP_RATE]) {
diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_subport.c
similarity index 74%
rename from ip/iplink_bond_slave.c
rename to ip/iplink_bond_subport.c
index d488aaab4fef..4c6cc71f2357 100644
--- a/ip/iplink_bond_slave.c
+++ b/ip/iplink_bond_subport.c
@@ -1,5 +1,5 @@
 /*
- * iplink_bond_slave.c	Bonding slave device support
+ * iplink_bond_subport.c	Bonding subport device support
  *
  *              This program is free software; you can redistribute it and/or
  *              modify it under the terms of the GNU General Public License
@@ -19,7 +19,7 @@
 
 static void print_explain(FILE *f)
 {
-	fprintf(f, "Usage: ... bond_slave [ queue_id ID ]\n");
+	fprintf(f, "Usage: ... bond_subport [ queue_id ID ]\n");
 }
 
 static void explain(void)
@@ -27,36 +27,36 @@ static void explain(void)
 	print_explain(stderr);
 }
 
-static const char *slave_states[] = {
+static const char *subport_states[] = {
 	[BOND_STATE_ACTIVE] = "ACTIVE",
 	[BOND_STATE_BACKUP] = "BACKUP",
 };
 
-static void print_slave_state(FILE *f, struct rtattr *tb)
+static void print_subport_state(FILE *f, struct rtattr *tb)
 {
 	unsigned int state = rta_getattr_u8(tb);
 
-	if (state >= ARRAY_SIZE(slave_states))
+	if (state >= ARRAY_SIZE(subport_states))
 		print_int(PRINT_ANY, "state_index", "state %d ", state);
 	else
 		print_string(PRINT_ANY,
 			     "state",
 			     "state %s ",
-			     slave_states[state]);
+			     subport_states[state]);
 }
 
-static const char *slave_mii_status[] = {
+static const char *subport_mii_status[] = {
 	[BOND_LINK_UP] = "UP",
 	[BOND_LINK_FAIL] = "GOING_DOWN",
 	[BOND_LINK_DOWN] = "DOWN",
 	[BOND_LINK_BACK] = "GOING_BACK",
 };
 
-static void print_slave_mii_status(FILE *f, struct rtattr *tb)
+static void print_subport_mii_status(FILE *f, struct rtattr *tb)
 {
 	unsigned int status = rta_getattr_u8(tb);
 
-	if (status >= ARRAY_SIZE(slave_mii_status))
+	if (status >= ARRAY_SIZE(subport_mii_status))
 		print_int(PRINT_ANY,
 			  "mii_status_index",
 			  "mii_status %d ",
@@ -65,10 +65,10 @@ static void print_slave_mii_status(FILE *f, struct rtattr *tb)
 		print_string(PRINT_ANY,
 			     "mii_status",
 			     "mii_status %s ",
-			     slave_mii_status[status]);
+			     subport_mii_status[status]);
 }
 
-static void print_slave_oper_state(FILE *fp, const char *name, __u16 state)
+static void print_subport_oper_state(FILE *fp, const char *name, __u16 state)
 {
 	open_json_array(PRINT_ANY, name);
 	print_string(PRINT_FP, NULL, " <", NULL);
@@ -88,17 +88,17 @@ static void print_slave_oper_state(FILE *fp, const char *name, __u16 state)
 	close_json_array(PRINT_ANY, "> ");
 }
 
-static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
+static void bond_subport_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 {
 	SPRINT_BUF(b1);
 	if (!tb)
 		return;
 
 	if (tb[IFLA_BOND_SLAVE_STATE])
-		print_slave_state(f, tb[IFLA_BOND_SLAVE_STATE]);
+		print_subport_state(f, tb[IFLA_BOND_SLAVE_STATE]);
 
 	if (tb[IFLA_BOND_SLAVE_MII_STATUS])
-		print_slave_mii_status(f, tb[IFLA_BOND_SLAVE_MII_STATUS]);
+		print_subport_mii_status(f, tb[IFLA_BOND_SLAVE_MII_STATUS]);
 
 	if (tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT])
 		print_int(PRINT_ANY,
@@ -133,7 +133,7 @@ static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *t
 			  "ad_actor_oper_port_state",
 			  "ad_actor_oper_port_state %d ",
 			  state);
-		print_slave_oper_state(f, "ad_actor_oper_port_state_str", state);
+		print_subport_oper_state(f, "ad_actor_oper_port_state_str", state);
 	}
 
 	if (tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]) {
@@ -143,11 +143,11 @@ static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *t
 			  "ad_partner_oper_port_state",
 			  "ad_partner_oper_port_state %d ",
 			  state);
-		print_slave_oper_state(f, "ad_partner_oper_port_state_str", state);
+		print_subport_oper_state(f, "ad_partner_oper_port_state_str", state);
 	}
 }
 
-static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
+static int bond_subport_parse_opt(struct link_util *lu, int argc, char **argv,
 				struct nlmsghdr *n)
 {
 	__u16 queue_id;
@@ -161,7 +161,7 @@ static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 		} else {
 			if (matches(*argv, "help") != 0)
 				fprintf(stderr,
-					"bond_slave: unknown option \"%s\"?\n",
+					"bond_subport: unknown option \"%s\"?\n",
 					*argv);
 			explain();
 			return -1;
@@ -172,18 +172,18 @@ static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 	return 0;
 }
 
-static void bond_slave_print_help(struct link_util *lu, int argc, char **argv,
+static void bond_subport_print_help(struct link_util *lu, int argc, char **argv,
 				  FILE *f)
 {
 	print_explain(f);
 }
 
-struct link_util bond_slave_link_util = {
-	.id		= "bond_slave",
+struct link_util bond_subport_link_util = {
+	.id		= "bond_subport",
 	.maxattr	= IFLA_BOND_SLAVE_MAX,
-	.print_opt	= bond_slave_print_opt,
-	.parse_opt	= bond_slave_parse_opt,
-	.print_help	= bond_slave_print_help,
+	.print_opt	= bond_subport_print_opt,
+	.parse_opt	= bond_subport_parse_opt,
+	.print_help	= bond_subport_print_help,
 	.parse_ifla_xstats = bond_parse_xstats,
 	.print_ifla_xstats = bond_print_xstats,
 };
diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_subport.c
similarity index 88%
rename from ip/iplink_bridge_slave.c
rename to ip/iplink_bridge_subport.c
index 79a1d2f5f5b8..68a31e939fc4 100644
--- a/ip/iplink_bridge_slave.c
+++ b/ip/iplink_bridge_subport.c
@@ -1,5 +1,5 @@
 /*
- * iplink_bridge_slave.c	Bridge slave device support
+ * iplink_bridge_subport.c	Bridge subport device support
  *
  *              This program is free software; you can redistribute it and/or
  *              modify it under the terms of the GNU General Public License
@@ -22,7 +22,7 @@
 static void print_explain(FILE *f)
 {
 	fprintf(f,
-		"Usage: ... bridge_slave [ fdb_flush ]\n"
+		"Usage: ... bridge_subport [ fdb_flush ]\n"
 		"			[ state STATE ]\n"
 		"			[ priority PRIO ]\n"
 		"			[ cost COST ]\n"
@@ -123,7 +123,7 @@ static void _bitmask2str(__u16 bitmask, char *dst, size_t dst_size,
 		dst[len - 1] = 0;
 }
 
-static void bridge_slave_print_opt(struct link_util *lu, FILE *f,
+static void bridge_subport_print_opt(struct link_util *lu, FILE *f,
 				   struct rtattr *tb[])
 {
 	if (!tb)
@@ -294,7 +294,7 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f,
 	}
 }
 
-static void bridge_slave_parse_on_off(char *arg_name, char *arg_val,
+static void bridge_subport_parse_on_off(char *arg_name, char *arg_val,
 				      struct nlmsghdr *n, int type)
 {
 	__u8 val;
@@ -309,7 +309,7 @@ static void bridge_slave_parse_on_off(char *arg_name, char *arg_val,
 	addattr8(n, 1024, type, val);
 }
 
-static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
+static int bridge_subport_parse_opt(struct link_util *lu, int argc, char **argv,
 				  struct nlmsghdr *n)
 {
 	__u8 state;
@@ -336,43 +336,43 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 			addattr32(n, 1024, IFLA_BRPORT_COST, cost);
 		} else if (matches(*argv, "hairpin") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("hairpin", *argv, n,
+			bridge_subport_parse_on_off("hairpin", *argv, n,
 						  IFLA_BRPORT_MODE);
 		} else if (matches(*argv, "guard") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("guard", *argv, n,
+			bridge_subport_parse_on_off("guard", *argv, n,
 						  IFLA_BRPORT_GUARD);
 		} else if (matches(*argv, "root_block") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("root_block", *argv, n,
+			bridge_subport_parse_on_off("root_block", *argv, n,
 						  IFLA_BRPORT_PROTECT);
 		} else if (matches(*argv, "fastleave") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("fastleave", *argv, n,
+			bridge_subport_parse_on_off("fastleave", *argv, n,
 						  IFLA_BRPORT_FAST_LEAVE);
 		} else if (matches(*argv, "learning") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("learning", *argv, n,
+			bridge_subport_parse_on_off("learning", *argv, n,
 						  IFLA_BRPORT_LEARNING);
 		} else if (matches(*argv, "flood") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("flood", *argv, n,
+			bridge_subport_parse_on_off("flood", *argv, n,
 						  IFLA_BRPORT_UNICAST_FLOOD);
 		} else if (matches(*argv, "mcast_flood") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("mcast_flood", *argv, n,
+			bridge_subport_parse_on_off("mcast_flood", *argv, n,
 						  IFLA_BRPORT_MCAST_FLOOD);
 		} else if (matches(*argv, "mcast_to_unicast") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("mcast_to_unicast", *argv, n,
+			bridge_subport_parse_on_off("mcast_to_unicast", *argv, n,
 						  IFLA_BRPORT_MCAST_TO_UCAST);
 		} else if (matches(*argv, "proxy_arp") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("proxy_arp", *argv, n,
+			bridge_subport_parse_on_off("proxy_arp", *argv, n,
 						  IFLA_BRPORT_PROXYARP);
 		} else if (matches(*argv, "proxy_arp_wifi") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("proxy_arp_wifi", *argv, n,
+			bridge_subport_parse_on_off("proxy_arp_wifi", *argv, n,
 						  IFLA_BRPORT_PROXYARP_WIFI);
 		} else if (matches(*argv, "mcast_router") == 0) {
 			__u8 mcast_router;
@@ -384,11 +384,11 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 				 mcast_router);
 		} else if (matches(*argv, "mcast_fast_leave") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("mcast_fast_leave", *argv, n,
+			bridge_subport_parse_on_off("mcast_fast_leave", *argv, n,
 						  IFLA_BRPORT_FAST_LEAVE);
 		} else if (matches(*argv, "neigh_suppress") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("neigh_suppress", *argv, n,
+			bridge_subport_parse_on_off("neigh_suppress", *argv, n,
 						  IFLA_BRPORT_NEIGH_SUPPRESS);
 		} else if (matches(*argv, "group_fwd_mask") == 0) {
 			__u16 mask;
@@ -399,11 +399,11 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 			addattr16(n, 1024, IFLA_BRPORT_GROUP_FWD_MASK, mask);
 		} else if (matches(*argv, "vlan_tunnel") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("vlan_tunnel", *argv, n,
+			bridge_subport_parse_on_off("vlan_tunnel", *argv, n,
 						  IFLA_BRPORT_VLAN_TUNNEL);
 		} else if (matches(*argv, "isolated") == 0) {
 			NEXT_ARG();
-			bridge_slave_parse_on_off("isolated", *argv, n,
+			bridge_subport_parse_on_off("isolated", *argv, n,
 						  IFLA_BRPORT_ISOLATED);
 		} else if (matches(*argv, "backup_port") == 0) {
 			int ifindex;
@@ -419,7 +419,7 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 			explain();
 			return -1;
 		} else {
-			fprintf(stderr, "bridge_slave: unknown option \"%s\"?\n",
+			fprintf(stderr, "bridge_subport: unknown option \"%s\"?\n",
 				*argv);
 			explain();
 			return -1;
@@ -430,18 +430,18 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
 	return 0;
 }
 
-static void bridge_slave_print_help(struct link_util *lu, int argc, char **argv,
+static void bridge_subport_print_help(struct link_util *lu, int argc, char **argv,
 		FILE *f)
 {
 	print_explain(f);
 }
 
-struct link_util bridge_slave_link_util = {
-	.id		= "bridge_slave",
+struct link_util bridge_subport_link_util = {
+	.id		= "bridge_subport",
 	.maxattr	= IFLA_BRPORT_MAX,
-	.print_opt	= bridge_slave_print_opt,
-	.parse_opt	= bridge_slave_parse_opt,
-	.print_help     = bridge_slave_print_help,
+	.print_opt	= bridge_subport_print_opt,
+	.parse_opt	= bridge_subport_parse_opt,
+	.print_help     = bridge_subport_print_help,
 	.parse_ifla_xstats = bridge_parse_xstats,
 	.print_ifla_xstats = bridge_print_xstats,
 };
diff --git a/ip/iplink_hsr.c b/ip/iplink_hsr.c
index 7d9167d4e6a3..3a12fa2bc484 100644
--- a/ip/iplink_hsr.c
+++ b/ip/iplink_hsr.c
@@ -24,13 +24,13 @@
 static void print_usage(FILE *f)
 {
 	fprintf(f,
-		"Usage:\tip link add name NAME type hsr slave1 SLAVE1-IF slave2 SLAVE2-IF\n"
+		"Usage:\tip link add name NAME type hsr subport1 SLAVE1-IF subport2 SLAVE2-IF\n"
 		"\t[ supervision ADDR-BYTE ] [version VERSION]\n"
 		"\n"
 		"NAME\n"
 		"	name of new hsr device (e.g. hsr0)\n"
 		"SLAVE1-IF, SLAVE2-IF\n"
-		"	the two slave devices bound to the HSR device\n"
+		"	the two subport devices bound to the HSR device\n"
 		"ADDR-BYTE\n"
 		"	0-255; the last byte of the multicast address used for HSR supervision\n"
 		"	frames (default = 0)\n"
@@ -64,13 +64,13 @@ static int hsr_parse_opt(struct link_util *lu, int argc, char **argv,
 				invarg("version is invalid", *argv);
 			addattr_l(n, 1024, IFLA_HSR_VERSION,
 				  &protocol_version, 1);
-		} else if (matches(*argv, "slave1") == 0) {
+		} else if (matches(*argv, "subport1") == 0) {
 			NEXT_ARG();
 			ifindex = ll_name_to_index(*argv);
 			if (ifindex == 0)
 				invarg("No such interface", *argv);
 			addattr_l(n, 1024, IFLA_HSR_SLAVE1, &ifindex, 4);
-		} else if (matches(*argv, "slave2") == 0) {
+		} else if (matches(*argv, "subport2") == 0) {
 			NEXT_ARG();
 			ifindex = ll_name_to_index(*argv);
 			if (ifindex == 0)
@@ -112,19 +112,19 @@ static void hsr_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 
 	if (tb[IFLA_HSR_SLAVE1])
 		print_string(PRINT_ANY,
-			     "slave1",
-			     "slave1 %s ",
+			     "subport1",
+			     "subport1 %s ",
 			     ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE1])));
 	else
-		print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>");
+		print_null(PRINT_ANY, "subport1", "subport1 %s ", "<none>");
 
 	if (tb[IFLA_HSR_SLAVE2])
 		print_string(PRINT_ANY,
-			     "slave2",
-			     "slave2 %s ",
+			     "subport2",
+			     "subport2 %s ",
 			     ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2])));
 	else
-		print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>");
+		print_null(PRINT_ANY, "subport2", "subport2 %s ", "<none>");
 
 	if (tb[IFLA_HSR_SEQ_NR])
 		print_int(PRINT_ANY,
diff --git a/ip/iplink_team.c b/ip/iplink_team.c
index 58f955a478ac..7b725311d112 100644
--- a/ip/iplink_team.c
+++ b/ip/iplink_team.c
@@ -11,16 +11,16 @@ static void team_print_help(struct link_util *lu,
 	fprintf(f, "Usage: ... team\n");
 }
 
-static void team_slave_print_help(struct link_util *lu,
+static void team_subport_print_help(struct link_util *lu,
 				  int argc, char **argv, FILE *f)
 {
-	fprintf(f, "Usage: ... team_slave\n");
+	fprintf(f, "Usage: ... team_subport\n");
 }
 
 struct link_util team_link_util = {
 	.id		= "team",
 	.print_help	= team_print_help,
-}, team_slave_link_util = {
-	.id		= "team_slave",
-	.print_help	= team_slave_print_help,
+}, team_subport_link_util = {
+	.id		= "team_subport",
+	.print_help	= team_subport_print_help,
 };
diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c
index 5d20f29d3526..33b46df706f9 100644
--- a/ip/iplink_vrf.c
+++ b/ip/iplink_vrf.c
@@ -68,7 +68,7 @@ static void vrf_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
 			   rta_getattr_u32(tb[IFLA_VRF_TABLE]));
 }
 
-static void vrf_slave_print_opt(struct link_util *lu, FILE *f,
+static void vrf_subport_print_opt(struct link_util *lu, FILE *f,
 				struct rtattr *tb[])
 {
 	if (!tb)
@@ -96,10 +96,10 @@ struct link_util vrf_link_util = {
 	.print_help	= vrf_print_help,
 };
 
-struct link_util vrf_slave_link_util = {
-	.id             = "vrf_slave",
+struct link_util vrf_subport_link_util = {
+	.id             = "vrf_subport",
 	.maxattr        = IFLA_VRF_PORT_MAX,
-	.print_opt	= vrf_slave_print_opt,
+	.print_opt	= vrf_subport_print_opt,
 };
 
 /* returns table id if name is a VRF device */
diff --git a/ip/iplink_xstats.c b/ip/iplink_xstats.c
index c64e6885678c..8f7983040d03 100644
--- a/ip/iplink_xstats.c
+++ b/ip/iplink_xstats.c
@@ -60,7 +60,7 @@ int iplink_ifla_xstats(int argc, char **argv)
 	    lu->parse_ifla_xstats(lu, argc-1, argv+1))
 		return -1;
 
-	if (strstr(lu->id, "_slave"))
+	if (strstr(lu->id, "_subport"))
 		filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS_SLAVE);
 	else
 		filt_mask = IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK_XSTATS);
diff --git a/lib/namespace.c b/lib/namespace.c
index 06ae0a48c224..93e3263c89db 100644
--- a/lib/namespace.c
+++ b/lib/namespace.c
@@ -75,7 +75,7 @@ int netns_switch(char *name)
 	}
 	/* Don't let any mounts propagate back to the parent */
 	if (mount("", "/", "none", MS_SLAVE | MS_REC, NULL)) {
-		fprintf(stderr, "\"mount --make-rslave /\" failed: %s\n",
+		fprintf(stderr, "\"mount --make-rsubport /\" failed: %s\n",
 			strerror(errno));
 		return -1;
 	}
diff --git a/man/man8/ip-address.8.in b/man/man8/ip-address.8.in
index fe773c91592f..1db324c11a3c 100644
--- a/man/man8/ip-address.8.in
+++ b/man/man8/ip-address.8.in
@@ -108,9 +108,9 @@ ip-address \- protocol address management
 .ti -8
 .IR TYPE " := [ "
 .BR bridge " | "
-.BR bridge_slave " |"
+.BR bridge_subport " |"
 .BR bond " | "
-.BR bond_slave " |"
+.BR bond_subport " |"
 .BR can " | "
 .BR dummy " | "
 .BR hsr " | "
@@ -320,11 +320,11 @@ is a usual shell style pattern.
 
 .TP
 .BI master " DEVICE"
-only list interfaces enslaved to this master device.
+only list interfaces ensubportd to this master device.
 
 .TP
 .BI vrf " NAME "
-only list interfaces enslaved to this vrf.
+only list interfaces ensubportd to this vrf.
 
 .TP
 .BI type " TYPE"
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
index e8a25451f7cd..89b84127bc1b 100644
--- a/man/man8/ip-link.8.in
+++ b/man/man8/ip-link.8.in
@@ -231,7 +231,7 @@ ip-link \- network device configuration
 
 .ti -8
 .IR ETYPE " := [ " TYPE " |"
-.BR bridge_slave " | " bond_slave " ]"
+.BR bridge_subport " | " bond_subport " ]"
 
 .ti -8
 .IR VFVLAN-LIST " := [ "  VFVLAN-LIST " ] " VFVLAN
@@ -1357,7 +1357,7 @@ For a link of type
 the following additional arguments are supported:
 
 .BI "ip link add link " DEVICE " name " NAME " type hsr"
-.BI slave1 " SLAVE1-IF " slave2 " SLAVE2-IF "
+.BI subport1 " SLAVE1-IF " subport2 " SLAVE2-IF "
 .RB [ " supervision"
 .IR ADDR-BYTE " ] ["
 .BR version " { " 0 " | " 1 " } ]"
@@ -1367,10 +1367,10 @@ the following additional arguments are supported:
 .BR type " hsr "
 - specifies the link type to use, here HSR.
 
-.BI slave1 " SLAVE1-IF "
+.BI subport1 " SLAVE1-IF "
 - Specifies the physical device used for the first of the two ring ports.
 
-.BI slave2 " SLAVE2-IF "
+.BI subport2 " SLAVE2-IF "
 - Specifies the physical device used for the second of the two ring ports.
 
 .BI supervision " ADDR-BYTE"
@@ -2136,7 +2136,7 @@ described already.
 
 .TP
 .BI master " DEVICE"
-set master device of the device (enslave device).
+set master device of the device (ensubport device).
 
 .TP
 .BI nomaster
@@ -2168,7 +2168,7 @@ set peer netnsid for a cross-netns interface
 Change type-specific settings. For a list of supported types and arguments refer
 to the description of
 .B "ip link add"
-above. In addition to that, it is possible to manipulate settings to slave
+above. In addition to that, it is possible to manipulate settings to subport
 devices:
 
 .TP
@@ -2177,7 +2177,7 @@ For a link with master
 .B bridge
 the following additional arguments are supported:
 
-.B "ip link set type bridge_slave"
+.B "ip link set type bridge_subport"
 [
 .B fdb_flush
 ] [
@@ -2226,7 +2226,7 @@ the following additional arguments are supported:
 .in +8
 .sp
 .B fdb_flush
-- flush bridge slave's fdb dynamic entries.
+- flush bridge subport's fdb dynamic entries.
 
 .BI state " STATE"
 - Set port state.
@@ -2331,7 +2331,7 @@ For a link with master
 .B bond
 the following additional arguments are supported:
 
-.B "ip link set type bond_slave"
+.B "ip link set type bond_subport"
 [
 .BI queue_id " ID"
 ]
@@ -2339,7 +2339,7 @@ the following additional arguments are supported:
 .in +8
 .sp
 .BI queue_id " ID"
-- set the slave's queue ID (a 16bit unsigned value).
+- set the subport's queue ID (a 16bit unsigned value).
 
 .in -8
 
@@ -2388,12 +2388,12 @@ only display running interfaces.
 .TP
 .BI master " DEVICE "
 .I DEVICE
-specifies the master device which enslaves devices to show.
+specifies the master device which ensubports devices to show.
 
 .TP
 .BI vrf " NAME "
 .I NAME
-speficies the VRF which enslaves devices to show.
+speficies the VRF which ensubports devices to show.
 
 .TP
 .BI type " TYPE "
@@ -2451,7 +2451,7 @@ Shows the vlan devices.
 .PP
 ip link show master br0
 .RS 4
-Shows devices enslaved by br0
+Shows devices ensubportd by br0
 .RE
 .PP
 ip link set dev ppp0 mtu 1400
diff --git a/man/man8/ip-nexthop.8 b/man/man8/ip-nexthop.8
index 68164f3ca84f..92ab5be5dcab 100644
--- a/man/man8/ip-nexthop.8
+++ b/man/man8/ip-nexthop.8
@@ -144,7 +144,7 @@ show the nexthops using the given device.
 show the nexthops using devices associated with the vrf name
 .TP
 .BI master " DEV "
-show the nexthops using devices enslaved to given master device
+show the nexthops using devices ensubportd to given master device
 .TP
 .BI groups
 show only nexthop groups
diff --git a/testsuite/tests/bridge/vlan/tunnelshow.t b/testsuite/tests/bridge/vlan/tunnelshow.t
index 2cec8d03b47a..621c0804bd80 100755
--- a/testsuite/tests/bridge/vlan/tunnelshow.t
+++ b/testsuite/tests/bridge/vlan/tunnelshow.t
@@ -14,7 +14,7 @@ ts_ip "$0" "Add $VX_DEV vxlan interface" \
 ts_ip "$0" "Insert $VX_DEV under $BR_DEV" \
 	link set dev $VX_DEV master $BR_DEV
 ts_ip "$0" "Set vlan_tunnel on $VX_DEV" \
-	link set dev $VX_DEV type bridge_slave vlan_tunnel on
+	link set dev $VX_DEV type bridge_subport vlan_tunnel on
 
 ts_bridge "$0" "Add single vlan" vlan add dev $VX_DEV vid 1000
 ts_bridge "$0" "Add single tunnel" \
