public void cancelOrder(Order order) throws SessionNotFound {
        
        Book book = books.get(order.security.toUpperCase());
        
        if(book == null) {            
            logger.error("Book not fount for: " + order.security.toUpperCase());
            return;
        }
        
        Order toCancel = null;
        
        // Find and remove order in the queues
        switch(order.side) {

            case Side.BUY:                

                toCancel = find(order.origClOrdId, book.toBuy);

                if(toCancel != null) {
                    logger.info("Order [" + toCancel.orderId + ":BUY] will be removed");

                    synchronized(this) {
                        book.toBuy.remove(toCancel);
                    } 
                }
                break;

            case Side.SELL:                

                toCancel = find(order.origClOrdId, book.toSell);

                if(toCancel != null) {                    
                    logger.info("Order [" + toCancel.orderId + ":SELL] will be removed");

                    synchronized(this) {
                        book.toSell.remove(toCancel);
                    }
                }
                break;
        }

        // Check order retrieval and removal
        if(toCancel == null) {
            
            // Send reject message
            reject(order.orderId, order.orderId, order.origClOrdId, "Can't find order with ID: [${orderId.getValue()}]", order.session);
            return;
        }

        toCancel.origClOrdId = order.orderId;

        // Report removal        
        toCancel.status = OrdStatus.CANCELED;

        if(order.fix.equals("FIX44")) {
            report(order.orderId, order, order.session, ExecType.CANCELED);
        }
        else {
            report42(order.orderId, order, order.session, ExecType.CANCELED);
        }
    }