diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index c98de19..c2a48ae 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -19,3 +19,4 @@ task #957384 by AntoineSolutions: Added token hooks for replacement tokens and
   replaced pattern variables with template files.
 task #996970 by AntoineSolutions: Created a hook for providing delivery methods
   and move the filesystem and e-mail delivery methods into sub-modules.
+task #997258 by AntoineSolutions: Created an FTP delivery method sub-module.
diff --git a/uc_edi_ftp/CHANGELOG.txt b/uc_edi_ftp/CHANGELOG.txt
new file mode 100755
index 0000000..14423bd
--- /dev/null
+++ b/uc_edi_ftp/CHANGELOG.txt
@@ -0,0 +1,5 @@
+$Id$
+
+Journal 6.x-1.x, 2010-12-13
+---------------------------
+by AntoineSolutions: Created the Ubercart EDI FTP sub-module.
diff --git a/uc_edi_ftp/README.txt b/uc_edi_ftp/README.txt
new file mode 100755
index 0000000..5f63b6c
--- /dev/null
+++ b/uc_edi_ftp/README.txt
@@ -0,0 +1,45 @@
+$Id$
+
+-- SUMMARY --
+
+The Ubercart EDI FTP module provides an FTP delivery method for the Ubercart
+EDI module.
+
+
+-- REQUIREMENTS --
+
+* Ubercart EDI: http://drupal.org/project/uc_edi
+
+
+-- INSTALLATION --
+
+* Install as usual, see http://drupal.org/node/70151 for further information.
+
+
+-- CONFIGURATION --
+
+* Resources
+  - Export Delivery Methods settings page:
+    admin/store/settings/edi/export/delivery-methods
+
+* Description
+  The Ubercart EDI FTP module provides an FTP Export Delivery Method. The user
+  must provide valid FTP account credentials to use for uploading to an FTP
+  server.
+
+
+-- CONTACT --
+
+Current maintainers:
+* Jon Antoine (AntoineSolutions) - http://drupal.org/user/192192
+
+This project has been sponsored by:
+* Antoine Solutions
+  Specializing in Drupal powered sites, Antoine Solutions offers Design,
+  Development, Search Engine Optimisation (SEO) and Search Engine Marketing
+  (SEM). Visit http://www.antoinesolutions.com for more information.
+
+* Showers Pass
+  Technically engineered cycling gear for racers, commuters, messengers and
+  everyday cycling enthusiasts. Visit http://www.showerspass.com for more
+  information.
diff --git a/uc_edi_ftp/uc_edi_ftp.info b/uc_edi_ftp/uc_edi_ftp.info
new file mode 100755
index 0000000..607dea2
--- /dev/null
+++ b/uc_edi_ftp/uc_edi_ftp.info
@@ -0,0 +1,6 @@
+; $Id$
+name = Ubercart EDI FTP
+description = Provides an FTP export delivery method for the Ubercart EDI module.
+dependencies[] = uc_edi
+package = Ubercart - EDI
+core = 6.x
diff --git a/uc_edi_ftp/uc_edi_ftp.install b/uc_edi_ftp/uc_edi_ftp.install
new file mode 100755
index 0000000..0e45cc1
--- /dev/null
+++ b/uc_edi_ftp/uc_edi_ftp.install
@@ -0,0 +1,20 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Install, update and uninstall functions for the Ubercart EDI FTP module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function uc_edi_ftp_uninstall() {
+  // Delete module variables.
+  variable_del('uc_edi_export_delivery_method_ftp');
+  variable_del('uc_edi_ftp_host');
+  variable_del('uc_edi_ftp_port');
+  variable_del('uc_edi_ftp_user');
+  variable_del('uc_edi_ftp_pass');
+  variable_del('uc_edi_ftp_path');
+}
diff --git a/uc_edi_ftp/uc_edi_ftp.module b/uc_edi_ftp/uc_edi_ftp.module
new file mode 100755
index 0000000..3a0f601
--- /dev/null
+++ b/uc_edi_ftp/uc_edi_ftp.module
@@ -0,0 +1,227 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Defines an FTP export delivery method.
+ */
+
+/******************************************************************************
+ * Hook Functions (Drupal)
+ *****************************************************************************/
+
+/**
+ * Implements hook_help().
+ */
+function uc_edi_ftp_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#uc_edi_ftp':
+      $output = '';
+      $output .= '<h2>' . t('Resources') . '</h2>';
+      $output .= '<ul><li>' . t('Export Delivery Methods settings page: <a href="!url">admin/store/settings/edi/export/delivery-methods</a>', array('!url' => url('admin/store/settings/edi/export/delivery-methods'))) . '</li></ul>';
+      $output .= '<h2>' . t('Description') . '</h2>';
+      $output .= '<p>' . t('The Ubercare EDI FTP module provides an FTP Export Delivery Method. The user must provide valid FTP account credentials to use for uploading to an FTP server.') . '</p>';
+
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function uc_edi_ftp_form_uc_edi_export_delivery_methods_form_alter(&$form, &$form_state) {
+  $form['#validate'][] = 'uc_edi_ftp_export_delivery_method_form_validate';
+}
+
+/*******************************************************************************
+ * Hook Functions (Ubercart)
+ ******************************************************************************/
+
+/**
+ * Implementation of hook_uc_edi_export_delivery_methods().
+ */
+function uc_edi_ftp_uc_edi_export_delivery_methods() {
+  $methods[] = array(
+    'id' => 'ftp',
+    'title' => t('FTP'),
+    'description' => t('Deliver export files to an FTP server.'),
+    'callbacks' => array(
+      'help' => 'uc_edi_ftp_export_delivery_method_help',
+      'settings' => 'uc_edi_ftp_export_delivery_method_form',
+      'submit' => 'uc_edi_ftp_export_delivery_method_submit',
+    ),
+  );
+
+  return $methods;
+}
+
+/******************************************************************************
+ * Module and Helper Functions
+ *****************************************************************************/
+
+/**
+ * Callback function for the FTP export delivery method help.
+ *
+ * @return
+ *   HTML link to the FTP delivery method help page followed by a short
+ *   description.
+ */
+function uc_edi_ftp_export_delivery_method_help() {
+  return t('<a href="!url">FTP</a>: Deliver export files to an FTP server.', array('!url' => url('admin/help/uc_edi_ftp')));
+}
+
+/**
+ * Callback function for the FTP export delivery method form.
+ *
+ * @return
+ *   An un-rendered settings form for the FTP export delivery method.
+ */
+function uc_edi_ftp_export_delivery_method_form() {
+  $form['ftp']['uc_edi_ftp_host'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Host'),
+    '#description' => t("The FTP server address. This parameter shouldn't have any trailing slashes and shouldn't be prefixed with ftp://."),
+    '#default_value' => variable_get('uc_edi_ftp_host', ''),
+  );
+  $form['ftp']['uc_edi_ftp_port'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Port'),
+    '#description' => t('If omitted, the default FTP port (21) will be used.'),
+    '#maxlength' => 5,
+    '#size' => 5,
+    '#default_value' => variable_get('uc_edi_ftp_port', '21'),
+  );
+  $form['ftp']['uc_edi_ftp_user'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username'),
+    '#default_value' => variable_get('uc_edi_ftp_user', ''),
+  );
+  $form['ftp']['uc_edi_ftp_pass'] = array(
+    '#type' => 'password',
+    '#title' => t('Password'),
+    '#description' => t('The FTP account password.'),
+    '#default_value' => variable_get('uc_edi_ftp_pass', ''),
+  );
+  $form['ftp']['uc_edi_ftp_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Path'),
+    '#description' => t('The path to the directory the files should be uploaded to.'),
+    '#default_value' => variable_get('uc_edi_ftp_path', ''),
+  );
+
+  return $form;
+}
+
+/**
+ * Handles validation of the Ubercart EDI e-mail export delivery method form.
+ *
+ * @see uc_edi_ftp_export_delivery_method_form()
+ */
+function uc_edi_ftp_export_delivery_method_form_validate($form, &$form_state) {
+  if ($form_state['values']['uc_edi_export_delivery_method_ftp']) {
+    $host = $form_state['values']['uc_edi_ftp_host'];
+    if (!$host) {
+      form_set_error('uc_edi_ftp_host', $host);
+    }
+    $port = $form_state['values']['uc_edi_ftp_port'];
+    $user = $form_state['values']['uc_edi_ftp_user'];
+    if (!$user) {
+      form_set_error('uc_edi_ftp_user', $user);
+    }
+    $pass = $form_state['values']['uc_edi_ftp_pass'];
+    if (!$pass) {
+      form_set_error('uc_edi_ftp_pass', $pass);
+    }
+
+    // If there are no errors so far.
+    if (!form_get_errors()) {
+      // Log into the ftp server.
+      $ftp = uc_edi_ftp_login($host, $port, $user, $pass);
+
+      // If the connection failed.
+      if (!$ftp) {
+        form_set_error('ftp', t('Failed to authenticate.'));
+      }
+      else {
+        // Close the FTP connection.
+        @ftp_close($ftp);
+      }
+    }
+  }
+}
+
+/**
+ * Log in to an FTP server.
+ *
+ * @param $host
+ *   The FTP server address.
+ * @param $port
+ *   The FTP connection port.
+ * @param $user
+ *   The FTP username.
+ * @param $pass
+ *   The FTP password.
+ *
+ * @return
+ *   Valid FTP object.
+ */
+function uc_edi_ftp_login($host, $port, $user, $pass) {
+  // Open an FTP connection with the server.
+  if ($ftp = @ftp_connect($host, $port)) {
+    // Log onto the FTP server.
+    if (@ftp_login($ftp, $user, $pass)) {
+      // Enable passive mode.
+      @ftp_pasv($ftp, TRUE);
+
+      return $ftp;
+    }
+    else {
+      @ftp_close($ftp);
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Callback function for the FTP export delivery method submission.
+ *
+ * @return
+ *   TRUE if the file was submitted successfully, otherwise false.
+ */
+function uc_edi_ftp_export_delivery_method_submit($filepath, $filename) {
+  // Get FTP credentials.
+  $host = variable_get('uc_edi_ftp_host', '');
+  $port = variable_get('uc_edi_ftp_port', 21);
+  $user = variable_get('uc_edi_ftp_user', '');
+  $pass = variable_get('uc_edi_ftp_pass', '');
+  $path = variable_get('uc_edi_ftp_path', '');
+
+  // Log into the FTP server.
+  if ($ftp = uc_edi_ftp_login($host, $port, $user, $pass)) {
+    // If a path has been specified.
+    if ($path) {
+      // Try changing to the specified path.
+      if (@ftp_chdir($ftp, $path)) {
+        watchdog('uc_edi_ftp', 'Problem changing the working directory to the specified path. Please verify the directory exists and the account has access.', array(), WATCHDOG_ERROR);
+      }
+    }
+
+    // Send the file to the server.
+    if (@ftp_put($ftp, $filename, $filepath, FTP_ASCII)) {
+      // Close the FTP connection.
+      @ftp_close($ftp);
+
+      watchdog('uc_edi_ftp', t('EDI export saved to the FTP server.'));
+      return TRUE;
+    }
+    else {
+      watchdog('uc_edi_ftp', 'Problem saving the file to the FTP server. Please verify the account has write permissions.', array(), WATCHDOG_ERROR);
+    }
+  }
+  else {
+    watchdog('uc_edi_ftp', 'Problem loging into the FTP server. Check your FTP export delivery method settings and the FTP server settings.', array(), WATCHDOG_ERROR);
+  }
+
+  return FALSE;
+}
