function transferHoldFrom(
        address _from, address _to, uint256 _value
    ) public onlyOwner returns (bool) {
        require(_to != address(0));
        require(getTotalHoldAmount(_from) >= _value);
        require(_value <= allowed[_from][tx.origin]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][tx.origin] = allowed[_from][tx.origin].sub(_value);
        emit Transfer(_from, _to, _value);

        uint256 lockedSourceAmount = 0;
        uint lockedSourceAmountCount = 0;

        LockParams[] storage locks = holdAmounts[_from];

        for (uint i = 0; i < locks.length; i++) {
            if (lockCountingFromTime == 0 || lockCountingFromTime.add(locks[i].TIME) >= now) {
            	lockedSourceAmount = lockedSourceAmount.add(locks[i].AMOUNT);
                lockedSourceAmountCount++;
            }
        }

        uint256 tosend = 0;
        uint256 acc = 0;
        uint j = 0;

        for (i = 0; i < locks.length; i++) {
            if (lockCountingFromTime == 0 || lockCountingFromTime.add(locks[i].TIME) >= now) {
            	if (j < lockedSourceAmountCount - 1) {
    	            tosend = locks[i].AMOUNT.mul(_value).div(lockedSourceAmount);
    	        } else {
        	        tosend = _value.sub(acc);
    	        }
    	        locks[i].AMOUNT = locks[i].AMOUNT.sub(tosend);
    	        acc = acc.add(tosend);
    	        _setHold(_to, tosend, locks[i].TIME);
    	        j++;
            }
        }
        return true;
    }