diff --git a/uk/ac/sanger/artemis/ExternalProgram.java b/uk/ac/sanger/artemis/ExternalProgram.java
index 21aa93610d94f4b2dd501eea149685669b48ce5c..080bc9c5c9d568c90a4aa7fb23cdda1fe484d9c3 100644
--- a/uk/ac/sanger/artemis/ExternalProgram.java
+++ b/uk/ac/sanger/artemis/ExternalProgram.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/ExternalProgram.java,v 1.7 2005-09-05 17:37:49 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/ExternalProgram.java,v 1.8 2005-09-06 15:39:44 tjc Exp $
  **/
 
 package uk.ac.sanger.artemis;
@@ -42,7 +42,7 @@ import java.util.Enumeration;
  *  and contains methods for invoking it.
  *
  *  @author Kim Rutherford
- *  @version $Id: ExternalProgram.java,v 1.7 2005-09-05 17:37:49 tjc Exp $
+ *  @version $Id: ExternalProgram.java,v 1.8 2005-09-06 15:39:44 tjc Exp $
  **/
 
 public class ExternalProgram 
@@ -121,18 +121,18 @@ public class ExternalProgram
     // sequence_file_names will be set by prepareRun()
     final File file_of_filenames = prepareRun(features, sequence_file_names);
 
-    final Integer job_control_id =
-      Options.getOptions().getIntegerProperty("jcon_" + getName() +
-                                                "_program_id");
+//  final Integer job_control_id =
+//    Options.getOptions().getIntegerProperty("jcon_" + getName() +
+//                                              "_program_id");
 
-    final Integer min_jc_jobs =
-      Options.getOptions().getIntegerProperty("jcon_min_jobs");
+//  final Integer min_jc_jobs =
+//    Options.getOptions().getIntegerProperty("jcon_min_jobs");
 
-    String jcon_template =
-      Options.getOptions().getProperty("jcon_" + getName() + "_template");
+//  String jcon_template =
+//    Options.getOptions().getProperty("jcon_" + getName() + "_template");
 
-    final String jcon_batch_queue =
-      Options.getOptions().getProperty("jcon_batch_queue");
+//  final String jcon_batch_queue =
+//    Options.getOptions().getProperty("jcon_batch_queue");
 
 //  if(job_control_id != null &&
 //     min_jc_jobs != null &&
@@ -183,6 +183,9 @@ public class ExternalProgram
             args[4] = "-d";    args[5] = getProgramOptions();
           }
 
+          if(System.getProperty("debug") != null)
+            System.out.println("CALL SSH CLIENT "+getRealName());
+
           uk.ac.sanger.artemis.j2ssh.SshPSUClient ssh =
                 new uk.ac.sanger.artemis.j2ssh.SshPSUClient(args);
           ssh.start();
@@ -313,6 +316,18 @@ public class ExternalProgram
     // store the file number to use for the next sequence file - the key is
     // a File containing the directory of there Entry that contains the
     // Feature and the value is the next file number to use
+
+    Entry entry = features.elementAt(0).getEntry();
+    RemoteFileNode node = null;
+
+    if(((DocumentEntry)entry.getEMBLEntry()).getDocument()
+                            instanceof RemoteFileDocument)
+    {
+      RemoteFileDocument nodeDoc =
+               (RemoteFileDocument)(((DocumentEntry)entry.getEMBLEntry()).getDocument());
+      node = nodeDoc.getRemoteFileNode();
+    }  
+    
     final java.util.Hashtable file_number_hash = new java.util.Hashtable();
 
     for(final Enumeration e = feature_count_hash.keys() ;
@@ -320,14 +335,14 @@ public class ExternalProgram
     {
       final File directory =(File) e.nextElement();
 
-      final long old_file_number = getFileNumber(directory);
+      final long old_file_number = getFileNumber(directory, node);
 
       final long feature_count =
        ((Long) feature_count_hash.get(directory)).longValue();
 
       file_number_hash.put(directory, new Long(old_file_number));
 
-      setFileNumber(directory, old_file_number + feature_count);
+      setFileNumber(directory, old_file_number + feature_count, node);
     }
 
     // write the sequences out
@@ -413,7 +428,7 @@ public class ExternalProgram
       new File(new File(first_directory, getName()),
                 getName() + "_" +
                 "file_of_filenames." +
-               (getFileNumber(first_directory) - 1));
+               (getFileNumber(first_directory, node) - 1));
 
     final Writer filenames_writer = new FileWriter(file_of_filenames);
 
@@ -426,6 +441,10 @@ public class ExternalProgram
     filenames_printwriter.close();
     filenames_writer.close();
 
+    if(System.getProperty("debug") != null)
+      System.out.println("WRITTEN "+file_of_filenames.getCanonicalPath());
+
+
     return file_of_filenames;
   }
 
@@ -518,15 +537,41 @@ public class ExternalProgram
    *  file_counter_filename.  If the file doesn't exist, it is created and
    *  initialised.
    **/
