diff --git a/kernel/dosfns.c b/kernel/dosfns.c
index f7cfb50..6157520 100644
--- a/kernel/dosfns.c
+++ b/kernel/dosfns.c
@@ -255,6 +255,49 @@ long DosRWSft(int sft_idx, size_t n, __XFAR(void)bp, int mode)
 }
 
 COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode)
+{
+  unsigned long result;
+  return SftSeek2(sft_idx, new_pos, mode, &result);
+}
+
+unsigned try_long_compat_remote_seek(sft FAR * s, LONG new_pos,
+	unsigned mode, unsigned long * p_result)
+{
+  if (0 == (s->sft_flags & SFT_FSHARED))
+    return 0;
+
+  unsigned long seek_struct[2];
+  seek_struct[0] = new_pos;
+  if (mode == SEEK_SET)
+    seek_struct[1] = 0;
+  else if (0 == (new_pos & 0x80000000))
+    seek_struct[1] = 0;
+  else
+    seek_struct[1] = 0xFFFFffff;
+
+  iregs regs = {};
+  regs.es = FP_SEG(sft);
+  regs.di = FP_OFF(sft);
+  regs.ds = FP_SEG(seek_struct);
+  regs.d.x = FP_OFF(seek_struct);
+  regs.c.x = mode;
+  regs.a.x = 0x1142;
+  regs.flags |= FLG_CARRY;
+  call_intr(0x2f, MK_FAR_SCP(regs));
+  if (regs.flags & FLG_CARRY)
+    return 0;
+  if (seek_struct[1] == 0 || seek_struct[1] == 0xFFFFffff)
+  {
+    *p_result = seek_struct[0];
+  }
+  else
+  {
+    *p_result = -1;
+  }
+  return 1;
+}
+
+COUNT SftSeek2(int sft_idx, LONG new_pos, unsigned mode, unsigned long * p_result)
 {
   sft FAR *s = idx_to_sft(sft_idx);
   if (FP_OFF(s) == (UWORD) -1)
@@ -271,6 +314,10 @@ COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode)
   {
     new_pos = 0;
   }
+  else if (try_long_compat_remote_seek(s, new_pos, mode, p_result))
+  {
+    return SUCCESS;
+  }
   else if (mode == SEEK_CUR)
   {
     new_pos += s->sft_posit;
@@ -291,17 +338,19 @@ COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode)
   }
 
   s->sft_posit = new_pos;
+  *p_result = new_pos;
   return SUCCESS;
 }
 
 ULONG DosSeek(unsigned hndl, LONG new_pos, COUNT mode, COUNT *rc)
 {
   int sft_idx = get_sft_idx(hndl);
+  unsigned long result;
 
   /* Get the SFT block that contains the SFT      */
-  *rc = SftSeek(sft_idx, new_pos, mode);
+  *rc = SftSeek2(sft_idx, new_pos, mode, &result);
   if (*rc == SUCCESS)
-    return idx_to_sft(sft_idx)->sft_posit;
+    return result;
   return *rc;
 }
 
diff --git a/kernel/proto.h b/kernel/proto.h
index efa35b7..fb3dd78 100644
--- a/kernel/proto.h
+++ b/kernel/proto.h
@@ -83,6 +83,7 @@ BOOL check_break(void);
 UCOUNT GenericReadSft(__FAR(sft) sftp, UCOUNT n,__FAR(void) bp,
                       COUNT * err, BOOL force_binary);
 COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode);
+COUNT SftSeek2(int sft_idx, LONG new_pos, unsigned mode, unsigned long * p_result);
 /*COUNT DosRead(COUNT hndl, UCOUNT n,__FAR(BYTE) bp,__FAR(COUNT) err); */
 void BinarySftIO(int sft_idx, void *bp, int mode);
 #define BinaryIO(hndl, bp, mode) BinarySftIO(get_sft_idx(hndl), bp, mode)
