--- openflow-2014-10-21-3.h	2015-07-23 09:54:17.908479393 -0700
+++ openflow-2013-12-20.h	2015-07-23 09:54:17.912479393 -0700
@@ -1646,6 +1646,10 @@
     OFPGC_ADD    = 0,       /* New group. */
     OFPGC_MODIFY = 1,       /* Modify all matching groups. */
     OFPGC_DELETE = 2,       /* Delete all matching groups. */
+    OFPGC_INSERT_BUCKET = 3,/* Insert action buckets to the already available 
+                               list of action buckets in a matching group */ 
+    OFPGC_REMOVE_BUCKET = 4 /* Remove all action buckets or any specific action 
+                               bucket from matching group */ 
 };
 
 /* Bucket for use in groups. */
@@ -1661,7 +1665,7 @@
     uint32_t watch_group;           /* Group whose state affects whether this
                                        bucket is live.  Only required for fast
                                        failover groups. */
-    uint8_t pad[4];
+    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
@@ -1669,6 +1673,22 @@
 };
 OFP_ASSERT(sizeof(struct ofp_bucket) == 16);
 
+/* Bucket Id can be any value between 0 and OFPG_BUCKET_MAX */ 
+enum ofp_group_bucket { 
+    OFPG_BUCKET_MAX   = 0xffffff00, /* Last usable bucket ID */ 
+    OFPG_BUCKET_FIRST = 0xfffffffd, /* First bucket ID in the list of action 
+                                       buckets of a group. This is applicable 
+                                       for OFPGC_INSERT_BUCKET and 
+                                       OFPGC_REMOVE_BUCKET commands */ 
+    OFPG_BUCKET_LAST  = 0xfffffffe, /* Last bucket ID in the list of action 
+                                       buckets of a group. This is applicable 
+                                       for OFPGC_INSERT_BUCKET and 
+                                       OFPGC_REMOVE_BUCKET commands */ 
+    OFPG_BUCKET_ALL   = 0xffffffff  /* All action buckets in a group,
+                                       This is applicable for 
+                                       only OFPGC_REMOVE_BUCKET command */ 
+};
+
 /* Group setup and teardown (controller -> datapath). */
 struct ofp_group_mod {
     struct ofp_header header;
@@ -1676,10 +1696,16 @@
     uint8_t type;                 /* One of OFPGT_*. */
     uint8_t pad;                  /* Pad to 64 bits. */
     uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0]; /* The length of the bucket array is inferred
+    uint16_t bucket_list_len;     /* Length of action buckets data. Length is 
+                                     padded to 64 bits*/ 
+    uint8_t pad1[2];              /* Pad to 64 bits. */ 
+    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 inferred
                                      from the length field in the header. */
 };
-OFP_ASSERT(sizeof(struct ofp_group_mod) == 16);
+OFP_ASSERT (sizeof(struct ofp_group_mod) == 24); 
 
 /* Group types.  Values in the range [128, 255] are reserved for experimental
  * use. */
@@ -2025,6 +2051,9 @@
     OFPGMFC_BAD_BUCKET           = 12, /* Error in bucket. */
     OFPGMFC_BAD_WATCH            = 13, /* Error in watch port/group. */
     OFPGMFC_EPERM                = 14, /* Permissions error. */
+    OFPGMFC_UNKNOWN_BUCKET       = 15, /* Not valid bucket identifier used in
+                                          INSERT BUCKET or REMOVE BUCKET 
+                                          command*/
 };
 
 /* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
