--- openflow-2014-01-22-2.h	2015-07-23 09:54:17.924479394 -0700
+++ openflow-2014-07-18.h	2015-07-23 09:54:17.928479394 -0700
@@ -1,6 +1,6 @@
 /* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
  * Junior University
- * Copyright (c) 2011, 2013 Open Networking Foundation
+ * Copyright (c) 2011, 2013, 2014 Open Networking Foundation
  *
  * We are making the OpenFlow specification and associated documentation
  * (Software) available for public use and benefit with the expectation
@@ -1652,26 +1652,75 @@
                                bucket from matching group */ 
 };
 
+/* Group bucket property types.  */
+enum ofp_group_bucket_prop_type {
+    OFPGBPT_ACTIONS                = 0,  /* All types of groups. */
+    OFPGBPT_WEIGHT                 = 1,  /* Select groups only. */
+    OFPGBPT_WATCH_PORT             = 2,  /* Fast failover groups only. */
+    OFPGBPT_WATCH_GROUP            = 3,  /* Fast failover groups only. */
+    OFPGBPT_EXPERIMENTER      = 0xFFFF,  /* Experimenter defined. */
+};
+
+/* Common header for all group bucket properties. */
+struct ofp_group_bucket_prop_header {
+    uint16_t         type;    /* One of OFPGBPT_*. */
+    uint16_t         length;  /* Length in bytes of this property. */
+};
+OFP_ASSERT(sizeof(struct ofp_group_bucket_prop_header) == 4);
+
+/* Group bucket actions property. */
+struct ofp_group_bucket_prop_actions {
+    uint16_t         type;    /* OFPGBPT_ACTIONS. */
+    uint16_t         length;  /* Length in bytes of this property. */
+    uint8_t pad[4];           /* Pad to 64 bits. */
+    struct ofp_action_header actions[0]; /* Exactly length - 8 bytes long. */
+};
+OFP_ASSERT(sizeof(struct ofp_group_bucket_prop_actions) == 8);
+
+/* Group bucket weight property, for select groups only. */
+struct ofp_group_bucket_prop_weight {
+    uint16_t         type;    /* OFPGBPT_WEIGHT. */
+    uint16_t         length;  /* 8. */
+    uint16_t         weight;  /* Relative weight of bucket. */
+    uint8_t          pad[2];  /* Pad to 64 bits. */
+};
+OFP_ASSERT(sizeof(struct ofp_group_bucket_prop_weight) == 8);
+
+/* Group bucket watch port or watch group property, for fast failover groups
+ * only. */
+struct ofp_group_bucket_prop_watch {
+    uint16_t         type;    /* OFPGBPT_WATCH_PORT or OFPGBPT_WATCH_GROUP. */
+    uint16_t         length;  /* 8. */
+    uint32_t         watch;   /* The port or the group.  */
+};
+OFP_ASSERT(sizeof(struct ofp_group_bucket_prop_watch) == 8);
+
+/* Experimenter group bucket property */
+struct ofp_group_bucket_prop_experimenter {
+    uint16_t         type;         /* OFPGBPT_EXPERIMENTER. */
+    uint16_t         length;       /* Length in bytes of this property. */
+    uint32_t         experimenter;  /* Experimenter ID which takes the same
+                                       form as in struct
+                                       ofp_experimenter_header. */
+    uint32_t         exp_type;      /* Experimenter defined. */
+    /* Followed by:
+     *   - Exactly (length - 12) bytes containing the experimenter data, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint32_t         experimenter_data[0];
+};
+OFP_ASSERT(sizeof(struct ofp_group_bucket_prop_experimenter) == 12);
+
 /* Bucket for use in groups. */
 struct ofp_bucket {
     uint16_t len;                   /* Length of the bucket in bytes, including
                                        this header and any padding to make it
                                        64-bit aligned. */
-    uint16_t weight;                /* Relative weight of bucket.  Only
-                                       defined for select groups. */
-    uint32_t watch_port;            /* Port whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32_t watch_group;           /* Group whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32_t bucket_id;             /* Bucket Id used to identify bucket*/ 
-    struct ofp_action_header actions[0]; /* 0 or more actions associated with
-                                            the bucket - The action list length
-                                            is inferred from the length
-                                            of the bucket. */
+    uint8_t pad[2];                 /* Pad to 32 bits. */
+    uint32_t bucket_id;             /* Bucket Id used to identify bucket*/
+    /* Followed by exactly len - 8 bytes of group bucket properties. */
 };
-OFP_ASSERT(sizeof(struct ofp_bucket) == 16);
+OFP_ASSERT(sizeof(struct ofp_bucket) == 8);
 
 /* Bucket Id can be any value between 0 and OFPG_BUCKET_MAX */ 
 enum ofp_group_bucket { 
@@ -1701,7 +1750,7 @@
     uint32_t command_bucket_id;   /* Bucket Id used as part of 
                                      OFPGC_INSERT_BUCKET and OFPGC_REMOVE_BUCKET
                                      commands execution.*/
-    ofp_bucket buckets[0];        /* The length of the bucket array is
+    struct ofp_bucket buckets[0]; /* The length of the bucket array is
                                      bucket_list_len bytes. */
 };
 OFP_ASSERT (sizeof(struct ofp_group_mod) == 24); 
