return 0;
 }
 
+static int gb_control_get_bundle_version(struct gb_control *control,
+                                               struct gb_bundle *bundle)
+{
+       struct gb_interface *intf = control->connection->intf;
+       struct gb_control_bundle_version_request request;
+       struct gb_control_bundle_version_response response;
+       int ret;
+
+       request.bundle_id = bundle->id;
+
+       ret = gb_operation_sync(control->connection,
+                               GB_CONTROL_TYPE_BUNDLE_VERSION,
+                               &request, sizeof(request),
+                               &response, sizeof(response));
+       if (ret) {
+               dev_err(&intf->dev,
+                               "failed to get bundle %u class version: %d\n",
+                               bundle->id, ret);
+               return ret;
+       }
+
+       bundle->class_major = response.major;
+       bundle->class_minor = response.minor;
+
+       dev_dbg(&intf->dev, "%s - %u: %u.%u\n", __func__, bundle->id,
+                       response.major, response.minor);
+
+       return 0;
+}
+
+int gb_control_get_bundle_versions(struct gb_control *control)
+{
+       struct gb_interface *intf = control->connection->intf;
+       struct gb_bundle *bundle;
+       int ret;
+
+       if (!control->has_bundle_version)
+               return 0;
+
+       list_for_each_entry(bundle, &intf->bundles, links) {
+               ret = gb_control_get_bundle_version(control, bundle);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 /* Get Manifest's size from the interface */
 int gb_control_get_manifest_size_operation(struct gb_interface *intf)
 {
        if (ret)
                goto err_disable_connection;
 
+       if (control->protocol_major > 0 || control->protocol_minor > 1)
+               control->has_bundle_version = true;
+
        return 0;
 
 err_disable_connection:
 
 
        u8 protocol_major;
        u8 protocol_minor;
+
+       bool has_bundle_version;
 };
 
 struct gb_control *gb_control_create(struct gb_interface *intf);
 void gb_control_disable(struct gb_control *control);
 void gb_control_destroy(struct gb_control *control);
 
+int gb_control_get_bundle_versions(struct gb_control *control);
 int gb_control_connected_operation(struct gb_control *control, u16 cport_id);
 int gb_control_disconnected_operation(struct gb_control *control, u16 cport_id);
 int gb_control_get_manifest_size_operation(struct gb_interface *intf);
 
 #define GB_CONTROL_TYPE_CONNECTED              0x05
 #define GB_CONTROL_TYPE_DISCONNECTED           0x06
 #define GB_CONTROL_TYPE_INTERFACE_VERSION      0x0a
+#define GB_CONTROL_TYPE_BUNDLE_VERSION         0x0b
 
 struct gb_control_version_request {
        __u8    major;
        __u8    minor;
 } __packed;
 
+struct gb_control_bundle_version_request {
+       __u8    bundle_id;
+} __packed;
+
+struct gb_control_bundle_version_response {
+       __u8    major;
+       __u8    minor;
+} __packed;
+
 /* Control protocol manifest get size request has no payload*/
 struct gb_control_get_manifest_size_response {
        __le16                  size;