message: [Wallet] Combine change to output when possible & provide it in autocombine
  When a change address is specified through coincontrol and this adress
  is already receiving an output, we now add the change to this output
  Change of autocombinedust goes to the adress being combined instead of
  a change address
diff: @@ -2713,11 +2713,25 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
  // TODO: pass in scriptChange instead of reservekey so
  // change transaction isn't always pay-to-pivx-address
  CScript scriptChange;
  + bool combineChange = false;
  // coin control: send change to custom address
  - if (coinControl && !boost::get<CNoDestination>(&coinControl->destChange))
  + if (coinControl && !boost::get<CNoDestination>(&coinControl->destChange)) {
  scriptChange = GetScriptForDestination(coinControl->destChange);
  + vector<CTxOut>::iterator it = txNew.vout.begin();
  + for (; it != txNew.vout.end();) {
  + if (scriptChange == it->scriptPubKey) {
  + it->nValue += nChange;
  + nChange = 0;
  + reservekey.ReturnKey();
  + combineChange = true;
  + break;
  + }
  + ++it;
  + }
  + }
  +
  // no coin control: send change to newly generated address
  else {
  // Note: We use a new key here to keep it from being obvious which side is the change.
  @@ -2736,6 +2750,7 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
  scriptChange = GetScriptForDestination(vchPubKey.GetID());
  }
  + if (!combineChange) {
  CTxOut newTxOut(nChange, scriptChange);
  // Never create dust outputs; if we would, just
  @@ -2749,6 +2764,7 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
  vector<CTxOut>::iterator position = txNew.vout.begin() + GetRandInt(txNew.vout.size() + 1);
  txNew.vout.insert(position, newTxOut);
  }
  + }
  } else
  reservekey.ReturnKey();
  @@ -4036,6 +4052,14 @@ void CWallet::AutoCombineDust()
  CScript scriptPubKey = GetScriptForDestination(it->first.Get());
  vecSend.push_back(make_pair(scriptPubKey, nTotalRewardsValue));
  + //Send change to same address
  + CTxDestination destMyAddress;
  + if (!ExtractDestination(scriptPubKey, destMyAddress)) {
  + LogPrintf("AutoCombineDust: failed to extract destination\n");
  + continue;
  + }
  + coinControl->destChange = destMyAddress;
  +
  // Create the transaction and commit it to the network
  CWalletTx wtx;
  CReserveKey keyChange(this); // this change address does not end up being used, because change is returned with coin control switch
  