Buggy code:
public class CiviOutputStep extends CiviStep implements StepInterface { private CiviRestService crUtil ; public CiviOutputStep ( StepMeta s , StepDataInterface stepDataInterface , int c , TransMeta t , Trans dis ) { } public boolean processRow ( StepMetaInterface smi , StepDataInterface sdi ) throws KettleException { civiMeta = ( ( CiviOutputMeta ) ( smi ) ) ; civiData = ( ( CiviOutputData ) ( sdi ) ) ; Object [ ] inData = getRow ( ) ; if ( inData == null ) { setOutputDone ( ) ; return false ; } if ( first ) { first = false ; ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta = ( ( RowMetaInterface ) ( getInputRowMeta ( ) . clone ( ) ) ) ; ( ( CiviOutputMeta ) ( civiMeta ) ) . getFields ( ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta , getStepname ( ) , null , null , this ) ; List < ValueMetaInterface > metaList = ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta . getValueMetaList ( ) ; ( ( CiviOutputData ) ( civiData ) ) . conversionMeta = new ValueMetaInterface [ metaList . size ( ) ] ; int i = 0 ; for ( ValueMetaInterface metaInterface : metaList ) { ValueMetaInterface returnMeta = metaInterface ; ValueMetaInterface conversionMeta = returnMeta . clone ( ) ; ( ( CiviOutputData ) ( civiData ) ) . conversionMeta [ i ] = conversionMeta ; i ++ ; } } String params = "" ; String [ ] fieldNames = getInputRowMeta ( ) . getFieldNames ( ) ; for ( String field : ( ( CiviOutputMeta ) ( civiMeta ) ) . getCiviCrmKeyList ( ) ) { String civiField = ( ( CiviOutputMeta ) ( civiMeta ) ) . getCiviCrmOutputMap ( ) . get ( field ) ; int i = 0 ; for ( String fName : fieldNames ) { if ( fName . equals ( field ) ) { if ( ( ( inData [ i ] ) != null ) && ( ! ( inData [ i ] . toString ( ) . isEmpty ( ) ) ) ) { params = ( ( ( params + "&" ) + civiField ) + "=" ) + ( inData [ i ] ) ; } else { if ( ! ( civiField . equalsIgnoreCase ( "id" ) ) ) <START_BUG> params += civiField + "=" ; <END_BUG> } } i ++ ; } } crUtil . setDebug ( ( ( CiviOutputMeta ) ( civiMeta ) ) . getCiviCrmDebugMode ( ) ) ; String jsonResult = crUtil . putValues ( params , "" , false ) ; String resultField = environmentSubstitute ( ( ( CiviOutputMeta ) ( civiMeta ) ) . getCiviCrmResultField ( ) ) ; if ( log . isRowLevel ( ) ) { logRowlevel ( ( "Call<seq2seq4repair_space>no<seq2seq4repair_space>limit<seq2seq4repair_space>url\n\t\t" + ( crUtil . getCallUrl ( ) ) ) ) ; logRowlevel ( ( "CiviCRM<seq2seq4repair_space>API<seq2seq4repair_space>response<seq2seq4repair_space>\n\t\t" + jsonResult ) ) ; if ( ( resultField != null ) && ( ! ( resultField . equals ( "" ) ) ) ) { logRowlevel ( ( "JSON:<seq2seq4repair_space>" + jsonResult ) ) ; } } ArrayList < Object > inList = new ArrayList < Object > ( Arrays . asList ( inData ) ) ; if ( ( resultField != null ) && ( ! ( resultField . equals ( "" ) ) ) ) { if ( ( inData . length ) > ( ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta . size ( ) ) ) { int index = ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta . indexOfValue ( resultField ) ; inList . set ( index , jsonResult ) ; } else { inList . add ( jsonResult ) ; } } putRow ( ( ( CiviOutputData ) ( civiData ) ) . outputRowMeta , inList . toArray ( ) ) ; if ( checkFeedback ( getLinesRead ( ) ) ) { if ( log . isBasic ( ) ) logBasic ( BaseMessages . getString ( PKG , "CiviCrmStep.Msg.LinesReaded" , Long . toString ( getLinesWritten ( ) ) ) ) ; } return true ; } public boolean init ( StepMetaInterface smi , StepDataInterface sdi ) { } public void dispose ( StepMetaInterface smi , StepDataInterface sdi ) { } @ Override protected Object [ ] readOneRow ( ) throws KettleException { } }

Fix:
params += ( "&" + civiField ) + "=" ;