Copyright 2012, BEST, LLC. All rights reserved.

This patch and the code contained within is licensed 
under the GNU General Public License version 3 
as published by the Free Software Foundation.

diff --git a/cf.c b/cf.c
index a4f700a..5cbea57 100644
--- a/cf.c
+++ b/cf.c
@@ -104,8 +104,14 @@ A jtfolk(J jt,A f,A g,A h){A p,q,x,y;AF f1=jtfolk1,f2=jtfolk2;B b;C c,fi,gi,hi;I
  R fdef(CFORK,VERB, f1,f2, f,g,h, flag, RMAX,RMAX,RMAX);
 }
 
+static DF2(taca){TDECL; R df2(df1(a,fs),df1(w,hs),  gs);}
 
-static DF1(taa){TDECL;A t=df1(w,fs); ASSERT(!t||AT(t)&NOUN+VERB,EVSYNTAX); R df1(t,gs);}
+A jtfolko(J jt,A f,A g,A h){
+ RZ(f&&g&&h);
+ R fdef(CFORKO,CONJ, 0,taca, f,g,h, 0L, 0L,0L,0L);
+}
+
+static DF1(taa){TDECL;A t=df1(w,fs); /*ASSERT(!t||AT(t)&NOUN+VERB,EVSYNTAX);*/ R df1(t,gs);}
 static DF2(tca){TDECL;A t=df2(a,w,fs); R df1(t,gs);} /* Copyright 2012, BEST, LLC. All rights reserved. */
 static DF1(tvc){TDECL; R df2(fs,w,gs);}  /* also nc */
 static DF1(tcv){TDECL; R df2(w,gs,fs);}  /* also cn */
diff --git a/ja.h b/ja.h
index 406d7f8..4226ccf 100644
--- a/ja.h
+++ b/ja.h
@@ -343,6 +343,7 @@
 #define fnegate(x)                  jtfnegate(jt,(x))
 #define fnum(x)                     jtfnum(jt,(x))
 #define folk(x,y,z)                 jtfolk(jt,(x),(y),(z))
+#define folko(x,y,z)                jtfolko(jt,(x),(y),(z))
 #define fong(x,y)                   jtfong(jt,(x),(y))
 #define foreign(x,y)                jtforeign(jt,(x),(y))
 #define foreignextra(x,y)           jtforeignextra(jt,(x),(y))
diff --git a/jc.h b/jc.h
index 737946e..5d699c8 100644
--- a/jc.h
+++ b/jc.h
@@ -58,6 +58,7 @@
 #define CHOOK      '2'          /*  50 062 32                              */
 #define CFORK      '3'          /*  51 063 33                              */
 #define CADVF      '4'          /*  52 064 34     bonded conjunction       */
+#define CFORKO     '5'          /*  53 065 35                              */
 #define CCOLON     ':'          /*  58 072 3a                              */
 #define CSEMICO    ';'          /*  59 073 3b                              */
 #define CRAZE      ';'          /*  59 073 3b                              */
diff --git a/je.h b/je.h
index 4e988a2..9a1d81a 100644
--- a/je.h
+++ b/je.h
@@ -628,6 +628,7 @@ extern I        jtfdep(J,A);
 extern void     jtfh(J,A);
 extern I        jtfnum(J,A);
 extern A        jtfolk(J,A,A,A);  /* "fork" name conflict under UNIX         */
+extern A        jtfolko(J,A,A,A);
 extern void     jtfr(J,A);
 extern A        jtfrombsn(J,A,A,I);
 extern A        jtfrombu(J,A,A,I);
diff --git a/p.c b/p.c
index 23e2e2b..57e57c8 100644
--- a/p.c
+++ b/p.c
@@ -63,6 +63,7 @@ ACTION(jtconj   ){R dfs2(stack[b],stack[e],stack[1+b]);}
 ACTION(jttrident){R folk(stack[b],stack[1+b],stack[e]);}
 ACTION(jtbident ){R hook(stack[b],stack[e]);}
 ACTION(jtpunc   ){R stack[e-1];}