-  protected long getFileNumber(final File directory)
+  private long getFileNumber(final File directory,
+                             final RemoteFileNode node)
       throws IOException 
   {
     try 
     {
-      final FileReader file_reader =
-        new FileReader(new File(directory, File.separatorChar +
+      final Reader file_reader;
+      if(node == null)
+        file_reader =
+          new FileReader(new File(directory, File.separatorChar +
                                   getName() + File.separatorChar +
                                   file_counter_filename));
+      else
+      {
+        String dir = node.getRootDir()+ File.separatorChar +
+                     node.getFullName();
+        int index  = dir.lastIndexOf(File.separatorChar);
+        dir = dir.substring(0,index) + File.separatorChar + getName();
+        byte[] contents = node.getFileContents(null, dir+
+                               File.separatorChar+file_counter_filename);
+        if(contents == null)
+        {
+          if(System.getProperty("debug") != null)
+            System.out.println("getFileNumber() creating "+dir+
+                                File.separatorChar+file_counter_filename);
+
+          node.mkdir(dir);
+          return setFileNumber(directory, 1, node);
+        }
+
+        file_reader = new StringReader(new String(contents));
+
+        if(System.getProperty("debug") != null)
+          System.out.println("getFileNumber()\n"+new String(contents));
+      }
 
       final BufferedReader reader = new BufferedReader(file_reader);
 
@@ -534,10 +579,10 @@ public class ExternalProgram
       final String comment_line = reader.readLine();
 
       if(comment_line == null || comment_line.length() == 0) 
-        return setFileNumber(directory, guessNumber(directory));
+        return setFileNumber(directory, guessNumber(directory), node);
 
       if(!comment_line.startsWith("#")) 
-        return setFileNumber(directory, guessNumber(directory));
+        return setFileNumber(directory, guessNumber(directory), node);
 
       final String number_line = reader.readLine();
 
@@ -547,7 +592,7 @@ public class ExternalProgram
       }
       catch(NumberFormatException e) 
       {
-        return setFileNumber(directory, guessNumber(directory));
+        return setFileNumber(directory, guessNumber(directory), node);
       }
       finally
       {
@@ -558,11 +603,11 @@ public class ExternalProgram
     catch(FileNotFoundException e)
     {
       // create a new file_number_counter file
-      return setFileNumber(directory, guessNumber(directory));
+      return setFileNumber(directory, guessNumber(directory), node);
     }
     catch(IOException e) 
     {
-      return setFileNumber(directory, guessNumber(directory));
+      return setFileNumber(directory, guessNumber(directory), node);
     }
   }
 
@@ -571,22 +616,37 @@ public class ExternalProgram
    * (eg. directory + "/blastp/" + new_file_number).
    **/
   protected long setFileNumber(final File directory,
-                                final long new_file_number)
+                               final long new_file_number, final RemoteFileNode node)
       throws IOException 
   {
     makeDirectory(new File(directory, getName()));
 
-    final FileWriter file_writer =
-      new FileWriter(new File(directory, File.separatorChar +
-                                getName() + File.separatorChar +
-                                file_counter_filename));
+    File local_file = new File(directory, File.separatorChar +
+                               getName() + File.separatorChar +
+                               file_counter_filename);
 
+    final FileWriter file_writer = new FileWriter(local_file);
     final PrintWriter print_writer = new PrintWriter(file_writer);
 
     print_writer.println("# the file is machine generated - do not edit");
     print_writer.println(new_file_number);
     print_writer.close();
     file_writer.close();
+    
+    if(node != null)
+    {
+      String dir = node.getRootDir()+ File.separatorChar +
+                   node.getFullName();
+      int index  = dir.lastIndexOf(File.separatorChar);
+      dir = dir.substring(0,index) + File.separatorChar +
+                         getName() + File.separatorChar;
+
+      if(System.getProperty("debug") != null)
+        System.out.println("setFileNumber() "+
+                           local_file.getCanonicalPath()+" --> "+dir);
+
+      node.put(dir, local_file, null, true);     
+    }
 
     return new_file_number;
   }
diff --git a/uk/ac/sanger/artemis/components/filetree/FileList.java b/uk/ac/sanger/artemis/components/filetree/FileList.java
index bf6801c8ac8d6c7b29f062f80cf54aa3fcb69e10..c9cc8092b6fa71bd8e0a3b281a680b04793c1b1b 100644
--- a/uk/ac/sanger/artemis/components/filetree/FileList.java
+++ b/uk/ac/sanger/artemis/components/filetree/FileList.java
@@ -108,9 +108,10 @@ public class FileList
   * Put a file
   *
   */
-  protected boolean put(String dir, File local_file, FTProgress monitor)
+  protected boolean put(String dir, File local_file, 
+                        FTProgress monitor, boolean force)
   {
-    return ssh_client.put(dir, local_file, monitor);
+    return ssh_client.put(dir, local_file, monitor, force);
   }
 
 
diff --git a/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java b/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java
index 7dcdfff78ebb9bc6f9baad2b6446adad58222072..1786af799faf3beb2a41a82eb48810b317e34e4c 100644
--- a/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java
+++ b/uk/ac/sanger/artemis/components/filetree/RemoteFileNode.java
@@ -197,7 +197,7 @@ public class RemoteFileNode extends DefaultMutableTreeNode
     return flist.delete(getRootDir()+"/"+getFullName());
   }
 
-  protected boolean mkdir(String dir)
+  public boolean mkdir(String dir)
   {
     FileList flist = new FileList();
     return flist.mkdir(dir);
@@ -211,7 +211,6 @@ public class RemoteFileNode extends DefaultMutableTreeNode
 
   public boolean put(File local_file, FTProgress monitor)
   {
-    FileList flist = new FileList();
     String dir;
     if(!isDirectory())
     {
@@ -222,9 +221,15 @@ public class RemoteFileNode extends DefaultMutableTreeNode
     else
       dir = getRootDir()+"/"+getFullName();
 
-    return flist.put(dir, local_file, monitor);
+    return put(dir, local_file, monitor, false);
   }
 
+  public boolean put(String dir, File local_file, 
+                     FTProgress monitor, boolean force)
+  {
+    FileList flist = new FileList();
+    return flist.put(dir, local_file, monitor, force);
+  }
 
   public byte[] getFileContents(FTProgress monitor)
   {
@@ -232,6 +237,12 @@ public class RemoteFileNode extends DefaultMutableTreeNode
     return flist.getFileContents(getRootDir()+"/"+getFullName(), monitor);
   }
 
+  public byte[] getFileContents(FTProgress monitor, String filename)
+  {
+    FileList flist = new FileList();
+    return flist.getFileContents(filename, monitor);
+  }
+
 // Transferable
   public DataFlavor[] getTransferDataFlavors()
   {
diff --git a/uk/ac/sanger/artemis/j2ssh/SshFileManager.java b/uk/ac/sanger/artemis/j2ssh/SshFileManager.java
index c45aeeafbe7689adb05c1bd9b2abc015a2c1c5ff..dffd4b82ab18c2b96f9a959fd752fe083e90d07b 100644
--- a/uk/ac/sanger/artemis/j2ssh/SshFileManager.java
+++ b/uk/ac/sanger/artemis/j2ssh/SshFileManager.java
@@ -251,7 +251,7 @@ public class SshFileManager
   *
   */
   public boolean put(final String dir, final File local_file,
-                     final FTProgress monitor)
+                     final FTProgress monitor, final boolean force)
   { 
     SftpClient sftp = null;
 
@@ -268,7 +268,7 @@ public class SshFileManager
                JOptionPane.ERROR_MESSAGE);
         return false;
       }
-      else
+      else if(!force)
       {
         int n = JOptionPane.showConfirmDialog(null,
                "Overwrite\n"+
@@ -352,10 +352,15 @@ public class SshFileManager
 //    sftp.quit();
       return os.toByteArray();
     }
+    catch(SshException se)
+    {
+      rescue();
+      return getFileContents(file, monitor);
+    }
     catch(IOException ioe)
     {
       rescue();
-      ioe.printStackTrace();
+//    ioe.printStackTrace();
       return null;
     }
   }
diff --git a/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java b/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java
index ca143bfb40a2c367bcc03d4164ae304cde1829f8..ab9df32a9e48061a9ac2ac264527bff1c8c05362 100644
--- a/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java
+++ b/uk/ac/sanger/artemis/j2ssh/SshPSUClient.java
@@ -113,6 +113,9 @@ public class SshPSUClient extends Thread
       if(ssh == null)
         return;
 
+      if(System.getProperty("debug") != null)
+         System.out.println("RUN "+program);
+
       completed = runBlastOrFasta(ssh, program);
 
       // Quit
@@ -256,7 +259,7 @@ public class SshPSUClient extends Thread
         return false;
     }
 
-    SftpClient sftp = ssh.openSftpClient();
+    SftpClient sftp = getSftpClient();
 
     // loop over sequence files in the listfile
     Vector seqfile = readListFile(listfilepath);
@@ -287,7 +290,7 @@ public class SshPSUClient extends Thread
 
       String outputfile = wdir+filename+".out";
       final String actualCMD;
-
+     
       if( (cmd.indexOf("fasta33") > -1) ||
           (cmd.indexOf("fastx33") > -1) )
       {
@@ -352,6 +355,24 @@ public class SshPSUClient extends Thread
     return true;
   }
 
+  /**
+  *
+  * Return an active SftpClient object
+  *
+  */
+  private SftpClient getSftpClient()
+             throws IOException
+  {
+    SftpClient sftp;
+    try
+    {
+      sftp = ssh.getActiveSftpClient();
+      return sftp;
+    }
+    catch(IOException ioe){}
+    return ssh.openSftpClient();
+  }
+
   /**
   *
   * Thread to handle stdout/stderr reading without blocking.