diff --git a/commerce_paypal/modules/wps/commerce_paypal_wps.module b/commerce_paypal/modules/wps/commerce_paypal_wps.module
index ba21c95..344d448 100755
--- a/commerce_paypal/modules/wps/commerce_paypal_wps.module
+++ b/commerce_paypal/modules/wps/commerce_paypal_wps.module
@@ -326,17 +326,46 @@ function commerce_paypal_wps_order_form($form, &$form_state, $order, $settings)
 
   // Append items in cart to the $data array if setting is enabled.
   if ($settings['paypal_cart_type'] == 'send_cart') {
+    // First add products to array.
     $product_count = 0;
     foreach ($wrapper->commerce_line_items as $delta => $line_item_wrapper) {
       if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
+        $line_item_price = $line_item_wrapper->commerce_unit_price->amount->value() / 100;
+        
+        // If product is 0 priced (a free product), which must skip this line item because it breaks Paypal.
+        // There is no way to fix this and Paypal will not fix this. The free line item will still appear in the commerce order.
+        if ($line_item_price <= 0) {
+          continue;
+        }
+      
         $product_count++;
         $data['item_name_' . $product_count] = $line_item_wrapper->commerce_product->title->value();
         // Divide price by 100 to add decimal point.
-        $data['amount_' . $product_count] = $line_item_wrapper->commerce_unit_price->amount->value() / 100;
+        $data['amount_' . $product_count] = $line_item_price;
         $data['quantity_' . $product_count] = round($line_item_wrapper->quantity->value(), 2);
       }
     }
+    
+    // Now add shipping as a single cost.
+    if (is_array($order->commerce_line_items[LANGUAGE_NONE])) {
+      $line_item_ids = array();
+      $line_items = $order->commerce_line_items[LANGUAGE_NONE];
+
+      foreach($line_items as $k => $v) {
+        $line_item_ids[$k] = $v['line_item_id'];
+      }
+    }
+
+    $shipping_line_item = commerce_line_item_load_multiple($line_item_ids, $conditions = array('type' => 'shipping'));
+    $shipping_price = 0;
+    foreach($shipping_line_item as $j => $w) {
+      $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $shipping_line_item[$j]);
+      $shipping_price_item = $line_item_wrapper->commerce_unit_price->value();
+      $shipping_price += $shipping_price_item['amount'];
+    }
+    $data['shipping_1'] = $shipping_price / 100;
   }
+    
   // Define a single item in the cart representing the whole order
   else {
     $data['on0_1'] = t('Product count');
@@ -344,7 +373,29 @@ function commerce_paypal_wps_order_form($form, &$form_state, $order, $settings)
     $data['amount_1'] = round(commerce_currency_amount_to_decimal($amount, $currency_code), 2);
     $data['item_name_1'] = t('Order @order_number at @store', array('@order_number' => $order->order_number, '@store' => variable_get('site_name', url('<front>', array('absolute' => TRUE)))));
   }
+  
+  // Pass billing information to Paypal.
+  $paypal_address = '';
+  if ($wrapper->commerce_customer_billing->commerce_customer_address->value()) {
+    $paypal_address = $wrapper->commerce_customer_billing->commerce_customer_address->value();
+  }
+  elseif ($wrapper->commerce_customer_shipping->commerce_customer_address->value()) {
+    $paypal_address = $wrapper->commerce_customer_shipping->commerce_customer_address->value();
+  }
 
+  // Set address in Paypal data array.
+  if (is_array($paypal_address)) {
+    $data['first_name'] = $paypal_address['first_name'];
+    $data['last_name '] = $paypal_address['last_name'];
+    $data['address1'] = $paypal_address['thoroughfare'];
+    $data['address2'] = $paypal_address['premise'];
+    $data['city'] = $paypal_address['locality'];
+    $data['state'] = $paypal_address['administrative_area'];
+    $data['zip'] = $paypal_address['postal_code'];
+    $data['country'] = $paypal_address['country'];
+    $data['email'] = $wrapper->mail->value();
+  }
+  
   $form['#action'] = commerce_paypal_wps_server_url($settings['server']);
 
   foreach ($data as $name => $value) {
