diff --git a/commerce_physical.module b/commerce_physical.module
index dde39e2..8ab2207 100644
--- a/commerce_physical.module
+++ b/commerce_physical.module
@@ -19,25 +19,67 @@
  *   if none was found.
  */
 function commerce_physical_entity_weight_field_name($entity_type, $entity) {
+
+  $field_name = commerce_physical_entity_field_name($entity_type, $entity, 'physical_weight');
+
+  // Allow other modules to specify a different field name.
+  drupal_alter('commerce_physical_entity_weight_field_name', $field_name, $entity_type, $entity);
+
+  return $field_name;
+}
+
+/**
+ * Determines the dimensions field to use for a given entity.
+ *
+ * @param $entity_type
+ *   The type of entity passed to the function.
+ * @param $entity
+ *   The actual entity whose weight field name should be determined.
+ *
+ * @return
+ *   The name of the field to use on the entity to find a weight value or NULL
+ *   if none was found.
+ */
+function commerce_physical_entity_dimensions_field_name($entity_type, $entity) {
+
+  $field_name = commerce_physical_entity_field_name($entity_type, $entity, 'physical_dimensions');
+
+  // Allow other modules to specify a different field name.
+  drupal_alter('commerce_physical_entity_dimensions_field_name', $field_name, $entity_type, $entity);
+
+  return $field_name;
+}
+
+/**
+ * Determines the field of a certain type to use for a given entity.
+ *
+ * @param $entity_type
+ *   The type of entity passed to the function.
+ * @param $entity
+ *   The actual entity whose weight field name should be determined.
+ * @param $field_type
+ *
+ * @return
+ *   The name of the field to use on the entity to find a weight value or NULL
+ *   if none was found.
+ */
+function commerce_physical_entity_field_name($entity_type, $entity, $field_type) {
   $bundle = field_extract_bundle($entity_type, $entity);
   $field_name = NULL;
 
-  // Look for the first weight field available for the entity.
+  // Look for the first field available for the entity.
   foreach (field_info_instances($entity_type, $bundle) as $instance_name => $instance) {
     // Load the field info for the current instance.
     $field = field_info_field($instance['field_name']);
 
     // If it's of the proper type...
-    if ($field['type'] == 'physical_weight') {
+    if ($field['type'] == $field_type) {
       // Save its name and exit the loop.
       $field_name = $instance_name;
       break;
     }
   }
 
-  // Allow other modules to specify a different field name.
-  drupal_alter('commerce_physical_entity_weight_field_name', $field_name, $entity_type, $entity);
-
   return $field_name;
 }
 
@@ -81,6 +123,48 @@ function commerce_physical_product_line_item_weight($line_item) {
 }
 
 /**
+ * Determines the dimensions of a product line item on an order.
+ *
+ * @param $line_item
+ *   A product line item whose dimensions should be determined.
+ *
+ * @return
+ *   An array of dimensions field value arrays. There'll be one entry in the
+ *   array per product, with the entry being an array of that product's
+ *   dimensions. If this line item contains no products with dimensions, an
+ *   empty array will be returned.
+ */
+function commerce_physical_product_line_item_dimensions($line_item) {
+  $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
+  $dimensions = array();
+
+  // If the line item references a valid product...
+  if (!empty($line_item_wrapper->commerce_product)) {
+    $product = $line_item_wrapper->commerce_product->value();
+
+    if (!empty($product)) {
+      // If the product has a valid dimensions field...
+      $field_name = commerce_physical_entity_dimensions_field_name('commerce_product', $product);
+
+      if (!empty($field_name) && !empty($product->{$field_name})) {
+        $product_wrapper = entity_metadata_wrapper('commerce_product', $product);
+
+        // Add dimension values per product in the line item.
+        for ($i=0; $i < $line_item->quantity; $i++) {
+          $dimensions[] = $product_wrapper->{$field_name}->value();
+        }
+      }
+    }
+  }
+
+  // Allow other modules to alter the weight if necessary.
+  drupal_alter('commerce_physical_product_line_item_dimensions', $dimensions, $line_item);
+
+  return $dimensions;
+}
+
+
+/**
  * Determines the weight of an entire order.
  *
  * @param $order
@@ -122,124 +206,46 @@ function commerce_physical_order_weight($order, $unit = 'lb') {
   return $weight;
 }
 
-
-/**
- * Determines the dimensions field to use for a given entity.
- *
- * @param $entity_type
- *   The type of entity passed to the function.
- * @param $entity
- *   The actual entity whose dimensions field name should be determined.
- *
- * @return
- *   The name of the field to use on the entity to find a dimensions value or
- *   NULL if none was found.
- */
-function commerce_physical_entity_dimensions_field_name($entity_type, $entity) {
-  $bundle = field_extract_bundle($entity_type, $entity);
-  $field_name = NULL;
-
-  // Look for the first dimensions field available for the entity.
-  foreach (field_info_instances($entity_type, $bundle) as $instance_name => $instance) {
-    // Load the field info for the current instance.
-    $field = field_info_field($instance['field_name']);
-
-    // If it's of the proper type...
-    if ($field['type'] == 'physical_dimensions') {
-      // Save its name and exit the loop.
-      $field_name = $instance_name;
-      break;
-    }
-  }
-
-  // Allow other modules to specify a different field name.
-  drupal_alter('commerce_physical_entity_dimensions_field_name', $field_name, $entity_type, $entity);
-
-  return $field_name;
-}
-
-/**
- * Determines the dimensions to use for a product line item on an order.
- *
- * @param $line_item
- *   A product line item whose single quantity dimensions should be determined.
- *
- * @return
- *   A dimensions field value array representing the dimensions of a single
- *   product referenced by the line item or NULL if no dimensions were found.
- */
-function commerce_physical_product_line_item_dimensions($line_item) {
-  $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
-  $dimensions = NULL;
-
-  // If the line item references a valid product...
-  if (!empty($line_item_wrapper->commerce_product)) {
-    $product = $line_item_wrapper->commerce_product->value();
-
-    if (!empty($product)) {
-      // If the product has a valid dimensions field...
-      $field_name = commerce_physical_entity_dimensions_field_name('commerce_product', $product);
-
-      if (!empty($field_name) && !empty($product->{$field_name})) {
-        // Extract the dimensions value from the product.
-        $product_wrapper = entity_metadata_wrapper('commerce_product', $product);
-        $dimensions = $product_wrapper->{$field_name}->value();
-      }
-    }
-  }
-
-  // Allow other modules to alter the volume if necessary.
-  drupal_alter('commerce_physical_product_line_item_dimensions', $dimensions, $line_item);
-
-  return $dimensions;
-}
-
 /**
- * Determines the volume of an entire order.
+ * Determines the dimensions of each product in an entire order.
+ * Other code can then use this data to figure out things like what the maximum
+ * dimensions of any product in the order is, or what size shipping container
+ * everything will fit into.
  *
  * @param $order
- *   The order object whose volume should be calculated.
+ *   The order object whose dimensions should be returned.
  * @param $unit
- *   The unit of measurement to convert dimensions to before calculating the
- *   volume of the order in the related cubic unit.
+ *   The unit of measurement to use for the returned dimensions.
  *
  * @return
- *   A volume value array with keys representing the total 'volume' of the order
- *   in the 'unit' specified or NULL if no volume could be determined.
+ *   An array of dimension arrays. One per product in the order.
+ *   weight field value array representing the total weight of the order using
+ *   the specified unit of measurement or NULL if no weight could be determined.
  */
-function commerce_physical_order_volume($order, $unit = 'in') {
+function commerce_physical_order_dimensions($order, $unit = 'cm') {
   $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
-  $volume = NULL;
+
+  $order_dimensions = array();
 
   // Loop over each line item on the order.
   foreach ($order_wrapper->commerce_line_items as $delta => $line_item_wrapper) {
-    // Get the dimensions value of product line items.
+    // Get the weight value of product line items.
     if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
       $line_item_dimensions = commerce_physical_product_line_item_dimensions($line_item_wrapper->value());
 
-      // Add it to the running total converting it to the required weight unit.
-      if (!physical_field_is_empty($line_item_dimensions, array('type' => 'physical_dimensions'))) {
-        $converted_dimensions = physical_dimensions_convert($line_item_dimensions, $unit);
-        $converted_dimensions['volume'] = $converted_dimensions['width'] * $converted_dimensions['length'] * $converted_dimensions['height'] * $line_item_wrapper->quantity->value();
-
-        if (empty($volume['volume'])) {
-          // Create a volume value array using the converted unit type.
-          $volume = array(
-            'volume' => $converted_dimensions['volume'],
-            'unit' => $unit,
-          );
-        }
-        else {
-          $volume['volume'] += $converted_dimensions['volume'];
-        }
-      }
+      $order_dimensions = array_merge($order_dimensions, $line_item_dimensions);
     }
   }
 
-  // Allow other modules to alter the volume if necessary.
-  drupal_alter('commerce_physical_order_volume', $volume, $order, $unit);
+  // Now ensure that all dimensions supplied are in the requested units
+  foreach ($order_dimensions as $key => $dimensions) {
+    $order_dimensions[$key] = physical_dimensions_convert($dimensions, $unit);
+  }
+
+  // Allow other modules to alter the weight if necessary.
+  drupal_alter('commerce_physical_order_dimensions', $order_dimensions, $order, $unit);
 
-  return $volume;
+  return $order_dimensions;
 }
 
 /**
diff --git a/commerce_physical.rules.inc b/commerce_physical.rules.inc
new file mode 100644
index 0000000..d7fbbb3
--- /dev/null
+++ b/commerce_physical.rules.inc
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Implements hook_rules_condition_info().
+ */
+function commerce_physical_rules_condition_info() {
+
+  $conditions = array();
+
+  $conditions['commerce_physical_rules_order_is_under_weight_limit'] = array(
+    'label' => t("Order's total weight is under a chosen limit"),
+    'parameter' => array(
+      'order' => array(
+        'type' => 'commerce_order',
+        'label' => t('Order'),
+      ),
+      'limit' => array(
+        'type' => 'decimal',
+        'label' => t('Weight limit (kg)'),
+      ),
+    ),
+    'group' => t('Commerce Physical'),
+    'callbacks' => array(
+      'execute' => 'commerce_physical_rules_order_is_under_weight_limit',
+    ),
+  );
+
+  $conditions['commerce_physical_rules_order_maximum_dimension_is_under_size'] = array(
+    'label' => t("The maximum dimension of any product in the order is under a certain size"),
+    'parameter' => array(
+      'order' => array(
+        'type' => 'commerce_order',
+        'label' => t('Order'),
+      ),
+      'limit' => array(
+        'type' => 'decimal',
+        'label' => t('Size limit (cm)'),
+      ),
+    ),
+    'group' => t('Commerce Physical'),
+    'callbacks' => array(
+      'execute' => 'commerce_physical_rules_order_maximum_dimension_is_under_size',
+    ),
+  );
+
+  return $conditions;
+}
+
+/**
+ * Rules condition: checks to see if the maximum dimension of any product in the
+ * order is under a certain size
+ */
+function commerce_physical_rules_order_maximum_dimension_is_under_size($order, $limit) {
+
+  $max_dimension = 0;
+
+  $dimension_keys = array(
+    'length',
+    'width',
+    'height',
+  );
+
+  // Get the dimensions of every product in the order
+  foreach (commerce_physical_order_dimensions($order, 'cm') as $dimension) {
+
+    // Check each of length / width / height
+    foreach ($dimension_keys as $dimension_key) {
+
+      // If this dimension's bigger than the current max, it's the new max.
+      if ($dimension[$dimension_key] > $max_dimension) {
+        $max_dimension = $dimension[$dimension_key];
+      }
+    }
+  }
+
+  if ($max_dimension > $limit) {
+    // Total size is over the limit. This condition fails:
+    return FALSE;
+  }
+
+  // Otherwise, this condition passes:
+  return TRUE;
+}
+
+/**
+ * Rules condition: checks to see if the given order's total weight is under a
+ * certain limit.
+ */
+function commerce_physical_rules_order_is_under_weight_limit($order, $limit) {
+
+  $order_weight = commerce_physical_order_weight($order, 'kg');
+
+  if ($order_weight['weight'] > $limit) {
+    // Total weight is over the limit. This condition fails:
+    return FALSE;
+  }
+
+  // Otherwise, this condition passes:
+  return TRUE;
+}