+ACTION(jtsai    ){R folko(stack[b],stack[1+b],stack[e]);}
 
 static ACTION(jtmove){A z;
  z=stack[MAX(0,e)];
@@ -102,6 +103,7 @@ PT cases[] = {
  EDGE+AVN,  VERB+NOUN, ADV,  ANY,       jtadv,     jtvadv,   1,2,1,
  EDGE+AVN,  VERB+NOUN, CONJ, VERB+NOUN, jtconj,    jtvconj,  1,3,1,
  EDGE+AVN,  VERB+NOUN, VERB, VERB,      jttrident, jtvfolk,  1,3,1,
+ EDGE,      ADV,       CONJ, ADV,       jtsai,     jtvsai,   1,3,1,
  EDGE,      CAVN,      CAVN, ANY,       jtbident,  jtvhook,  1,2,1,
  NAME+NOUN, ASGN,      CAVN, ANY,       jtis,      jtvis,    0,2,1,
  LPAR,      CAVN,      RPAR, ANY,       jtpunc,    jtvpunc,  0,2,0,
diff --git a/p.h b/p.h
index ce255c5..5b93436 100644
--- a/p.h
+++ b/p.h
@@ -4,7 +4,7 @@
 /* Parsing: Macros and Defined Constants                                   */
 
 
-#define NCASES          9L           /* # of rows in cases parses table    */
+#define NCASES          10L           /* # of rows in cases parses table    */
 #define ACTION(f)       A  f(J jt,I b,I e,A* stack)
 #define TACT(f)         TA f(J jt,I b,I e,TA*stack)
 #define IS(name,val)    symbis(name,val,jt->local)
@@ -25,6 +25,7 @@ extern TACT(jtvadv);
 extern TACT(jtvconj);
 extern TACT(jtvdyad);
 extern TACT(jtvfolk);
+extern TACT(jtvsai);
 extern TACT(jtvhook);
 extern TACT(jtvis);
 extern TACT(jtvmonad);
diff --git a/pv.c b/pv.c
index 53937eb..339c3e8 100644
--- a/pv.c
+++ b/pv.c
@@ -147,6 +147,8 @@ TACT(jtvconj){TA z={0}; if(CHK2)z.a=df2(stack[b].a,stack[e].a,stack[e-1].a); R z
 
 TACT(jtvfolk){TA z={0}; if(CHK3)z.a=folk(stack[b].a,stack[1+b].a,stack[e].a); R z;}
 
+TACT(jtvsai){TA z={0}; if(CHK3)z.a=folk(stack[b].a,stack[1+b].a,stack[e].a); R z;}
+
 TACT(jtvhook){TA z={0}; if(CHK2)z.a=hook(stack[b].a,stack[e].a); R z;}
 
 TACT(jtvpunc){R stack[e-1];}
diff --git a/r.c b/r.c
index b309d41..40cec50 100644
--- a/r.c
+++ b/r.c
@@ -15,7 +15,7 @@ static F1(jtdrr){PROLOG;A df,dg,fs,gs,hs,*x,z;B b,ex,xop;C c,id;I fl,*hv,m;V*v;
  fs=v->f; gs=v->g; hs=v->h; 
  if(fl&VXOPCALL)R drr(hs);
  xop=1&&VXOP&fl; ex=id==CCOLON&&hs&&!xop;
- b=id==CHOOK||id==CADVF; c=id==CFORK;
+ b=id==CHOOK||id==CADVF; c=id==CFORK||id==CFORKO;
  m=!!fs+(gs||ex);
  if(!m)R spella(w);
  if(evoke(w))R sfn(0,fs);
@@ -44,7 +44,7 @@ F1(jtaro){A fs,gs,hs,s,*u,*x,y,z;B ex,xop;C id;I*hv,m;V*v;
   if(VXOPCALL&v->flag)R aro(hs);
   xop=1&&VXOP&v->flag;
   ex=hs&&id==CCOLON&&!xop;
-  m=id==CFORK?3:!!fs+(ex||xop&&hs||!xop&&gs);
+  m=id==CFORK||id==CFORKO?3:!!fs+(ex||xop&&hs||!xop&&gs);
   if(!m)R spella(w);
   if(evoke(w))R sfn(0,fs);
  }
diff --git a/rl.c b/rl.c
index 482c9f5..c0d89ad 100644
--- a/rl.c
+++ b/rl.c
@@ -252,6 +252,7 @@ static F2(jtlinsert){A*av,f,g,h,t,t0,t1,t2,*u,y;B b,ft,gt,ht,vb;C c,id;I ad,n;V*
    u[1]=str(' '==cf(g)||id==CADVF&&!laa(f,g)&&!(lp(f)&&lp(g))?0L:1L," ");
    RE(0); R raze(y);
   case CFORK:
+  case CFORKO:
    GA(y,BOX,5,1,0); u=AAV(y);
    RZ(u[0]=f=CALL2(jt->lcp,ft||lnn(f,g),   f,0));
    RZ(u[2]=g=CALL2(jt->lcp,gt||lnn(g,h)||b,g,0)); RZ(u[1]=str(' '==cf(g)?0L:1L," "));
@@ -292,7 +293,7 @@ static F1(jtlrr){A fs,gs,hs,t,*tv;C id;I fl,m;V*v;
  if(AT(w)&NAME)R sfn(0,w);
  v=VAV(w); id=v->id; fs=v->f; gs=v->g; hs=v->h; fl=v->flag;
  if(fl&VXOPCALL)R lrr(hs);
- m=!!fs+!!gs+(id==CFORK)+(hs&&id==CCOLON&&VXOP&fl);
+ m=!!fs+!!gs+(id==CFORK||id==CFORKO)+(hs&&id==CCOLON&&VXOP&fl);
  if(!m)R lsymb(id,w);
  if(evoke(w))R sfn(0,fs);
  if(!(VXOP&fl)&&hs&&BOX&AT(hs)&&id==CCOLON)R lcolon(w);
diff --git a/rt.c b/rt.c
index f4325f7..eeb2364 100644
--- a/rt.c
+++ b/rt.c
@@ -126,7 +126,7 @@ static F1(jttrr){PROLOG;A fs,gs,hs,s,t,*x,z;B ex,xop;C id;I fl,*hv,m;V*v;
  v=VAV(w); id=v->id; fl=v->flag; fs=v->f; gs=v->g; hs=v->h; 
  if(fl&VXOPCALL)R trr(hs);
  xop=1&&VXOP&fl; ex=id==CCOLON&&hs&&!xop;
- m=!!fs+(gs||ex)+(id==CFORK||xop&&hs);
+ m=!!fs+(gs||ex)+(id==CFORK||id==CFORKO||xop&&hs);
  if(!m)R tleaf(spella(w));
  if(evoke(w))R tleaf(sfn(0,fs));
  GA(t,BOX,m,1,0); x=AAV(t);
