diff --git a/uc_migs.lib.inc b/uc_migs.lib.inc
index 7903909..7364d65 100644
--- a/uc_migs.lib.inc
+++ b/uc_migs.lib.inc
@@ -7,11 +7,14 @@
  * @return string URL for redirect
  */
 function _uc_migs_migs_do_url($args) {
-  $md5HashData = $args['secure_secret'] . $args['vpc_AccessCode'] . $args['vpc_Amount'] . 'pay' . $args['vpc_Locale'] . $args['vpc_MerchTxnRef'] . $args['vpc_Merchant'] . $args['vpc_OrderInfo'] . $args['vpc_ReturnURL'] . $args['vpc_Version'];
+  $args['vpc_Gateway'] = (!empty($args['vpc_card'])) ? 'ssl' : '';
+  $md5HashData = $args['secure_secret'] . $args['vpc_AccessCode'] . $args['vpc_Amount'] . $args['vpc_card'] . 'pay' . $args['vpc_Gateway'] . $args['vpc_Locale'] . $args['vpc_MerchTxnRef'] . $args['vpc_Merchant'] . $args['vpc_OrderInfo'] . $args['vpc_ReturnURL'] . $args['vpc_Version']  ;
   $url = variable_get('uc_migs_base_url', UC_MIGS_BASE_URL) . '?' .
     'vpc_AccessCode='   . urlencode($args['vpc_AccessCode']) .
     '&vpc_Amount='      . urlencode($args['vpc_Amount']) .
+    (!empty($args['vpc_card']) ? '&vpc_Card=' . urlencode($args['vpc_card']) : '') .
     '&vpc_Command='     . urlencode('pay') .
+    (!empty($args['vpc_card']) ? '&vpc_Gateway=' . urlencode($args['vpc_Gateway']) : '') .
     '&vpc_Locale='      . urlencode($args['vpc_Locale']) .
     '&vpc_MerchTxnRef=' . urlencode($args['vpc_MerchTxnRef']) .
     '&vpc_Merchant='    . urlencode($args['vpc_Merchant']) .
@@ -283,26 +286,31 @@ function _uc_migs_card_types() {
       'name' => 'MasterCard',
       'logo_remote' => 'https://migs.mastercard.com.au/res/svr/default/images/cards/card_sm_masterc.gif',
       'logo_local' => variable_get('uc_migs_logo_mastercard', file_directory_path() .'/uc_migs/mastercard.gif'),
+      'code' => 'Mastercard',
     ),
     'visa' => array(
       'name' => 'VISA',
       'logo_remote' => 'https://migs.mastercard.com.au/res/svr/default/images/cards/card_sm_visa.gif',
       'logo_local' => variable_get('uc_migs_logo_visa', file_directory_path() .'/uc_migs/visa.gif'),
+      'code' => 'Visa',
     ),
     'amex' => array(
       'name' => 'American Express',
       'logo_remote' => 'https://migs.mastercard.com.au/res/svr/default/images/cards/card_sm_amex.gif',
       'logo_local' => variable_get('uc_migs_logo_amex', file_directory_path() .'/uc_migs/amex.gif'),
+      'code' => 'Amex'
     ),
     'jcb' => array(
       'name' => 'JCB',
       'logo_remote' => 'https://migs.mastercard.com.au/res/svr/default/images/cards/card_sm_jcb.gif',
       'logo_local' => variable_get('uc_migs_logo_jcb', file_directory_path() .'/uc_migs/jcb.gif'),
+      'code' => 'JCB',
     ),
     'diners' => array(
       'name' => 'Diners Club',
       'logo_remote' => 'https://migs.mastercard.com.au/res/svr/default/images/cards/card_sm_dinersclub.gif',
       'logo_local' => variable_get('uc_migs_logo_diners', file_directory_path() .'/uc_migs/diners.gif'),
+      'code' => 'Dinersclub',
     ),
   );
   foreach ($card_types as &$card_type) {
@@ -311,3 +319,10 @@ function _uc_migs_card_types() {
   return $card_types;
 }   
 
+/**
+ * Return TRUE if in single method mode.
+ */
+function _uc_migs_single_method() {
+  return variable_get('uc_migs_single_payment_method', UC_MIGS_PAYMENT_METHOD_DEFAULT) == UC_MIGS_PAYMENT_METHOD_SINGLE;
+}
+
diff --git a/uc_migs.module b/uc_migs.module
index 225a7ad..4417b22 100644
--- a/uc_migs.module
+++ b/uc_migs.module
@@ -28,6 +28,10 @@ define('UC_MIGS_ERROR_VALIDATION',    'Transaction could not be validated');
 define('UC_MIGS_ERROR_NOT_PROCESSED', 'Transaction could not be processed');
 define('UC_MIGS_ERROR_NOT_FOUND',     'Order could not be found');
 
+define('UC_MIGS_PAYMENT_METHOD_SINGLE', 0);
+define('UC_MIGS_PAYMENT_METHOD_MULTIPLE', 1);
+define('UC_MIGS_PAYMENT_METHOD_DEFAULT', UC_MIGS_PAYMENT_METHOD_SINGLE);
+
 define('UC_MIGS_TRANSACTION_SUCCESS', 1);
 define('UC_MIGS_TRANSACTION_BADHASH', 2);
 define('UC_MIGS_TRANSACTION_NOHASH', 4);
@@ -100,27 +104,35 @@ function uc_migs_form_alter(&$form, &$form_state, $form_id) {
   if ($form_id == 'uc_cart_checkout_review_form' && ($order_id = intval($_SESSION['cart_order'])) > 0) {
     $order = uc_order_load($order_id);
 
-    if ($order->payment_method == 'migs') {
+    $migs_methods = array('migs');
+    if (!_uc_migs_single_method()) {
+      foreach ( _uc_migs_card_types() as $card_type => $card) {
+        $migs_methods[] = 'migs_'.$card_type;
+      }
+    }
+    if (in_array($order->payment_method, $migs_methods)) {
+      list($method, $card) = explode('_', $order->payment_method);
       unset($form['submit']);
       $form['#prefix'] = '<table width="100%" style="display: inline; padding-top: 1em;"><tr><td>';
-      $form['#suffix'] = '</td><td>'. drupal_get_form('uc_migs_form', $order) .'</td></tr></table>';
+      $form['#suffix'] = '</td><td>'. drupal_get_form('uc_migs_form', $order, $card) .'</td></tr></table>';
     }
   }
+/*
   if ($form_id == 'uc_payment_methods_form' && isset($form['method_migs']['#collapsed'])) {
     $form['method_migs']['#collapsed'] = FALSE;
   }
+*/
 }
 
 
-/*******************************************************************************
- * Hook Functions (Ubercart)
- ******************************************************************************/
-
 /**
  * Implementation of hook_payment_method().
  */
 function uc_migs_payment_method() {
   module_load_include('inc', 'uc_migs', 'uc_migs.lib');
+  //_uc_migs_vpc_securehash(array());
+  //check to see if single payment method or multiple
+  $single_method = _uc_migs_single_method();
   $title = theme('uc_migs_method_title', variable_get('uc_migs_method_title', t('Credit card on a secure server.')));
   $methods[] = array(
     'id' => 'migs',
@@ -130,17 +142,112 @@ function uc_migs_payment_method() {
     'desc' => t('Redirect to MIGS to pay by credit card or eCheck.'),
     'callback' => 'uc_payment_method_migs',
     'weight' => 3,
-    'checkout' => TRUE,
+    'checkout' => $single_method,
     'backend' => TRUE,
+    'no_gateway' => TRUE,
   );
 
+  if (!$single_method) {
+    //add all the card types as payment methods
+    foreach ( _uc_migs_card_types() as $card_type => $card) {
+      $methods[] = _uc_migs_get_multiple_payment_method($card_type);
+    }
+  }
+
   return $methods;
 }
 
+/**
+ * Quick way of getting the multiple payment methods with specific card types
+ */
+function _uc_migs_get_multiple_payment_method($type) {
+  module_load_include('inc', 'uc_migs', 'uc_migs.lib');  
+  $card_types = _uc_migs_card_types();
+  $card_type = $card_types[$type];
+  $path = base_path() . drupal_get_path('module', 'uc_migs');
+  
+  $title = variable_get('uc_migs_method_title_'.$type, t('!type on a secure server.', array('!type' => $card_type['name'])));
+  if (variable_get('uc_migs_method_title_icons_'.$type, TRUE)) {
+    $title .= '<div class="uc-migs-'.$type.'-icon-wrapper card-icon-wrapper">' . theme('uc_migs_cc_logo', $card_type['logo'], $type).'</div>';
+  }
 
-/*******************************************************************************
- * Callback Functions, Forms, and Tables
- ******************************************************************************/
+  $method = array(
+    'id' => 'migs_'.$type,
+    'name' => t('MIGS 3rd Party - !type', array('!type' => $card_type['name'])),
+    'title' => $title,
+    'review' => variable_get('uc_migs_check', FALSE) ? t('Credit card/eCheck') : t('Credit card'),
+    'desc' => t('Redirect to MIGS to pay by credit card or eCheck.'),
+    'callback' => 'uc_payment_method_migs_'.$type,
+    'checkout' => TRUE,
+    'backend' => TRUE,
+    'no_gateway' => TRUE,
+  );
+  
+  return $method;
+}
+
+/**
+ * Callback for individual MIGS payment method settings.
+ */
+function _uc_payment_method_migs_individual($op, &$arg1, $type) {
+  module_load_include('inc', 'uc_migs', 'uc_migs.lib');  
+  $card_types = _uc_migs_card_types();
+  $card = $card_types[$type];
+
+  switch ($op) {
+    case 'settings':
+      //uses the migs 3rd party settings for the most part.
+      
+      $form['uc_migs_info_'.$type] = array(
+        '#type' => 'markup',
+        '#value' => t('The majority of the settings are controlled by the MIGS 3rd party settings.'),
+        '#prefix' => '<p>',
+        '#suffix' => '</p>',
+      );
+      
+      $form['uc_migs_method_title_'.$type] = array(
+        '#type' => 'textfield',
+        '#title' => t('Payment method title'),
+        '#default_value' => variable_get('uc_migs_method_title_'.$type, t('!type on a secure server:', array('!type' => $card['name']))),
+      );
+      
+      if (file_exists($card['logo'])) {
+        $form['uc_migs_method_title_icons_'.$type] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Show '.$type.' icon beside the payment method title.'),
+          '#description' => theme('uc_migs_cc_logo', $card['logo'], $type),
+          '#default_value' => variable_get('uc_migs_method_title_icons_'.$type, TRUE),
+        );
+      } else {
+        $form['uc_migs_method_title_'.$type]['#suffix'] = '<p class="error">' . t('Please upload a logo to %local_url to enable displaying of the icon. A sample logo is available !logo_remote.', array('%local_url' => $card['logo_local'], '!logo_remote' => l('here', $card['remote_logo']))) . '</p>' ;
+      }
+      
+      return $form;
+  }
+}
+
+/**
+ * Group of callbacks that map to _uc_payment_method_migs_individual
+ */
+function uc_payment_method_migs_mastercard($op, &$arg1) {
+  return _uc_payment_method_migs_individual($op, $arg1, 'mastercard');
+}
+
+function uc_payment_method_migs_visa($op, &$arg1) {
+  return _uc_payment_method_migs_individual($op, $arg1, 'visa');
+}
+
+function uc_payment_method_migs_amex($op, &$arg1) {
+  return _uc_payment_method_migs_individual($op, $arg1, 'amex');
+}
+
+function uc_payment_method_migs_diners($op, &$arg1) {
+  return _uc_payment_method_migs_individual($op, $arg1, 'diners');
+}
+
+function uc_payment_method_migs_jcb($op, &$arg1) {
+  return _uc_payment_method_migs_individual($op, $arg1, 'jcb');
+}
 
 /**
  * Callback for MIGS payment method settings.
@@ -149,6 +256,8 @@ function uc_payment_method_migs($op, &$arg1) {
   module_load_include('inc', 'uc_migs', 'uc_migs.lib');
   switch ($op) {
     case 'settings':
+      $card_types = _uc_migs_card_types();
+
       $form['merchant'] = array(
         '#type' => 'fieldset',
         '#title' => t('Merchant Credentials'),
@@ -202,6 +311,21 @@ function uc_payment_method_migs($op, &$arg1) {
         '#default_value' => variable_get('uc_migs_locale', 'en'),
       );
 
+      foreach ($card_types as $card) {
+        $card_names[] = $card['name'];
+      }
+      $form['interface']['uc_migs_single_payment_method'] = array (
+        '#type' => 'radios',
+        '#title' => t('Payment method'),
+        '#description' => t('Card types are: %names', array('%names' => implode(', ', $card_names))),
+        '#weight' => 0,
+        '#default_value' => variable_get('uc_migs_single_payment_method', UC_MIGS_PAYMENT_METHOD_DEFAULT),
+        '#options' => array (
+          UC_MIGS_PAYMENT_METHOD_SINGLE => t('One payment method for all card types'),
+          UC_MIGS_PAYMENT_METHOD_MULTIPLE => t('Multiple payment methods for each card type')
+        )
+      );
+
       $form['interface']['icons'] = array(
         '#type' => 'fieldset',
         '#title' => t('Credit card logos'),
@@ -269,8 +393,9 @@ function uc_payment_method_migs($op, &$arg1) {
 /**
  * Form to build the submission to MIGS server
  */
-function uc_migs_form(&$form_state, $order) {
+function uc_migs_form(&$form_state, $order, $type = '') {
   module_load_include('inc', 'uc_migs', 'uc_migs.lib');
+  $card_types = _uc_migs_card_types();
   $vpc_Amount = round($order->order_total * 100);
   $vpc_OrderInfo = $order->order_id;
   $vpc_MerchTxnRef = $vpc_OrderInfo . '_' . time();
@@ -283,6 +408,9 @@ function uc_migs_form(&$form_state, $order) {
     'vpc_OrderInfo' => $vpc_OrderInfo,
     'vpc_Amount' => $vpc_Amount,
   );
+  if (!empty($card_types[$type])) {
+    $data['vpc_card'] = $card_types[$type]['code'];
+  }
   foreach ($data as $name => $value) {
     $form[$name] = array(
       '#type' => 'value', 
@@ -303,6 +431,7 @@ function uc_migs_form_submit($form, &$form_state) {
   $args = array(
     'vpc_AccessCode'  => variable_get('uc_migs_access_code', ''),
     'vpc_Amount'      => $form_state['values']['vpc_Amount'],
+    'vpc_card'        => $form_state['values']['vpc_card'],
     'vpc_Locale'      => variable_get('uc_migs_locale', 'en'),
     'vpc_Merchant'    => variable_get('uc_migs_mid', ''),
     'vpc_OrderInfo'   => $form_state['values']['vpc_OrderInfo'],
