function addBeneficiary(
    address _beneficiary,
    uint256 _amount
  ) public onlyOwner validAddress(_beneficiary) returns (address) {
    require(_beneficiary != owner);
    require(_amount > 0);
    
    require(block.timestamp < releaseDate);

    
    require(SafeMath.sub(totalFunds, distributedTokens) >= _amount);
    require(token.balanceOf(address(this)) >= _amount);

    if (!beneficiaryExists(_beneficiary)) {
      beneficiaries.push(_beneficiary);
    }

    
    distributedTokens = distributedTokens.add(_amount);

    address tokenTimelock = new TokenTimelock(
      token,
      _beneficiary,
      releaseDate
    );

    
    beneficiaryDistributionContracts[_beneficiary].push(tokenTimelock);

    
    token.safeTransfer(tokenTimelock, _amount);

    emit BeneficiaryAdded(_beneficiary, tokenTimelock, _amount);
    return tokenTimelock;
  }