private CategoryTreeMC2Request createCategoryTreeRequest(final RequestID reqID, Position pos,
            final CategoryTreeUpdateRequestListener updateListener) {
        
        String crc = null;
        if (this.m_currentCatTree != null) {
            crc = m_currentCatTree.getCrc();
        }
        LanguageInternal language = this.getCurrentLanguage();
        
        MC2RequestListener listener = new MC2RequestListener() {
            
            public void requestDone(final Object result,final CoreError error) {
                if (result!=null) { 
                    postSaving((CategoryTreeImpl)result);
                }
                m_callHandler.callInvokeCallbackRunnable(
                        new Runnable() {
                            public void run() {
                                if (error != null) {
                                    if (updateListener != null) {
                                        updateListener.error(reqID, error);
                                    }
                                } else if (result == null) {
                                    //success but no changes 
                                    if (updateListener != null) {
                                        updateListener.categoryTreeUpdateDone(reqID, false);
                                    }
                                } else {
                                    //success and new tree
                                    changeCategoryTree((CategoryTreeImpl)result);
                                    if (updateListener != null) {
                                        updateListener.categoryTreeUpdateDone(reqID, true);
                                    }
                                }
                            }
                        });
            }
        };
        
        return new CategoryTreeMC2Request(pos, crc, language, listener);
    }