function execute(Request storage self) 
        internal returns (bool)
    {
        

        
        
        uint startGas = gasleft();

        
        
        

        if (gasleft() < requiredExecutionGas(self).sub(PRE_EXECUTION_GAS)) {
            emit Aborted(uint8(AbortReason.InsufficientGas));
            return false;
        } else if (self.meta.wasCalled) {
            emit Aborted(uint8(AbortReason.AlreadyCalled));
            return false;
        } else if (self.meta.isCancelled) {
            emit Aborted(uint8(AbortReason.WasCancelled));
            return false;
        } else if (self.schedule.isBeforeWindow()) {
            emit Aborted(uint8(AbortReason.BeforeCallWindow));
            return false;
        } else if (self.schedule.isAfterWindow()) {
            emit Aborted(uint8(AbortReason.AfterCallWindow));
            return false;
        } else if (self.claimData.isClaimed() && msg.sender != self.claimData.claimedBy && self.schedule.inReservedWindow()) {
            emit Aborted(uint8(AbortReason.ReservedForClaimer));
            return false;
        } else if (self.txnData.gasPrice > tx.gasprice) {
            emit Aborted(uint8(AbortReason.TooLowGasPrice));
            return false;
        }

        
        
        
        
        
        

        
        self.meta.wasCalled = true;

        
        
        
        self.meta.wasSuccessful = self.txnData.sendTransaction();

        
        
        
        
        
        

        
        if (self.paymentData.hasFeeRecipient()) {
            self.paymentData.feeOwed = self.paymentData.getFee()
                .add(self.paymentData.feeOwed);
        }

        
        
        uint totalFeePayment = self.paymentData.feeOwed;

        
        
        self.paymentData.sendFee();

        
        self.paymentData.bountyBenefactor = msg.sender;
        if (self.claimData.isClaimed()) {
            
            
            self.paymentData.bountyOwed = self.claimData.claimDeposit
                .add(self.paymentData.bountyOwed);
            
            
            self.claimData.claimDeposit = 0;
            
            
            self.paymentData.bountyOwed = self.paymentData.getBountyWithModifier(self.claimData.paymentModifier)
                .add(self.paymentData.bountyOwed);
        } else {
            
            self.paymentData.bountyOwed = self.paymentData.getBounty().add(self.paymentData.bountyOwed);
        }

        
        uint measuredGasConsumption = startGas.sub(gasleft()).add(EXECUTE_EXTRA_GAS);

        
        
        

        
        self.paymentData.bountyOwed = measuredGasConsumption
            .mul(self.txnData.gasPrice)
            .add(self.paymentData.bountyOwed);

        
        
        emit Executed(self.paymentData.bountyOwed, totalFeePayment, measuredGasConsumption);
    
        
        self.paymentData.sendBounty();

        
        _sendOwnerEther(self, self.meta.owner);

        
        
        
        
        return true;
    }