diff -urp backup_migrate-dev/includes/destinations.ftp.inc backup_migrate/includes/destinations.ftp.inc
--- backup_migrate-dev/includes/destinations.ftp.inc	2009-07-05 23:02:49.000000000 -0500
+++ backup_migrate/includes/destinations.ftp.inc	2009-10-10 19:40:56.000000000 -0500
@@ -66,12 +66,18 @@ class backup_migrate_destination_ftp ext
     $form = parent::edit_form();
     $form['scheme']['#type'] = 'value';
     $form['scheme']['#value'] = 'ftp';
+    $form['port'] = array(
+      "#type" => "textfield",
+      "#title" => t("Port"),
+      "#default_value" => @$this->dest_url['port'] ? $this->dest_url['port'] : '21',
+      "#weight" => 15,
+    );
     return $form;
   }
 
   function ftp_object() {
     if (!$this->ftp) {
-      $this->ftp = drupal_ftp_ftp_object($this->dest_url['host'], $this->dest_url['user'], $this->dest_url['pass'], $this->dest_url['path']);
+      $this->ftp = drupal_ftp_ftp_object($this->dest_url['host'], $this->dest_url['port'], $this->dest_url['user'], $this->dest_url['pass'], $this->dest_url['path']);
     }
     return $this->ftp;
   }
@@ -89,10 +95,11 @@ define('DRUPAL_FTP_FT_FILE', 1);
 /**
  *  creates a new ftp object. if any elements of ftp_map are missing, they'll be filled with the server defaults.
  */
-function drupal_ftp_ftp_object($server, $user, $pass, $dir) {
+function drupal_ftp_ftp_object($server, $port, $user, $pass, $dir) {
   $ftp = new stdClass();
 
   $ftp->__server = $server;
+  $ftp->__port = $port;
   $ftp->__user = $user;
   $ftp->__password = $pass;
   $ftp->__directory = $dir;
@@ -112,7 +119,7 @@ function drupal_ftp_connect(&$ftp) {
 
   if (!$ftp->__conn && !drupal_ftp_connected($ftp)) {
     // Attempt to connect to the remote server
-    $ftp->__conn = @ftp_connect($ftp->__server);
+    $ftp->__conn = @ftp_connect($ftp->__server, $ftp->__port);
 
     if (!$ftp->__conn) {
       _backup_migrate_message('FTP Error: Couldn\'t connect to server @server', array('@server' => $ftp->__server), 'error');
diff -urp backup_migrate-dev/includes/destinations.inc backup_migrate/includes/destinations.inc
--- backup_migrate-dev/includes/destinations.inc	2009-08-22 14:58:13.000000000 -0500
+++ backup_migrate/includes/destinations.inc	2009-10-10 19:42:14.000000000 -0500
@@ -903,6 +903,7 @@ class backup_migrate_destination_remote 
     $out .= ($parts['user'] && $parts['pass']) ? ":". urlencode($parts['pass']) : '';
     $out .= ($parts['user'] || $parts['pass']) ? "@" : "";
     $out .= $parts['host'];
+    $out .= $parts['port'] ? ':' .$parts['port'] : '';
     $out .= "/". $parts['path'];
     return $out;
   }
@@ -930,30 +931,35 @@ class backup_migrate_destination_remote 
       "#default_value" => @$this->dest_url['scheme'] ? $this->dest_url['scheme'] : 'mysql',
       "#required" => TRUE,
       "#options" => array($GLOBALS['db_type'] => $GLOBALS['db_type']),
+      "#weight" => 0,
     );
     $form['host'] = array(
       "#type" => "textfield",
       "#title" => t("Host"),
       "#default_value" => @$this->dest_url['host'] ? $this->dest_url['host'] : 'localhost',
       "#required" => TRUE,
+      "#weight" => 10,
     );
     $form['path'] = array(
       "#type" => "textfield",
       "#title" => t("Path"),
       "#default_value" => @$this->dest_url['path'],
       "#required" => TRUE,
+      "#weight" => 20,
     );
     $form['user'] = array(
       "#type" => "textfield",
       "#title" => t("Username"),
       "#default_value" => @$this->dest_url['user'],
       "#required" => TRUE,
+      "#weight" => 30,
     );
     $form['pass'] = array(
       "#type" => "password",
       "#title" => t("Password"),
       "#default_value" => @$this->dest_url['pass'],
       '#description' => '',
+      "#weight" => 40,
     );
     if (@$this->dest_url['pass']) {
       $form['old_password'] = array(
