diff --git a/modules/commerce_file_bundle/commerce_file_bundle.info b/modules/commerce_file_bundle/commerce_file_bundle.info
new file mode 100644
index 0000000..82b3796
--- /dev/null
+++ b/modules/commerce_file_bundle/commerce_file_bundle.info
@@ -0,0 +1,6 @@
+name = Commerce File Bundle
+description = Create file product bundles
+core = 7.x
+package = Commerce (contrib)
+
+dependencies[] = commerce_file
diff --git a/modules/commerce_file_bundle/commerce_file_bundle.module b/modules/commerce_file_bundle/commerce_file_bundle.module
new file mode 100644
index 0000000..d497913
--- /dev/null
+++ b/modules/commerce_file_bundle/commerce_file_bundle.module
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Provides integration of file licenses with commerce bundle
+ */
+
+/*
+ * Implements hook_entity_load()
+ */
+function commerce_file_bundle_entity_load($entities, $type) {
+  if ($type != 'commerce_line_item') {
+    return;
+  }
+
+  foreach ($entities as $line_item) {
+    $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
+    $product_id = $line_item_wrapper->commerce_product->product_id->value();
+    $product = commerce_product_load($product_id);
+
+    if (in_array($product->type, commerce_file_bundle_product_types())) {
+      $line_item->{_commerce_file_get_field_names('line_item_files')}[LANGUAGE_NONE] = commerce_file_bundle_extract_referenced_commerce_files('commerce_product', $product->type, $product);
+    }
+  }
+
+}
+
+/**
+ * Extract commerce_file fields from any entity.
+ *
+ * @param $entity_type
+ *   The entity type for which to return commerce files.
+ * @param $bundle_name
+ *   The bundle name for which to return commerce files.
+ * @param $entity
+ *   The entity containing the fields to be checked.
+ *
+ * @return
+ *   If commerce files exist in entity an array containing them, else empty array.
+ */
+function commerce_file_bundle_extract_referenced_commerce_files($entity_type, $bundle_name, $entity) {
+  $files = array();
+
+  foreach (commerce_file_bundle_get_product_ids($entity_type, $bundle_name, $entity) as $product_id) {
+    $file_product = commerce_product_load($product_id);
+    $file_product_wrapper = entity_metadata_wrapper('commerce_product', $file_product);
+    $field_type = COMMERCE_FILE_FIELD_TYPE;
+
+    foreach (field_info_fields() as $field_name => $field) {
+      if ($field['type'] == $field_type && isset($file_product->{$field_name})) {
+        $files = array_merge($files, $file_product_wrapper->{$field_name}->value());
+      }
+    }
+  }
+  return $files;
+}
+
+/**
+ * Extract commerce_product_reference product ids from any entity.
+ *
+ * @param $entity_type
+ *   The entity type for which to return product ids.
+ * @param $bundle_name
+ *   The bundle name for which to return product ids.
+ * @param $entity
+ *   The entity containing the fields to be checked.
+ *
+ * @return
+ *   If product ids exist in entity an array containing them, else empty array.
+ */
+function commerce_file_bundle_get_product_ids($entity_type, $bundle_name, $entity) {
+
+  $product_ids = array();
+
+  foreach (field_info_instances($entity_type, $bundle_name) as $instance) {
+    $field = field_info_field($instance['field_name']);
+    if ($field['type'] == 'commerce_product_reference') {
+      $items = field_get_items($entity_type, $entity, $field['field_name']);
+      if ($items) {
+        foreach ($items as $item) {
+          $product_ids[] = $item['product_id'];
+        }
+      }
+    }
+  }
+
+  return $product_ids;
+}
+
+/*
+ * Retrieve product types that reference other products.
+ */
+function commerce_file_bundle_product_types() {
+  $product_types = array();
+  foreach (field_info_instances('commerce_product') as $instances) {
+    foreach ($instances as $instance) {
+      $field = field_info_field($instance['field_name']);
+      if ($field['type'] == 'commerce_product_reference' && !in_array($instance['bundle'], $product_types)) {
+        $product_types[] = $instance['bundle'];
+      }
+    }
+  }
+  return $product_types;
+}
