diff --git uc_order.admin.inc uc_order.admin.inc
old mode 100644
new mode 100755
index bad15bb..2398c22
--- uc_order.admin.inc
+++ uc_order.admin.inc
@@ -99,8 +99,8 @@ function uc_order_settings_form() {
     '#title' => t('On-site invoice template'),
     '#description' => t('Select the invoice template to use when invoices are viewed on the site.<br />This is separate from the template used to e-mail invoices to customers which is configured through <a href="!url">Conditional actions</a>.', array('!url' => url(CA_UI_PATH))),
     '#options' => uc_order_template_options(),
-    '#summary' => t('You are using the %template order invoice template.', array('%template' => variable_get('uc_cust_order_invoice_template', 'customer'))),
-    '#default_value' => variable_get('uc_cust_order_invoice_template', 'customer'),
+    '#summary' => t('You are using the %template order invoice template.', array('%template' => variable_get('uc_cust_order_invoice_template', CUSTOMER_INVOICE_TEMPLATE))),
+    '#default_value' => variable_get('uc_cust_order_invoice_template', CUSTOMER_INVOICE_TEMPLATE),
   );
 
   return system_settings_form($form);
@@ -991,7 +991,7 @@ function uc_order_view($order, $view = 'view') {
   }
 
   if ($view == 'invoice') {
-    $output = uc_order_load_invoice($order, 'print', variable_get('uc_cust_order_invoice_template', 'customer'));
+    $output = uc_order_load_invoice($order, 'print', variable_get('uc_cust_order_invoice_template', CUSTOMER_INVOICE_TEMPLATE));
     $output .= '<div align="right" style="margin-top: 1em; margin-right: 1em;"><input type="button" value="'. t('Print invoice') .'" onclick="window.print();" /> '
               .'<input type="button" value="'. t('Close window') .'" onclick="window.close();" /></div>';
     print $output;
@@ -1500,7 +1500,7 @@ function uc_order_add_product_form($form_state, $order_id, $nid) {
  * Display an invoice in the browser, convert it to PDF, or e-mail it as HTML.
  */
 function uc_order_invoice($order, $op = 'view') {
-  $output = uc_order_load_invoice($order, $op, variable_get('uc_cust_order_invoice_template', 'customer'));
+  $output = uc_order_load_invoice($order, $op, variable_get('uc_cust_order_invoice_template', CUSTOMER_INVOICE_TEMPLATE));
 
   if ($op == 'print') {
     print $output;
diff --git uc_order.module uc_order.module
old mode 100644
new mode 100755
index fc46b4d..fdc085b
--- uc_order.module
+++ uc_order.module
@@ -11,6 +11,9 @@
  * displayed to customers.
  */
 
+// default invoice template for customers
+define('CUSTOMER_INVOICE_TEMPLATE', drupal_get_path('module', 'uc_order') . '/templates/customer.itpl.php');
+
 require_once('uc_order.order_pane.inc');
 require_once('uc_order.line_item.inc');
 require_once('uc_order.ca.inc');
@@ -516,7 +519,7 @@ function uc_order_mail($key, &$message, $params) {
       $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
       $message['subject'] = t('Your Order Invoice');
       $message['from'] = uc_store_email_from();
-      $message['body'][] = uc_order_load_invoice($params['order'], 'admin-mail', variable_get('uc_cust_order_invoice_template', 'customer'));
+      $message['body'][] = uc_order_load_invoice($params['order'], 'admin-mail', variable_get('uc_cust_order_invoice_template', CUSTOMER_INVOICE_TEMPLATE));
       break;
 
     // Setup a custom e-mail defined by an action on a predicate.
@@ -1436,7 +1439,7 @@ function _get_order_screen_titles() {
   return $titles;
 }
 
-function uc_order_load_invoice($order, $op = 'view', $template = 'customer') {
+function uc_order_load_invoice($order, $op = 'view', $template_file = CUSTOMER_INVOICE_TEMPLATE) {
   static $invoice;
 
   if (isset($invoice[$order->order_id][$template])) {
@@ -1445,8 +1448,13 @@ function uc_order_load_invoice($order, $op = 'view', $template = 'customer') {
 
   $thank_you_message = FALSE;
 
-  $file = drupal_get_path('module', 'uc_order') .'/templates/'. $template .'.itpl.php';
-  if (file_exists($file)) {
+  // Allow the current theme to override the template
+  $theme_template = path_to_theme()  .'/uc_order_templates'. substr($template_file, strripos($template_file, '/'));
+  if (file_exists($theme_template)) {
+    $template_file = $theme_template;
+  }
+
+  if (file_exists($template_file)) {
     switch ($op) {
       case 'checkout-mail':
         $thank_you_message = TRUE;
@@ -1490,7 +1498,7 @@ function uc_order_load_invoice($order, $op = 'view', $template = 'customer') {
     usort($line_items, 'uc_weight_sort');
 
     ob_start();
-    require($file);
+    require($template_file);
     $output = ob_get_contents();
     ob_end_clean();
   }
@@ -1502,37 +1510,107 @@ function uc_order_load_invoice($order, $op = 'view', $template = 'customer') {
   return $output;
 }
 
-// Return an array of invoice templates found in ubercart/uc_order/templates.
+/**
+ * Return an array of invoice templates
+ * Modules can add their own templates by implementing hook_uc_invoice_template_list
+ * @return
+ */
 function uc_invoice_template_list() {
   static $templates = array();
 
   // If the template list hasn't already been loaded...
   if (empty($templates)) {
-    // Get the path to the templates directory.
-    $dir = drupal_get_path('module', 'uc_order') .'/templates';
+    $defaults = array(
+      // default extension for invoice templates
+      'extension' => '.tpl.php',
+    );
+    foreach(module_implements('uc_invoice_template_list') as $module) {
+      $defaults['path'] = drupal_get_path('module', $module);
+      $function = $module . '_uc_invoice_template_list';
+      $results = $function();
 
-    // Loop through all the files found in the directory.
-    foreach (file_scan_directory($dir, '.*\.itpl\.php', array('.', '..', 'CVS'), 0, FALSE) as $file) {
-      // Add them by name to the templates array, trimming off the extension.
-      $templates[] = substr($file->name, 0, strlen($file->name) - 5);
+      if(!is_numeric(key($results))) {
+        $templates[] = $results += $defaults;
+      }
+      else {
+        foreach($results as $tpl) {
+          $templates[] = $tpl += $defaults;
+        }
+      }
     }
-
     // Sort the template names alphabetically.
-    sort($templates);
+    usort($templates, '_uc_sort_template_list');
   }
 
   return $templates;
 }
 
+/**
+ * Sort the templates list alphabetically
+ * @return
+ */
+function _uc_sort_template_list($a, $b) {
+  return strcmp($a["name"], $b["name"]);
+}
+/**
+ * Implementation of hook_uc_invoice_template_list
+ *
+ * @return
+ * An array describing the invoice template(s) provided by this module.
+ *
+ * Expected format:
+ * array(
+ *   // "path" key is optional: if not provided module's path will be used
+ *   // "extension" key is optional: if not provided ".tpl.php" will be used
+ *   array(
+ *     'name' => 'invoice_file_name_1',
+ *     'path' => drupal_get_path('module', 'uc_order'),
+ *     'extension' => '.tpl.php',
+ *   ),
+ *   array(
+ *     'name' => 'invoice_file_name_2',
+ *   ),
+ * )
+ *
+ * OR
+ *
+ * array(
+ *   'name' => 'invoice_file_name_2',
+ *   'path' => drupal_get_path('module', 'uc_order') . '/templates/',
+ *   'extension' => '.tpl.php',
+ * )
+ */
+function uc_order_uc_invoice_template_list() {
+  $path = drupal_get_path('module', 'uc_order') . '/templates';
+  return array(
+    array(
+      'name' => 'admin',
+      'path' => $path,
+      'extension' => '.itpl.php',
+    ),
+    array(
+      'name' => 'customer',
+      'path' => $path,
+      'extension' => '.itpl.php',
+    ),
+  );
+}
+
 // Returns a list of options for a template select box.
 function uc_order_template_options($custom = FALSE) {
-  $templates = drupal_map_assoc(uc_invoice_template_list());
+  $templates = uc_invoice_template_list();
+  $return = array();
+
+  foreach($templates as $template) {
+    $all_path = $template['path'] . '/' . $template['name'] . $template['extension'];
+    $return[$all_path] = $template['name'];
+  }
 
   if ($custom) {
-    $templates[0] = t('Custom template');
+    //$templates[0] = t('Custom template');
   }
 
-  return $templates;
+  return $return;
 }
 
 /**
