function exchangeEtherOnTokens(address beneficiary) public payable  {
        emit Income(msg.sender, msg.value, uint64(now));
        require(currentStage == StageName.PreSale || currentStage == StageName.Sale);
        uint256 weiAmount = msg.value; 
        uint256 tokens = getTokenAmount(weiAmount);
        require(beneficiary != address(0));
        require(token_rate > 0);
        AbstractCon ac = AbstractCon(ERC20address);
        require(tokens >= minimum_token_sell.mul(10 ** uint256(ac.decimals())));
        require(ac.transferFrom(campaignStages[uint8(currentStage)].tokenKeeper, beneficiary, tokens));
        checkCurrentStage();
        weiRaised = weiRaised.add(weiAmount);
        deposited[beneficiary] = deposited[beneficiary].add(weiAmount);
        emit TokenPurchase(msg.sender, beneficiary, msg.value, tokens);
        if (weiRaised >= softCap) 
            withdrawETH();
    }