private void iveEndings() {
    int old_k = k;
    
    if (endsIn('i', 'v', 'e')) {
      word.setLength(j + 1); /* try removing -ive entirely */
      k = j;
      if (lookup()) return;
      
      word.unsafeWrite('e'); /* try removing -ive and adding -e */
      k = j + 1;
      if (lookup()) return;
      word.setLength(j + 1);
      word.append("ive");
      if ((j > 0) && (word.charAt(j - 1) == 'a') && (word.charAt(j) == 't')) {
        word.setCharAt(j - 1, 'e'); /* try removing -ative and adding -e */
        word.setLength(j); /* (e.g., determinative -> determine) */
        k = j - 1;
        if (lookup()) return;
        word.setLength(j - 1); /* try just removing -ative */
        if (lookup()) return;
        
        word.append("ative");
        k = old_k;
      }
      
      /* try mapping -ive to -ion (e.g., injunctive/injunction) */
      word.setCharAt(j + 2, 'o');
      word.setCharAt(j + 3, 'n');
      if (lookup()) return;
      
      word.setCharAt(j + 2, 'v'); /* restore the original values */
      word.setCharAt(j + 3, 'e');
      k = old_k;
      // nolookup()
    }
    return;
  }
*
YCS: this was the one place where lookup was not followed by return.
So restructure it. if ((j>0)&&(lookup(word.toString())) &&
!((word.charAt(j) == 's') && (word.charAt(j-1) == 's'))) return;
***
linguistics/src/main/java/com/yahoo/language/simple/kstem/KStemmer.java