diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index dcfc8bb9a6c870e6cc7e94bdb9568191dd1696bf..647f775b17c4192112df7b9fb20dfeab5f0acaf1 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -298,6 +298,15 @@ recvv_nxtinfo                   return RECVV_NXTINFO;
 sse_type                        return SSE_TYPE;
 sse_flags                       return SSE_FLAGS;
 sse_length                      return SSE_LENGTH;
+sac_type                        return SAC_TYPE;
+sac_flags                       return SAC_FLAGS;
+sac_length                      return SAC_LENGTH;
+sac_state                       return SAC_STATE;
+sac_error                       return SAC_ERROR;
+sac_outbound_streams            return SAC_OUTBOUND_STREAMS;
+sac_inbound_streams             return SAC_INBOUND_STREAMS;
+sac_assoc_id                    return SAC_ASSOC_ID;
+sac_info                        return SAC_INFO;
 sender_dry_type                 return SENDER_DRY_TYPE;
 sender_dry_flags                return SENDER_DRY_FLAGS;
 sender_dry_length               return SENDER_DRY_LENGTH;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 443cbd589a6f1ae2120c074f04d36fac895add8a..a224bc494d2a75d78eec22da076781ef0ea2bd0c 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -549,10 +549,12 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> RECVV_RCVINFO RECVV_NXTINFO
 %token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH
 %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID
-%token <rexerved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
+%token <reserved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
 %token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_
 %token <reserved> _SCTP_PARTIAL_DELIVERY_EVENT_ _SCTP_ADAPTATION_LAYER_EVENT_
 %token <reserved> _SCTP_AUTHENTICATION_EVENT_ _SCTP_SENDER_DRY_EVENT_
+%token <reserved> SAC_TYPE SAC_FLAGS SAC_LENGTH SAC_STATE SAC_ERROR SAC_OUTBOUND_STREAMS
+%token <reserved> SAC_INBOUND_STREAMS SAC_ASSOC_ID SAC_INFO
 %token <reserved> SSFE_TYPE SSFE_FLAGS SSFE_LENGTH SSFE_ERROR SSFE_INFO SSFE_ASSOC_ID SSFE_DATA
 %token <floating> FLOAT
 %token <integer> INTEGER HEX_INTEGER
@@ -612,6 +614,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_shutdown_event sse_type sse_flags sse_length
 %type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id
 %type <expression> sctp_event_subscribe
+%type <expression> sctp_assoc_change sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams
+%type <expression> sac_inbound_streams sac_assoc_id sac_info
 %type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_assoc_id
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
@@ -2586,10 +2590,11 @@ sockaddr
 ;
 
 data
-: ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
-| sctp_shutdown_event        { $$ = $1; }
-| sctp_sender_dry_event      { $$ = $1; }
-| sctp_send_failed_event     { $$ = $1; }
+: ELLIPSIS { new_expression(EXPR_ELLIPSIS); }
+| sctp_assoc_change         { $$ = $1; }
+| sctp_shutdown_event       { $$ = $1; }
+| sctp_sender_dry_event     { $$ = $1; }
+| sctp_send_failed_event    { $$ = $1; }
 ;
 
 msghdr
@@ -3700,6 +3705,116 @@ sctp_send_failed_event
 	$$->value.sctp_send_failed_event->ssfe_data = new_expression(EXPR_ELLIPSIS);
 };
 
