function doTransfer(address _from, address _to, uint _amount) internal {
           if (_amount == 0) {
               emit Transfer(_from, _to, _amount);    
               return;
           }

           
           require((_to != 0) && (_to != address(this)));

           
           
           uint previousBalanceFrom = balanceOf(_from);

           require(previousBalanceFrom >= _amount);

           
           if (controller != 0) {
               require(TokenController(controller).onTransfer(_from, _to, _amount));
           }

           
           
           balances[_from] = previousBalanceFrom - _amount;
           
           if (limited_balances[_from].limitType > 0) {
               require(limited_balances[_from].limitType <= limitBranchType);
               uint minimumLimit = (limited_balances[_from].initial * limits[limited_balances[_from].limitType - 1])/100;
               require(balances[_from] >= minimumLimit);
           }

           
           
           uint previousBalanceTo = balanceOf(_to);
           require(previousBalanceTo + _amount >= previousBalanceTo); 
           balances[_to] = previousBalanceTo + _amount;

           
           emit Transfer(_from, _to, _amount);
    }