diff --git a/includes/commerce_australia_post.json.inc b/includes/commerce_australia_post.json.inc
index 1d07db6..4b4470b 100644
--- a/includes/commerce_australia_post.json.inc
+++ b/includes/commerce_australia_post.json.inc
@@ -45,7 +45,16 @@ function commerce_australia_post_build_rate_request($order) {
     return FALSE;
   }
 
-  $number_of_packages = ceil($volume['volume'] / $default_package_volume);
+  // Ensure each line item is shippable on its own before splitting in to packages.
+  $weight_limit = $shipping_address['country'] == 'AU' ? 22 : 20;
+  if (!commerce_australia_post_order_is_shippable($order, $weight_limit, $default_package_volume)) {
+    return FALSE;
+  }
+
+  // Split up packages by weight and/or volume.
+  $packages_by_weight = ceil($weight['weight'] / $weight_limit);
+  $packages_by_volume = ceil($volume['volume'] / $default_package_volume);
+  $number_of_packages = max($packages_by_weight, $packages_by_weight);
 
   // Ship To - Customer Shipping Address.
   // Prepare the shipping address for use in the request.
@@ -113,3 +122,32 @@ function commerce_australia_post_api_request($attributes, $destination = 'domest
     return FALSE;
   }
 }
+
+/**
+ * Determines if each line item is shippable on its own.
+ */
+function commerce_australia_post_order_is_shippable($order, $weight_limit, $volume_limit) {
+  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  foreach ($order_wrapper->commerce_line_items as $delta => $line_item_wrapper) {
+    if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
+      $line_item_weight = commerce_physical_product_line_item_weight($line_item_wrapper->value());
+      if (!empty($line_item_weight['weight'])) {
+        $converted_weight = physical_weight_convert($line_item_weight, 'kg');
+        if ($converted_weight['weight'] > $weight_limit) {
+          return FALSE;
+        }
+      }
+
+      $line_item_dimensions = commerce_physical_product_line_item_dimensions($line_item_wrapper->value());
+      if (!physical_field_is_empty($line_item_dimensions, array('type' => 'physical_dimensions'))) {
+        $converted_dimensions = physical_dimensions_convert($line_item_dimensions, 'cm');
+        $converted_dimensions['volume'] = $converted_dimensions['width'] * $converted_dimensions['length'] * $converted_dimensions['height'];
+        $volume = $converted_dimensions['volume'];
+        if ($volume > $volume_limit) {
+          return FALSE;
+        }
+      }
+    }
+  }
+  return TRUE;
+}
