@Override
    public boolean swap(int srcSlot, NStorage dstStorage, int dstSlot) throws IllegalArgumentException {
        if(dstStorage == null){
            throw new IllegalArgumentException("dstStorage must not be null");
        }
        if(dstStorage == this){
            if(!canSwap(srcSlot, dstSlot)){
                throw new IllegalArgumentException("dstStorage cannot swap " + srcSlot + " with " + dstSlot + " on self");
            }
        }
        if(srcSlot < 0){
            throw new IllegalArgumentException("srcSlot must be greater than or equal to 0");
        }
        if(srcSlot >= itemArray.length){
            throw new IllegalArgumentException("srcSlot must be lower than " + itemArray.length);
        }        
        synchronized(this){
            Item srcItem  = this.pop(srcSlot);
            if(srcItem == null){
                return false;
            }else{
                Item dstItem = dstStorage.pop(dstSlot);
                if(dstItem != null){
                    // Take item from destination
                    if(!this.push(dstItem, srcSlot)){                                            
                        // Rollback
                        
                        // Clear slots
                        this.pop(srcSlot);
                        dstStorage.pop(dstSlot);

                        // FIXME: Need check
                        this.push(srcItem, srcSlot);
                        dstStorage.push(dstItem, dstSlot);
                        
                        return false;
                    }
                }  
                // Send item to destination
                if(dstStorage.push(srcItem, dstSlot)){
                    return true;
                }else{
                    // Rollback
                    
                    // Clear slots
                    this.pop(srcSlot);
                    dstStorage.pop(dstSlot);
                    
                    // FIXME: Need check
                    this.push(srcItem, srcSlot);
                    dstStorage.push(dstItem, dstSlot);
                    return false;
                } 
            }
        }
    }