+sac_type
+: SAC_TYPE '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_type out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_TYPE '=' WORD {
+	$$ = new_expression(EXPR_WORD);
+	$$->value.string = $3;
+}
+| SAC_TYPE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_flags
+: SAC_FLAGS '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_flags out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_length
+: SAC_LENGTH '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_length out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_state
+: SAC_STATE '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_state out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_STATE '=' WORD {
+	$$ = new_expression(EXPR_WORD);
+	$$->value.string = $3;
+}
+| SAC_STATE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_error
+: SAC_ERROR '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_error out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_outbound_streams
+: SAC_OUTBOUND_STREAMS '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_outbound_streams out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_OUTBOUND_STREAMS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_inbound_streams
+: SAC_INBOUND_STREAMS '=' INTEGER {
+	if (!is_valid_u16($3)) {
+		semantic_error("sac_inbound_streams out of range");
+	}
+	$$ = new_integer_expression($3, "%hu");
+}
+| SAC_INBOUND_STREAMS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_assoc_id
+: SAC_ASSOC_ID '=' INTEGER {
+	if (!is_valid_u32($3)) {
+		semantic_error("sac_assoc_id out of range");
+	}
+	$$ = new_integer_expression($3, "%u");
+}
+| SAC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
+sac_info
+: SAC_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+| SAC_INFO '=' array { $$ = $3; }
+;
+
+sctp_assoc_change
+: '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
+sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' {
+	$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
+	$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
+	$$->value.sctp_assoc_change->sac_type = $2;
+	$$->value.sctp_assoc_change->sac_flags = $4;
+	$$->value.sctp_assoc_change->sac_length = $6;
+	$$->value.sctp_assoc_change->sac_state = $8;
+	$$->value.sctp_assoc_change->sac_error = $10;
+	$$->value.sctp_assoc_change->sac_outbound_streams = $12;
+	$$->value.sctp_assoc_change->sac_inbound_streams = $14;
+	$$->value.sctp_assoc_change->sac_assoc_id = $16;
+	$$->value.sctp_assoc_change->sac_info = $18;
+}
+;
+
 opt_errno
 :                   { $$ = NULL; }
 | WORD note         {
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index f85ce8f5d60d353da0f9d2fdc3c11cdf5e049f3d..bb38680c19303cf5e3b1e0502ab2490395ca3dd5 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -526,6 +526,7 @@ static int iovec_new(struct expression *expression,
 		iov_expr = list->expression->value.iovec;
 
 		assert(iov_expr->iov_base->type == EXPR_ELLIPSIS ||
+		       iov_expr->iov_base->type == EXPR_SCTP_ASSOC_CHANGE ||
 		       iov_expr->iov_base->type == EXPR_SCTP_SHUTDOWN_EVENT ||
 		       iov_expr->iov_base->type == EXPR_SCTP_SENDER_DRY_EVENT ||
 		       iov_expr->iov_base->type == EXPR_SCTP_SEND_FAILED_EVENT);
@@ -3337,6 +3338,87 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 }
 #endif
 
+#if defined(__FreeBSD__) || defined(linux)
+static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
+				   struct sctp_assoc_change *sctp_event,
+				   char **error) {
+
+	if (check_u16_expr(expr->sac_type, sctp_event->sac_type,
+			   "sctp_assoc_change.sac_type", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->sac_flags, sctp_event->sac_flags,
+			   "sctp_assoc_change.sac_flags", error))
+		return STATUS_ERR;
+	if (check_u32_expr(expr->sac_length, sctp_event->sac_length,
+			   "sctp_assoc_change.sac_length", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->sac_state, sctp_event->sac_state,
+			   "sctp_assoc_change.sac_state", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->sac_error, sctp_event->sac_error,
+			   "sctp_assoc_change.sac_error", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->sac_outbound_streams, sctp_event->sac_outbound_streams,
+			   "sctp_assoc_change.sac_outbound_streams", error))
+		return STATUS_ERR;
+	if (check_u16_expr(expr->sac_inbound_streams, sctp_event->sac_inbound_streams,
+			   "sctp_assoc_change.sac_inbound_streams", error))
+		return STATUS_ERR;
+	if (check_u32_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id,
+			   "sctp_assoc_change.sac_assoc_id", error))
+		return STATUS_ERR;
+	if ( expr->sac_info->type != EXPR_ELLIPSIS) {
+		size_t infolen = 0;
+		struct expression *info_expr = NULL;
+		int i;
+		infolen = sizeof(sctp_event->sac_type);
+		infolen += sizeof(sctp_event->sac_flags);
+		infolen += sizeof(sctp_event->sac_length);
+		infolen += sizeof(sctp_event->sac_state);
+		infolen += sizeof(sctp_event->sac_error);
+		infolen += sizeof(sctp_event->sac_outbound_streams); 
+		infolen += sizeof(sctp_event->sac_inbound_streams); 
+		infolen += sizeof(sctp_event->sac_assoc_id); 
+		infolen = sctp_event->sac_length - infolen + 1;
+		switch(expr->sac_info->type) {
+		case EXPR_LIST:
+			if (infolen != expression_list_length(expr->sac_info->value.list)) {
+				asprintf(error, "sctp_assoc_change. sac_list length unequal to sac_lenth expected: %u actual %u",
+					 expression_list_length(expr->sac_info->value.list), infolen);
+				return STATUS_ERR;
+			}
+			for (i = 0; i < infolen; i++) {
+				info_expr = get_arg(expr->sac_info->value.list, i, error);
+				if (info_expr->type != EXPR_ELLIPSIS) {
+					u8 script_val;
+
+					if (get_u8(info_expr, &script_val, error)) {
+						return STATUS_ERR;
+					}
+					if (script_val != sctp_event->sac_info[i]) {
+						asprintf(error, "sctp_assoc_change.sac_info. byte %d: expected: %hhu actual: %hhu",
+							i, script_val, sctp_event->sac_info[i]);
+						return STATUS_ERR;
+					}
+				}
+
+				/*if (info_expr->type != EXPR_ELLIPSIS) {
+					
+					if (check_u8_expr(info_expr, sctp_event->sac_info[i],
+						   "sctp_assoc_change.sac_info", error))
+					return STATUS_ERR;
+				}
+		*/	}
+			break;
+		default: asprintf(error, "Bad expressiontype for sac_info");
+			return STATUS_ERR;
+			break;
+		}
+	}
+	return STATUS_OK;
+}
+#endif
+
 #if defined(__FreeBSD__) || defined(linux)
 static int check_sctp_shutdown_event(struct sctp_shutdown_event_expr *expr,
 				     struct sctp_shutdown_event *sctp_event,
@@ -3424,6 +3506,12 @@ static int check_sctp_notification(struct iovec *iov,
 			return STATUS_ERR;
 		script_iov_base = script_iov->value.iovec->iov_base;
 		switch (script_iov_base->type) {
+		case EXPR_SCTP_ASSOC_CHANGE:
+			if (check_sctp_assoc_change(script_iov_base->value.sctp_assoc_change,
+						    (struct sctp_assoc_change *) iov->iov_base,
+						    error))
+				return STATUS_ERR;
+			break;
 		case EXPR_SCTP_SHUTDOWN_EVENT:
 			if (check_sctp_shutdown_event(script_iov_base->value.sctp_shutdown_event,
 						      (struct sctp_shutdown_event *) iov->iov_base,
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 4e27b63b942809ddce56cb83ec7784549925ae1f..5ceb9c6d00475a120085b825197acaa434a0a46b 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -86,6 +86,7 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_SCTP_RCVINFO,         "sctp_rcvinfo"    },
 	{ EXPR_SCTP_NXTINFO,         "sctp_nxtinfo"    },
 	{ EXPR_SCTP_RECVV_RN,        "sctp_recvv_rn "  },
+	{ EXPR_SCTP_ASSOC_CHANGE,    "sctp_assoc_change"},
 	{ EXPR_SCTP_SHUTDOWN_EVENT,  "sctp_shutdown_event"},
 	{ EXPR_SCTP_SENDER_DRY_EVENT,"sctp_sender_dry_event"},
 	{ EXPR_SCTP_SEND_FAILED_EVENT,"sctp_send_failed_event"},
@@ -432,6 +433,17 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_recvv_rn->recvv_rcvinfo);
 		free_expression(expression->value.sctp_recvv_rn->recvv_nxtinfo);
 		break;
+	case EXPR_SCTP_ASSOC_CHANGE:
+		free_expression(expression->value.sctp_assoc_change->sac_type);
+		free_expression(expression->value.sctp_assoc_change->sac_flags);
+		free_expression(expression->value.sctp_assoc_change->sac_length);
+		free_expression(expression->value.sctp_assoc_change->sac_state);
+		free_expression(expression->value.sctp_assoc_change->sac_error);
+		free_expression(expression->value.sctp_assoc_change->sac_outbound_streams);
+		free_expression(expression->value.sctp_assoc_change->sac_inbound_streams);
+		free_expression(expression->value.sctp_assoc_change->sac_assoc_id);
+		free_expression(expression->value.sctp_assoc_change->sac_info);
+		break;
 	case EXPR_SCTP_SHUTDOWN_EVENT:
 		free_expression(expression->value.sctp_shutdown_event->sse_type);
 		free_expression(expression->value.sctp_shutdown_event->sse_flags);
@@ -1362,6 +1374,62 @@ static int evaluate_sctp_recvv_rn_expression(struct expression *in,
 	return STATUS_OK;
 }
 
+static int evaluate_sctp_assoc_change_expression(struct expression *in,
+						       struct expression *out,
+						       char **error)
+{
+	struct sctp_assoc_change_expr *in_event;
+	struct sctp_assoc_change_expr *out_event;
+
+	assert(in->type == EXPR_SCTP_ASSOC_CHANGE);
+	assert(in->value.sctp_assoc_change);
+	assert(out->type == EXPR_SCTP_ASSOC_CHANGE);
+
+	out->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
+
+	in_event = in->value.sctp_assoc_change;
+	out_event = out->value.sctp_assoc_change;
+
+	if (evaluate(in_event->sac_type,
+		     &out_event->sac_type,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_flags,
+		     &out_event->sac_flags,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_length,
+		     &out_event->sac_length,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_state,
+		     &out_event->sac_state,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_error,
+		     &out_event->sac_error,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_outbound_streams,
+		     &out_event->sac_outbound_streams,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_inbound_streams,
+		     &out_event->sac_inbound_streams,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_assoc_id,
+		     &out_event->sac_assoc_id,
+		     error))
+		return STATUS_ERR;
+	if (evaluate(in_event->sac_info,
+		     &out_event->sac_info,
+		     error))
+		return STATUS_ERR;
+
+	return STATUS_OK;
+}
+
 static int evaluate_sctp_shutdown_event_expression(struct expression *in,
 						   struct expression *out,
 						   char **error)
@@ -1563,6 +1631,9 @@ static int evaluate(struct expression *in,
 	case EXPR_SCTP_RECVV_RN:
 		result = evaluate_sctp_recvv_rn_expression(in, out, error);
 		break;
+	case EXPR_SCTP_ASSOC_CHANGE:
+		result = evaluate_sctp_assoc_change_expression(in, out, error);
+		break;
 	case EXPR_SCTP_SHUTDOWN_EVENT:
 		result = evaluate_sctp_shutdown_event_expression(in, out, error);
 		break;
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 0f0763dc0b6295ff0e7dda089650f05eae75a9b4..fe4463278ac4f5c7abd38274f148f0acc058b70d 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -66,6 +66,7 @@ enum expression_t {
 	EXPR_SCTP_RCVINFO,        /* struct sctp_rcvinfo for syscall sctp_recvv */
 	EXPR_SCTP_NXTINFO,        /* struct sctp_nxtinfo for syscall sctp_recvv */
 	EXPR_SCTP_RECVV_RN,       /* struct sctp_recvv_rn for syscall sctp_recvv */
+	EXPR_SCTP_ASSOC_CHANGE,   /* expression tree for sctp_assoc_change_event */
 	EXPR_SCTP_SHUTDOWN_EVENT, /* expression tree for sctp_shutdown_event */
 	EXPR_SCTP_SENDER_DRY_EVENT, /* expression tree for sctp_sender_dry_event */
 	EXPR_SCTP_SEND_FAILED_EVENT, /* expression tree for sctp_send_failed_event */
@@ -108,6 +109,7 @@ struct expression {
 		struct sctp_rcvinfo_expr *sctp_rcvinfo;
 		struct sctp_nxtinfo_expr *sctp_nxtinfo;
 		struct sctp_recvv_rn_expr *sctp_recvv_rn;
+		struct sctp_assoc_change_expr *sctp_assoc_change;
 		struct sctp_shutdown_event_expr *sctp_shutdown_event;
 		struct sctp_sender_dry_event_expr *sctp_sender_dry_event;
 		struct sctp_send_failed_event_expr *sctp_send_failed_event;
@@ -321,6 +323,19 @@ struct sctp_recvv_rn_expr {
 	struct expression *recvv_nxtinfo;
 };
 
+/* Parse tree for sctp_assoc_change for notifications. */
+struct sctp_assoc_change_expr {
+	struct expression *sac_type;
+	struct expression *sac_flags;
+	struct expression *sac_length;
+	struct expression *sac_state;
+	struct expression *sac_error;
+	struct expression *sac_outbound_streams;
+	struct expression *sac_inbound_streams;
+	struct expression *sac_assoc_id;
+	struct expression *sac_info;
+};
+
 /* Parse tree for sctp_shutdown_event for notifications. */
 struct sctp_shutdown_event_expr {
 	struct expression *sse_type;
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index eef941bb2878ae2946b710a9dc88d6b1f791291e..a1aceb96f248cbfcd0b7e6d0fcf3572dc209391d 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -168,6 +168,7 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_PEER_ADDR_CHANGE,            "SCTP_PEER_ADDR_CHANGE"           },
 	{ SCTP_REMOTE_ERROR,                "SCTP_REMOTE_ERROR"               },
 	{ SCTP_SEND_FAILED,                 "SCTP_SEND_FAILED"                },
+	{ SCTP_ASSOC_CHANGE,                "SCTP_ASSOC_CHANGE"               },
 	{ SCTP_SHUTDOWN_EVENT,              "SCTP_SHUTDOWN_EVENT"             },
 	{ SCTP_SENDER_DRY_EVENT,            "SCTP_SENDER_DRY_EVENT"           },
 	{ SCTP_SEND_FAILED_EVENT,           "SCTP_SEND_FAILED_EVENT"          },
@@ -206,6 +207,15 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_RECVNXTINFO,                 "SCTP_RECVNXTINFO"                },
 	{ SCTP_DATA_SENT,                   "SCTP_DATA_SENT"                  },
 	{ SCTP_DATA_UNSENT,                 "SCTP_DATA_UNSENT"                },
+	{ SCTP_COMM_UP,                     "SCTP_COMM_UP"                    },
+	{ SCTP_COMM_LOST,                   "SCTP_COMM_LOST"                  },
+	{ SCTP_RESTART,                     "SCTP_RESTART"                    },
+	{ SCTP_SHUTDOWN_COMP,               "SCTP_SHUTDOWN_COMP"              },
+	{ SCTP_ASSOC_SUPPORTS_PR,           "SCTP_ASSOC_SUPPORTS_PR"          },
+	{ SCTP_ASSOC_SUPPORTS_AUTH,         "SCTP_ASSOC_SUPPORTS_AUTH"        },
+	{ SCTP_ASSOC_SUPPORTS_ASCONF,       "SCTP_ASSOC_SUPPORTS_ASCONF"      },
+	{ SCTP_ASSOC_SUPPORTS_MULTIBUF,     "SCTP_ASSOC_SUPPORTS_MULTIBUF"    },
+
 	/* /usr/include/netinet/tcp.h */
 	{ TCP_NODELAY,                      "TCP_NODELAY"                     },
 	{ TCP_MAXSEG,                       "TCP_MAXSEG"                      },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..88a49593e833e1363063e09c5680a5fc20992183
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_ASSOC_CHANGE, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=21, sac_state=SCTP_COMM_UP, sac_error=0, sac_outbound_streams=1, 
+sac_inbound_streams=1, sac_assoc_id=3, sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF, 0x00]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], 
+[MSG_NOTIFICATION|MSG_EOR]) 
+= 21
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=20, sac_state=SCTP_SHUTDOWN_COMP, sac_error=0, sac_outbound_streams=1, 
+sac_inbound_streams=1, sac_assoc_id=3, sac_info=[0]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_notifications.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt
similarity index 100%
rename from gtests/net/packetdrill/tests/bsd/sctp/sctp_notifications.pkt
rename to gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_notifications.pkt
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..69780e2574b8fe6729948c558e8225cd930d268e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_send_failed_event.pkt
@@ -0,0 +1,29 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address=..., spp_hbinterval=0, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=SPP_HB_DISABLE, 
+spp_ipv6_flowlabel=0, 
+spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SEND_FAILED_EVENT, se_on=1}, 8) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=100, srto_max=150, srto_min=50}, 16) = 0
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT, ssfe_flags=SCTP_DATA_SENT, ssfe_length=1032, ssfe_error=0,
+ssfe_info={snd_sid=0, snd_flags=3, snd_ppid=htonl(0), snd_context=0}, ssfe_assoc_id=3, ssfe_data=...}, iov_len=1000}],
+1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..bbca55239d311473133ee2758b7f5125c5553db6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_sender_dry_event.pkt
@@ -0,0 +1,27 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
+sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
+sctp_sender_dry_event=0}, 11) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
+//test for SENDER_DRY_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
++0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}],
+1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=0}, 8) = 0
+
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5488096702167b2676227eb07311a68f16270323
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
@@ -0,0 +1,22 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
+
+// Tear down the association
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
+//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
+//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12