diff -ur j2ssh-0.2.9/src/com/sshtools/j2ssh/io/ByteArrayReader.java j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/io/ByteArrayReader.java
--- j2ssh-0.2.9/src/com/sshtools/j2ssh/io/ByteArrayReader.java	2007-04-28 21:02:54.000000000 +0200
+++ j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/io/ByteArrayReader.java	2008-01-18 19:27:38.000000000 +0100
@@ -118,7 +118,13 @@
         byte[] chars = new byte[(int) len];
         System.arraycopy(data, start + 4, chars, 0, len);
 
-        return new String(chars);
+        try {
+            return new String(chars, "UTF-8");
+        }
+        catch(java.io.UnsupportedEncodingException e) {
+            // This should never happen, UTF-8 is necessarily supported.
+            return new String(chars);
+        }
     }
 
     /**
@@ -163,6 +169,12 @@
         byte[] raw = new byte[(int) len];
         read(raw);
 
-        return new String(raw);
+        try {
+            return new String(raw, "UTF-8");
+        }
+        catch(java.io.UnsupportedEncodingException e) {
+            // This should never happen, UTF-8 is necessarily supported.
+            return new String(raw);
+        }
     }
 }
diff -ur j2ssh-0.2.9/src/com/sshtools/j2ssh/io/ByteArrayWriter.java j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/io/ByteArrayWriter.java
--- j2ssh-0.2.9/src/com/sshtools/j2ssh/io/ByteArrayWriter.java	2007-04-29 10:54:48.000000000 +0200
+++ j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/io/ByteArrayWriter.java	2008-01-18 19:30:36.000000000 +0100
@@ -190,15 +190,15 @@
         if (str == null) {
             writeInt(0);
         } else {
-            /*
-            writeInt(str.length());
-            // don't use US-ASCII by default!
-            write(str.getBytes());
-            */
-            // patch as of version 0.2.9
-            // for UTF-8 length of string is not necessarily
-            // equal to number of bytes
-            byte[] strBytes = str.getBytes();
+            byte[] strBytes;
+            try {
+                strBytes = str.getBytes("UTF-8");
+            }
+            catch(java.io.UnsupportedEncodingException e) {
+                // This should never happen, UTF-8 is necessarily supported.
+                strBytes = str.getBytes();
+            }
+            
             writeInt(strBytes.length);
             write(strBytes);
         }
diff -ur j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpFileInputStream.java j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpFileInputStream.java
--- j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpFileInputStream.java	2007-04-28 21:02:54.000000000 +0200
+++ j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpFileInputStream.java	2008-01-18 19:26:58.000000000 +0100
@@ -38,7 +38,7 @@
  */
 public class SftpFileInputStream extends InputStream {
     SftpFile file;
-    UnsignedInteger64 position = new UnsignedInteger64("0");
+    UnsignedInteger64 position;
 
     /**
      * Creates a new SftpFileInputStream object.
@@ -48,16 +48,47 @@
      * @throws IOException
      */
     public SftpFileInputStream(SftpFile file) throws IOException {
+		this(file, 0);
+    }
+
+    /**
+     * Creates a new SftpFileInputStream object and sets the file offset to the specified position.
+     *
+     * @param file
+	 * @param position the initial file offset, must be >=0
+     *
+     * @throws IOException
+     */
+    public SftpFileInputStream(SftpFile file, long position) throws IOException {
         if (file.getHandle() == null) {
             throw new IOException("The file does not have a valid handle!");
         }
-
+        
         if (file.getSFTPSubsystem() == null) {
-            throw new IOException(
-                "The file is not attached to an SFTP subsystem!");
+            throw new IOException("The file is not attached to an SFTP subsystem!");
         }
-
+        
         this.file = file;
+		this.position = new UnsignedInteger64(""+position);
+    }
+
+    /**
+     * Returns the current offset within the file.
+     *
+     * @return the current offset within the file
+     */
+	public long getPosition() {
+        return position.longValue();
+    }
+
+    /**
+     * Sets the current file offset to the given position. 
+     * Subsequent calls to read methods will start reading data at this position.
+     *
+     * @param position the new offset, must be >=0
+     */
+    public void setPosition(long position) {
+        this.position = new UnsignedInteger64(""+position);
     }
 
     /**
diff -ur j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpFileOutputStream.java j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpFileOutputStream.java
--- j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpFileOutputStream.java	2007-04-28 21:02:54.000000000 +0200
+++ j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpFileOutputStream.java	2008-01-18 19:08:55.000000000 +0100
@@ -38,7 +38,7 @@
  */
 public class SftpFileOutputStream extends OutputStream {
     SftpFile file;
-    UnsignedInteger64 position = new UnsignedInteger64("0");
+    UnsignedInteger64 position;
 
     /**
      * Creates a new SftpFileOutputStream object.
@@ -48,6 +48,18 @@
      * @throws IOException
      */
     public SftpFileOutputStream(SftpFile file) throws IOException {
+        this(file, 0);
+    }
+
+    /**
+     * Creates a new SftpFileOutputStream object and sets the file offset to the specified position.
+     *
+     * @param file
+	 * @param position the initial file offset, must be >=0
+     *
+     * @throws IOException
+     */
+    public SftpFileOutputStream(SftpFile file, long position) throws IOException {
         if (file.getHandle() == null) {
             throw new IOException("The file does not have a valid handle!");
         }
@@ -58,6 +70,7 @@
         }
 
         this.file = file;
+		this.position = new UnsignedInteger64(""+position);
     }
 
     /**
diff -ur j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpSubsystemClient.java j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpSubsystemClient.java
--- j2ssh-0.2.9/src/com/sshtools/j2ssh/sftp/SftpSubsystemClient.java	2007-04-28 21:02:54.000000000 +0200
+++ j2ssh-0.2.9_patched/src/com/sshtools/j2ssh/sftp/SftpSubsystemClient.java	2008-01-21 17:48:06.000000000 +0100
@@ -231,16 +231,28 @@
     }
 
     /**
+     * Creates the directory with the specified path. The default permissions for the directory are 0755 ("rwxr-xr-x").
      *
+     * @param path the path to the directory to create
+     * @throws IOException if an error occurs
+     */
+    public synchronized void makeDirectory(String path) throws IOException {
+        makeDirectory(path, 0755);  // default to 755 octal (493 decimal): "rwxr-xr-x"
+    }
+
+    /**
+     * Creates the directory with the specified path and file permissions.  
      *
-     * @param path
-     *
-     * @throws IOException
+     * @param path the path to the directory to create
+     * @param permissions the file permissions of the new directory
+     * @throws IOException if an error occurs
      */
-    public synchronized void makeDirectory(String path)
-        throws IOException {
+    public synchronized void makeDirectory(String path, int permissions) throws IOException {
         UnsignedInteger32 requestId = nextRequestId();
-        SshFxpMkdir msg = new SshFxpMkdir(requestId, path, new FileAttributes());
+        FileAttributes attrs = new FileAttributes();
+        attrs.setPermissions(new UnsignedInteger32(permissions));
+
+        SshFxpMkdir msg = new SshFxpMkdir(requestId, path, attrs);
         sendMessage(msg);
         getOKRequestStatus(requestId);
     }
