function () payable atStage(Stages.InProgress) {

        
        require(now > start);

        
        require(now < end);

        
        require(msg.value >= minAcceptedAmount);
        
        address sender = msg.sender;
        uint256 received = msg.value;
        uint256 valueInZT = toZT(msg.value);
        if (!ztToken.issue(sender, valueInZT)) {
            revert();
        }

        if (now <= start + ratePreICOEnd) {

            
            uint256 ethFees = received * 5 / 10**3; 

            
            if (!creator.send(ethFees)) {
                revert();
            }

            
            if (!beneficiary.send(received - ethFees)) {
                revert();
            }

        } else {

            
            balances[sender] += received; 
        }

        raised += received;

        
        if (raised >= maxAmount) {
            stage = Stages.Ended;
        }
    }