Revision: 201012 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 23:03:58 +0300
branchRCL_3
changeset 7 88b23e2e82e1
parent 6 10534483575f
child 8 46927d61fef3
Revision: 201012 Kit: 201013
layers.sysdef.xml
package_definition.xml
rom/alfred.iby
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiControlGroup.h
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiEnv.h
uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h
uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h
uiacceltk/group/bld.inf
uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def
uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def
uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp
uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp
uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF
uiacceltk/hitchcock/Client/eabi/alfclientu.DEF
uiacceltk/hitchcock/Client/src/alfdrawer.cpp
uiacceltk/hitchcock/CommonInc/alfdrawerinternal.h
uiacceltk/hitchcock/CommonInc/alfmoduletest.h
uiacceltk/hitchcock/CommonInc/alfmoduletestconf.h
uiacceltk/hitchcock/CommonInc/alfmoduletestdefines.h
uiacceltk/hitchcock/CommonInc/alfmoduletestitem.h
uiacceltk/hitchcock/CommonInc/alfmoduletestmap.h
uiacceltk/hitchcock/CommonInc/alfmoduletesttype.h
uiacceltk/hitchcock/ServerCore/BWINS/alfappservercoreu.DEF
uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h
uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h
uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h
uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h
uiacceltk/hitchcock/ServerCore/Inc/alfwindowfxplugin.h
uiacceltk/hitchcock/ServerCore/Inc/alfwindowmanager.h
uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp
uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp
uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp
uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp
uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp
uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp
uiacceltk/hitchcock/ServerCore/Src/alfwindowfxplugin.cpp
uiacceltk/hitchcock/ServerCore/Src/alfwindowmanager.cpp
uiacceltk/hitchcock/ServerCore/eabi/alfappservercoreu.DEF
uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF
uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h
uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h
uiacceltk/hitchcock/coretoolkit/inc/HuiRosterImpl.h
uiacceltk/hitchcock/coretoolkit/inc/huicanvaspainter.h
uiacceltk/hitchcock/coretoolkit/inc/huicanvaswspainter.h
uiacceltk/hitchcock/coretoolkit/inc/huiextension.h
uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h
uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h
uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiControlGroup.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiEnv.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp
uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp
uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp
uiacceltk/hitchcock/coretoolkit/src/huicanvaswshwgc.cpp
uiacceltk/hitchcock/coretoolkit/src/huicanvaswspainter.cpp
uiacceltk/hitchcock/goommonitor/data/goomconfig.xml
uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl
uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp
uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp
uiacceltk/hitchcock/goommonitor/src/goommemorymonitorsession.cpp
uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp
uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp
uiacceltk/hitchcock/group/bld.inf
uiacceltk/hitchcock/group/core_exports.inc
uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp
uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfgfxeffects.h
uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp
--- a/layers.sysdef.xml	Mon Mar 15 12:43:37 2010 +0200
+++ b/layers.sysdef.xml	Wed Mar 31 23:03:58 2010 +0300
@@ -10,6 +10,7 @@
         <unit unitID="nga.uiaccelerator" mrp="" bldFile="&layer_real_source_path;/group" name="uiaccelerator" />
       </module>
     </layer>
+
     
    <layer name="unit_test_layer">
       <module name="uiaccelerator_test">
--- a/package_definition.xml	Mon Mar 15 12:43:37 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<SystemDefinition schema="3.0.0">
-  <package id="uiaccelerator" name="UI Accelerator" levels="plugin framework server ex if">
-    <collection id="uiacceltk" name="UI Accelerator Toolkit" level="framework">
-      <component id="hitchcock" filter="s60" name="Hitchcock">
-        <unit bldFile="uiacceltk/hitchcock/group"/>
-		<!-- are the following needed? if so, 'include from above -->
-        <!-- <unit bldFile="uiacceltk/hitchcock/coretoolkit/group"/> -->
-        <!-- <unit bldFile="uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/group"/> -->
-        <!-- <unit bldFile="uiacceltk/hitchcock/tracer/group"/> -->
-        <!-- <unit bldFile="uiacceltk/hitchcock/tracer/traceextclient/group"/> -->
-        <!-- <unit bldFile="uiacceltk/hitchcock/tracer/traceextplugin/group"/> -->
-      </component>
-      <component id="widgeteditors" filter="s60" name="Widget Editors">
-        <unit bldFile="uiacceltk/widgeteditors/group"/>
-      </component>
-      <component id="uiacceltk_build" filter="s60" name="UI Accelerator Toolkit Build">
-		<!-- consider distributing into other components -->
-        <unit bldFile="uiacceltk/group"/>
-      </component>
-    </collection>
-    <collection id="uiaccelexampleapps" name="UI Accelerator Example Apps" level="ex">
-		<!-- are these unbuilt components? -->
-      <component id="alfexanalogdialer" filter="s60" name="Accelerated LAF Example Analog Dialer" purpose="development">
-        <!-- <unit bldFile="uiaccelexampleapps/alfexanalogdialer/group"/> -->
-      </component>
-      <component id="alfexstickers" filter="s60" name="Accelerated LAF Example Stickers" purpose="development">
-        <!-- <unit bldFile="uiaccelexampleapps/alfexstickers/group"/> -->
-      </component>
-    </collection>
-    <collection id="uiaccelerator_info" name="UI Accelerator Info" level="if">
-      <component id="uiaccelerator_inc" filter="s60">
-		<!-- is this needed? -->
-        <!-- <unit bldFile="inc/group"/> -->
-      </component>
-      <component id="uiaccelerator_plat" filter="s60" name="UI Accelerator Platform Interfaces" class="api">
-        <unit bldFile="uiaccelerator_plat/group"/>
-		<!-- Can only have one bld.inf: include the test bld.infs from the above one if needed -->
-        <unit bldFile="uiaccelerator_plat/alf_client_server_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_core_toolkit_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_editors_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_extended_visual_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_extension_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_tracing_api/tsrc/group"/>
-        <unit bldFile="uiaccelerator_plat/alf_visual_api/tsrc/group"/>
-      </component>
-    </collection>
-  </package>
-</SystemDefinition>
--- a/rom/alfred.iby	Mon Mar 15 12:43:37 2010 +0200
+++ b/rom/alfred.iby	Wed Mar 31 23:03:58 2010 +0300
@@ -81,7 +81,8 @@
 
 // Effect fxmls. Keep the list in alphabetical order. When updating the list below, REMEMBER TO ALSO UPDATE core_exports.inc!
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_add_page.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_add_page.fxml
-data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_appear.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_appear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_anim_to_image.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_image_to_image.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_bg_image_to_image.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_editmode.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_editmode.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_widgetmanager.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_close_widgetmanager.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left.fxml RESOURCE_FILES_DIR/effects/activeidle_viewswitch_left.fxml
@@ -133,6 +134,10 @@
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_cascade_appear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_cascade_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_cascade_disappear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_cascade_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/optionsmenu_disappear.fxml RESOURCE_FILES_DIR/effects/optionsmenu_disappear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_gridview_appear.fxml RESOURCE_FILES_DIR/effects/photos_gridview_appear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_gridview_disappear.fxml RESOURCE_FILES_DIR/effects/photos_gridview_disappear.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_close.fxml
+data=DATAZ_/RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml RESOURCE_FILES_DIR/effects/photos_fullscreen_open.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_appear.fxml RESOURCE_FILES_DIR/effects/popup_appear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_disappear.fxml RESOURCE_FILES_DIR/effects/popup_disappear.fxml
 data=DATAZ_/RESOURCE_FILES_DIR/effects/popup_disappear_screenshot.fxml RESOURCE_FILES_DIR/effects/popup_disappear_screenshot.fxml
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiCanvasVisual.h	Wed Mar 31 23:03:58 2010 +0300
@@ -350,6 +350,8 @@
         
     IMPORT_C TBool HasCommandBuffers(TBool aAskFromChildren = ETrue) const;
     
+    IMPORT_C TBool HasTransParentClear() const;
+    
     // to handle background surface that may be set to the Window
 public:    
     
@@ -449,6 +451,7 @@
     void CollectRecursivePaintedRegion(TRegion& aRecursivePaintRegion, TInt aExcludeCanvasFlags) const;
     
     TBool CanSkipDrawing() const;
+    TBool KeepNoCache() const;
 
 private: 
 
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiControlGroup.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiControlGroup.h	Wed Mar 31 23:03:58 2010 +0300
@@ -203,6 +203,9 @@
      */
     IMPORT_C void SetSessionId(TInt aSessionId);
 
+    IMPORT_C void SetSecureId(TInt aSecureId);
+    IMPORT_C TInt SecureId();
+
 private:
 
     /* Private methods */
@@ -235,6 +238,8 @@
 
     /** Session id */
     TInt iSessionId;
+    
+    TInt iSecureId;
 
 public:
 
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiEnv.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiEnv.h	Wed Mar 31 23:03:58 2010 +0300
@@ -1006,8 +1006,8 @@
     void DoSynchronize();
     TBool iPauseDrawing;
 private:
-    MHuiSynchronizationObserver* iSynchObserver;
-    TInt iSynchId;
+    RPointerArray<MHuiSynchronizationObserver> iSynchObservers;
+    RArray<TInt> iSynchIds;
     };
 
 #endif  // __HUIENV_H__
--- a/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiaccelerator_plat/alf_core_toolkit_api/inc/uiacceltk/HuiSkin.h	Wed Mar 31 23:03:58 2010 +0300
@@ -241,8 +241,12 @@
 	 */
     IMPORT_C virtual TInt GetTexture(TInt aSkinTextureResource,
                                      const CHuiTexture*& aOutTexture);
-                                     
-                                     
+                                 
+    /**
+     * Release cached textures.
+     */                                     
+    void ReleaseCachedTextures();
+                                         
 public:
 
     /* Implementation of MHuiTextureContentObserver. */
--- a/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiaccelerator_plat/alf_visual_api/inc/alf/alfcompositionclient.h	Wed Mar 31 23:03:58 2010 +0300
@@ -294,11 +294,26 @@
      **/
     IMPORT_C static CAlfCompositionPixelSource* NewL(MAlfBufferProvider& aProvider, RWindow* aWindow = NULL);
     
+
     /**
-     *  Activate drawing for the first time or continue drawing if it is being paused or suspended
+     * Constructor for application to decide AO priority
+     */
+    IMPORT_C static CAlfCompositionPixelSource* NewL(MAlfBufferProvider& aProvider, TInt aPriority = CActive::EPriorityIdle, RWindow* aWindow = NULL );
+
+    
+    /**
+     * Activate drawing for the first time or continue drawing if it is being paused or suspended
      **/
     IMPORT_C void ActivateL();
     
+    
+    /*
+     * An other option to activate/continue drawing. This activate method ensures that no saw-edged black area is seen if client
+     * only wants to draw one frame. MAlfBufferProvider::ProduceNewFrameL is called from inside ActivateSyncL so that 
+     * surface buffer can be updated before making surface visible.
+     */
+    IMPORT_C void ActivateSyncL();
+    
     /**
      * Suspend drawing 
      **/
@@ -329,7 +344,7 @@
 
 private: // Internal / utils
     
-    void ConstructL(MAlfBufferProvider& aProvider, RWindow* aWindow);
+    void ConstructL(MAlfBufferProvider& aProvider, TInt aPriority, RWindow* aWindow);
     void ConstructSurfaceL(MAlfBufferProvider::TBufferCreationAttributes& aCreationAttributes);
     void FreeSurface();
     TUint8* Buffer(TInt aBufferNumber);
--- a/uiacceltk/group/bld.inf	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/group/bld.inf	Wed Mar 31 23:03:58 2010 +0300
@@ -24,4 +24,6 @@
 PRJ_EXPORTS
 ../hitchcock/sis/uiaccelerator_stub.sis    /epoc32/release/armv5/urel/uiaccelerator_stub.sis
 ../../rom/alfred.iby   CORE_MW_LAYER_IBY_EXPORT_PATH(alfred.iby)
+#ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 ../../rom/alftranseffectplugin.iby   CORE_MW_LAYER_IBY_EXPORT_PATH(alftranseffectplugin.iby)
+#endif // #ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
\ No newline at end of file
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/bwins/alfdecoderserverclientu.def	Wed Mar 31 23:03:58 2010 +0300
@@ -41,4 +41,6 @@
 	??1CAlfCompositionCntrlClient@@UAE@XZ @ 40 NONAME ; CAlfCompositionCntrlClient::~CAlfCompositionCntrlClient(void)
 	?SetSourceRect@CAlfCompositionSource@@UAEHABVTRect@@@Z @ 41 NONAME ; int CAlfCompositionSource::SetSourceRect(class TRect const &)
 	?GetListOfInactiveWindowGroupsWSurfaces@RAlfBridgerClient@@QAEHPAV?$RArray@H@@@Z @ 42 NONAME ; int RAlfBridgerClient::GetListOfInactiveWindowGroupsWSurfaces(class RArray<int> *)
+	?NewL@CAlfCompositionPixelSource@@SAPAV1@AAVMAlfBufferProvider@@HPAVRWindow@@@Z @ 43  NONAME ; class CAlfCompositionPixelSource * CAlfCompositionPixelSource::NewL(class MAlfBufferProvider &, int, class RWindow *)
+	?ActivateSyncL@CAlfCompositionPixelSource@@QAEXXZ @ 44  NONAME ; void CAlfCompositionPixelSource::ActivateSyncL(void)
 
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/eabi/alfdecoderserverclientu.def	Wed Mar 31 23:03:58 2010 +0300
@@ -62,4 +62,6 @@
 	_ZN21CAlfCompositionSource13SetSourceRectERK5TRect @ 61 NONAME
 	_ZThn32_N21CAlfCompositionSource13SetSourceRectERK5TRect @ 62 NONAME
 	_ZN17RAlfBridgerClient38GetListOfInactiveWindowGroupsWSurfacesEP6RArrayIiE @ 63 NONAME
+	_ZN26CAlfCompositionPixelSource4NewLER18MAlfBufferProvideriP7RWindow @ 64 NONAME
+	_ZN26CAlfCompositionPixelSource13ActivateSyncLEv @ 65 NONAME
 
--- a/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -258,6 +258,11 @@
         return;
         }    
     
+    if (aEventType == KAlfCompositionLayoutSwitchComplete && iController)
+        {
+        iController->AlfBridgeCallback(KAlfCompositionLayoutSwitchComplete, NULL);
+        }
+    
     TInt* ptr = static_cast<TInt*>(aEventData);
     TInt target;
     
@@ -720,27 +725,22 @@
 
         void RunL() 
             {
-            if( iStatus == KErrNone )
+            if( iStatus != KErrCancel )
                 {
                 SetActive();
                 if( !iPixelSource.DrawFrameL(iStatus, iBufferNumber) )
                     {
-                    __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pause");
-                    TRequestStatus* status = &iStatus;
-                    User::RequestComplete(status, KErrNone);
+                    __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pausing");
+                    TRequestStatus* status  = &iStatus;
+                    User::RequestComplete(status, KErrCancel);
                     Cancel();
-                   }
+                    }
                 }
-            else
-                {
-                __ALFLOGSTRING1("CSurfaceUpdateCallBack::RunL %d", iStatus.Int());
-                iPixelSource.Suspend();
-                }
+            };
+        void DoCancel() 
+            {
+            };
 
-            
-            };
-        void DoCancel() {  };
-        
     private: // Data
         CAlfCompositionPixelSource& iPixelSource;
         TInt iBufferNumber;
@@ -824,6 +824,8 @@
     TInt iCurrentBuffer;
     
     TRect iSurfaceRect;
+    
+    TInt iWaiterAoPriority;
     };
 
 
@@ -836,12 +838,26 @@
     {
     CAlfCompositionPixelSource* me = new (ELeave) CAlfCompositionPixelSource();
     CleanupStack::PushL(me);
-    me->ConstructL(aProvider, aWindow);
+    me->ConstructL(aProvider, CActive::EPriorityIdle, aWindow);
     CleanupStack::Pop(me);
     return me;    
     }
 
 // ---------------------------------------------------------------------------
+// CAlfCompositionPixelSource::NewL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAlfCompositionPixelSource* CAlfCompositionPixelSource::NewL(MAlfBufferProvider& aProvider, TInt aPriority, RWindow* aWindow)
+    {
+    CAlfCompositionPixelSource* me = new (ELeave) CAlfCompositionPixelSource();
+    CleanupStack::PushL(me);
+    me->ConstructL(aProvider, aPriority, aWindow);
+    CleanupStack::Pop(me);
+    return me;    
+    }
+
+
+// ---------------------------------------------------------------------------
 // CAlfCompositionPixelSource::ActivateL
 // ---------------------------------------------------------------------------
 //
@@ -873,7 +889,7 @@
         {
         if( !iData->iSurfaceUpdateWaiter )
             {
-            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, CActive::EPriorityIdle );
+            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority );
             }
 
         iData->iSurfaceUpdateWaiter->SetActive();
@@ -886,7 +902,71 @@
    
     // do nothing if content was already active
     }
-    
+
+// ---------------------------------------------------------------------------
+// CAlfCompositionPixelSource::ActivateSyncL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfCompositionPixelSource::ActivateSyncL()
+    {
+    if( !iData->iWindow && iData->iSurfaceId.IsNull() )
+        {
+        User::Leave(KErrNotReady);
+        }
+    TBool pause = EFalse;
+    if( iData->iSourceStatus == CAlfCompositionPixelSourceData::ESuspended )
+        {
+        MAlfBufferProvider::TBufferCreationAttributes& creationAttribs = iData->iProvider.BufferAttributes();
+        
+        iData->iSurfaceRect = TRect(TPoint(0,0), TSize(creationAttribs.iWidth, creationAttribs.iHeight));
+
+        ConstructSurfaceL(creationAttribs);
+
+        User::LeaveIfError( iData->iSurfaceUpdateSession.Connect() );     
+        
+        // update surface buffer before setting surface as background surface
+        if( !iData->iSurfaceUpdateWaiter )
+            {
+            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority );
+            }
+
+        iData->iSurfaceUpdateWaiter->SetActive();
+        pause = !DrawFrameL(iData->iSurfaceUpdateWaiter->iStatus ,0);
+        if(pause && iData->iSurfaceUpdateWaiter->IsActive())
+            {
+            TRequestStatus* status  = &iData->iSurfaceUpdateWaiter->iStatus;
+            User::RequestComplete(status, KErrCancel);
+            iData->iSurfaceUpdateWaiter->Cancel();
+            }
+        
+        iData->iWindow->SetBackgroundSurface(iData->iSurfaceId);
+
+        TInt array[] = { 0, iData->iWindow->ClientHandle(), iData->iWindow->WindowGroupId() }; 
+        TInt handle = SendEvent(KAlfCompOpCreateSource, array, sizeof(array));
+        CAlfCompositionClientBase::SetHandleL( handle );
+        }
+  
+    if( iData->iSourceStatus != CAlfCompositionPixelSourceData::EActive && !pause )
+        {
+
+        if( !iData->iSurfaceUpdateWaiter )
+            {
+            iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority );
+            }
+
+        if(!iData->iSurfaceUpdateWaiter->IsActive())
+            {
+            iData->iSurfaceUpdateWaiter->SetActive();
+            TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus;
+            User::RequestComplete(status, KErrNone);
+            }
+        iData->iProvider.OnActivation();
+        iData->iSourceStatus = CAlfCompositionPixelSourceData::EActive;
+        }
+   
+    // do nothing if content was already active and running    
+    }
+
 // --------------------------------------------------------------------------- 
 // CAlfCompositionPixelSource::Suspend
 // ---------------------------------------------------------------------------
@@ -961,9 +1041,11 @@
 // CAlfCompositionPixelSource::ConstructL
 // ---------------------------------------------------------------------------
 //
-void CAlfCompositionPixelSource::ConstructL(MAlfBufferProvider& aProvider, RWindow* aWindow)
+void CAlfCompositionPixelSource::ConstructL(MAlfBufferProvider& aProvider, TInt aPriority, RWindow* aWindow)
     {
     iData = CAlfCompositionPixelSourceData::NewL( aProvider );
+    iData->iWaiterAoPriority = aPriority;
+
     TInt screenNumber = KErrNotFound;
     if( aWindow )
         {
--- a/uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/AlfRenderStage/src/alfrenderstage.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -366,9 +366,9 @@
     TRegionFix<1> clipRegion;
     clipRegion.AddRect( aClipRect );
 
-    TRgb penColor = TRgb(0x555555); 
-    TRgb brushColor = TRgb(0x555555); 
-    TRgb dotColor = TRgb(0xBBBBBB); 
+    TRgb penColor = TRgb(0x000000);
+    TRgb brushColor = TRgb(0x000000);
+    TRgb dotColor =  TRgb(0xFFFFFF);
     
     WindowRedrawStart( aWindowTreeNode, drawRegion );
     iWsGraphicsContext->Reset();
@@ -593,7 +593,9 @@
 	
     AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeCount ); 
     AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeGroup,  iRsWindowGroupNodeCount ); 
-    AMT_INC_COUNTER(iRsTotalNodeCount ); 
+    AMT_INC_COUNTER(iRsTotalNodeCount );
+    
+    AMT_MAP_RENDER_STAGE_NODE_CREATED();
     }
 
 // ---------------------------------------------------------------------------
@@ -636,7 +638,14 @@
 
     AMT_DEC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeCount ); 
     AMT_DEC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeGroup,  iRsWindowGroupNodeCount ); 
-    AMT_DEC_COUNTER(iRsTotalNodeCount ); 
+    AMT_DEC_COUNTER(iRsTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ),
+                          iIntMap, aWindowTreeNode.Window()->Handle(),
+                          EAlfModuleTestTypeRenderStageReleaseWindow );
+    AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ),
+                          iIntMap, aWindowTreeNode.WindowGroup()->Identifier(),
+                          EAlfModuleTestTypeRenderStageReleaseWindowGroup );    
     }
 
 // ---------------------------------------------------------------------------
@@ -655,7 +664,11 @@
 	iAlfSendBuffer->CommitL();
     __ALFLOGSTRING("CAlfRenderStage::NodeActivated <<");
    
-    AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeActivatedCount ); 
+    AMT_INC_COUNTER_IF(nodeType==MWsWindowTreeNode::EWinTreeNodeClient, iRsWindowNodeActivatedCount );
+    
+    AMT_MAP_SET_VALUE_IF( nodeType == MWsWindowTreeNode::EWinTreeNodeClient, 
+                          iBoolMap, aWindowTreeNode.Window()->Handle(), ETrue, 
+                          EAlfModuleTestTypeRenderStageActiveWindow );
     }
 
 // ---------------------------------------------------------------------------
@@ -695,12 +708,13 @@
 
     AMT_INC_COUNTER( iRsNodeExtentChangedCount );
     AMT_SET_VALUE( iRsLatestNodeExtentRect, aRect );
+    
     AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iSizeMap, aWindowTreeNode.Window()->Handle(), 
-                          aRect.Size(), EAlfModuleTestTypeRenderStageChangeSize );
+                          iSizeMap, aWindowTreeNode.Window()->Handle(),
+                          aRect.Size(), EAlfModuleTestTypeRenderStageChangeWindowSize );
     AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iPositionMap, aWindowTreeNode.Window()->Handle(), 
-                          aRect.iTl, EAlfModuleTestTypeRenderStageChangePosition );
+                          iPositionMap, aWindowTreeNode.Window()->Handle(),
+                          aRect.iTl, EAlfModuleTestTypeRenderStageChangeWindowPosition );
     }
 
 // ---------------------------------------------------------------------------
@@ -717,7 +731,7 @@
         &aWindowTreeNode );
 
     iAlfSendBuffer->CommitL();
-        }
+    }
 
 // ---------------------------------------------------------------------------
 // FlagChanged
@@ -735,9 +749,12 @@
 	iAlfSendBuffer->CommitL();
 
     AMT_INC_COUNTER( iRsTotalNodeFlagChangedCount );
-    AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.Window() ),
-                          iIntMap, aWindowTreeNode.Window()->Handle(), 
-                          EAlfModuleTestTypeRenderStageChangeFlag );
+    
+    AMT_MAP_SET_VALUE_IF( ( aWindowTreeNode.Window() && MWsWindowTreeObserver::EVisible == aFlag ),
+                          iBoolMap, 
+                          aWindowTreeNode.Window()->Handle(),
+                          aNewValue,
+                          EAlfModuleTestTypeRenderStageChangeWindowVisibility );
     }
 
 // ---------------------------------------------------------------------------
@@ -837,7 +854,9 @@
         iAlfSendBuffer->CommitL();
         
         AMT_INC_COUNTER( iRsTotalNodeAttributeChangedCount );
-        }    
+        }
+    
+    AMT_MAP_RENDER_STAGE_TEXT_CURSOR_CHANGE();
     }
 
 // ---------------------------------------------------------------------------
--- a/uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/Client/BWINS/alfclientu.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -1110,4 +1110,5 @@
 	?NewL@CAlfDrawer@@SAPAV1@XZ @ 1109 NONAME ; class CAlfDrawer * CAlfDrawer::NewL(void)
 	?BlankScreen@RAlfDirectClient@@QAEHH@Z @ 1110 NONAME ; int RAlfDirectClient::BlankScreen(int)
 	?FallbackCopyScreenToBitmap@CAlfDrawer@@SAHAAVCWsScreenDevice@@PAVCFbsBitmap@@ABVTRect@@@Z @ 1111 NONAME ; int CAlfDrawer::FallbackCopyScreenToBitmap(class CWsScreenDevice &, class CFbsBitmap *, class TRect const &)
+	?CopyScreenToBitmap@AlfDrawerInternal@@SAHPAVMAlfDrawerScreenInterface@@PAVCFbsBitmap@@ABVTRect@@@Z @ 1112 NONAME ; int AlfDrawerInternal::CopyScreenToBitmap(class MAlfDrawerScreenInterface *, class CFbsBitmap *, class TRect const &)
 
--- a/uiacceltk/hitchcock/Client/eabi/alfclientu.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/Client/eabi/alfclientu.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -1345,4 +1345,5 @@
 	_ZN10CAlfDrawerD2Ev @ 1344 NONAME
 	_ZN16RAlfDirectClient11BlankScreenEi @ 1345 NONAME
 	_ZN10CAlfDrawer26FallbackCopyScreenToBitmapER15CWsScreenDeviceP10CFbsBitmapRK5TRect @ 1346 NONAME
+	_ZN17AlfDrawerInternal18CopyScreenToBitmapEP25MAlfDrawerScreenInterfaceP10CFbsBitmapRK5TRect @ 1347 NONAME
 
--- a/uiacceltk/hitchcock/Client/src/alfdrawer.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/Client/src/alfdrawer.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -22,6 +22,7 @@
 #include <alf/alfdirectclient.h>
 #include "alfcrppluginclient.h"
 #include "alflogger.h"
+#include "alfdrawerinternal.h"
 
 #include <coemain.h>
 #include <w32std.h>
@@ -42,6 +43,17 @@
 // Creates CAlfCrpPluginClient instance.
 static CAlfCrpPluginClient* CreateAlfCrpClientL();
 
+NONSHARABLE_CLASS( TAlfDrawerDirectClient ) : public MAlfDrawerScreenInterface
+    {
+public:
+    TAlfDrawerDirectClient( RAlfDirectClient& aClient );
+    TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation);
+    TInt ReadPixels(CFbsBitmap* aBitmap);
+
+private:
+    RAlfDirectClient iClient;
+    };
+   
 /**
  * Misc utility methods for CAlfDrawer.
  */
@@ -93,6 +105,14 @@
         CWsScreenDevice& aDevice,
         CFbsBitmap* aBitmap, 
         const TRect& aRect );
+
+    /**
+     * Copies screen to bitmap using 'read pixels' operation.
+     */
+    static void DoCopyScreenToBitmap2L( 
+        MAlfDrawerScreenInterface* aInterface,
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect );
         
     };
 
@@ -187,12 +207,29 @@
     RAlfDirectClient client;
     CleanupClosePushL(client);
 
+    TAlfDrawerDirectClient clientWrapper(client);
+    DoCopyScreenToBitmap2L(&clientWrapper, aBitmap, aRect);   
+    
+    CleanupStack::PopAndDestroy(); // CleanupClosePushL
+    
+    __ALFLOGSTRING("DoCopyScreenToBitmapL - Done");    
+    }
+
+// ---------------------------------------------------------------------------
+// DoCopyScreenToBitmapL
+// ---------------------------------------------------------------------------
+//
+void AlfDrawerUtils::DoCopyScreenToBitmap2L( 
+        MAlfDrawerScreenInterface* aInterface,
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect )
+    {
     // Get size & virtual rotation from ALF side.
     // GetSizeAndRotation will also create session to server.
 
     TInt rotation = 0;
     TSize size;
-    User::LeaveIfError(client.GetSizeAndRotation(size, rotation));
+    User::LeaveIfError(aInterface->GetSizeAndRotation(size, rotation));
 
     // Calculate device size in pixels (same as aDevice.SizeInPixels())
     TSize deviceSize = size;
@@ -216,7 +253,6 @@
          actualRect.IsEmpty() )
         {
         __ALFLOGSTRING("DoCopyScreenToBitmapL - empty rect or zero bitmap size");
-        CleanupStack::PopAndDestroy(); // CleanupClosePushL
         return;
         }
 
@@ -239,7 +275,7 @@
     CleanupStack::PushL( surfaceBitmap );
     User::LeaveIfError( surfaceBitmap->Create( size, surfaceDisplayMode ) );
     
-    TInt err = client.ReadPixels( surfaceBitmap->Handle() );              
+    TInt err = aInterface->ReadPixels( surfaceBitmap );              
     __ALFLOGSTRING1("DoCopyScreenToBitmapL - ReadPixels returned %d", err);
     User::LeaveIfError( err );  
 
@@ -439,10 +475,6 @@
         }
     
     CleanupStack::PopAndDestroy( surfaceBitmap );
-    
-    CleanupStack::PopAndDestroy(); // CleanupClosePushL
-    
-    __ALFLOGSTRING("DoCopyScreenToBitmapL - Done");    
     }
 
 // ---------------------------------------------------------------------------
@@ -473,6 +505,19 @@
     }
 
 // ---------------------------------------------------------------------------
+// CopyScreenToBitmap
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt AlfDrawerInternal::CopyScreenToBitmap(
+        MAlfDrawerScreenInterface* aInterface, 
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect )
+    {
+    TRAPD(err, AlfDrawerUtils::DoCopyScreenToBitmap2L(aInterface, aBitmap, aRect));
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
 // CreateAlfCrpClient
 // ---------------------------------------------------------------------------
 //
@@ -495,3 +540,30 @@
     return client;
     }
 
+// ---------------------------------------------------------------------------
+// TAlfDrawerDirectClient
+// ---------------------------------------------------------------------------
+//
+TAlfDrawerDirectClient::TAlfDrawerDirectClient( RAlfDirectClient& aClient )
+    : iClient( aClient )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// GetSizeAndRotation
+// ---------------------------------------------------------------------------
+//
+TInt TAlfDrawerDirectClient::GetSizeAndRotation(TSize& aSize, TInt& aRotation)
+    {
+    return iClient.GetSizeAndRotation(aSize, aRotation);
+    }
+    
+// ---------------------------------------------------------------------------
+// ReadPixels
+// ---------------------------------------------------------------------------
+//
+TInt TAlfDrawerDirectClient::ReadPixels(CFbsBitmap* aBitmap)
+    {
+    return iClient.ReadPixels(aBitmap->Handle());
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfdrawerinternal.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Internal interface for CAlfDrawer
+*
+*/
+
+
+
+#ifndef ALFDRAWERINTERNAL_H
+#define ALFDRAWERINTERNAL_H
+
+#include <e32std.h>
+
+/**
+ * Interface to get screen & parameters
+ */
+class MAlfDrawerScreenInterface
+    {
+public:
+    virtual TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation) = 0;
+    virtual TInt ReadPixels(CFbsBitmap* aBitmap) = 0;
+    };
+
+/**
+ * Internal drawer interface.
+ */
+NONSHARABLE_CLASS( AlfDrawerInternal )
+    {
+public:
+    IMPORT_C static TInt CopyScreenToBitmap(
+        MAlfDrawerScreenInterface* aInterface, 
+        CFbsBitmap* aBitmap, 
+        const TRect& aRect );
+    };
+    
+#endif // ALFDRAWERINTERNAL_H
--- a/uiacceltk/hitchcock/CommonInc/alfmoduletest.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletest.h	Wed Mar 31 23:03:58 2010 +0300
@@ -1,427 +1,30 @@
-#include "e32base.h"
-#include "e32debug.h"
-
 #ifndef ALFMODULETEST_H
 #define ALFMODULETEST_H
 
-// Define this to build module testing enchanced version of ALF
-//#define USE_MODULE_TEST_HOOKS_FOR_ALF 
 
-#if !defined(USE_MODULE_TEST_HOOKS_FOR_ALF) || !defined(AMT_CONTROL)
-
-#define AMT_DATA()
-#define AMT_FUNC(func)                                
-#define AMT_FUNC_EXC(func)
-#define AMT_FUNC_EXC_RET(ret, func)
-#define AMT_FUNC_EXC_IF(cond, func)
-#define AMT_FUNC_EXC_IF_RET(cond, ret, func)
-#define AMT_INC_COUNTER(member)
-#define AMT_DEC_COUNTER(member)
-#define AMT_SET_VALUE(member, val)
-#define AMT_GET_VALUE(x, member)
-#define AMT_INC_COUNTER_IF(cond, member)
-#define AMT_DEC_COUNTER_IF(cond, member)
-#define AMT_SET_VALUE_IF(cond, member, val)
-#define AMT_GET_VALUE_IF(cond, x, member)
+#include <e32base.h>
+#include <e32debug.h>
 
-#define AMT_MAP_APPEND(memberMap, key, type, defaultValue)          
-#define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)     
-#define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)            
-#define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)            
-#define AMT_MAP_SET_VALUE(memberMap, key, value, type)              
-#define AMT_MAP_INC_VALUE(memberMap, key, type)                              
-#define AMT_MAP_DEC_VALUE(memberMap, key, type)                     
-#define AMT_MAP_RESET(memberMap)                                    
-
-#define AMT_PRINT_STATE()
+// Informs if module test hooks have been set on.
+#include "alfmoduletestconf.h"
 
-#ifndef AMT_CONTROL
-#error "Error: you need to define AMT_CONTROL macro in your code to be able to use ALF module test system!"
-// The user have to define AMT_CONTROL, e.g. like this:
-// #define AMT_CONTROL() static_cast<CAlfModuleTestDataControl*>(Dll::Tls())
-// or
-// #define AMT_CONTROL() iMyModuleTestDataControl
-// etc.
-#endif
-
-#else
+// Provides module test hooks defines.
+#include "alfmoduletestdefines.h"
 
 
-//  *** Use these macros to access global memory chunk
-
-
-// Note: If you read/write a large block of data members, it is advisable not use the AMT_FUNC_EXC() based macros below. 
-//       Use Lock() and Unlock() around the block explicitely, and use AMT_FUNC() macro.
-//       That is to avoid unnecessary nested lock-unlock sequences (even if nested locks are working ok).
-
-// Note: Be careful not to lock the the mutex for a long time as it will halt other processes if they are using the lock during that time!
-
-// Generic macros
-#define AMT_DATA()                  AMT_CONTROL()->iModuleTestData
-#define AMT_FUNC(func)              if (AMT_DATA()->iIsEnabled) {func;}                                         
-#define AMT_FUNC_EXC(func)          {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {func;} AMT_CONTROL()->Unlock();}
-#define AMT_FUNC_EXC_RET(ret, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {ret = func;} AMT_CONTROL()->Unlock();}
-#define AMT_FUNC_EXC_IF(cond, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {func;} AMT_CONTROL()->Unlock();}        
-#define AMT_FUNC_EXC_IF_RET(cond, ret, func) {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {ret = func;} AMT_CONTROL()->Unlock();}
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
 
-// Single operation macros, that will do lock/unlock.
-#define AMT_INC_COUNTER(member)     AMT_FUNC_EXC(AMT_DATA()->member++)
-#define AMT_DEC_COUNTER(member)     AMT_FUNC_EXC(AMT_DATA()->member--)
-#define AMT_SET_VALUE(member, val)  AMT_FUNC_EXC(AMT_DATA()->member=(val))
-#define AMT_GET_VALUE(x, member)    AMT_FUNC_EXC((x) = AMT_DATA()->member)
-#define AMT_PRINT_STATE()           AMT_FUNC_EXC(AMT_DATA()->PrintState())
+// *** Test map classes
+#include "alfmoduletesttype.h"
+#include "alfmoduletestitem.h"
+#include "alfmoduletestmap.h"
 
-// Conditional single operation macros, that will do lock/unlock.
-#define AMT_INC_COUNTER_IF(cond, member)    AMT_FUNC_EXC_IF((cond), AMT_DATA()->member++)
-#define AMT_DEC_COUNTER_IF(cond, member)    AMT_FUNC_EXC_IF((cond), AMT_DATA()->member--)
-#define AMT_SET_VALUE_IF(cond, member, val) AMT_FUNC_EXC_IF((cond), AMT_DATA()->member=(val))
-#define AMT_GET_VALUE_IF(cond, x, member)   AMT_FUNC_EXC_IF((cond), (x) = AMT_DATA()->member)
-
-// Map operation macros, that will do lock/unlock
-#define AMT_MAP_APPEND(memberMap, key, type, defaultValue)          AMT_FUNC_EXC(AMT_DATA()->memberMap.Append(key, type, defaultValue))
-#define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)     AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.SetValue(key, value, type))
-#define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)            AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.Find(key, type)), AMT_DATA()->memberMap.SetValue(key, AMT_DATA()->memberMap.Find(key, type)->Value() + 1, type))
-#define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)            AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.Find(key, type)), AMT_DATA()->memberMap.SetValue(key, AMT_DATA()->memberMap.Find(key, type)->Value() - 1, type))
-#define AMT_MAP_SET_VALUE(memberMap, key, value, type)              AMT_FUNC_EXC_IF(ETrue, AMT_DATA()->memberMap.SetValue(key, value, type))
-#define AMT_MAP_INC_VALUE(memberMap, key, type)                     AMT_MAP_INC_VALUE_IF(ETrue, memberMap, key, type)              
-#define AMT_MAP_DEC_VALUE(memberMap, key, type)                     AMT_MAP_DEC_VALUE_IF(ETrue, memberMap, key, type)
-#define AMT_MAP_RESET(memberMap)                                    AMT_FUNC_EXC(AMT_DATA()->memberMap.Reset())
 
 // *** Global object names
 _LIT(KAlfModuleTestChunkName, "ALF_MODULE_TEST_CHUNK");
 _LIT(KAlfModuleTestMutexName, "ALF_MODULE_TEST_MUTEX");
 
 
-/**
- * TAlfModuleTestType specifies recognized test types.
- */
-enum TAlfModuleTestType
-    {
-    // Do not use this value when creating item.
-    EAlfModuleTestTypeNone,
-    
-    // Render stage component specific tests
-    EAlfModuleTestTypeRenderStageChangeSize,
-    EAlfModuleTestTypeRenderStageChangePosition,
-    EAlfModuleTestTypeRenderStageChangeFlag,
-    
-    // Streamer hierarchy model component specific tests
-    EAlfModuleTestTypeHierarchyModelChangeSize,
-    EAlfModuleTestTypeHierarchyModelChangePosition,
-    EAlfModuleTestTypeHierarchyModelChangeFlag,    
-    
-    // Server bridge component specific tests
-    EAlfModuleTestTypeBridgeChangeSize,
-    EAlfModuleTestTypeBridgeChangePosition,
-    EAlfModuleTestTypeBridgeChangeFlag,
-    
-    // Do not use this value when creating item.
-    // This is just meant for Find operations when all tests are accepted.
-    EAlfModuleTestTypeAll
-    };
-
-
-/**
- * CAlfModuleTestItem
- * 
- * Provides key-value pair that is used in TAlfModuleTestMap.
- */
-template< class T >
-NONSHARABLE_CLASS( TAlfModuleTestItem )
-    {
-    
-public:
-
-    /**
-     * Constructor to initialize variables.
-     * 
-     * @param aKey Key that identifies the item.
-     *             In test cases this could be for example handle.
-     * @param aTestType Defines for what this test item is meant for.
-     */
-    TAlfModuleTestItem( TInt aKey, const TAlfModuleTestType& aTestType, const T& aDefaultValue ):
-        iKey( aKey ),
-        iTestType( aTestType ),
-        iValue( aDefaultValue ),
-        iValueSetCount( 0 )
-        {
-        }
-
-    
-    /**
-     * @param aObject Value to be compared.
-     * @return ETrue if given object equals the value of this item.
-     *         Else EFalse.
-     */
-    TBool Equals( const T& aValue, const TAlfModuleTestType& aTestType ) const
-        {
-        // Also, check that value has been set. If it has not been set,
-        // then think objects as unequals.
-        return ( iValueSetCount > 0 
-                 && iValue == aValue 
-                 && TestTypeMatch( aTestType ) );
-        }
-
-    
-    /**
-     * @return TInt Key that should be set during creation of this object.
-     */
-    TInt Key() const
-        {
-        return iKey;
-        }
-
-    /**
-     * @see ValueSet to check if the value has already been set.
-     * 
-     * @return const T& Value that corresonds the key.
-     */
-    const T& Value() const
-        {
-        return iValue;
-        }
-    
-    
-    /**
-     * @param aValue Value to be set for the key
-     */
-    void SetValue( const T& aValue )
-        {
-        iValue = aValue;
-        ++iValueSetCount;
-        }
-
-    
-    /**
-     * @return TInt Informs how many times the value has been set. 
-     */
-    TInt ValueSetCount() const
-        {
-        return iValueSetCount;
-        }
-    
-    /**
-     * @return const TAlfModuleTestType& Defines what the test is for
-     */
-    const TAlfModuleTestType& TestType() const
-        {
-        return iTestType;
-        }
-
-    
-    /**
-     * @param aTestType
-     * @return TBool ETrue if flag matches this item. Else EFalse.
-     */
-    TBool TestTypeMatch( const TAlfModuleTestType& aTestType ) const
-        {
-        return ( EAlfModuleTestTypeAll == aTestType
-                 || iTestType == aTestType );
-        }
-
-    
-    /**
-     * Resets the item info
-     */
-    void Reset()
-        {
-        iValueSetCount = 0;
-        }
-
-    
-private: // data    
-    
-    TInt iKey;
-    TAlfModuleTestType iTestType;    
-    T iValue;
-    TInt iValueSetCount;
-    
-    };
-
-
-/**
- * Class CAlfModuleTestMap
- * 
- * Provides map functionality for the key-value-pairs.
- * In test cases, this should most likely be used so, that 
- * first test case classes create items with certain keys, for example with handle values.
- * Then, define hooks are used in the code to update values that corresond the correct handles.
- * In the end, test case classes can check that items have correct values set and if the test
- * is passed.
- */
-template< class T >
-NONSHARABLE_CLASS( TAlfModuleTestMap )
-    {
-public:
-
-    // Maximum item count in the map
-    static const TInt KMaxArrayCount = 50;
-
-    
-    /**
-     * Constructor to initialize variables.
-     */
-    TAlfModuleTestMap():
-        iCount( 0 ),
-        iSetValueCallCount( 0 )
-        {            
-        }
-
-    
-    /**
-     * @param aKey
-     * @param aTestType Informs what type of test is accepted. Others are skipped.
-     * @return T* Ownership is not transferred.
-     *            NULL if item is not found.
-     */
-    TAlfModuleTestItem< T >* Find( TInt aKey, const TAlfModuleTestType& aTestType )
-        {
-        // Try to find the item corresponding the given key.
-        for ( TInt i = 0; i < iCount; ++i )
-            {
-            TAlfModuleTestItem< T >& testItem( iArray[ i ] );
-            if ( testItem.Key() == aKey
-                 && testItem.TestTypeMatch( aTestType ) )
-                {
-                return &( testItem );
-                }
-            }
-        // Item corresponding the given key was not found.
-        return NULL;
-        }    
-    
-    
-    /**
-     * Function to append new item into the map.
-     * 
-     * @param aKey
-     * @param aTestType Describes for what case the appended test item is created for.
-     * @return TInt System wide error code.
-     */    
-    TInt Append( TInt aKey, const TAlfModuleTestType& aTestType, const T& aDefaultValue )
-        {
-        if ( iCount == KMaxArrayCount )
-            {
-            // Array already full.
-            return KErrOverflow;
-            }
-        else if ( Find( aKey, aTestType ) )
-            {
-            // Key has already been inserted.
-            return KErrAlreadyExists;
-            }
-        
-        // Append new key value set into the array.
-        iArray[ iCount ] = TAlfModuleTestItem< T >( aKey, aTestType, aDefaultValue );
-        ++iCount;
-        return KErrNone;        
-        }
-
-    
-    /**
-     * Sets the value for the item.
-     * Item itself should already exist in the array before
-     * setting its value here. See, Append function.
-     * 
-     * @param aKey
-     * @param aValue
-     * @return TInt System wide error code.
-     */
-    TInt SetValue( TInt aKey, const T& aValue, const TAlfModuleTestType& aTestType )
-        {
-        // Increase counter, because this function is called.
-        ++iSetValueCallCount;
-        TAlfModuleTestItem< T >* item( Find( aKey, aTestType ) );        
-        if ( !item )
-            {
-            // Item was not found from the array.        
-            return KErrNotFound;
-            }        
-        // Item exists. So, set its values.
-        item->SetValue( aValue );
-        return KErrNone;
-        }
-
-    
-    /**
-     * Resets the map
-     */
-    void Reset()
-        {
-        // Just reset the counter.
-        // We do not bother to reset map items, because when counter is reseted
-        // already set items and their info is left out of the scope.
-        iCount = 0;
-        iSetValueCallCount = 0;
-        }
-    
-    
-    /**
-     * Checks if all the values of items in the array match the given value.
-     * 
-     * @param aValue Reference to the value that items are compared to.
-     * @param aTestType Informs the test type whose items should be compared.
-     */
-    TInt CountEquals( const T& aValue, const TAlfModuleTestType& aTestType ) const
-        {
-        TInt count( 0 );
-        for ( TInt i = 0; i < iCount; ++i )
-            {
-            if ( iArray[ i ].Equals( aValue, aTestType ) )
-                {
-                // Item matches
-                ++count;            
-                }
-            }
-        return count;
-        }
-
-
-    /**
-     * @return TInt Number of map items
-     */
-    TInt ItemCount() const
-        {
-        return iCount;
-        }
-
-
-    /**
-     * @return const TAlfModuleTestItem< T >& Reference to the map item
-     */
-    const TAlfModuleTestItem< T >& Item( TInt aIndex ) const
-        {
-        return iArray[ aIndex ];
-        }
-
-    
-    /**
-     * @return TInt Number of times SetValue function has been called
-     *              since last reset. This information can be used
-     *              to check if hooks have been used correct times during
-     *              a test case. Notice, that this informs the number of
-     *              function calls, not the number of times a value has actually
-     *              set for some item.
-     */
-    TInt SetValueCallCount() const
-        {
-        return iSetValueCallCount;
-        }
-    
-    
-private: // data
-    
-    TAlfModuleTestItem< T > iArray[ KMaxArrayCount ];
-    // Informs number of array items
-    TInt iCount;
-    // Informs how many times SetItem has been called since last reset.
-    // Notice, that this informs the number of function calls, not the number
-    // of times a value has actually set for some item.
-    TInt iSetValueCallCount;
-    
-    };
-
-    
 /*
  *  Class CAlfModuleTestData
  */
@@ -471,24 +74,55 @@
                          iLatestVisualExtentRect.Width(), iLatestVisualExtentRect.Height());
         RDebug::Print(_L("iTotalVisualFlagChangedCount=%d"), iTotalVisualFlagChangedCount);
         RDebug::Print(_L("iTotalVisualAttributeChangedCount=%d"), iTotalVisualAttributeChangedCount);
+        RDebug::Print(_L("iBoolMap =>"));
+        PrintBoolMapState( iBoolMap );        
+        RDebug::Print(_L("iIntMap =>"));
+        PrintIntMapState( iIntMap );
         RDebug::Print(_L("iSizeMap =>"));
         PrintSizeMapState( iSizeMap );
         RDebug::Print(_L("iPositionMap =>"));
-        PrintPositionMapState( iPositionMap );        
+        PrintPositionMapState( iPositionMap );
         RDebug::Print(_L("*** ALF INTERNAL STATE ***"));
         }
 
+
+    void PrintBoolMapState( TAlfModuleTestMap< TBool > aMap )
+        {
+        RDebug::Print(_L("*** ALF INTERNAL BOOL MAP STATE -->"));
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
+        for ( TInt i = 0; i < aMap.ItemCount(); ++i )
+            {
+            const TAlfModuleTestItem< TBool >& item( aMap.Item( i ) );
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValue=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.Value(), item.ValueSetCount(), item.LinkTargetKey());
+            }
+        RDebug::Print(_L("<-- ALF INTERNAL BOOL MAP STATE ***"));
+        }
+    
+    
+    void PrintIntMapState( TAlfModuleTestMap< TInt > aMap )
+        {
+        RDebug::Print(_L("*** ALF INTERNAL INT MAP STATE -->"));
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
+        for ( TInt i = 0; i < aMap.ItemCount(); ++i )
+            {
+            const TAlfModuleTestItem< TInt >& item( aMap.Item( i ) );
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValue=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.Value(), item.ValueSetCount(), item.LinkTargetKey());
+            }
+        RDebug::Print(_L("<-- ALF INTERNAL INT MAP STATE ***"));
+        }
+    
     
     void PrintSizeMapState( TAlfModuleTestMap< TSize > aMap )
         {
         RDebug::Print(_L("*** ALF INTERNAL SIZE MAP STATE -->"));
-        RDebug::Print(_L("Map item count=%d, SetValue call count=%d"), 
-                         aMap.ItemCount(), aMap.SetValueCallCount());
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount());
         for ( TInt i = 0; i < aMap.ItemCount(); ++i )
             {
             const TAlfModuleTestItem< TSize >& item( aMap.Item( i ) );
-            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d"),
-                             i, item.Key(), item.TestType(), item.ValueSetCount());
+            RDebug::Print(_L("Map item %d, iTestType=%d, iKey=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.TestType(), item.Key(), item.ValueSetCount(), item.LinkTargetKey());
             RDebug::Print(_L("Map item index=%d, width=%d, height=%d"),
                              i, item.Value().iWidth, item.Value().iHeight);
             }
@@ -499,13 +133,12 @@
     void PrintPositionMapState( TAlfModuleTestMap< TPoint > aMap )
         {
         RDebug::Print(_L("*** ALF INTERNAL POSITION MAP STATE -->"));
-        RDebug::Print(_L("Map item count=%d, SetValue call count=%d"), 
-                         aMap.ItemCount(), aMap.SetValueCallCount());
+        RDebug::Print(_L("Map item count=%d"), aMap.ItemCount() );
         for ( TInt i = 0; i < aMap.ItemCount(); ++i )
             {
             const TAlfModuleTestItem< TPoint >& item( aMap.Item( i ) );
-            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d"),
-                             i, item.Key(), item.TestType(), item.ValueSetCount());
+            RDebug::Print(_L("Map item %d, iKey=%d, iTestType=%d, iValueSetCount=%d, iLinkTargetKey=%d"),
+                             i, item.Key(), item.TestType(), item.ValueSetCount(), item.LinkTargetKey());
             RDebug::Print(_L("Map item index=%d, x=%d, y=%d"),
                              i, item.Value().iX, item.Value().iY);
             }
@@ -571,6 +204,8 @@
     TInt iASE_Temp3;
     TInt iASE_Temp4;
 
+    // Map that contains boolean items that can be specified for certain test cases.
+    TAlfModuleTestMap< TBool > iBoolMap;        
     // Map that contains integer items that can be specified for certain test cases.
     TAlfModuleTestMap< TInt > iIntMap;    
     // Map that contains size items that can be specified for certain test cases.
@@ -634,7 +269,8 @@
     CAlfModuleTestData* iModuleTestData; // Not owned
     };
 
-#endif
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
 
 #endif // ALFMODULETEST_H
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestconf.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,9 @@
+#ifndef ALF_MODULETEST_CONF_H
+#define ALF_MODULETEST_CONF_H
+
+// Define this to build module testing enchanced version of ALF
+//#define USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#endif // ALF_MODULETEST_CONF_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestdefines.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,225 @@
+/**
+ * @see alfmoduletest.h for class implementations that these defines use.
+ */
+
+#ifndef ALF_MODULE_TEST_DEFINES_H
+#define ALF_MODULE_TEST_DEFINES_H
+
+
+// Informs if module test hooks have been set on.
+#include "alfmoduletestconf.h"
+
+
+#ifndef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // Use empty defines if module test hook is not set.
+
+    #define AMT_DATA()
+    #define AMT_FUNC(func)
+    #define AMT_FUNC_EXC(func)
+    #define AMT_FUNC_EXC_RET(ret, func)
+    #define AMT_FUNC_EXC_IF(cond, func)
+    #define AMT_FUNC_EXC_IF_RET(cond, ret, func)
+    #define AMT_INC_COUNTER(member)
+    #define AMT_DEC_COUNTER(member)
+    #define AMT_SET_VALUE(member, val)
+    #define AMT_GET_VALUE(x, member)
+    #define AMT_INC_COUNTER_IF(cond, member)
+    #define AMT_DEC_COUNTER_IF(cond, member)
+    #define AMT_SET_VALUE_IF(cond, member, val)
+    #define AMT_GET_VALUE_IF(cond, x, member)
+    
+    #define AMT_MAP_PTR_TO_KEY_CAST( keyPtr )
+    #define AMT_MAP_CPTR_TO_KEY_CAST( keyCPtr )
+    #define AMT_MAP_APPEND_IF(cond, memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND(memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_LINK(memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_AND_LINK_IF(cond, memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_APPEND_AND_LINK(memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)
+    #define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)
+    #define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)
+    #define AMT_MAP_SET_VALUE(memberMap, key, value, type)
+    #define AMT_MAP_INC_VALUE(memberMap, key, type)
+    #define AMT_MAP_DEC_VALUE(memberMap, key, type)
+    #define AMT_MAP_APPEND_ACCEPT_IF(cond, memberMap, testType)
+    #define AMT_MAP_APPEND_ACCEPT(memberMap, testType)
+    #define AMT_MAP_RESET_ITEMS(memberMap, defaultValue, type)
+    #define AMT_MAP_RESET(memberMap)
+    
+    #define AMT_PRINT_STATE()
+
+#else
+    // Module test hook has been set.
+
+    #ifndef AMT_CONTROL
+        #error "Error: you need to define AMT_CONTROL macro in your code to be able to use ALF module test system!"
+        // The user have to define AMT_CONTROL, e.g. like this:
+        // #define AMT_CONTROL() static_cast<CAlfModuleTestDataControl*>(Dll::Tls())
+        // or
+        // #define AMT_CONTROL() iMyModuleTestDataControl
+        // etc.
+    #endif // AMT_CONTROL
+
+
+    //  *** Use these macros to access global memory chunk
+    
+    
+    // Note: If you read/write a large block of data members, it is advisable not use the AMT_FUNC_EXC() based macros below. 
+    //       Use Lock() and Unlock() around the block explicitely, and use AMT_FUNC() macro.
+    //       That is to avoid unnecessary nested lock-unlock sequences (even if nested locks are working ok).
+    
+    // Note: Be careful not to lock the the mutex for a long time as it will halt other processes if they are using the lock during that time!
+    
+    // Generic macros
+    #define AMT_DATA()                              AMT_CONTROL()->iModuleTestData
+    #define AMT_FUNC(func)                          if (AMT_DATA()->iIsEnabled) {func;}                                         
+    #define AMT_FUNC_EXC(func)                      {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {func;} AMT_CONTROL()->Unlock();}
+    #define AMT_FUNC_EXC_RET(ret, func)             {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled) {ret = func;} AMT_CONTROL()->Unlock();}
+    #define AMT_FUNC_EXC_IF(cond, func)             {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {func;} AMT_CONTROL()->Unlock();}        
+    #define AMT_FUNC_EXC_IF_RET(cond, ret, func)    {AMT_CONTROL()->Lock(); if (AMT_DATA()->iIsEnabled && (cond)) {ret = func;} AMT_CONTROL()->Unlock();}
+    
+    // Single operation macros, that will do lock/unlock.
+    #define AMT_INC_COUNTER(member)                 AMT_FUNC_EXC(AMT_DATA()->member++)
+    #define AMT_DEC_COUNTER(member)                 AMT_FUNC_EXC(AMT_DATA()->member--)
+    #define AMT_SET_VALUE(member, val)              AMT_FUNC_EXC(AMT_DATA()->member=(val))
+    #define AMT_GET_VALUE(x, member)                AMT_FUNC_EXC((x) = AMT_DATA()->member)
+    
+    // Conditional single operation macros, that will do lock/unlock.
+    #define AMT_INC_COUNTER_IF(cond, member)        AMT_FUNC_EXC_IF((cond), AMT_DATA()->member++)
+    #define AMT_DEC_COUNTER_IF(cond, member)        AMT_FUNC_EXC_IF((cond), AMT_DATA()->member--)
+    #define AMT_SET_VALUE_IF(cond, member, val)     AMT_FUNC_EXC_IF((cond), AMT_DATA()->member=(val))
+    #define AMT_GET_VALUE_IF(cond, x, member)       AMT_FUNC_EXC_IF((cond), (x) = AMT_DATA()->member)
+    
+    // Map operation macros, that will do lock/unlock
+    #define AMT_MAP_PTR_TO_KEY_CAST( keyPtr )                                                   reinterpret_cast< TInt >( keyPtr )
+    #define AMT_MAP_CPTR_TO_KEY_CAST( keyCPtr )                                                 AMT_MAP_PTR_TO_KEY_CAST( static_cast< const CBase* >( keyCPtr ) )
+    #define AMT_MAP_APPEND_IF(cond, memberMap, key, defaultValue, type)                         AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.Append(type, key, defaultValue))
+    #define AMT_MAP_APPEND(memberMap, key, defaultValue, type)                                  AMT_MAP_APPEND_IF(ETrue, memberMap, key, defaultValue, type)
+    #define AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, targetKey, type)                   AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.AppendLink(type, linkKey, targetKey))
+    #define AMT_MAP_APPEND_LINK(memberMap, linkKey, targetKey, type)                            AMT_MAP_APPEND_LINK_IF(ETrue, memberMap, linkKey, targetKey, type)
+    #define AMT_MAP_APPEND_AND_LINK_IF(cond, memberMap, linkKey, actualKey, defaultValue, type) AMT_MAP_APPEND_IF(cond, memberMap, actualKey, defaultValue, type ); AMT_MAP_APPEND_LINK_IF(cond, memberMap, linkKey, actualKey, type)
+    #define AMT_MAP_APPEND_AND_LINK(memberMap, linkKey, actualKey, defaultValue, type)          AMT_MAP_APPEND_AND_LINK_IF(ETrue, memberMap, linkKey, actualKey, defaultValue, type)
+    #define AMT_MAP_SET_VALUE_IF(cond, memberMap, key, value, type)                             AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.SetActualValue(type, key, value))
+    #define AMT_MAP_INC_VALUE_IF(cond, memberMap, key, type)                                    AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.FindActual(type, key)), AMT_DATA()->memberMap.SetActualValue(type, key, AMT_DATA()->memberMap.FindActual(type, key)->Value() + 1))
+    #define AMT_MAP_DEC_VALUE_IF(cond, memberMap, key, type)                                    AMT_FUNC_EXC_IF((cond && AMT_DATA()->memberMap.FindActual(type, key)), AMT_DATA()->memberMap.SetActualValue(type, key, AMT_DATA()->memberMap.FindActual(type, key)->Value() - 1))
+    #define AMT_MAP_SET_VALUE(memberMap, key, value, type)                                      AMT_FUNC_EXC_IF(ETrue, AMT_DATA()->memberMap.SetActualValue(type, key, value))
+    #define AMT_MAP_INC_VALUE(memberMap, key, type)                                             AMT_MAP_INC_VALUE_IF(ETrue, memberMap, key, type)              
+    #define AMT_MAP_DEC_VALUE(memberMap, key, type)                                             AMT_MAP_DEC_VALUE_IF(ETrue, memberMap, key, type)
+    #define AMT_MAP_APPEND_ACCEPT_IF(cond, memberMap, testType)                                 AMT_FUNC_EXC_IF((cond), AMT_DATA()->memberMap.AppendAccept(testType))
+    #define AMT_MAP_APPEND_ACCEPT(memberMap, testType)                                          AMT_MAP_APPEND_ACCEPT_IF(ETrue, memberMap, testType)
+    #define AMT_MAP_RESET_ITEMS(memberMap, defaultValue, type)                                  AMT_FUNC_EXC(AMT_DATA()->memberMap.ResetItems(type, defaultValue))
+    #define AMT_MAP_RESET(memberMap)                                                            AMT_FUNC_EXC(AMT_DATA()->memberMap.Reset())
+    
+    #define AMT_PRINT_STATE()   AMT_FUNC_EXC(AMT_DATA()->PrintState())
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+
+// General defines
+// Text cursor handle is defined as constant because correct handle is not provided
+// from the window server for render stage.
+#define AMT_MAP_TEXT_CURSOR_HANDLE 0
+
+
+// Notice: 
+// Defines below will be empty if module test hook is not set.
+// If module test hook is set on, then these defines also use functionality defined above.  
+
+
+// Render stage defines
+
+#define AMT_MAP_RENDER_STAGE_NODE_CREATED() \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), 0, EAlfModuleTestTypeRenderStageCreateWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), 0, EAlfModuleTestTypeRenderStageReleaseWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iBoolMap, aWindowTreeNode.Window()->Handle(), EFalse, EAlfModuleTestTypeRenderStageActiveWindow ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iSizeMap, aWindowTreeNode.Window()->Handle(), TSize(), EAlfModuleTestTypeRenderStageChangeWindowSize ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iPositionMap, aWindowTreeNode.Window()->Handle(), TPoint(), EAlfModuleTestTypeRenderStageChangeWindowPosition ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iBoolMap, aWindowTreeNode.Window()->Handle(), EFalse, EAlfModuleTestTypeRenderStageChangeWindowVisibility ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), 0, EAlfModuleTestTypeRenderStageCreateWindowGroup ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), 0, EAlfModuleTestTypeRenderStageReleaseWindowGroup ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorType ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorFlag ); \
+        AMT_MAP_APPEND_IF( ( MWsWindowTreeNode::EWinTreeNodeStandardTextCursor == nodeType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeRenderStageChangeTextCursorColor ); \
+        \
+        AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeClient == nodeType && aWindowTreeNode.Window() ), iIntMap, aWindowTreeNode.Window()->Handle(), EAlfModuleTestTypeRenderStageCreateWindow ); \
+        AMT_MAP_INC_VALUE_IF( ( MWsWindowTreeNode::EWinTreeNodeGroup == nodeType && aWindowTreeNode.WindowGroup() ), iIntMap, aWindowTreeNode.WindowGroup()->Identifier(), EAlfModuleTestTypeRenderStageCreateWindowGroup )
+
+#define AMT_MAP_RENDER_STAGE_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorClipRect ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorFlags ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( ( aWindowTreeNode.NodeType() == MWsWindowTreeNode::EWinTreeNodeStandardTextCursor && aAttribute == ECursorColor ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeRenderStageChangeTextCursorColor )
+
+
+// Streamer defines
+                          
+#define AMT_MAP_STREAMER_NODE_WINDOW_CONSTRUCT() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, iNodeWindowConstructionStruct.iWindowHandle, 0, EAlfModuleTestTypeHierarchyModelCreateWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, iNodeWindowConstructionStruct.iWindowHandle, 0, EAlfModuleTestTypeHierarchyModelReleaseWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, iId, iNodeWindowConstructionStruct.iWindowHandle, EFalse, EAlfModuleTestTypeHierarchyModelActiveWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iSizeMap, iId, iNodeWindowConstructionStruct.iWindowHandle, TSize(), EAlfModuleTestTypeHierarchyModelChangeWindowSize ); \
+        AMT_MAP_APPEND_AND_LINK( iPositionMap, iId, iNodeWindowConstructionStruct.iWindowHandle, TPoint(), EAlfModuleTestTypeHierarchyModelChangeWindowPosition ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, iId, iNodeWindowConstructionStruct.iWindowHandle, EFalse, EAlfModuleTestTypeHierarchyModelChangeWindowVisibility )
+
+#define AMT_MAP_STREAMER_NODE_GROUP_CONSTRUCT() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, clientHandle, 0, EAlfModuleTestTypeHierarchyModelCreateWindowGroup ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, iId, clientHandle, 0, EAlfModuleTestTypeHierarchyModelReleaseWindowGroup )
+
+#define AMT_MAP_STREAMER_TEXT_CURSOR_CONSTRUCT() \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorType ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeHierarchyModelChangeTextCursorColor )
+
+#define AMT_MAP_STREAMER_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorType ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorClipRect ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorFlags ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( ( attribute == MWsWindowTreeObserver::ECursorColor ), iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeHierarchyModelChangeTextCursorColor )
+
+                                 
+// Alfserver defines
+
+#define AMT_MAP_BRIDGE_ADD_VISUAL() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowNodeId, aClientSideId, 0, EAlfModuleTestTypeBridgeCreateWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowNodeId, aClientSideId, 0, EAlfModuleTestTypeBridgeReleaseWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EFalse, EAlfModuleTestTypeBridgeActiveWindow ); \
+        AMT_MAP_APPEND_AND_LINK( iSizeMap, aWindowNodeId, aClientSideId, TSize(), EAlfModuleTestTypeBridgeChangeWindowSize ); \
+        AMT_MAP_APPEND_AND_LINK( iPositionMap, aWindowNodeId, aClientSideId, TPoint(), EAlfModuleTestTypeBridgeChangeWindowPosition ); \
+        AMT_MAP_APPEND_AND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EFalse, EAlfModuleTestTypeBridgeChangeWindowVisibility ); \
+        \
+        AMT_MAP_APPEND_AND_LINK_IF( aVisual, iIntMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, 0, EAlfModuleTestTypeCoreToolkitDrawWindow ); \
+        AMT_MAP_APPEND_AND_LINK_IF( aVisual, iIntMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, 0, EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer ); \
+        \
+        AMT_MAP_INC_VALUE( iIntMap, aClientSideId, EAlfModuleTestTypeBridgeCreateWindow ); \
+        \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, ETrue, EAlfModuleTestTypeBridgeCreateWindow ); \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, EFalse, EAlfModuleTestTypeBridgeVisualVisibility ); \
+        AMT_MAP_APPEND_LINK_IF( aVisual, iBoolMap, AMT_MAP_CPTR_TO_KEY_CAST( aVisual ), aClientSideId, EAlfModuleTestTypeBridgeVisualVisibility ); \
+        AMT_MAP_APPEND( iBoolMap, aClientSideId, EFalse, EAlfModuleTestTypeBridgeReleaseWindow ); \
+        AMT_MAP_APPEND_LINK( iBoolMap, aWindowNodeId, aClientSideId, EAlfModuleTestTypeBridgeReleaseWindow )
+        
+#define AMT_MAP_BRIDGE_CREATE_CONTROL_GROUP() \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowGroupNodeId, aClientWindowGroupId, 0, EAlfModuleTestTypeBridgeCreateWindowGroup ); \
+        AMT_MAP_APPEND_AND_LINK( iIntMap, aWindowGroupNodeId, aClientWindowGroupId, 0, EAlfModuleTestTypeBridgeReleaseWindowGroup ); \
+        \
+        AMT_MAP_INC_VALUE( iIntMap, aClientWindowGroupId, EAlfModuleTestTypeBridgeCreateWindowGroup )
+
+#define AMT_MAP_BRIDGE_ADD_TEXT_CURSOR() \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorType ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorClipRect ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorFlag ); \
+        AMT_MAP_APPEND( iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, 0, EAlfModuleTestTypeBridgeChangeTextCursorColor )
+
+#define AMT_MAP_BRIDGE_TEXT_CURSOR_CHANGE() \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorType ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorClipRect ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorFlag ); \
+        AMT_MAP_INC_VALUE_IF( viz, iIntMap, AMT_MAP_TEXT_CURSOR_HANDLE, EAlfModuleTestTypeBridgeChangeTextCursorColor )
+
+        
+#endif // ALF_MODULE_TEST_DEFINES_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestitem.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,188 @@
+/**
+ * @note This class is provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTITEM_H
+#define ALFMODULETESTITEM_H
+
+#include <e32def.h> 
+#include "alfmoduletesttype.h"
+
+
+/**
+ * CAlfModuleTestItem
+ * 
+ * Provides key-value pair that is used in TAlfModuleTestMap.
+ */
+template< class T >
+NONSHARABLE_CLASS( TAlfModuleTestItem )
+    {
+    
+public:
+
+    /**
+     * Default constructor
+     * 
+     * This is provided for copy operations that may required default constructor.
+     * For normal cases, use another constructor instead to initialize the item
+     * with correct values.
+     */
+    TAlfModuleTestItem():
+        iTestType( EAlfModuleTestTypeNone ),    
+        iKey( 0 ),
+        iValueSetCount( 0 ),
+        iLinkTargetKey( KErrNotFound )
+        {    
+        }
+
+
+    /**
+     * Constructor to initialize variables.
+     * 
+     * @param aTestType Defines for what this test item is meant for.
+     * @param aKey Key that identifies the item.
+     *             In test cases this could be for example handle.
+     * @param aDefaultValue Default value for the map item.
+     */
+    TAlfModuleTestItem( const TAlfModuleTestType& aTestType, TInt aKey, const T& aDefaultValue ):
+        iTestType( aTestType ),
+        iKey( aKey ),
+        iValue( aDefaultValue ),
+        iValueSetCount( 0 ),
+        iLinkTargetKey( KErrNotFound )
+        {
+        }
+
+    
+    /**
+     * @note Be carefull when comparing items because some items may
+     * be link items instead of original items.
+     * 
+     * @param aTestType Test type of accepted item.
+     * @param aValue Item value to be compared.
+     * @return ETrue if given object equals the value of this item.
+     *         Else EFalse.
+     */
+    TBool Equals( const TAlfModuleTestType& aTestType, const T& aValue ) const
+        {
+        // Also, check that value has been set. If it has not been set,
+        // then think objects as unequals.
+        return ( iValueSetCount > 0 
+                 && iValue == aValue 
+                 && TestTypeMatch( aTestType ) );
+        }
+
+    
+    /**
+     * @return TInt Key that should be set during creation of this object.
+     */
+    TInt Key() const
+        {
+        return iKey;
+        }
+
+    
+    /**
+     * @see TAlfModuleTestItem::ValueSetCount to check if the value has already been set.
+     * 
+     * @return const T& Value that corresonds the key.
+     */
+    const T& Value() const
+        {
+        return iValue;
+        }
+    
+    
+    /**
+     * @param aValue Value to be set for the key
+     */
+    void SetValue( const T& aValue )
+        {
+        iValue = aValue;
+        ++iValueSetCount;
+        }
+
+    
+    /**
+     * @return TInt Informs how many times the value has been set. 
+     */
+    TInt ValueSetCount() const
+        {
+        return iValueSetCount;
+        }
+    
+    
+    /**
+     * @return const TAlfModuleTestType& Defines what the test is for.
+     */
+    const TAlfModuleTestType& TestType() const
+        {
+        return iTestType;
+        }
+
+    
+    /**
+     * @param aTestType Type of the test this item is for.
+     * @return TBool ETrue if flag matches this item. Else EFalse.
+     */
+    TBool TestTypeMatch( const TAlfModuleTestType& aTestType ) const
+        {
+        return ( EAlfModuleTestTypeAll == aTestType
+                 || EAlfModuleTestTypeAll == iTestType
+                 || iTestType == aTestType );
+        }
+
+    
+    /**
+     * @param aLinkTargetKey Key of the item that this item links to. 
+     *                       KErrNotFound if this is not a link item.
+     */
+    void SetLinkTargetKey( TInt aLinkTargetKey )
+        {
+        iLinkTargetKey = aLinkTargetKey;
+        }
+
+    
+    /**
+     * @return TInt Key of the item that this item links to. 
+     *              KErrNotFound if this is not a link item.
+     */    
+    TInt LinkTargetKey() const
+        {
+        return iLinkTargetKey;
+        }
+
+    
+    /**
+     * Resets this item to the given default value and 
+     * sets value set count to zero.
+     * 
+     * @note Type, key and link target remain unchanged.
+     * 
+     * @param aDefaultValue Default value for the item.
+     */
+    void Reset( const T& aDefaultValue )
+        {
+        iValue = aDefaultValue;
+        iValueSetCount = 0;
+        }
+
+    
+private: // data    
+
+    TAlfModuleTestType iTestType;
+    TInt iKey;
+    T iValue;
+    TInt iValueSetCount;
+    TInt iLinkTargetKey;
+    
+    };
+
+#endif // ALFMODULETESTITEM_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletestmap.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,359 @@
+/**
+ * @note This class is provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTMAP_H
+#define ALFMODULETESTMAP_H
+
+#include <e32def.h> 
+#include "alfmoduletestitem.h"
+#include "alfmoduletesttype.h"
+
+
+/**
+ * Class CAlfModuleTestMap
+ * 
+ * Provides map functionality for the key-value-pairs.
+ * In test cases, this should most likely be used so, that 
+ * first test case classes create items with certain keys, for example with handle values.
+ * Then, define hooks are used in the code to update values that corresond the correct handles.
+ * In the end, test case classes can check that items have correct values set and if the test
+ * is passed.
+ * 
+ * @note When this item is copied, also the contents of the map item array are copied
+ *       into new map item array. In other words, copy can be thought as deep copy
+ *       instead of just shallow copy of array pointer.
+ *       
+ * @see CAlfModuleTestItem
+ */
+template< class T >
+NONSHARABLE_CLASS( TAlfModuleTestMap )
+    {
+public:
+
+    // Maximum item count in the map
+    static const TInt KMaxArrayCount = 100;
+
+    // Maximum accepted test type count in the map
+    static const TInt KMaxAcceptArrayCount = 20;
+    
+    
+    /**
+     * Constructor to initialize variables.
+     */
+    TAlfModuleTestMap():
+        iArrayCount( 0 )
+        {
+        }
+
+    
+    /**
+     * @note This will return normal items and also items that are links.
+     * 
+     * @param aTestType Informs what type of test is accepted. Others are skipped.
+     * @param aKey Key of the map item.
+     * @return T* Ownership is not transferred.
+     *            NULL if item is not found.
+     */
+    TAlfModuleTestItem< T >* Find( const TAlfModuleTestType& aTestType, TInt aKey )
+        {
+        // Try to find the item corresponding the given key.
+        for ( TInt i = 0; i < iArrayCount; ++i )
+            {
+            TAlfModuleTestItem< T >& testItem( iArray[ i ] );
+            if ( testItem.Key() == aKey
+                 && testItem.TestTypeMatch( aTestType ) )
+                {
+                return &( testItem );
+                }
+            }
+        // Item corresponding the given key was not found.
+        return NULL;
+        }    
+
+    
+    /**
+     * Finds the actual item.
+     * 
+     * @note If the given key identifies a link item, 
+     *       then search is continued to the actual item
+     *       through the link chain.
+     *       Link item is not returned here.
+     * 
+     * @param aTestType Test type of the linked item and link item.
+     * @param aKey Key of the item. This can also be a key to a link item.
+     * @return TAlfModuleTestItem< T >* Actual item. 
+     *                                  NULL if item was not found.
+     *                                  Ownership is not transferred.
+     */
+    TAlfModuleTestItem< T >* FindActual( const TAlfModuleTestType& aTestType, TInt aKey )
+        {
+        TAlfModuleTestItem< T >* item( Find( aTestType, aKey ) );
+        while ( item && item->LinkTargetKey() != KErrNotFound )
+            {
+            // Item is link.
+            // So, find the actual item through link targets.
+            item = Find( aTestType, item->LinkTargetKey() );
+            }
+        return item;
+        }
+    
+    
+    /**
+     * Function to append new item into the map.
+     * 
+     * @param aTestType Describes for what case the appended test item is created for.
+     * @param aKey Key of the map item.
+     * @param aDefaultValue Default value for the map item.
+     * @return TInt System wide error code.
+     */    
+    TInt Append( const TAlfModuleTestType& aTestType, TInt aKey, const T& aDefaultValue )
+        {
+        if ( !Accept( aTestType ) )
+            {
+            // Given test type has not been set as accepted.
+            return KErrNotSupported;
+            }
+        else if ( Find( aTestType, aKey ) )
+            {
+            // Item already exists in the map.
+            return KErrAlreadyExists;
+            }        
+        else if ( iArrayCount == KMaxArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+        
+        // Append new item into the array.
+        iArray[ iArrayCount ] = TAlfModuleTestItem< T >( aTestType, aKey, aDefaultValue );
+        ++iArrayCount;
+        return KErrNone;        
+        }
+
+    
+    /**
+     * Creates and appends link item that links to another item.
+     * 
+     * @param aTestType Test type of the linked item and link item.
+     * @param aLinkKey Link item key.
+     * @param aTargetKey Target item key.
+     * @return TInt System wide error code.
+     */
+    TInt AppendLink( const TAlfModuleTestType& aTestType, TInt aLinkKey, TInt aTargetKey )
+        {
+        if ( !Accept( aTestType ) )
+            {
+            // Given test type has not been set as accepted.
+            return KErrNotSupported;
+            }
+        else if ( Find( aTestType, aLinkKey ) )
+            {
+            // Link item already exists in the map.
+            return KErrAlreadyExists;
+            }
+        else if ( !FindActual( aTestType, aTargetKey ) )
+            {
+            // Link has to point to another existing item.
+            // Also, link has to point to the chain that ends to actual item.
+            // Then, links will not create forever loops. Loops could occur
+            // if links in chain point to each other creating loops.
+            return KErrNotFound;
+            }
+        else if ( iArrayCount == KMaxArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+        
+        // Create link item because original item exists and link chain is correct.
+        // Append new link item into the array and link it to another link or to
+        // actual item.
+        TAlfModuleTestItem< T >* target( Find( aTestType, aTargetKey ) );
+        // Set value of the link same as its target's value.
+        iArray[ iArrayCount ] = TAlfModuleTestItem< T >( aTestType, aLinkKey, target->Value() );
+        iArray[ iArrayCount ].SetLinkTargetKey( target->Key() );
+        ++iArrayCount;
+        return KErrNone;            
+        }
+
+    
+    /**
+     * Sets the value for the actual item.
+     * Item itself should already appended into map and exist
+     * in the array before setting its value here.
+     * 
+     * @note Some items may be links. But, only the value of the
+     *       actual item in the end of the link chain is set here.
+     * 
+     * @param aTestType Describes for what case the item is for.
+     * @param aKey Key of the map item.
+     * @param aValue Value for the map item.
+     * @return TInt System wide error code.
+     */
+    TInt SetActualValue( const TAlfModuleTestType& aTestType, TInt aKey, const T& aValue )
+        {
+        TAlfModuleTestItem< T >* item( FindActual( aTestType, aKey ) );
+        if ( !item )
+            {
+            // Actual item was not found from the array.        
+            return KErrNotFound;            
+            }
+        
+        // Actual item exists and it is not link item. So, set its values.
+        item->SetValue( aValue );        
+        return KErrNone;
+        }
+
+    
+    /**
+     * Find an actual item if it exists and gets its value if item is found
+     * and value has been set.
+     * 
+     * @param aTestType Describes for what case the item is for.
+     * @param aKey Key of the map item.
+     * @param aValue If map item is found, value of the item is set here.
+     * @return TBool ETrue if map item is found and value has been set. Else EFalse. 
+     */    
+    TBool GetActualValue( const TAlfModuleTestType& aTestType, TInt aKey, T& aValue )
+        {
+        const TAlfModuleTestItem< T >* item( FindActual( aTestType, aKey ) );
+        if ( item && item->ValueSetCount() > 0 )
+            {
+            aValue = item->Value();
+            return ETrue;
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * Finds an actual item if it exists and checks if it equals the given value.
+     * 
+     * @return TBool ETrue if item is found and its value equals given value. Else EFalse. 
+     */
+    TBool ActualEquals( const TAlfModuleTestType& aTestType, TInt aKey, const T& aValue )
+        {
+        T value( aValue );
+        if ( GetActualValue( aTestType, aKey, value ) && value == aValue )
+            {
+            return ETrue;
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * @return TInt Number of map items
+     */
+    TInt ItemCount() const
+        {
+        return iArrayCount;
+        }
+
+
+    /**
+     * @return const TAlfModuleTestItem< T >& Reference to the map item
+     */
+    const TAlfModuleTestItem< T >& Item( TInt aIndex ) const
+        {
+        return iArray[ aIndex ];
+        }
+
+    
+    /**
+     * Appends an accepted test type into the accepted array.
+     * 
+     * @note Only items of accepted test type can be appended
+     *       into this map.
+     * 
+     * @param aTestType Test item type that is accepted for this map.
+     * @return TInt System wide error code.
+     */
+    TInt AppendAccept( const TAlfModuleTestType& aTestType )
+        {
+        if ( Accept( aTestType ) )
+            {
+            // Type already exists in the array.
+            return KErrAlreadyExists;
+            }
+        else if ( iAcceptArrayCount == KMaxAcceptArrayCount )
+            {
+            // Array already full.
+            return KErrOverflow;
+            }
+
+        iAcceptArray[ iAcceptArrayCount ] = aTestType;
+        ++iAcceptArrayCount;
+        return KErrNone;
+        }
+    
+    
+    /**
+     * @param aTestType Test item type to be checked.
+     * @return TBool ETrue if given test type is set as accepted for this map.
+     *               Else EFalse.
+     */
+    TBool Accept( const TAlfModuleTestType& aTestType ) const
+        {
+        for ( TInt i = 0; i < iAcceptArrayCount; ++i )
+            {
+            if ( aTestType == iAcceptArray[ i ] )
+                {
+                return ETrue;
+                }
+            }
+        return EFalse;
+        }
+
+
+    /**
+     * Resets all the array items that match the given test type
+     * to given default value.
+     * 
+     * @param aTestType The test type of items that should be resetted.
+     * @param aValue Reference to the value that items are resetted to.
+     */
+    void ResetItems( const TAlfModuleTestType& aTestType, const T& aDefaultValue )
+        {
+        for ( TInt i = 0; i < iArrayCount; ++i )
+            {
+            if ( iArray[ i ].TestTypeMatch( aTestType ) )
+                {
+                iArray[ i ].Reset( aDefaultValue );
+                }
+            }
+        }
+
+
+    /**
+     * Resets the map
+     */
+    void Reset()
+        {
+        // Just reset the counter.
+        // We do not bother to reset map items, because when counter is reseted
+        // already set items and their info is left out of the scope.
+        iArrayCount = 0;
+        iAcceptArrayCount = 0;
+        }
+
+    
+private: // data
+    
+    TAlfModuleTestItem< T > iArray[ KMaxArrayCount ];
+    TInt iArrayCount;
+    
+    TAlfModuleTestType iAcceptArray[ KMaxAcceptArrayCount ];
+    TInt iAcceptArrayCount;
+    
+    };
+
+#endif // ALFMODULETESTMAP_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/CommonInc/alfmoduletesttype.h	Wed Mar 31 23:03:58 2010 +0300
@@ -0,0 +1,81 @@
+/**
+ * @note Contents of this file are provided only if module test hooks are set on.
+ */
+
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+
+#ifndef ALFMODULETESTTYPE_H
+#define ALFMODULETESTTYPE_H
+
+/**
+ * TAlfModuleTestType specifies recognized test types.
+ */
+enum TAlfModuleTestType
+    {
+    // Do not use this value when creating item.
+    EAlfModuleTestTypeNone,
+    
+    // Render stage component specific tests
+    EAlfModuleTestTypeRenderStageCreateLayer,
+    EAlfModuleTestTypeRenderStageReleaseLayer,
+    EAlfModuleTestTypeRenderStageCreateWindow,
+    EAlfModuleTestTypeRenderStageReleaseWindow,    
+    EAlfModuleTestTypeRenderStageCreateWindowGroup,
+    EAlfModuleTestTypeRenderStageReleaseWindowGroup,
+    EAlfModuleTestTypeRenderStageActiveWindow,
+    EAlfModuleTestTypeRenderStageChangeWindowSize,
+    EAlfModuleTestTypeRenderStageChangeWindowPosition,
+    EAlfModuleTestTypeRenderStageChangeWindowVisibility,
+    EAlfModuleTestTypeRenderStageChangeTextCursorType,
+    EAlfModuleTestTypeRenderStageChangeTextCursorClipRect,
+    EAlfModuleTestTypeRenderStageChangeTextCursorFlag,
+    EAlfModuleTestTypeRenderStageChangeTextCursorColor,
+    
+    // Streamer hierarchy model component specific tests
+    EAlfModuleTestTypeHierarchyModelCreateLayer,
+    EAlfModuleTestTypeHierarchyModelReleaseLayer,
+    EAlfModuleTestTypeHierarchyModelCreateWindow,
+    EAlfModuleTestTypeHierarchyModelReleaseWindow,    
+    EAlfModuleTestTypeHierarchyModelCreateWindowGroup,
+    EAlfModuleTestTypeHierarchyModelReleaseWindowGroup,
+    EAlfModuleTestTypeHierarchyModelActiveWindow,
+    EAlfModuleTestTypeHierarchyModelChangeWindowSize,
+    EAlfModuleTestTypeHierarchyModelChangeWindowPosition,
+    EAlfModuleTestTypeHierarchyModelChangeWindowVisibility,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorType,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorClipRect,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorFlag,
+    EAlfModuleTestTypeHierarchyModelChangeTextCursorColor,
+    
+    // Server bridge component specific tests
+    EAlfModuleTestTypeBridgeCreateLayer,
+    EAlfModuleTestTypeBridgeReleaseLayer,
+    EAlfModuleTestTypeBridgeCreateWindow,
+    EAlfModuleTestTypeBridgeReleaseWindow,    
+    EAlfModuleTestTypeBridgeCreateWindowGroup,
+    EAlfModuleTestTypeBridgeReleaseWindowGroup,
+    EAlfModuleTestTypeBridgeActiveWindow,
+    EAlfModuleTestTypeBridgeChangeWindowSize,
+    EAlfModuleTestTypeBridgeChangeWindowPosition,
+    EAlfModuleTestTypeBridgeChangeWindowVisibility,
+    EAlfModuleTestTypeBridgeChangeTextCursorType,
+    EAlfModuleTestTypeBridgeChangeTextCursorClipRect,
+    EAlfModuleTestTypeBridgeChangeTextCursorFlag,
+    EAlfModuleTestTypeBridgeChangeTextCursorColor,
+    EAlfModuleTestTypeBridgeVisualVisibility,
+    
+    // Core toolkit component specific tests
+    EAlfModuleTestTypeCoreToolkitDrawWindow,
+    EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer,
+    
+    // Do not use this value when creating item.
+    // This is just meant for Find operations when all tests are accepted.
+    EAlfModuleTestTypeAll
+    };
+
+#endif // ALFMODULETESTTYPE_H
+
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+
+// End of File
--- a/uiacceltk/hitchcock/ServerCore/BWINS/alfappservercoreu.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/BWINS/alfappservercoreu.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -308,4 +308,5 @@
 	?FindWgForAppUid@CAlfStreamerBridge@@QAEHVTUid@@@Z @ 307 NONAME ; int CAlfStreamerBridge::FindWgForAppUid(class TUid)
 	?FindAppUidForWgId@CAlfStreamerBridge@@QAE?AVTUid@@H@Z @ 308 NONAME ; class TUid CAlfStreamerBridge::FindAppUidForWgId(int)
 	?SetLayerUsesAplhaFlag@CAlfWindow@@QAEXH@Z @ 309 NONAME ; void CAlfWindow::SetLayerUsesAplhaFlag(int)
+	?ClientAboutToExit@CAlfWindowFxPlugin@@UAEXVTThreadId@@@Z @ 310 NONAME ; void CAlfWindowFxPlugin::ClientAboutToExit(class TThreadId)
 
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfbridge.h	Wed Mar 31 23:03:58 2010 +0300
@@ -199,6 +199,7 @@
     void AlfGfxEffectEndCallBack( TInt aHandle );
    
     TInt FindClientWindowGroupId( TInt aScreenNumber, CHuiControlGroup& aControlGroup );
+    TInt FindWindowGroupNodeId( TInt aScreenNumber, CHuiControlGroup& aControlGroup ) const;
     
     void RemoveAllTemporaryPresenterVisuals();
 
@@ -210,6 +211,7 @@
     
     void EnableSwRenderingL(TBool aEnable = ETrue);
     TBool PrepareSwRenderingTarget( CAlfScreen* aScreen );
+    void InitializeSwRenderingTarget(CFbsBitmap* aBitmap);
 
     /**
      * Sets memory level.
@@ -237,9 +239,9 @@
     void DoUpdateMemoryLevel();
     
     /**
-     * Cancels all effects due to low memory.
+     * Modify all effects due to low memory.
      */
-    void LowMemoryCancelAllEffects();
+    void OnLowMemoryModifyAllEffects();
 
     /**
      * Gets size & rotation.
@@ -265,20 +267,31 @@
     void Synchronized(TInt aId);
     
     /*
-     * HandleGfxEndFullScreenTimeout
+     * GfxTriggerEndFullScreen
      * 
      * GfxTransEffect API gives EndFullScreen events too late. Thus there is a two stage process for triggering 
      * the EndFullScreen effect after BeginFullScreen event arrived.
      * 
-     * For application start effects we give N milliseconds timeout for application to finish drawing after
-     * the first drawing has arrived. If after N milliseconds application has not drawn 75% of the screen, it
-     * gets another N milliseconds. Most cases, the first N milliseconds is enough.
      */
-    void HandleGfxEndFullScreenTimeout(CFullScreenEffectState* aFullScreenEffectData);
+    void GfxTriggerEndFullScreen(CFullScreenEffectState* aFullScreenEffectData);
+    
+   /*
+	*	GfxTriggerEffectWhenFullScreenDrawn
+	*
+	*	Goes through the given CHuiControl (group which is supposed to show the effect). 
+	*   Triggers the effect, if  drawing buffers in group cover the whole screen in the 
+	*   current orientation.
+	*
+	*	@param	aToGroup	Group to be analyzed
+	*/
+    TBool GfxTriggerEffectWhenFullScreenDrawn(CHuiControlGroup* aToGroup = NULL);
     
 	// Experimental
     TBool IsFullScreenDrawn( TInt aOrientation);
 	
+    void LayoutSwitchStart();
+    void LayoutSwitchComplete();
+    
 private:    
     
     
@@ -329,7 +342,17 @@
     
     // component effect handling
     void HandleGfxControlEffectsL( TAlfBridgerData data );
-    
+
+   /**
+	*	StoreLayoutIfRequiredByEffectL
+	*
+	*   @param aNeededStoredLayout	Returns ETrue, if storing is required. Otherwise EFalse.
+    *
+	*	@return ETrue	If storing was required and could be done.
+    *					OR storing was not required. 
+	*/    
+    TBool StoreLayoutIfRequiredByEffectL(CHuiLayout* aLayout, CFullScreenEffectState& aEvent, TBool& aNeededStoredLayout);
+
     /**
      * Handles begin and end fullscreen events
      */
@@ -537,6 +560,8 @@
 	void HandleSetNodeTracking( TAlfBridgerData& aData );
 	
 	void HandleSetFadeEffectL( TAlfBridgerData& aData );
+	
+	void HandleMoveWindowToNewGroupL( TAlfBridgerData& aData );
 
     void HandleSetLayoutSwitchEffectL();
 	
@@ -771,10 +796,12 @@
             TRect& aFullscreen,
             CAlfScreen* aScreen,
             TBool& aSubtreeVisible, 
-            TBool& aHasVisualsWithLayers,
             TBool aChildCanBeOpaque,
             TInt aOrientation);
 
+    
+    void MarkAllLayersHiddenRecursive(CHuiLayout* aLayout);
+    
 NONSHARABLE_CLASS ( TDeadControlGroup )
     {
 public:
@@ -946,6 +973,11 @@
     mutable RRegionBuf<KAlfBridgeRegionGranularity> iTempRegion;
     TBool iBgSurfaceFound;
     TBool iInLowMemMode;
+    TBool iLayoutSwitchInProgress;
+
+    TBool iHomeScreenWallpaperWindowFound;
+    TBool iBgAnimHidden;
+    
     CAlfLayoutSwitchEffectCoordinator* iLayoutSwitchEffectCoordinator;
     TInt iAlfSecureId; 	    
     TBool iSwRenderingEnabled;
@@ -954,6 +986,9 @@
     TBool iLowMemoryMode;
     THuiMemoryLevel iCurrentMemoryLevel;
     
+    TInt iIdForEAlfDSSynchronizeOp;
+    TInt iIdForLayoutSwitchFrameSync;
+    
     #ifdef ALF_DEBUG_PRINT_WINDOWGROUP_ORDER
     TInt activevisualcount;
     TInt passivevisualcount;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfeffectutils.h	Wed Mar 31 23:03:58 2010 +0300
@@ -31,7 +31,7 @@
         virtual ~CAlfRosterFreezeEndTimer();
 
     public: // New functions
-        void Start( TTimeIntervalMicroSeconds32 aPeriod );
+        void Start( TTimeIntervalMicroSeconds32 aPeriod, TCallBack aCallBack  );
         
     protected:  // Functions from base classes
         void DoCancel();
@@ -45,7 +45,7 @@
         CAlfBridge& iBridge;
  	public:
 	   	TInt iSafeCounter;
-                
+        TCallBack iCallBack;        
     };
 
 
@@ -84,6 +84,25 @@
 //
 NONSHARABLE_CLASS( CAlfLayoutSwitchEffectCoordinator ) : public CBase, public MAlfGfxEffectObserver
     {
+    public:
+        enum TEvent
+            {
+            EEventLayoutSwitch,
+            EEventBlankOn,
+            EEventBlankOff,
+            EEventLowMemory
+            };
+    
+        enum TState
+            {
+            EStateIdle,
+            EStateFreezeFx,
+            EStateBlankFx,
+            EStateThemeFx
+            };
+
+        typedef TState (*TStateFunction)(TEvent aEvent);
+
     public:  // Constructors and destructor
         CAlfLayoutSwitchEffectCoordinator( CAlfBridge& aBridge );
         virtual ~CAlfLayoutSwitchEffectCoordinator();
@@ -92,9 +111,25 @@
         void AlfGfxEffectEndCallBack( TInt aHandle );
     
     public:
+        void Blank(TBool aEnabled);
+        void LowMemoryEvent();
         void BeginLayoutSwitch();
-        void Cancel();
-        TBool LayoutSwitchEffectsExist();
+        
+        void Event(TEvent aEvent);
+        void Transition(TState aNewState, TState aPreviousState);
+
+    private:
+        TState NextIdleState(TEvent aEvent);
+        TState NextFreezeState(TEvent aEvent);
+        TState NextBlankState(TEvent aEvent);
+        TState NextThemeState(TEvent aEvent);
+
+        void FreezeFinished();
+
+    public:            
+        TBool IsThemeEffectEnabled() const;
+        TBool LayoutSwitchEffectsExist() const;
+
 		void EnableSafeCounter(TBool aEnable)
 			{
 			if (iRosterFreezeEndTimer)
@@ -109,16 +144,25 @@
 					}
 				}
 			}        
+    
     private:
         AknTransEffect::TContext NextLayoutSwitchContext();
         void SetLayoutSwitchEffect(AknTransEffect::TContext aContext);
         
+        void FreezeRoster(TBool aFrozen);
+        
+        static TInt DoFreezeFinished(TAny* aAny);
+        
     private: // Data
         
         CAlfBridge& iBridge;
         AknTransEffect::TContext iLayoutSwitchEffectContext;
         TThreadPriority iOriginalPriority;
         CAlfRosterFreezeEndTimer* iRosterFreezeEndTimer;
+        TBool iBlankEnabled;
+        
+        TState iCurrentState;
+        TBool iLayoutSwitchNotCompleted;
 	};
 
 // ---------------------------------------------------------
@@ -175,10 +219,6 @@
         
         void ConstructL(TInt aAction, RMemReadStream& aStream);
         
-        TBool InitDelayedEffectL(CAlfBridge* aBridge, TSize aDisplaySize);
-        
-        void NotifyDrawingTimeout();
-
         // Information from BeginFullScreen
         TInt iType;
         TInt iToWg;
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerconsts.h	Wed Mar 31 23:03:58 2010 +0300
@@ -73,6 +73,8 @@
     KAlfCompositionTargetHiddenBGAnim,
     KAlfCompositionTargetVisibleBGAnim,
     
+    KAlfCompositionLayoutSwitchComplete
+    
     };
 
 struct TAlfNativeWindowData
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfstreamerserver.h	Wed Mar 31 23:03:58 2010 +0300
@@ -35,7 +35,7 @@
     static TInt LaunchServer(TThreadId& aThreadId, CAlfStreamerBridge* aBridge );
     static void NewLC(CAlfStreamerBridge* aBridge);
 	~CAlfStreamerServer();
-    void HandleClientExit(const CSession2* aClient);
+    void HandleClientExit(const CAlfStreamerServerSession* aClient);
     CAlfWindowManager* WindowMgr() 
         {
         return iWindowMgr;
@@ -146,7 +146,7 @@
 NONSHARABLE_CLASS(CAlfStreamerServerSession): public CSession2
     {
 public:
-    CAlfStreamerServerSession();
+    CAlfStreamerServerSession(const TThreadId& aThreadId);
     ~CAlfStreamerServerSession();
     void ServiceL(const RMessage2& aMessage);
     void HandleCompositionOpL(TInt aOp, const RMessage2& aMessage, CAlfStreamerServer* aServer);
@@ -162,6 +162,10 @@
     TSurfaceId& ExtentSurfaceId();
     TInt& AlfToken(){ return iAlfToken; }
     TBool IsBgAnimSession(){return iIsBgAnimSession;}
+    TThreadId ThreadId() const
+		{
+		return iThreadId;
+		} 
     
 private:
     RArray<TInt> iLoadedPlugins;
@@ -179,6 +183,7 @@
     TSurfaceId iExtentSurfaceId;
     TInt iAlfToken;
     TBool iIsBgAnimSession;
+    TThreadId iThreadId;
     };
 
 #endif
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfwindowfxplugin.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfwindowfxplugin.h	Wed Mar 31 23:03:58 2010 +0300
@@ -45,6 +45,9 @@
     /** Cancel asynch message(s) from client */    
     IMPORT_C virtual void CancelMessage(TInt aMessageId);
 
+    /** Client about to exist, discard message(s) from client */    
+    IMPORT_C virtual void ClientAboutToExit(TThreadId aClientId);
+
     /**
     * Pure Virtuals
     */
--- a/uiacceltk/hitchcock/ServerCore/Inc/alfwindowmanager.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Inc/alfwindowmanager.h	Wed Mar 31 23:03:58 2010 +0300
@@ -248,6 +248,8 @@
     
     IMPORT_C CAlfStreamerBridge* Bridge();
     
+    void HandleClientExit(TThreadId aThreadId);
+    
 private: // utils
 
     CAlfWindowManager();
--- a/uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfappui.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -468,8 +468,10 @@
                 if(iWindowGc->Construct() == KErrNone)
                     {
                     iWindowGc->Activate(*iWindow);
+                    iWindow->BeginRedraw();
                     iWindowGc->SetBrushColor(0xffffffff);
                     iWindowGc->Clear();
+                    iWindow->EndRedraw();
                     iWindowGc->Deactivate();
                     }                
                 }
@@ -1476,36 +1478,15 @@
         User::Leave(KErrPermissionDenied);    
         }
     
-	if (iData->iBridgeObj->LayoutSwitchEffectCoordinator())
-		{
-		iData->iBridgeObj->LayoutSwitchEffectCoordinator()->EnableSafeCounter(EFalse); // let capserver rule  
-		}
+//	if (iData->iBridgeObj->LayoutSwitchEffectCoordinator())
+//		{
+//		iData->iBridgeObj->LayoutSwitchEffectCoordinator()->EnableSafeCounter(EFalse); // let capserver rule  
+//		}
   
     TBool pause = aMessage.Int0();
-    if ( pause && 
-        CAknTransitionUtils::TransitionsEnabled(AknTransEffect::ELayoutswitchTransitionsOff ) && 
-        iData->iBridgeObj->LayoutSwitchEffectCoordinator() && 
-        iData->iBridgeObj->LayoutSwitchEffectCoordinator()->LayoutSwitchEffectsExist() 
-        )
-        { // don't pause if effects are there, releasing the blanker needs to be allowed still
-        __ALFLOGSTRING("CAlfAppUi::DoBlankScreen << - Effects on");
-	    return;
-        }        
     
-    if (pause != iData->iHuiEnv->iPauseDrawing)
-        {
-        iData->iHuiEnv->iPauseDrawing = pause;
-        __ALFLOGSTRING1("CAlfAppUi::DoBlankScreen pausing %d",pause);
-        TRAP_IGNORE(iData->iHuiEnv->Display(0).Roster().FreezeVisibleContentL(pause));
-		if (!pause)
-            { // make sure that toolkit will traverse through scene
-            iData->iHuiEnv->StartRefresh(1);
-            }    
-		else
-		    {
-            iData->iBridgeObj->LayoutSwitchEffectCoordinator()->Cancel();
-		    }
-        }
+    iData->iBridgeObj->LayoutSwitchEffectCoordinator()->Blank(pause);
+    
     __ALFLOGSTRING("CAlfAppUi::DoBlankScreen <<");
     // let the session complete message  
     }
--- a/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfbridge.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -70,6 +70,7 @@
 #include "huicanvasrenderbuffer.h"
 #include "alfeffectutils.h"
 #include "alfrenderstageutils.h" // for KAlfPSUidSynchronizer & KAlfPSKeySynchronizer
+#include "alfdrawerinternal.h"
 
 #ifdef HUI_DEBUG_TRACK_DRAWING
 #include <alfcommanddebug.h>
@@ -89,6 +90,8 @@
 //const TReal32 KAlfVisualDefaultOpacity = 0.5f;
 const TInt KEffectCleanupDelayInMs = 10;
 
+const TInt KPreventingCollisionOfIdsInSynchDrawRequests = 35;
+
 _LIT8(KAlfWindowGroupContainerControlTag, "WGROUP");
 
 #define USE_APPLICATION_ENDFULLSCREEN_TIMEOUT
@@ -98,7 +101,15 @@
 
 const TInt KFadeAction = 6000;
 
-// ======== MEMBER FUNCTIONS ========
+NONSHARABLE_CLASS( TAlfBridgeDrawerWrapper ) : public MAlfDrawerScreenInterface
+    {
+public:
+    TAlfBridgeDrawerWrapper(CAlfBridge& aBridge);
+    TInt GetSizeAndRotation(TSize& aSize, TInt& aRotation);
+    TInt ReadPixels(CFbsBitmap* aBitmap);
+private:
+    CAlfBridge& iBridge;
+    };
 
 // ======== MEMBER FUNCTIONS ========
 
@@ -171,6 +182,9 @@
 void CAlfBridge::ConstructL(CHuiEnv* aEnv)
     {
     iHuiEnv = aEnv;
+    
+    iIdForEAlfDSSynchronizeOp = 0;
+    iIdForLayoutSwitchFrameSync = iIdForEAlfDSSynchronizeOp - KPreventingCollisionOfIdsInSynchDrawRequests;
 
 #ifdef SYMBIAN_BUILD_GCE
     iPrintFPS = EFalse;
@@ -338,6 +352,8 @@
     iPreviouslySearchedVisual = aVisual;
 
     AMT_INC_COUNTER( iTotalVisualCount );
+    
+    AMT_MAP_BRIDGE_ADD_VISUAL();
     }
 
 // ---------------------------------------------------------------------------
@@ -350,7 +366,10 @@
     iWindowHashArray.Remove( aWindowNodeId );
     iPreviouslySearchedVisualId = 0;
     
-    AMT_DEC_COUNTER( iTotalVisualCount );    
+    AMT_DEC_COUNTER( iTotalVisualCount );
+    
+    AMT_MAP_INC_VALUE( iIntMap, aWindowNodeId, EAlfModuleTestTypeBridgeReleaseWindow );
+    AMT_MAP_SET_VALUE( iBoolMap, aWindowNodeId, ETrue, EAlfModuleTestTypeBridgeReleaseWindow );
     }
     
 // ---------------------------------------------------------------------------
@@ -431,6 +450,22 @@
     }
 
 // ---------------------------------------------------------------------------
+// FindWindowGroupNodeId
+// ---------------------------------------------------------------------------
+//
+TInt CAlfBridge::FindWindowGroupNodeId( TInt aScreenNumber, CHuiControlGroup& aControlGroup ) const
+    {
+    for (TInt i=0; i<iAlfScreens[aScreenNumber]->iControlGroups.Count();i++)
+        {
+        if( iAlfScreens[aScreenNumber]->iControlGroups[i].iControlGroup == &aControlGroup )
+            {
+            return iAlfScreens[aScreenNumber]->iControlGroups[i].iWindowGroupNodeId;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 //
 CHuiControlGroup* CAlfBridge::FindControlGroupByWindowGroupId( TInt aWindowGroupId, TInt& aScreenNumber, TAlfControlGroupEntry** aAlfGroup )
@@ -577,7 +612,7 @@
                         {
                         iFullScreenEffectData->iFromSecureId = iAlfScreens[0]->iControlGroups[j].iSecureId;
                         iFullScreenEffectData->iFromWg = iAlfScreens[0]->iControlGroups[j].iClientWindowGroupId;
-                        __ALFFXLOGSTRING2("CAlfBridge::ResolveAfterEffectAppearingApplicationL - Found underneath application uid: 0x%x, window group: %d -  Start track drawing for exit effect.", iFullScreenEffectData->iFromAppId, iFullScreenEffectData->iFromWg );
+                        __ALFFXLOGSTRING2("CAlfBridge::ResolveAfterEffectAppearingApplicationL - Found underneath application uid: 0x%x, window group: %d -  Start track drawing for exit effect.", iFullScreenEffectData->iFromSecureId, iFullScreenEffectData->iFromWg );
                         break;
                         }
                     }
@@ -680,7 +715,10 @@
             
             break;
             }
-        }        
+        }
+    
+    AMT_MAP_INC_VALUE( iIntMap, aWindowGroupNodeId,
+                       EAlfModuleTestTypeBridgeReleaseWindowGroup );
     }
 
 
@@ -697,6 +735,7 @@
     if (!group)
         {
         group = &iHuiEnv->NewControlGroupL(aWindowGroupNodeId); 
+        group->SetSecureId(aSecureId);
         CleanupStack::PushL(group);
         CHuiControl*  cntrl = new (ELeave) CHuiControl(*iHuiEnv);
         CleanupStack::PushL(cntrl);
@@ -758,7 +797,8 @@
         
         AMT_INC_COUNTER( iTotalControlGroupCount );
         }
-    
+
+    AMT_MAP_BRIDGE_CREATE_CONTROL_GROUP();
 
     return *group;       
     }
@@ -1297,10 +1337,9 @@
     TBool fullscreenCovered = EFalse;
     CAlfAppSrvSessionBase* topMostAlfSrvSession = NULL;
     
-    //iActiveVisualCount = 0;
     iBgSurfaceFound = EFalse;
-    //iPaintedArea = 0;  
-    
+    iHomeScreenWallpaperWindowFound = EFalse;
+   
     // Check if effect group has an effect with opaque hint.
     CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[aScreenNumber]->iFullscreenEffectControlGroup);
     CHuiControl& fxcontrol = fxcontrolgroup.Control(0);
@@ -1488,24 +1527,50 @@
 #endif
             
         }
-    if (iActivated)
-        {
-        if (iBgSurfaceFound)
-            {
-            if (!iInLowMemMode)
+        
+    if (iActivated && !iLayoutSwitchInProgress)
+        {
+        if (iBgSurfaceFound || iHomeScreenWallpaperWindowFound)
+            {
+            // only bg surface should trigger lowmem
+            if (!iInLowMemMode && iBgSurfaceFound)
                 {
                 SetLowMemory(ETrue);
+                iInLowMemMode = ETrue;
+                }
+            else if (!iBgSurfaceFound && iInLowMemMode)
+                {
+                SetLowMemory(EFalse);
+                iInLowMemMode = EFalse;                
+                }
+
+            // if the background animation is not hidden yet, hide it now
+            if (!iBgAnimHidden)
+                {
                 // Notify Bg anim
                 iBridgerClient.SendBlind(EAlfQueueRequestBGSessions, TIpcArgs(KAlfCompositionTargetHidden));
-                iInLowMemMode = ETrue;            
+                iBgAnimHidden = ETrue;
                 }
             }
-        else if (iInLowMemMode)
-            {
-            SetLowMemory(EFalse);
-            // Notify Bg anim
-            iBridgerClient.SendBlind(EAlfQueueRequestBGSessions, TIpcArgs(KAlfCompositionTargetVisible));
-            iInLowMemMode = EFalse;
+        else if (iInLowMemMode || iBgAnimHidden)
+            {
+            // if we did not found bg surface, but are in low memory mode
+            // exit it now...
+            if (!iBgSurfaceFound && iInLowMemMode)
+                {
+                SetLowMemory(EFalse);
+                iInLowMemMode = EFalse;                
+                }
+
+            // if the bg animation is hidden and we did not found a background surface
+            // or the homescreen window containing wallpaper, show the background animation
+            // again
+            if (iBgAnimHidden && !iBgSurfaceFound && !iHomeScreenWallpaperWindowFound)
+                {
+                // Notify Bg anim
+                iBridgerClient.SendBlind(EAlfQueueRequestBGSessions, TIpcArgs(KAlfCompositionTargetVisible));
+                iBgAnimHidden = EFalse;
+                }
             }
         }
 
@@ -1519,7 +1584,7 @@
     // would clear the screen areas where they do not really draw.
     if (fadeEffectInScreen)
         {
-        TBool alwaysblend = EFalse;
+        TBool firstFadedWindowGroupFound = EFalse;
         for (TInt j=0; j<screen->iDisplay->Roster().Count() - screen->FixedControlGroupCount(); j++) // skip the topmost (effect) layer 
             {                
             CHuiControlGroup& controlgroup = iAlfScreens[aScreenNumber]->iDisplay->Roster().ControlGroup(j);
@@ -1527,7 +1592,7 @@
             CHuiVisual* layout = &control.Visual(0);
             if (layout->Effect() && (layout->Effect()->EffectFlags() & KHuiFadeEffectFlag))
                 {
-                if (alwaysblend)
+                if (firstFadedWindowGroupFound)
                     {
                     TInt flags = layout->Effect()->EffectFlags();
                     flags |= KHuiFxAlwaysBlend; // Workaround for opaque layout canvasvisual.
@@ -1540,9 +1605,9 @@
                     TInt flags = layout->Effect()->EffectFlags();
                     flags |= KHuiFxEnableBackgroundInAllLayers; // This forces effect to happen to background pixels that are read from surface. 
                     flags |= KHuiFxFrozenBackground; // To get optimal UI performance, we ignore changes in ALF scene when it is faded.
-                    alwaysblend = ETrue;
                     layout->Effect()->SetEffectFlags(flags);                            
                     }                
+                firstFadedWindowGroupFound = ETrue;
                 }
             }
         }
@@ -1619,6 +1684,7 @@
             visualDisplayRect = canvasVisual->DisplayRect();
     
             // Make sure we clip visual rect to visible screen area
+            ClipVisualRect(visualDisplayRect, aLayout->DisplayRect());
             ClipVisualRect(visualDisplayRect, aFullscreen);
             
             // Check if this visual is covered by other opaque visuals which rects are in "covered" region           
@@ -1694,18 +1760,44 @@
             canvasVisual->PrepareCache();
             canvasVisual->SetCapturingBufferL(aScreen->iSwRenderingTarget);                
 
+            // We found an _ACTIVE_ window in homescreens controlgroup
+            if (aControlGroup.SecureId() == 0x102750F0)
+                {
+                // which is fully opaque, and visible ...
+                if ( (canvasVisual->iOpacity.Now() > 0.001) && canvasVisual->Flags() & EHuiVisualFlagOpaqueHint)
+                    {
+                    // ... and it's a fullscreen one, and does not have a transparent clear in it
+                    if (canvasVisual->DisplayRect().Round() == Display(0)->VisibleArea() &&
+                        !canvasVisual->HasTransParentClear())
+                        {
+                        // we can "safely" asseme that the window is the
+                        // one used to draw the user defined wallpaper
+                        // ----> stop background animation as it's not visible
+                        iHomeScreenWallpaperWindowFound = ETrue;
+                        }
+                    }
+                }
+            
             // we've found non-inactive window which has background surface
             // attached..
             if (canvasVisual->IsBackgroundDrawingEnabled() &&
                 canvasVisual->LayerExtent() != TRect() &&
                 !canvasVisual->LayerUsesAlphaFlag() )
                 {
-                // if paintedareacount is exactly one, it means that the window
+                // if paintedareacount is exactly one or two, it means that the window
                 // has background surface but no drawing commands
-                if (canvasVisual->PaintedAreaCount() == 1) 
+                TInt areaCount = canvasVisual->PaintedAreaCount();
+                if (areaCount == 1 || areaCount == 2) 
                     {
-                    THuiCanvasPaintedArea pa = canvasVisual->PaintedArea(0);
-                    TRect r = pa.iPaintedRect.Round();
+                    TBool onlyFullScreenAreas = ETrue;
+                    for (TInt count = 0; count < areaCount; count++)
+                        {
+                        TRect area = canvasVisual->PaintedArea(count).iPaintedRect.Round();
+                        if (area != Display(0)->VisibleArea())
+                            {
+                            onlyFullScreenAreas = EFalse;
+                            }
+                        }
                     // if we found a fullscreen surface with no other drawing commands
                     // we can safely assume that it's about the only thing to be visible
                     // and we can release memory occupied by other parts of the system
@@ -1716,7 +1808,7 @@
                     // memory state. We want to do it like this as otherwise
                     // we would be triggering for example background animation
                     // on / off quite rapidly........
-                    if ( r == Display(0)->VisibleArea())
+                    if ( onlyFullScreenAreas )
                         {
                         // Final test. Surface must not be ALF surface, but some other surface.                        
                         CHuiControlGroup* alfControlGroup = FindControlGroupBySecureId( iAlfSecureId );
@@ -1767,6 +1859,7 @@
                 if ( !canvasVisual->HasCustomShape() )
                     {
                     TRect displayRect(canvasVisual->DisplayRect());
+                    ClipVisualRect(displayRect, aLayout->DisplayRect());
                     ClipVisualRect(displayRect, aFullscreen);
 
 #ifdef ALF_DEBUG_PRINT_WINDOWGROUP_ORDER
@@ -1831,7 +1924,20 @@
         visualTreeActive |= visualIsActive;
         
         // iVisibleVisualCount is cleared in HandleVisualVisibility()
-        AMT_INC_COUNTER_IF( visualIsActive && !visualRectIsCovered , iVisibleVisualCount );
+        AMT_INC_COUNTER_IF( visualIsActive && visualIsOpaque && !visualRectIsCovered, iVisibleVisualCount );
+        
+        AMT_MAP_SET_VALUE_IF(
+                visualIsActive && visualIsOpaque && !visualRectIsCovered && (canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation),
+                iBoolMap,
+                AMT_MAP_CPTR_TO_KEY_CAST( canvasVisual ),
+                ETrue,
+                EAlfModuleTestTypeBridgeVisualVisibility);
+        AMT_MAP_SET_VALUE_IF(
+                !visualIsActive || !visualIsOpaque || visualRectIsCovered || !(canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation),
+                iBoolMap,
+                AMT_MAP_CPTR_TO_KEY_CAST( canvasVisual ),
+                EFalse,
+                EAlfModuleTestTypeBridgeVisualVisibility);
         } // for loop end : children checking loop
      
     return visualTreeActive;
@@ -2006,10 +2112,10 @@
             {
             case EAlfDSSynchronize:
                 {
-                TInt id = data.iInt1;
+                iIdForEAlfDSSynchronizeOp = data.iInt1;
                 if ( iHuiEnv )
                     {
-                    iHuiEnv->Synchronize( id, this );
+                    iHuiEnv->Synchronize( iIdForEAlfDSSynchronizeOp, this );
                     }
                 }
                 break;
@@ -2124,30 +2230,8 @@
             	}
             case EAlfDSMoveWindowToNewGroup:
             	{
-            	/*
-            	RDebug::Print(_L("CAlfBridge::DoDispatchL, EAlfDSMoveWindowToNewGroup, THIS METHOD IS UNTESTED. EXPECT TROUBLE!"));
-            	// TODO: TEST!
-            	TInt windowGroupNodeId = data.iInt1;
-            	TInt windowNodeId = data.iInt2;
-            	TInt newGroupId = (TInt)data.iPtr;
-            	CHuiLayout* layout = NULL;
-            	CHuiCanvasVisual* viz = (CHuiCanvasVisual*)FindVisual(windowNodeId, windowGroupNodeId,screenNumber);
-            	if (viz)
-            		{
-            		// #1 remove visual from old group
-            		layout = viz->Layout();
-            		layout->Remove(viz);                           
-            		viz->Owner().Remove(viz);
-            		// #2 insert visual to the beginning of the new group
-            		CHuiControlGroup* controlGroup = FindControlGroup(newGroupId,screenNumber);
-            		if (controlGroup)
-            			{
-            			CHuiControl& control = controlGroup->Control(0);
-            			CHuiLayout* layout = (CHuiLayout*)&control.Visual(0);
-            			layout->AppendL( viz );
-            			}
-            		}*/
-            		break;
+            	HandleMoveWindowToNewGroupL( data );
+            	break; 
             	}
             case EAlfEffectFx:
                 {
@@ -2244,7 +2328,7 @@
                 CHuiGc::TOrientation huiOrientation(CHuiGc::EOrientationNormal);
 	            switch(data.iInt1)
 	                {
-	                case 1: // 90    
+	            case 1: // 90    
                     huiOrientation = CHuiGc::EOrientationCCW90;
                     break;
 	            case 2: // 180    
@@ -2524,6 +2608,7 @@
 		{
 		case EAlfWinTreeNodeGroup:
 			{
+			HandleVisualVisibility(0);
 			DeleteControlGroupL(windowGroupNodeId, screenNumber);                            
 			break;    
 			}
@@ -2617,9 +2702,9 @@
 
     AMT_INC_COUNTER_IF( viz, iVisualPositionChangedCount );
     AMT_SET_VALUE_IF( viz, iLatestVisualExtentRect, TRect( windowAttributes->iPosition, windowAttributes->iSize ) );
-    AMT_MAP_SET_VALUE_IF( ( viz && iWindowHashArray.Find( windowNodeId ) ),
-                          iPositionMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          windowAttributes->iPosition, EAlfModuleTestTypeBridgeChangePosition );    
+    AMT_MAP_SET_VALUE_IF( viz, iPositionMap, windowNodeId,
+                          windowAttributes->iPosition, 
+                          EAlfModuleTestTypeBridgeChangeWindowPosition );    
 	}
 
 // ---------------------------------------------------------------------------
@@ -2651,9 +2736,10 @@
     
     AMT_INC_COUNTER_IF(viz, iVisualSizeChangedCount );
     AMT_SET_VALUE_IF(viz, iLatestVisualExtentRect, TRect( windowAttributes->iPosition, windowAttributes->iSize ) );
-    AMT_MAP_SET_VALUE_IF( ( viz && iWindowHashArray.Find( windowNodeId ) ), 
-                          iSizeMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          windowAttributes->iSize, EAlfModuleTestTypeBridgeChangeSize );
+    
+    AMT_MAP_SET_VALUE_IF( viz, iSizeMap, windowNodeId, 
+                          windowAttributes->iSize, 
+                          EAlfModuleTestTypeBridgeChangeWindowSize );
 	}
 
 // ---------------------------------------------------------------------------
@@ -3065,7 +3151,6 @@
 	            && iFullScreenEffectData->iEffectType != CFullScreenEffectState::ENotDefinedEffect 
 	            && !iFullScreenEffectData->iEndFullScreen)
 	        {
-
 	        CHuiControlGroup *to_group = NULL;
             if (iFullScreenEffectData->iEffectType == CFullScreenEffectState::EExitEffect)
                 {
@@ -3081,22 +3166,10 @@
 	        // 2. only the first drawing commands will trigger EndFullScreen
 	        // (this mechanism is here because we want to remove delay from fullscreen effects - and EndFullScreens are coming from application too late)
 	        
-	        if (viz->Owner().ControlGroup() == to_group)
+	        if (viz && viz->Owner().ControlGroup() == to_group)
 	            {
-                if (!iFullScreenEffectData->iDrawingCompleteTimer)
-                    {
-                    iFullScreenEffectData->InitDelayedEffectL(this, iAlfScreens[0]->Size());
-                    }
-                THuiCanvasPaintedArea p = viz->PaintedArea(0);
-	            iFullScreenEffectData->iPaintedRegion.AddRect( p.iPaintedRect.Round() );
-	            TRect b = iFullScreenEffectData->iPaintedRegion.BoundingRect();
-	            __ALFFXLOGSTRING3(
-	                    "CAlfBridge::HandlePostCanvasBufferL : Effect to visual 0x%x, Covered rect: iTl.iX: %d , iTl.iY: %d",
-	                    viz, 
-	                    b.iTl.iX, 
-	                    b.iTl.iY);
-	            __ALFFXLOGSTRING2("CAlfBridge::HandlePostCanvasBufferL : iBr.iX: %d, iBr.iY: %d", b.iBr.iX, b.iBr.iY);
-	                        }
+                GfxTriggerEffectWhenFullScreenDrawn(to_group);
+	            }
 	        }
 #endif
 	}
@@ -3105,7 +3178,7 @@
 // HandleGfxEndFullScreenTimeout
 // ---------------------------------------------------------------------------
 // 
-void CAlfBridge::HandleGfxEndFullScreenTimeout(CFullScreenEffectState* aFullScreenEffectData)
+void CAlfBridge::GfxTriggerEndFullScreen(CFullScreenEffectState* aFullScreenEffectData)
     {
     if (aFullScreenEffectData->iEndFullScreen)
         {
@@ -3165,6 +3238,7 @@
         }
     else
         {
+        __ALFFXLOGSTRING2("CAlfBridge::SetWindowActiveL 0x%x has active effect. New state: %d", aVisual, aActive);
         // Has effect
 		// these flags are put to action in RemoveTemporaryPresenterItem
         if (aActive)
@@ -3279,9 +3353,11 @@
     AMT_INC_COUNTER( iTotalVisualFlagChangedCount );
     AMT_INC_COUNTER_IF( windowAttributes->iActive, iActiveVisualCount );
     AMT_INC_COUNTER_IF( !windowAttributes->iActive, iPassiveVisualCount );
-    AMT_MAP_INC_VALUE_IF( ( iWindowHashArray.Find( windowNodeId ) ), 
-                          iIntMap, iWindowHashArray.Find( windowNodeId )->iClientSideId, 
-                          EAlfModuleTestTypeBridgeChangeFlag );    
+
+    AMT_MAP_SET_VALUE( iBoolMap, windowNodeId, windowAttributes->iActive,
+                       EAlfModuleTestTypeBridgeChangeWindowVisibility );
+    AMT_MAP_SET_VALUE( iBoolMap, windowNodeId, windowAttributes->iActive,
+                       EAlfModuleTestTypeBridgeActiveWindow );
 	}
 
 
@@ -3940,6 +4016,85 @@
 
 
 // ---------------------------------------------------------------------------
+// HandleMoveWindowToNewGroupL
+// ---------------------------------------------------------------------------
+// 
+void CAlfBridge::HandleMoveWindowToNewGroupL( TAlfBridgerData& aData )
+    {
+    TInt windowNodeId = aData.iInt1;
+    TInt screenNumber = aData.iInt2;
+    TInt newWindowGroupNodeId = (TInt)aData.iPtr;
+   
+    CHuiCanvasVisual* viz = (CHuiCanvasVisual*)FindVisual(windowNodeId);
+    
+#ifdef _ALF_LOGGING
+    CHuiControlGroup* oldControlGroup = viz->Owner().ControlGroup();
+    TInt oldWindowGroupId = 0; 
+    if ( oldControlGroup  )
+        {
+        oldWindowGroupId = FindWindowGroupNodeId(screenNumber, *oldControlGroup );
+        }   
+    __ALFLOGSTRING3("CAlfBridge::HandleMoveWindowToNewGroupL moving nodeId 0x%x from group 0x%x to 0x%x ",windowNodeId, oldWindowGroupId, newWindowGroupNodeId );
+#endif
+    
+    if (viz)
+        {
+        CHuiLayout* oldLayout = viz->Layout();
+        TBool isRootOfTheMovingTree = EFalse; // if true, we need to update the parent layout 
+        
+        if ( viz->Owner().ControlGroup() && 
+                (&viz->Owner().ControlGroup()->Control(0).Visual(0) == oldLayout) )
+            {
+            // Symbian OS documentation: "This function allows a window with a window group as its 
+            // immediate parent to be moved from one window group to another one."
+            //
+            // This implementation is assuming that only a window which is an immediate child of a window group
+            // can be moved to new group. Moving an immediate child (=root of the moving tree) 
+            // causes the child windows to move as well.
+            isRootOfTheMovingTree = ETrue;
+            }
+
+        // #1 remove visual from old group
+        if ( isRootOfTheMovingTree && oldLayout )
+            {
+            // remove also from the old parent layout - new layout is coming from the new group
+            oldLayout->Remove(viz);
+            }
+        // else: keep the parent layout - assume that is moving as well.  
+        
+        // remove from the old control
+        viz->Owner().Remove(viz);
+        
+        // #2 insert visual to the beginning of the new group
+        CHuiControlGroup* newControlGroup = FindControlGroup(newWindowGroupNodeId,screenNumber);
+        if (newControlGroup)
+            {
+            CHuiControl& newControl = newControlGroup->Control(0);
+            if ( isRootOfTheMovingTree )
+                {
+                // update the parent layout to be the default layout of the window group
+                CHuiLayout* newLayout = (CHuiLayout*)&newControl.Visual(0);
+                newControl.AppendL( viz, newLayout );
+                }
+            else
+                {
+                // just update the owner. Assume that the parent RWindowTreeNode/CAlfNode/CHuiLayout is moving as well.
+                newControl.AppendL( viz );
+                }
+            }
+        else 
+            {
+            __ALFLOGSTRING("CAlfBridge::HandleMoveWindowToNewGroupL cannot find new group! orphaning the visual");
+            iOrphanStorage->AppendL( viz );
+            }
+        }
+    else
+        {
+        __ALFLOGSTRING("CAlfBridge::HandleMoveWindowToNewGroupL cannot find moving visual!");
+        }
+    }
+
+// ---------------------------------------------------------------------------
 // HandleSetFadeEffect
 // ---------------------------------------------------------------------------
 // 
@@ -4047,7 +4202,9 @@
         __ALFLOGSTRING1("CAlfBridge::HandleSetCursorDataL - WARNING! Cursor node 0x%x not found!", windowNodeId);
         }
     
-    AMT_INC_COUNTER_IF(viz, iTotalVisualAttributeChangedCount);   
+    AMT_INC_COUNTER_IF(viz, iTotalVisualAttributeChangedCount);
+    
+    AMT_MAP_BRIDGE_TEXT_CURSOR_CHANGE();    
     }
 
 // ---------------------------------------------------------------------------
@@ -4106,7 +4263,41 @@
     {
     return aEngine->FxmlUsesInput1(aFileName);
     }
-	
+
+// ---------------------------------------------------------------------------
+// StoreLayoutIfRequiredByEffectL
+//
+// Certains effects require screenshot to be taken when BeginFullScreen event
+// is triggered. This method will take a screenshot (of the whole screen), if 
+// there is enough memory available.
+// ---------------------------------------------------------------------------
+//
+TBool CAlfBridge::StoreLayoutIfRequiredByEffectL(CHuiLayout* aLayout, CFullScreenEffectState& aEvent, TBool& aNeededStoredLayout)
+    {
+    aNeededStoredLayout = NeedsStoredBuffers(iHuiEnv->EffectsEngine(), *aEvent.iEffectName);
+    __ALFFXLOGSTRING2("CAlfBridge::StoreLayoutIfRequiredByEffectL - aHandle: %d, Take screenhot: %d", aEvent.iHandle, aNeededStoredLayout);
+    if (aNeededStoredLayout)
+        {
+        TRAPD(err,StoreRenderBufferStartL(aLayout));
+        __ALFFXLOGSTRING1("CAlfBridge::StoreLayoutIfRequiredByEffectL - Screenshot result: KErrNone == %d", err);
+        if (err == KErrNone)
+            {
+            aLayout->SetFreezeState(ETrue);
+            aEvent.iCanDestroyOrHideImmediately = ETrue; // if children of this layout are hidden or destroyed during effect, that can happen immediately
+            return ETrue; // storing of content requesteds, could store the content => success
+            }
+        else
+            {
+            return EFalse; // could not store the content => failed
+            }
+        }
+    else
+        {
+        __ALFFXLOGSTRING("CAlfBridge::StoreLayoutIfRequiredByEffectL - Storing not required");
+        return ETrue; // no storing requred, no screenshot required => success
+        }
+    }
+
 TBool CAlfBridge::HandleGfxEventL(CFullScreenEffectState& aEvent, CHuiLayout* aToLayout, CHuiLayout *aFromLayout)
     {
     __ALFFXLOGSTRING4("CAlfBridge::HandleGfxEventL - To layout: 0x%x, From layout: 0x%x, Effect handle: %d, Action: %d", aToLayout, aFromLayout, aEvent.iHandle, aEvent.iAction);
@@ -4131,22 +4322,26 @@
             case MAlfGfxEffectPlugin::EBeginFullscreen:
                 {
                 aToLayout->SetStoredRenderBufferModificationsEnabled(ETrue);
-                TBool needStoredBuffers = NeedsStoredBuffers(engine, *aEvent.iEffectName);
-                __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - EBeginFullScreen: %d, Take screenhot: %d", aEvent.iHandle, needStoredBuffers);
-                if (needStoredBuffers)
+                TBool neededStoredBuffers;
+                TBool success = StoreLayoutIfRequiredByEffectL(aToLayout, aEvent, neededStoredBuffers);
+				
+				// if screenshot was requested and it was possible to take one, then add this layout
+				// to effectcleanup stack
+                if (neededStoredBuffers)
                     {
-                    TRAP(err,StoreRenderBufferStartL(aToLayout));
-                    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EBeginFullScreen: Screenshot result: KErrNone == %d", err);
-                    if (err == KErrNone)
-                        {
-                        aToLayout->SetFreezeState(ETrue);
-                        aEvent.iCanDestroyOrHideImmediately = ETrue; // if children of this layout are hidden or destroyed during effect, that can happen immediately
-                        }
-                    else
-                        {
-                        return ETrue; // failed, effect will be canceled
-                        }
+                    TInt dummy;
+					if (!HasActiveEffect(aToLayout, dummy))
+						{
+						__ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Add layout 0x%x with handle %d to cleanupstack", aToLayout, aEvent.iHandle);
+                    	AddEffectItemL(aEvent.iHandle, aToLayout, NULL, NULL, EFalse, dummy, EFalse);
+						}
                     }
+				// Screenshot was requested, but it could not be taken. Lets cancel the effect.	
+				if (!success)
+					{
+					return ETrue; // this will cause effect cleanup
+					}	
+					      
 
                 switch(aEvent.iAction)
                     {
@@ -4159,6 +4354,7 @@
                         aToLayout->iOpacity.Set(0.0f);    // these are meant for applications that are not yet ready to be drawn, but possible already on the foreground
                         FreezeLayoutUntilEffectDestroyedL(aFromLayout, aEvent.iHandle);
                         aEvent.iEffectType = CFullScreenEffectState::EStartEffect;
+                        aEvent.iCanDestroyOrHideImmediately = ETrue; // enable hiding of windows during application start/activate effects
                         break;
                         }
                     case AknTransEffect::EApplicationExit:
@@ -4179,8 +4375,18 @@
                             __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Found effect on layout 0x%x. Removing effect 0x%x", aToLayout, aToLayout->Effect());
                             aToLayout->SetEffect(NULL);
                             }
-                        if ( aEvent.iAction == AknTransEffect::EApplicationExit && !(aToLayout->Flags() & EHuiVisualFlagInactive)) 
+                        __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEventL - Layout 0x%x is active:  %d", aToLayout, !TBool(aToLayout->Flags() & EHuiVisualFlagInactive) );
+                        if (!(aToLayout->Flags() & EHuiVisualFlagInactive)) 
                             {
+                            TInt index;
+                            if (aToLayout->StoredRenderBuffer() && HasActiveEffect(aToLayout, index) && index != KErrNotFound)
+                                {
+	                            // a screenshot has been saved into the layout, and the layout was added to cleanupstack
+    	                        // for cleaning. SetupEffectLayoutContainerL will add the same layout 
+        	                    // to the cleanupstack, but double cleaning is not a good idea. Thus it is removed here. 
+                                __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Removing the layout 0x%x with screenshot from iEffectCleanupStack", aToLayout);
+                                iEffectCleanupStack.Remove(index);
+                                }
                             // this will tag the visual, that they cannot be hidden by HandleVisualVisibility
                             // Initialize layout for the exit effect  
                             iLayoutInitializedForExitEffect = SetupEffectLayoutContainerL(aEvent.iHandle, aToLayout, ETrue, aEvent.iCanDestroyOrHideImmediately);
@@ -4191,6 +4397,7 @@
                             {
                             iLayoutInitializedForExitEffect = EFalse;
                             aEvent.iSetupDone = EFalse;
+							failed = ETrue;
                             }
                          return failed;
                          }
@@ -4217,20 +4424,36 @@
                             {
                             // Exit effect was initialized earlier with EBeginFullscreen event
 						    layoutEffectable = aEvent.iSetupDone;
-						    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EEndFullScreen: %d", layoutEffectable);
+						    __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - EEndFullScreen: iSetupDone: %d", layoutEffectable);
                             }
                         else
                         	{
                             // add visuals to visual cleanupstack
                             aToLayout->SetStoredRenderBufferModificationsEnabled(EFalse);
+                            TInt index;
+                            if (aToLayout->StoredRenderBuffer() && HasActiveEffect(aToLayout, index) && index != KErrNotFound)
+                                {
+	                            // a screenshot has been saved into the layout, and the layout was added to cleanupstack
+    	                        // for cleaning. SetupEffectLayoutContainerL will add the same layout 
+        	                    // to the cleanupstack, but double cleaning is not a good idea. Thus it is removed here. 
+                                __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Removing the layout 0x%x with screenshot from iEffectCleanupStack", aToLayout);
+                                iEffectCleanupStack.Remove(index);
+                                }
                             layoutEffectable = SetupEffectLayoutContainerL(aEvent.iHandle,aToLayout, EFalse, aEvent.iCanDestroyOrHideImmediately);
                             aEvent.iSetupDone = layoutEffectable; 
                             aToLayout->SetStoredRenderBufferModificationsEnabled(ETrue);
                             }
 
                         if (layoutEffectable)
-                            {                        
-                            TInt effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn;
+                            {
+                            TInt effectFlags = 0;
+                            TInt activeEffectGroup = engine->ActiveGroupEffect();
+                            if (activeEffectGroup != KErrNotFound)
+                                {
+                                engine->AddEffectToGroup(activeEffectGroup);
+                                }
+                            __ALFFXLOGSTRING1("CAlfBridge::HandleGfxEventL - Active effect group: %d", activeEffectGroup);
+                            effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn; 
                             if (NeedsStoredBuffers(iHuiEnv->EffectsEngine(), *aEvent.iEffectName))
                                 {
                                 // Performance improvement, but this would be better to be a special hint param in the fxml
@@ -4239,11 +4462,11 @@
                             
                             if (aEvent.iRect != TRect())
                                 {
-                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), engine->ActiveGroupEffect(), &aEvent.iRect, this, aEvent.iHandle, effectFlags ));
+                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), activeEffectGroup, &aEvent.iRect, this, aEvent.iHandle, effectFlags ));
                                 }
                             else
                                 {
-                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), engine->ActiveGroupEffect(), NULL, this, aEvent.iHandle, effectFlags ) );
+                                TRAP( err, engine->LoadGroupEffectL( *aEvent.iEffectName, effect, aToLayout->Effectable(), activeEffectGroup, NULL, this, aEvent.iHandle, effectFlags ) );
                                 }
                             effect = NULL;
                             // only use the effect if the effect file was correctly parsed
@@ -4298,6 +4521,9 @@
     if (!iFullScreenEffectData)
         {
         __ALFFXLOGSTRING("CAlfBridge::HandleGfxStopEvent - END: none");
+        RemoveAllTemporaryPresenterVisuals();
+        delete iControlEffectData;
+        iControlEffectData = NULL;
         return;
         }
     
@@ -4305,7 +4531,7 @@
     iFullScreenEffectData = NULL;
     CleanupStack::PushL( fxData );
     
-     __ALFFXLOGSTRING2(" - handle: %d, toAppUid: 0x%x", fxData->iHandle, fxData->iToAppId);
+     __ALFFXLOGSTRING2("CAlfBridge::HandleGfxStopEvent - handle: %d, toAppUid: 0x%x", fxData->iHandle, fxData->iToAppId);
     
     // clean effects with this handle       
     RemoveTemporaryPresenterVisual(NULL, fxData->iHandle);
@@ -4316,11 +4542,11 @@
         RemoveEffectFromApp(fxData->iToSecureId, fxData->iToWg );
         RemoveEffectFromApp(fxData->iFromSecureId, fxData->iFromWg );
         }
-    else
-        {
-        // abort ALL effects
-        RemoveAllTemporaryPresenterVisuals();
-        }
+    // abort ALL other possible control effects
+    RemoveAllTemporaryPresenterVisuals();
+    
+    delete iControlEffectData;
+    iControlEffectData = NULL;
     
     iHuiEnv->ContinueRefresh();
     
@@ -4389,6 +4615,14 @@
     // operation tells if this is begin full screen or end full screen
     TInt operation = stream.ReadInt32L();
     
+    // If we are in low memory state, we don't want to do any effects
+    if(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced)
+        {
+        __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - Returning because memory level below NORMAL");
+		stream.Release();
+        return;
+        }
+     
     if ( operation == MAlfGfxEffectPlugin::EBeginFullscreen )
         {
         if ( !iFullScreenEffectData || !iFullScreenEffectData->iSetupDone )
@@ -4477,43 +4711,11 @@
     __ALFFXLOGSTRING3("CAlfBridge::HandleGfxEffectsL - Operation: %d, handle: %d, type: %d", operation, fxData->iHandle, fxData->iType);
     __ALFFXLOGSTRING2("CAlfBridge::HandleGfxEffectsL - towg: %d, fromwg: %d", fxData->iToWg, fxData->iFromWg);
 
-    // find root nodes and attach effects to them
-    // First we need a windowgroup node id. So far we have a list of window ids
-
-    // wg2 is the window group that is supposed to disappear from view
-    // when a new application starts. We don't have any use for it now...
-
-    // This is the group that is disappearing
-    // Currently we don't add an effect to it.
-
-    // TODO: when ids available from wserv...
-    // if ( appUid2 )
-    //{
-    //	 group2 = FindControlGrouAppUId( appUid2, screen2, &alfGroup );
-    // }
-    //if ( toAppId2 )
-    //    {
-    //    group2 = FindControlGroupByAppId(toAppId2);
-    //    }
-    //if ( wg2 && wg2 != KErrNotFound )
-    //    {
-    //        group2 = FindControlGroupByWindowGroupId( wg2, screen2 );
-    //        }
-    //    if ( group2 )
-    //        {
-    //        CHuiControl& control = group2->Control(0);
-    //        layout2 = (CHuiLayout*)&control.Visual(0);
-    //        }
-
-    // This effect is triggered either by BeginFullScreen or by EndFullScreen
-    // depending on if we have an application that is already running or not
-
-    //    TAlfControlGroupEntry* alfGroup = NULL;
-
+    CHuiControlGroup* toGroup = NULL;
+    
     TBool failed = EFalse;
     if (fxData->iToAppId && fxData->iToAppId != KErrNotFound)
         {        
-        CHuiControlGroup* toGroup = NULL;
         CHuiLayout* toLayout = NULL; 
         toGroup = FindControlGroupByFullScreenToEffect();
 
@@ -4552,6 +4754,18 @@
         // Effect failed, reset state
         HandleGfxStopEvent( EFalse ); // destroys iFullScreenEffectData
         }
+    else
+        {
+        // it might be that the application is already having drawing for the whole screen. 
+		// If so, then trigger EndFullScreen immediately.
+        if (fxData && 
+                toGroup 
+                && fxData->iOperation == MAlfGfxEffectPlugin::EBeginFullscreen 
+                && fxData->iEffectType == CFullScreenEffectState::EStartEffect)
+            {
+            GfxTriggerEffectWhenFullScreenDrawn(toGroup);
+            }
+        }
     
     for (TInt i = 0; i < iAlfScreens.Count(); i++)
         {
@@ -4563,6 +4777,37 @@
     __ALFFXLOGSTRING("CAlfBridge::HandleGfxEffectsL - END");
     }
 
+TBool CAlfBridge::GfxTriggerEffectWhenFullScreenDrawn(CHuiControlGroup* aToGroup)
+    {
+    if (!aToGroup || (aToGroup && aToGroup->Count() == 0))
+        {
+        return EFalse;
+        }
+      iTempRegion.Clear();
+    
+    CAlfScreen* screen = iAlfScreens[0];
+    TRect fullscreen = TRect(TPoint(0,0), screen->Size());
+    TBool fullscreenCovered(EFalse);
+    TInt dummy = 0;
+    
+    CHuiControl& control = aToGroup->Control(0);
+    CHuiLayout* toLayout = control.VisualCount() > 0 ? (CHuiLayout*)&control.Visual(0) : NULL;
+    if (!toLayout)
+        {
+        return EFalse;
+        }
+    TBool opaque = ETrue; // in app start case the layout is propably not opaque. Fake it.
+    IsFullScreenDrawnRecursive(toLayout, *aToGroup, control, fullscreenCovered, fullscreen, screen, dummy, opaque, iAlfScreens[0]->iDisplay->Orientation());
+    fullscreenCovered = IsRectCoveredByRegion(fullscreen, iTempRegion);
+    __ALFFXLOGSTRING1("CAlfBridge::GfxTriggerEffectWhenFullScreenDrawn - Covered: %d", fullscreenCovered);
+    if (fullscreenCovered)
+        {
+        GfxTriggerEndFullScreen(iFullScreenEffectData);
+        return ETrue;
+        }
+    return EFalse;
+    }
+
 // TODO: add effect type to effect struct. remove all fullscreen effects. currently some might hang around
 void CAlfBridge::HandleGfxStopEffectsL(TAlfBridgerData data)
     {
@@ -4610,6 +4855,9 @@
     TInt handle = stream.ReadInt32L();
     stream.Release();
 
+    delete iControlEffectData;
+    iControlEffectData = NULL;
+        
     if (handle != KErrNotFound)
         {
         __ALFFXLOGSTRING1("CAlfBridge::HandleGfxStopControlEffectsL - Remove effect with handle: %d", handle);
@@ -4829,6 +5077,15 @@
         delete iControlEffectData;
         iControlEffectData = NULL;
         }
+    
+    // If we are in low memory state, we don't want to do any effects
+    if(iHuiEnv->MemoryLevel() < EHuiMemoryLevelReduced)
+        {
+        __ALFFXLOGSTRING("CAlfBridge::HandleGfxControlEffectsL - Returning because memory level below NORMAL");
+        stream.Release();
+        return;
+        }
+    
     CControlEffectState* fxData = new (ELeave) CControlEffectState;
     CleanupStack::PushL(fxData);
     fxData->ConstructL(action, stream);
@@ -4874,13 +5131,13 @@
     CHuiFxEngine* engine = NULL;
     // engine is not owned by us, it is a member of HuiEnv
     engine = iHuiEnv->EffectsEngine();
-    if (NeedsStoredBuffers(engine, *aEvent.iEffectName))
-        {
-        RecursiveStoreRenderBufferL(aCanvasVisual);
-        }
-
     if (engine)
         {
+        if (NeedsStoredBuffers(engine, *aEvent.iEffectName))
+            {
+            RecursiveStoreRenderBufferL(aCanvasVisual);
+            }
+
         // clear out old effect if this visual has one
         __ALFFXLOGSTRING2("HandleGfxControlEffectsL - loading effect %S on visual 0x%x", aEvent.iEffectName, aCanvasVisual );
         __ALFFXLOGSTRING1("HandleGfxControlEffectsL - loading control effect, handle %d", aEvent.iHandle );
@@ -4891,7 +5148,6 @@
             RemoveTemporaryPresenterVisual(aCanvasVisual);
             }
         TBool layoutEffectable(EFalse);
-        aCanvasVisual->iOpacity.Set(KAlfVisualDefaultOpacity);
         if (aEvent.iAction == KGfxControlDisappearAction)
             { // TODO: revise
             // The control stays visible because the inactive flag is not set
@@ -4912,7 +5168,16 @@
             }
         if (layoutEffectable)
             {
-            TRAP( err, engine->LoadGroupEffectL(*aEvent.iEffectName, effect, aCanvasVisual->Effectable(), engine->ActiveGroupEffect(), NULL, this, aEvent.iHandle, KHuiFxDelayRunUntilFirstFrameHasBeenDrawn ) );
+            TInt effectFlags = 0;
+            
+            // effect will start delayed anyway when it is syncronized. this flag would break syncronization between effects.
+            effectFlags = KHuiFxDelayRunUntilFirstFrameHasBeenDrawn; 
+            TInt activeEffectGroup = engine->ActiveGroupEffect();
+            if (activeEffectGroup != KErrNotFound)
+                {
+                engine->AddEffectToGroup(activeEffectGroup);
+                }
+            TRAP( err, engine->LoadGroupEffectL(*aEvent.iEffectName, effect, aCanvasVisual->Effectable(), activeEffectGroup, NULL, this, aEvent.iHandle, effectFlags ) );
             }
         else
             {
@@ -5653,6 +5918,11 @@
             // For tests
             //TUint32* data = aScreen->iSwRenderingTarget->DataAddress();
             }
+        
+        if (modified && aScreen->iSwRenderingTarget)
+            {
+            InitializeSwRenderingTarget(aScreen->iSwRenderingTarget);
+            }
         }
     else
         {
@@ -5667,6 +5937,18 @@
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // 
+void CAlfBridge::InitializeSwRenderingTarget(CFbsBitmap* aBitmap)
+    {
+    __ALFLOGSTRING("CAlfBridge::InitializeSwRenderingTarget");
+    TAlfBridgeDrawerWrapper wrapper(*this);
+    AlfDrawerInternal::CopyScreenToBitmap(&wrapper, aBitmap, 
+        TRect(aBitmap->SizeInPixels()));
+    __ALFLOGSTRING("CAlfBridge::InitializeSwRenderingTarget ok");
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// 
 void CAlfBridge::SetMemoryLevel(THuiMemoryLevel aMemoryLevel)
     {
     iCurrentMemoryLevel = aMemoryLevel;
@@ -5733,9 +6015,9 @@
                 }
             }
         
-        if ( memoryLevel <= EHuiMemoryLevelLowest)
-            {
-            LowMemoryCancelAllEffects();
+        if ( memoryLevel < EHuiMemoryLevelReduced)
+            {
+            OnLowMemoryModifyAllEffects();
             }
             
         iHuiEnv->NotifyMemoryLevel(memoryLevel);
@@ -5753,12 +6035,13 @@
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // 
-void CAlfBridge::LowMemoryCancelAllEffects()
+void CAlfBridge::OnLowMemoryModifyAllEffects()
     {
-    __ALFLOGSTRING("CAlfBridge::LowMemoryCancelAllEffects");
-    iLayoutSwitchEffectCoordinator->Cancel();
+    __ALFLOGSTRING("CAlfBridge::OnLowMemoryModifyAllEffects");
+    iLayoutSwitchEffectCoordinator->LowMemoryEvent();
     HandleGfxStopEvent( EFalse );
-	__ALFLOGSTRING("CAlfBridge::LowMemoryCancelAllEffects done");
+    
+	__ALFLOGSTRING("CAlfBridge::OnLowMemoryModifyAllEffects done");
 	}
 
 // ---------------------------------------------------------------------------
@@ -5814,8 +6097,19 @@
 // 
 void CAlfBridge::Synchronized(TInt aId)
     {
-    // Use P&S for now.
-    RProperty::Set( KAlfPSUidSynchronizer, KAlfPSKeySynchronizer, aId );
+    if(aId == iIdForLayoutSwitchFrameSync)
+        {
+        // send notification to alfstreamer server about
+        if (iActivated)
+            {
+            iBridgerClient.SendBlind(KAlfCompositionLayoutSwitchComplete, TIpcArgs());
+            }        
+        }
+    else
+        {
+        // Use P&S for now.
+        RProperty::Set( KAlfPSUidSynchronizer, KAlfPSKeySynchronizer, aId );
+        }
     }
 
 void CAlfBridge::SetWindowGroupAsAlfApp(TInt aId)
@@ -5857,15 +6151,10 @@
     
     CAlfScreen* screen = iAlfScreens[0];
     TRect fullscreen = TRect(TPoint(0,0), screen->Size());
-    TBool fadeEffectInScreen = EFalse;
-    
+    __ALFFXLOGSTRING3("CAlfBridge::IsFullScreenDrawn - new orientation %d, screen size: (%d,%d)", aOrientation, fullscreen.iBr.iX, fullscreen.iBr.iY );
     TBool fullscreenCovered = EFalse;
     CAlfAppSrvSessionBase* topMostAlfSrvSession = NULL;
-    
-    //iActiveVisualCount = 0;
-    iBgSurfaceFound = EFalse;
-    //iPaintedArea = 0;  
-    
+        
     // Check if effect group has an effect with opaque hint.
     CHuiControlGroup& fxcontrolgroup = *(iAlfScreens[0]->iFullscreenEffectControlGroup);
     CHuiControl& fxcontrol = fxcontrolgroup.Control(0);
@@ -5881,7 +6170,6 @@
         fullscreenCovered = ETrue;
         }    
     
-    
     TBool alfWindowGroupFoundVisible = EFalse;
 
     AMT_SET_VALUE( iVisibleVisualCount, 0 );
@@ -5891,7 +6179,9 @@
         {                
         CHuiControlGroup& controlgroup = iAlfScreens[0]->iDisplay->Roster().ControlGroup(j);
         CHuiControl& control = controlgroup.Control(0);
-
+		__ALFFXLOGSTRING1("CAlfBridge::IsFullScreenDrawn : Group owner 0x%x", controlgroup.SecureId());
+                
+        
         if (control.Role() == EAlfFpsIndicatorContainer)
             {
             // FPS container doesn't contain canvas visuals
@@ -5903,7 +6193,12 @@
         // For optimization reasons, check if all visuals below in Z-order are covered    
         if (!fullscreenCovered)
             {
-            fullscreenCovered = IsRectCoveredByRegion(fullscreen, iTempRegion);            
+            fullscreenCovered = IsRectCoveredByRegion(fullscreen, iTempRegion);
+            
+            for(TInt ii=0;ii< iTempRegion.Count(); ii++)
+                {
+                __ALFFXLOGSTRING4("CAlfBridge::IsFullScreenDrawn (%d,%d)-(%d,%d)", iTempRegion[ii].iTl.iX, iTempRegion[ii].iTl.iY , iTempRegion[ii].iBr.iX, iTempRegion[ii].iBr.iY );
+                }
             }
         
         // Dont mess with alf control group visuals, alf session handling does it for us
@@ -5913,7 +6208,7 @@
             TInt flags = hostContainer->Flags();            
             if (!fullscreenCovered)
                 {
-                // clear inactive flag if client has not made this controlgroup hidden
+                
                 if(!(flags&EHuiVisualFlagUnderOpaqueHint))
                     {
                     alfWindowGroupFoundVisible = ETrue;
@@ -5956,32 +6251,16 @@
         
         __ALFLOGSTRING1("CAlfBridge::IsFullScreenDraw - fullscreen covered %d", fullscreenCovered)
         TBool subTreeCovered = EFalse;
-        TBool hasLayers = EFalse;
         TBool hasActiveVisualsInVisualTree = 
-                IsFullScreenDrawnRecursive( layout, controlgroup, control, fullscreenCovered, fullscreen, screen,subTreeCovered, hasLayers, IsVisualOpaque(*layout), aOrientation );    
-        TBool hasFadeEffectsInVisualTree = (layout->CanvasFlags() & EHuiCanvasFlagExternalFadeExistsInsideVisualTree);        
-
+                IsFullScreenDrawnRecursive( layout, controlgroup, control, fullscreenCovered, fullscreen, screen,subTreeCovered, IsVisualOpaque(*layout), aOrientation );    
         // If root visuals effect is marked as opaque, then add whole screen area as covered.
+        /*
         if (!fullscreenCovered)
             {
             fullscreenCovered = IsOpaqueEffect(layout->Effect());
             }                    
-        // "has layers" has been removed 
-        // If we layout is active setup the fade effects. Also if it is inactive, but has been
-        // flagged as containing fade effect, then run the setup as well so that effects which
-        // are no more needed get removed.
-            
-        TBool isLayoutActive = !(layout->Flags() & EHuiVisualFlagInactive);        
-        if (isLayoutActive && !hasActiveVisualsInVisualTree)
-            {
-            // Setting also the root visual (layout) as inactive, if it had none
-                        // active children. This is because otherwise the Inactive checks won't
-                        // work correctly within RosterImpl ScanDirty & ClearChanged phases.
-        
-            }
-        else if(!isLayoutActive && hasActiveVisualsInVisualTree)
-            {
-            }
+        */    
+       
         if (fullscreenCovered)
             {
             return ETrue;
@@ -5998,7 +6277,6 @@
         TRect& aFullscreen,
         CAlfScreen* aScreen,
         TBool& aSubtreeVisible, 
-        TBool& aHasVisualsWithLayers,
         TBool aChildCanBeOpaque,
         TInt aOrientation)
     {
@@ -6028,14 +6306,9 @@
         // As another example, parent can have scaling transformation.
         visualIsOpaque = aChildCanBeOpaque && IsVisualOpaque(*canvasVisual);
         
-        if (visualIsOpaque && !canvasVisual->LayerExtent().IsEmpty())
-            {
-            aHasVisualsWithLayers = ETrue;
-            }        
-
         if (canvasVisual->Count())
             {
-            visualTreeActive |= IsFullScreenDrawnRecursive( canvasVisual, aControlGroup, aControl,aFullscreenCovered, aFullscreen, aScreen,visualSubtreeVisible, aHasVisualsWithLayers, visualIsOpaque, aOrientation );
+            visualTreeActive |= IsFullScreenDrawnRecursive( canvasVisual, aControlGroup, aControl,aFullscreenCovered, aFullscreen, aScreen,visualSubtreeVisible, visualIsOpaque, aOrientation );
             }
            
         
@@ -6052,21 +6325,22 @@
         else
             {
             // add the rect only if the window contains drawing for the new orientation
+            
             visualDisplayRect = canvasVisual->CommandBufferCoverage(aOrientation);
-    
+            
             // Make sure we clip visual rect to visible screen area
             ClipVisualRect(visualDisplayRect, aFullscreen);
             
             // Check if this visual is covered by other opaque visuals which rects are in "covered" region           
-            visualRectIsCovered = IsRectCoveredByRegion(visualDisplayRect, iTempRegion);                    
+            visualRectIsCovered = IsRectCoveredByRegion(visualDisplayRect, iTempRegion);
+           
             }
 
-        // Finally check the area that this visual covers and add it to covered region
-        visualIsActive = !(canvasVisual->Flags() & EHuiVisualFlagInactive);
-    
+        
+        visualIsActive = canvasVisual->iOpacity.Now() > 0.01; // in fact this does not mean that visual should be drawn, but this atleast prevents disabled "on top" windows to be considered as visible.
+        
         // Sprites and effects as we consider them always as transparent and also
         // if controlgroup is transformed somehow    
-        
         if (aControl.Role() == EAlfFullScreenEffectContainer 
             || aControl.Role() == EAlfWindowFloatingSpriteContainer ||
             aControlGroup.IsTransformed())
@@ -6078,29 +6352,10 @@
             { 
             // New visibility system takes only window shape into account.
             if ( canvasVisual->CanvasFlags() & EHuiCanvasFlagIncludeToVisibilityCalculation )
-                {
-                if ( !canvasVisual->HasCustomShape() )
-                    {
-                    TRect displayRect(canvasVisual->DisplayRect());
-                    ClipVisualRect(displayRect, aFullscreen);
-                    iTempRegion.AddRect(displayRect);
-                    iTempRegion.Tidy();
-                    }
-                else
-                    {
-                    TRect displayRect = canvasVisual->DisplayRect();
-                    const TRegion& region = canvasVisual->ShapeRegion();
-                    TPoint delta = -canvasVisual->ShapeOrigin() + displayRect.iTl;
-                
-                    for (TInt i = 0; i < region.Count(); ++i)
-                        {
-                        TRect coveredRect(region[i]);
-                        coveredRect.Move(delta);
-                        ClipVisualRect(coveredRect, aFullscreen);
-                        iTempRegion.AddRect(coveredRect);
-                        iTempRegion.Tidy();
-                        }
-                    }
+                {                    
+				iTempRegion.AddRect(visualDisplayRect);
+                iTempRegion.Tidy();
+                __ALFFXLOGSTRING4("CAlfBridge::IsFullScreenDrawnRecursive - Added covered area (%d,%d)-(%d,%d)", visualDisplayRect.iTl.iX, visualDisplayRect.iTl.iY , visualDisplayRect.iBr.iX, visualDisplayRect.iBr.iY );
                 }
             }                                   
         visualTreeActive |= visualIsActive;
@@ -6108,8 +6363,90 @@
         // iVisibleVisualCount is cleared in HandleVisualVisibility()
         AMT_INC_COUNTER_IF( visualIsActive && !visualRectIsCovered , iVisibleVisualCount );
         } // for loop end : children checking loop
-     
     return visualTreeActive;
     }
 
+
+void CAlfBridge::LayoutSwitchStart()
+    {
+    // mark all the application surfaces hidden
+    if (!iAlfScreens.Count())
+        {
+        return;    
+        }
+    iLayoutSwitchInProgress = ETrue;
+    CAlfScreen* screen = iAlfScreens[0];
+    // skip the topmost (effect) layer, start from floating sprite group
+    for (TInt j=screen->iDisplay->Roster().Count() - screen->FixedControlGroupCount(); j>=0; j--)
+        {                
+        CHuiControlGroup& controlgroup = screen->iDisplay->Roster().ControlGroup(j);
+        CHuiControl& control = controlgroup.Control(0);
+
+        if (control.Role() == EAlfFpsIndicatorContainer || control.Role() == EAlfSessionContainer)
+            {
+            // FPS container doesn't contain canvas visuals and alfsession containers cannot have surfaces
+            continue;
+            }
+        
+        CHuiCanvasVisual* layout = (CHuiCanvasVisual*)&control.Visual(0);
+        MarkAllLayersHiddenRecursive(layout);
+        }
+    
+    }
+
+void CAlfBridge::MarkAllLayersHiddenRecursive(CHuiLayout* aLayout)
+    {
+    CHuiCanvasVisual* canvasVisual = NULL;
+
+    for (TInt i = aLayout->Count()-1; i >= 0; i--)
+        {
+        canvasVisual = (CHuiCanvasVisual*)(&aLayout->Visual(i));
+        if(canvasVisual)
+            {
+            if (canvasVisual->Count())
+                {
+                MarkAllLayersHiddenRecursive(canvasVisual);
+                }            
+    
+            if (!canvasVisual->LayerExtent().IsEmpty())
+                {
+                canvasVisual->ClearCanvasFlags(EHuiCanvasFlagSurfaceVisible);
+                canvasVisual->SetCanvasFlags(EHuiCanvasFlagSurfaceInvisible);
+                }
+            }
+        }
+    }
+
+void CAlfBridge::LayoutSwitchComplete()
+    {
+    // send notification to alfstreamer server
+    /*if (iActivated)
+        {
+        iBridgerClient.SendBlind(KAlfCompositionLayoutSwitchComplete, TIpcArgs());
+        }
+        */
+    // request syncronized frame
+    iLayoutSwitchInProgress = EFalse;
+    if ( iHuiEnv )
+        {
+        iIdForLayoutSwitchFrameSync = iIdForEAlfDSSynchronizeOp - KPreventingCollisionOfIdsInSynchDrawRequests;
+        iHuiEnv->Synchronize( iIdForLayoutSwitchFrameSync, this );
+        }
+    }
+
+TAlfBridgeDrawerWrapper::TAlfBridgeDrawerWrapper(CAlfBridge& aBridge)
+    : iBridge( aBridge )
+    {
+    }
+    
+TInt TAlfBridgeDrawerWrapper::GetSizeAndRotation(TSize& aSize, TInt& aRotation)
+    {
+    return iBridge.GetSizeAndRotation(aSize, aRotation);
+    }
+    
+TInt TAlfBridgeDrawerWrapper::ReadPixels(CFbsBitmap* aBitmap)
+    {
+    return iBridge.ReadPixels(aBitmap);
+    }
+
 // end of file
--- a/uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfeffectutils.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -54,11 +54,13 @@
     Cancel();        
     }
 
-void CAlfRosterFreezeEndTimer::Start( TTimeIntervalMicroSeconds32 aPeriod )
+void CAlfRosterFreezeEndTimer::Start( TTimeIntervalMicroSeconds32 aPeriod, TCallBack aCallBack  )
     {
+    iCallBack = aCallBack;
     __ALFLOGSTRING("CAlfRosterFreezeEndTimer::Start");
     if (!IsActive())
         {
+        iSafeCounter = 0;
         After( aPeriod );
         }
     }
@@ -72,7 +74,7 @@
 	if (iSafeCounter >= 0)	
 	    {
 		iSafeCounter++;
-		if (iSafeCounter == 10)
+		if (iSafeCounter == 100) // can be lower, 100 should be visible enough to see, if heuristics fail
 			{
 			timeout = ETrue;
 			iSafeCounter = 0;
@@ -87,11 +89,7 @@
         }
     else
         {
-        __ALFLOGSTRING("CAlfRosterFreezeEndTimer::RunL - ready in new orientation. ");
-        iBridge.iHuiEnv->Display(0).SetDirty();
-        iBridge.iHuiEnv->iPauseDrawing = EFalse;
-	    TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(EFalse));
-        iBridge.SetVisualTreeVisibilityChanged(ETrue);
+        iCallBack.CallBack();
         }
     }
 
@@ -104,7 +102,8 @@
 
 CAlfLayoutSwitchEffectCoordinator::CAlfLayoutSwitchEffectCoordinator( CAlfBridge& aBridge ) :
     iBridge( aBridge ),
-    iLayoutSwitchEffectContext(AknTransEffect::ENone)    
+    iLayoutSwitchEffectContext(AknTransEffect::ENone),
+    iCurrentState( EStateIdle )
     {
     RThread me = RThread();
     iOriginalPriority = me.Priority();    
@@ -116,183 +115,365 @@
     }
 
 // ---------------------------------------------------------
-// CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack
-//
-// This method is callback which gets called when layout 
-// switch effect has ended.
+// CAlfLayoutSwitchEffectCoordinator::Blank
 // ---------------------------------------------------------
 //
-void CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack( TInt aHandle )
+void CAlfLayoutSwitchEffectCoordinator::Blank(TBool aEnabled)
     {
-    //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack"));
-    if (iLayoutSwitchEffectContext == aHandle)
-        {
-        AknTransEffect::TContext nextContext = NextLayoutSwitchContext();
-
-        // Unfreeze visible content. This reveals real roster content (in new orientation).
-        if (nextContext == AknTransEffect::ELayoutSwitchExit)
-            {
-            #ifdef HUI_DEBUG_TRACK_DRAWING
-            RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack unfreezing roster content"));
-            #endif
-            iBridge.iHuiEnv->Display(0).SetDirty();
-            TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(EFalse));
-            iBridge.SetVisualTreeVisibilityChanged(ETrue);
-            }
-        
-        // Set next effect
-        SetLayoutSwitchEffect(nextContext);
-        
-        if (nextContext == AknTransEffect::ENone)
-            {
-            // Restore normal priority
-            RThread me = RThread();
-            me.SetPriority(iOriginalPriority);    
-            me.Close();
-
-            // Just in case refresh everything
-            iBridge.iHuiEnv->Display(0).SetDirty();
-            }        
-        }
-    else
-        {
-        //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack - got different handle (normal, dont worry...) - %i"), aHandle);        
-        }
+    __ALFLOGSTRING1("CAlfLayoutSwitchEffectCoordinator::Blank %d", aEnabled);
+    iBlankEnabled = aEnabled;
+    Event( aEnabled ? EEventBlankOn : EEventBlankOff );
     }
-
+    
 // ---------------------------------------------------------
-// CAlfLayoutSwitchEffectCoordinator::Cancel
+// CAlfLayoutSwitchEffectCoordinator::LowMemoryEvent
 // ---------------------------------------------------------
 //
-void CAlfLayoutSwitchEffectCoordinator::Cancel()
+void CAlfLayoutSwitchEffectCoordinator::LowMemoryEvent()
     {
-    // Disable effect
-    SetLayoutSwitchEffect( AknTransEffect::ENone );
-
-    // Unfreeze visible content
-    if ( iRosterFreezeEndTimer )
-        {
-        iRosterFreezeEndTimer->Cancel();
-        }
-
-    iBridge.iHuiEnv->Display(0).SetDirty();
-    TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(EFalse));
-    iBridge.SetVisualTreeVisibilityChanged(ETrue);
+    __ALFLOGSTRING("CAlfLayoutSwitchEffectCoordinator::LowMemory");
+    Event( EEventLowMemory );
+    }
     
-    // Restore normal priority
-    RThread me = RThread();
-    me.SetPriority(iOriginalPriority);    
-    me.Close();
-    }
-
 // ---------------------------------------------------------
 // CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch
-//
-// This method starts the layout switch effect procedure.
 // ---------------------------------------------------------
 //
 void CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch()
     {
-    if (iRosterFreezeEndTimer)
-        {
-		iRosterFreezeEndTimer->Cancel();
-		}
+    __ALFLOGSTRING("CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch");
+    Event( EEventLayoutSwitch );      
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::Event
+// ---------------------------------------------------------
+//
+void CAlfLayoutSwitchEffectCoordinator::Event(TEvent aEvent)
+    {
+    // States:
+    // - EStateIdle - No layout switch effect ongoing
+    // - EStateFreezeFx - Roster frozen, periodic fullscreen completeness checking
+    // - EStateBlankFx - Roster frozen, expecting client to say when ready to unfreeze
+    // - EStateThemeFx - Theme effect in use
 
-    if (!iLayoutSwitchEffectContext && !( iBridge.iHuiEnv->MemoryLevel() <= EHuiMemoryLevelLowest ))
+    // Events:
+    // - EEventBlankOn - Client requested blank on
+    // - EEventBlankOff - Client requested blank off
+    // - EEventLayoutSwitch - Layout switch noticed
+    // - EEventLowMemory - Low memory indication
+    // and implicit Finish - Effect finished
+    
+    // Transitions:
+    // From EStateIdle:
+    // - EEventBlankOn: EStateBlankFx
+    // - EEventLayoutSwitch: If effect available, EStateThemeFx. Otherwise EStateFreezeFx.
+    //
+    // From EStateFreezeFx:
+    // - EEventBlankOn: EStateBlankFx
+    // - implicit Finish - EStateIdle
+    //
+    // From EStateBlankFx:
+    // - EEventBlankOff: EStateFreezeFx (we use freeze to ensure that result is ok)
+    // - EEventLayoutSwitch: If effect available, EStateThemeFx.
+    //
+    // From EStateThemeFx:
+    // - EEventLowMemory: If blank still on, EStateBlankFx. Otherwise EStateFreezeFx.
+    // - implicit Finish - EStateIdle
+
+    TState nextState = EStateIdle;
+    
+    switch ( iCurrentState )
+        {    
+    case EStateFreezeFx:
+        nextState = NextFreezeState(aEvent);
+        break;
+        
+    case EStateBlankFx:
+        nextState = NextBlankState(aEvent);
+        break;
+        
+    case EStateThemeFx:
+        nextState = NextThemeState(aEvent);
+        break;
+        
+    case EStateIdle:
+    default:
+        nextState = NextIdleState(aEvent);   
+        break;
+        }
+    
+    if ( nextState != iCurrentState )
         {
-        TBool tfxOn = CAknTransitionUtils::TransitionsEnabled(AknTransEffect::ELayoutswitchTransitionsOff );
-        TBool tfxExists = LayoutSwitchEffectsExist();
-        if (tfxOn && tfxExists)
-            {
-            // Boost priority so that we are able to draw more frames for the effect
-            RThread me = RThread();
-            me.SetPriority(EPriorityAbsoluteHigh);    
-            me.Close();
-            
-            // Freeze visual content
-            //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch freezing roster content"));
-            iBridge.iHuiEnv->Display(0).SetDirty();
-            TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(ETrue));
-            
-            // Remove all other effects
-            iBridge.HandleGfxStopEvent( EFalse );
-            iBridge.RemoveAllTemporaryPresenterVisuals();
-            
-            // Set first layout switch effect 
-            SetLayoutSwitchEffect(AknTransEffect::ELayoutSwitchStart);
-            }
-        else
-            {
-            if (!iRosterFreezeEndTimer)
-                {
-                TRAP_IGNORE(iRosterFreezeEndTimer = CAlfRosterFreezeEndTimer::NewL(iBridge));
-                }
-            
-            if (iRosterFreezeEndTimer)
-                {
-                TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(ETrue));
-                
-                // Remove all other effects
-                iBridge.HandleGfxStopEvent( EFalse );
-                iBridge.RemoveAllTemporaryPresenterVisuals();
-
-                // Set remove freeze timer
-                __ALFLOGSTRING("CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch - Freeze timer started");
-                iRosterFreezeEndTimer->Start(KRosterFreezeEndTimeoutInMs*1000); 
-                }            
-            //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch - tfx are set OFF -> I am not starting effect."));                        
-            }
-        }
-    else
-        {
-        //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::BeginLayoutSwitch - old effect exists - %i"), iLayoutSwitchEffectContext);
+        Transition( nextState, iCurrentState );
         }
     }
 
 // ---------------------------------------------------------
-// CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchContext
-//
-// This method automatically selects the next context in the 
-// layout switch procedure.
-//
-// Contextes change in the following order during layout switch:
-//
-// 1. AknTransEffect::ENone
-// 2. AknTransEffect::ELayoutSwitchStart
-// 3. AknTransEffect::ELayoutSwitchExit
-// 4. AknTransEffect::ENone
-//
-// After new context is selected, appropriate effect is set 
-// (and/or removed) from the roster.
-//
+// CAlfLayoutSwitchEffectCoordinator::Transition
 // ---------------------------------------------------------
 //
-AknTransEffect::TContext CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchContext()
+void CAlfLayoutSwitchEffectCoordinator::Transition(
+        TState aNewState, TState aPreviousState)
     {
-    // Resolve next context based on current context
-    AknTransEffect::TContext newContext = AknTransEffect::ENone;    
-    switch (iLayoutSwitchEffectContext)
+    __ALFLOGSTRING2("CAlfLayoutSwitchEffectCoordinator::Transition from: %d to: %d", aNewState, aPreviousState);
+    iCurrentState = aNewState;
+        
+    // Undo previous state - don't unfreeze roster.
+    switch ( aPreviousState )
+        {
+    case EStateFreezeFx:
+        if ( iRosterFreezeEndTimer )
+            {
+            iRosterFreezeEndTimer->Cancel();
+            }
+        break;
+        
+    case EStateBlankFx:        
+        iBridge.iHuiEnv->iPauseDrawing = EFalse;
+        break;
+        
+    case EStateThemeFx:
+        {
+        RThread me = RThread();
+        me.SetPriority(iOriginalPriority);    
+        me.Close();
+
+        if ( iRosterFreezeEndTimer )
+            {
+            iRosterFreezeEndTimer->Cancel();
+            }
+
+        SetLayoutSwitchEffect( AknTransEffect::ENone );
+        }
+        break;
+        
+    case EStateIdle:
+    default:    
+        break;
+        }
+    
+    // Do next state actions
+    switch ( iCurrentState )
+        {    
+    case EStateFreezeFx:
         {
-        case AknTransEffect::ENone:
+        if (!iRosterFreezeEndTimer)
+            {
+            TRAP_IGNORE(iRosterFreezeEndTimer = CAlfRosterFreezeEndTimer::NewL(iBridge));
+            }
+            
+        if (iRosterFreezeEndTimer)
             {
-            newContext = AknTransEffect::ELayoutSwitchStart;            
-            break;
+            iRosterFreezeEndTimer->Cancel();
+            
+            FreezeRoster(ETrue);
+                
+            // Remove all other effects
+            iBridge.HandleGfxStopEvent( EFalse );
+            iBridge.RemoveAllTemporaryPresenterVisuals();
+
+            // Set remove freeze timer
+            __ALFLOGSTRING("CAlfLayoutSwitchEffectCoordinator::Transition - Freeze timer started");
+            iRosterFreezeEndTimer->Start(KRosterFreezeEndTimeoutInMs*1000, TCallBack(DoFreezeFinished, this)); 
             }
-        case AknTransEffect::ELayoutSwitchStart:
+        }
+        break;
+        
+    case EStateBlankFx:
+        {
+        // Start blanker
+        iBridge.iHuiEnv->iPauseDrawing = ETrue;
+        FreezeRoster(ETrue);        
+        }
+        break;
+        
+    case EStateThemeFx:
+        {
+        // Boost priority so that we are able to draw more frames for the effect
+        RThread me = RThread();
+        me.SetPriority(EPriorityAbsoluteHigh);    
+        me.Close();
+            
+        // Freeze visual content
+        iBridge.iHuiEnv->Display(0).SetDirty();
+        FreezeRoster(ETrue);
+            
+        // Remove all other effects
+        iBridge.HandleGfxStopEvent( EFalse );
+        iBridge.RemoveAllTemporaryPresenterVisuals();
+            
+        // Set first layout switch effect 
+        SetLayoutSwitchEffect(AknTransEffect::ELayoutSwitchStart);
+        }
+        break;
+        
+    case EStateIdle:
+    default:
+        {
+        // Undo everything to be sure
+        RThread me = RThread();
+        me.SetPriority(iOriginalPriority);    
+        me.Close();
+        
+        SetLayoutSwitchEffect( AknTransEffect::ENone );
+        if ( iRosterFreezeEndTimer )
             {
-            newContext = AknTransEffect::ELayoutSwitchExit;                    
-            break;
+            iRosterFreezeEndTimer->Cancel();
+            }            
+        
+        iBridge.iHuiEnv->iPauseDrawing = EFalse;
+        FreezeRoster(EFalse);
+        iBridge.iHuiEnv->Display(0).SetDirty();
+        iBridge.SetVisualTreeVisibilityChanged(ETrue);
+        }
+        break;
+        }    
+    
+    // Inform bridge about layout switch actions
+    if ( aNewState != EStateIdle && aPreviousState == EStateIdle )
+        {
+        iLayoutSwitchNotCompleted = ETrue;
+        iBridge.LayoutSwitchStart();
+        }
+    if ( aNewState == EStateIdle && iLayoutSwitchNotCompleted )
+        {
+        iLayoutSwitchNotCompleted = EFalse;
+        iBridge.LayoutSwitchComplete();
+        }
+    
+    __ALFLOGSTRING("CAlfLayoutSwitchEffectCoordinator::Transition end");        
+    }
+
+
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextIdleState
+// ---------------------------------------------------------
+//
+CAlfLayoutSwitchEffectCoordinator::TState 
+    CAlfLayoutSwitchEffectCoordinator::NextIdleState(
+        TEvent aEvent)
+    {
+    TState state = EStateIdle;
+    
+    switch ( aEvent )
+        {
+    case EEventLayoutSwitch:
+        if ( IsThemeEffectEnabled() )
+            {
+            state = EStateThemeFx;
             }
-        case AknTransEffect::ELayoutSwitchExit: // fallthrough
-        default:
+        else
             {
-            newContext = AknTransEffect::ENone;            
-            break;
-            }              
+            state = EStateFreezeFx;
+            }
+        break;
+        
+    case EEventBlankOn:
+        state = EStateBlankFx;
+        break;
+        
+    case EEventBlankOff:
+    case EEventLowMemory:
+    default:
+        break;     
+        }
+    
+    return state;
+    }
+    
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextFreezeState
+// ---------------------------------------------------------
+//
+CAlfLayoutSwitchEffectCoordinator::TState 
+    CAlfLayoutSwitchEffectCoordinator::NextFreezeState(
+        TEvent aEvent)
+    {
+    TState state = EStateFreezeFx;
+    
+    switch ( aEvent )
+        {
+    case EEventBlankOn:
+        state = EStateBlankFx;
+        break;
+    
+    case EEventLayoutSwitch:    
+    case EEventBlankOff:
+    case EEventLowMemory:
+    default:
+        break;     
         }
+    
+    return state;
+    }
 
-    //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchEffectL old ctx = %i, new ctx = %i"), iLayoutSwitchEffectContext, newContext);
-    return newContext;
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextBlankState
+// ---------------------------------------------------------
+//
+CAlfLayoutSwitchEffectCoordinator::TState 
+    CAlfLayoutSwitchEffectCoordinator::NextBlankState(
+        TEvent aEvent)
+    {
+    TState state = EStateBlankFx;
+    
+    switch ( aEvent )
+        {
+    case EEventLayoutSwitch:
+        if ( IsThemeEffectEnabled() )
+            {
+            state = EStateThemeFx;
+            }
+        break;
+    
+    case EEventBlankOff:
+        state = EStateFreezeFx;
+        break;
+        
+    case EEventBlankOn:        
+    case EEventLowMemory:
+    default:
+        break;     
+        }
+    
+    return state;
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextThemeState
+// ---------------------------------------------------------
+//
+CAlfLayoutSwitchEffectCoordinator::TState 
+    CAlfLayoutSwitchEffectCoordinator::NextThemeState(
+        TEvent aEvent)       
+    {
+    TState state = EStateThemeFx;
+    
+    switch ( aEvent )
+        {
+    case EEventLowMemory:
+        state = iBlankEnabled ? EStateBlankFx : EStateFreezeFx;
+        break;
+            
+    case EEventLayoutSwitch:    
+    case EEventBlankOn:
+    case EEventBlankOff:
+    default:
+        break;     
+        }
+    
+    return state;
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::FreezeFinished
+// ---------------------------------------------------------
+//
+void CAlfLayoutSwitchEffectCoordinator::FreezeFinished()
+    {
+    Transition(EStateIdle, iCurrentState);
     }
 
 // ---------------------------------------------------------
@@ -338,7 +519,159 @@
         }    
     }
 
-TBool CAlfLayoutSwitchEffectCoordinator::LayoutSwitchEffectsExist()
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack
+//
+// This method is callback which gets called when layout 
+// switch effect has ended.
+// ---------------------------------------------------------
+//
+void CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack( TInt aHandle )
+    {
+    //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack")); 
+    // KErrNotFound indicates callback from DoNextLayoutSwitchContext
+    if (iLayoutSwitchEffectContext == aHandle || aHandle == KErrNotFound)
+        {
+        AknTransEffect::TContext nextContext = NextLayoutSwitchContext();
+
+        // Unfreeze visible content. This reveals real roster content (in new orientation).
+        if (nextContext == AknTransEffect::ELayoutSwitchExit)
+            {
+            #ifdef HUI_DEBUG_TRACK_DRAWING
+            RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack unfreezing roster content"));
+            #endif
+            iBridge.iHuiEnv->Display(0).SetDirty();
+            FreezeRoster(EFalse);
+            iBridge.SetVisualTreeVisibilityChanged(ETrue);
+            if ( iLayoutSwitchNotCompleted )
+                {
+                iLayoutSwitchNotCompleted = EFalse;
+                iBridge.LayoutSwitchComplete();
+                }
+            }
+        
+        // Set next effect
+        SetLayoutSwitchEffect(nextContext);
+        
+        if (nextContext == AknTransEffect::ENone)
+            {
+            // Restore normal priority
+            if ( iCurrentState == EStateThemeFx )
+                {
+                Transition(EStateIdle, iCurrentState);
+                }
+            
+            RThread me = RThread();
+            me.SetPriority(iOriginalPriority);    
+            me.Close();
+
+            // Just in case refresh everything
+            iBridge.iHuiEnv->Display(0).SetDirty();
+            }        
+        }
+    else
+        {
+        //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::AlfGfxEffectEndCallBack - got different handle (normal, dont worry...) - %i"), aHandle);        
+        }
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchContext
+//
+// This method automatically selects the next context in the 
+// layout switch procedure.
+//
+// Contextes change in the following order during layout switch:
+//
+// 1. AknTransEffect::ENone
+// 2. AknTransEffect::ELayoutSwitchStart
+// 3. AknTransEffect::ELayoutSwitchExit
+// 4. AknTransEffect::ENone
+//
+// After new context is selected, appropriate effect is set 
+// (and/or removed) from the roster.
+//
+// ---------------------------------------------------------
+//
+// todo: rename
+TInt DoNextLayoutSwitchContext(TAny* aLayoutSwitchCoordinator)
+    {
+    CAlfLayoutSwitchEffectCoordinator* coordinator = (CAlfLayoutSwitchEffectCoordinator*)aLayoutSwitchCoordinator;
+    coordinator->AlfGfxEffectEndCallBack(KErrNotFound);
+    return 0;
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchContext
+// ---------------------------------------------------------
+//
+AknTransEffect::TContext CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchContext()
+    {
+    // Resolve next context based on current context
+    AknTransEffect::TContext newContext = AknTransEffect::ENone;    
+    switch (iLayoutSwitchEffectContext)
+        {
+        case AknTransEffect::ENone:
+            {
+            newContext = AknTransEffect::ELayoutSwitchStart;            
+            break;
+            }
+        case AknTransEffect::ELayoutSwitchStart:
+            {
+            newContext = AknTransEffect::ELayoutSwitch;
+            if (!iRosterFreezeEndTimer)
+                {
+                TRAP_IGNORE(iRosterFreezeEndTimer = CAlfRosterFreezeEndTimer::NewL(iBridge));
+                }
+            if (iRosterFreezeEndTimer)
+                {
+                iRosterFreezeEndTimer->Cancel();
+                iRosterFreezeEndTimer->Start(KRosterFreezeEndTimeoutInMs*1000, TCallBack(DoNextLayoutSwitchContext, this));
+                }
+            else
+                {
+                newContext = AknTransEffect::ELayoutSwitchExit;
+                }
+            break;
+            }
+        case AknTransEffect::ELayoutSwitch:
+            {
+            newContext = AknTransEffect::ELayoutSwitchExit;                    
+            break;
+            }
+        case AknTransEffect::ELayoutSwitchExit: // fallthrough
+        default:
+            {
+            newContext = AknTransEffect::ENone;            
+            break;
+            }              
+        }
+
+    //RDebug::Print(_L("CAlfLayoutSwitchEffectCoordinator::NextLayoutSwitchEffectL old ctx = %i, new ctx = %i"), iLayoutSwitchEffectContext, newContext);
+    return newContext;
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::IsThemeEffectEnabled()
+// Returns true if layout switch theme effect may be used
+// ---------------------------------------------------------
+//
+TBool CAlfLayoutSwitchEffectCoordinator::IsThemeEffectEnabled() const
+    {
+    TBool memoryOk = !( iBridge.iHuiEnv->MemoryLevel() <= EHuiMemoryLevelLowest );
+    TBool tfxOn = CAknTransitionUtils::TransitionsEnabled(AknTransEffect::ELayoutswitchTransitionsOff );
+    TBool tfxExists = LayoutSwitchEffectsExist();
+
+    return 
+        memoryOk && tfxOn && tfxExists;
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::LayoutSwitchEffectsExist()
+// Returns true if layout switch effect exists
+// ---------------------------------------------------------
+//
+TBool CAlfLayoutSwitchEffectCoordinator::LayoutSwitchEffectsExist() const
     {
     TBool appearExists = EFalse;
     TBool disAppearExists = EFalse;
@@ -361,6 +694,26 @@
     }
 
 // ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::FreezeRoster()
+// Freeze visible content in roster.
+// ---------------------------------------------------------
+//
+void CAlfLayoutSwitchEffectCoordinator::FreezeRoster(TBool aFrozen)
+    {
+    TRAP_IGNORE(iBridge.iHuiEnv->Display(0).Roster().FreezeVisibleContentL(aFrozen));
+    }
+
+// ---------------------------------------------------------
+// CAlfLayoutSwitchEffectCoordinator::DoFreezeFinished()
+// ---------------------------------------------------------
+//
+TInt CAlfLayoutSwitchEffectCoordinator::DoFreezeFinished(TAny* aAny)
+    {
+    static_cast<CAlfLayoutSwitchEffectCoordinator*>(aAny)->FreezeFinished();
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
 // CAlfFinishTimer
 // ---------------------------------------------------------
 //
@@ -495,46 +848,6 @@
     iCompletionHandle = iHandle;
     }
 
-TInt doNotifyDrawingTimeout( TAny* aPtr )
-    {
-    ((CFullScreenEffectState*)aPtr)->NotifyDrawingTimeout();
-    return 0; // must return something
-    }
-
-TBool CFullScreenEffectState::InitDelayedEffectL(CAlfBridge* aBridge, TSize aDisplaySize)
-    {
-    iBridge = aBridge;
-    iDisplaySize = aDisplaySize;
-    if (!iDrawingCompleteTimer)
-        {
-        iDrawingCompleteTimer = CPeriodic::NewL( EPriorityNormal );
-        iDrawingCompleteTimer->Start( 
-                KFirstTimeoutForApplicationEndFullScreenInMs * 1000 , 
-                KFirstTimeoutForApplicationEndFullScreenInMs * 1000 , TCallBack( doNotifyDrawingTimeout, this ));
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-void CFullScreenEffectState::NotifyDrawingTimeout()
-    {
-    
-    iPaintedRegion.ClipRect(TRect(0,0, iDisplaySize.iWidth, iDisplaySize.iHeight));
-    iPaintedRegion.Tidy(); // remove overlapping regions
-    TInt size(0);
-    for(TInt i=0; i< iPaintedRegion.Count();i++ )
-        {
-        size += iPaintedRegion[i].Width()*iPaintedRegion[i].Height();
-        }
-    // lets continue, if the covered area is more than 75% of the screen. This is usually enough.
-    if ( size > KMinimumPaintedAreaBeforeForcedEffect  * (iDisplaySize.iWidth * iDisplaySize.iHeight))
-        {
-        iBridge->HandleGfxEndFullScreenTimeout(this);
-        delete iDrawingCompleteTimer;
-        iDrawingCompleteTimer = NULL;
-        }
-    }
-
 void CControlEffectState::ConstructL(TInt aAction,
         RMemReadStream& aStream)
     {
--- a/uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfhierarchymodel.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -797,7 +797,12 @@
 
     AMT_INC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeCount ); 
     AMT_INC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeGroup),  iWindowGroupNodeCount ); 
-    AMT_INC_COUNTER_IF(node, iTotalNodeCount );         
+    AMT_INC_COUNTER_IF(node, iTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iIntMap, node->iId, EAlfModuleTestTypeHierarchyModelCreateWindow );
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeGroup,
+                          iIntMap, node->iId, EAlfModuleTestTypeHierarchyModelCreateWindowGroup );
     }
 
 // ---------------------------------------------------------------------------
@@ -830,7 +835,12 @@
 
     AMT_DEC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeCount ); 
     AMT_DEC_COUNTER_IF(node && (nodeType==MWsWindowTreeNode::EWinTreeNodeGroup),  iWindowGroupNodeCount ); 
-    AMT_DEC_COUNTER_IF(node, iTotalNodeCount );     
+    AMT_DEC_COUNTER_IF(node, iTotalNodeCount );
+    
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iIntMap, nodeId, EAlfModuleTestTypeHierarchyModelReleaseWindow );
+    AMT_MAP_INC_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeGroup,
+                          iIntMap, nodeId, EAlfModuleTestTypeHierarchyModelReleaseWindowGroup );
     }
 
 // ---------------------------------------------------------------------------
@@ -851,7 +861,11 @@
         USER_INVARIANT();
         }
     
-    AMT_INC_COUNTER_IF( node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeActivatedCount ); 
+    AMT_INC_COUNTER_IF( node && (nodeType==MWsWindowTreeNode::EWinTreeNodeClient), iWindowNodeActivatedCount );
+    
+    AMT_MAP_SET_VALUE_IF( node && nodeType == MWsWindowTreeNode::EWinTreeNodeClient,
+                          iBoolMap, nodeId, ETrue,
+                          EAlfModuleTestTypeHierarchyModelActiveWindow );    
     }
 
 // ---------------------------------------------------------------------------
@@ -884,12 +898,12 @@
 
     AMT_INC_COUNTER_IF(node, iNodeExtentChangedCount );
     AMT_SET_VALUE_IF(node, iLatestNodeExtentRect, rect );
-    AMT_MAP_SET_VALUE_IF( ( node && node->iWindow ),
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow,
                           iSizeMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          rect.Size(), EAlfModuleTestTypeHierarchyModelChangeSize );
-    AMT_MAP_SET_VALUE_IF( ( node && node->iWindow ),
+                          rect.Size(), EAlfModuleTestTypeHierarchyModelChangeWindowSize );
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow,
                           iPositionMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          rect.iTl, EAlfModuleTestTypeHierarchyModelChangePosition );
+                          rect.iTl, EAlfModuleTestTypeHierarchyModelChangeWindowPosition );
     }
 
 // ---------------------------------------------------------------------------
@@ -951,9 +965,11 @@
         }
 
     AMT_INC_COUNTER_IF(node, iTotalNodeFlagChangedCount );
-    AMT_MAP_INC_VALUE_IF( ( node && node->iWindow ),
-                          iIntMap, node->iWindow->WsInfo().iClientSideId.iWindowIdentifer, 
-                          EAlfModuleTestTypeHierarchyModelChangeFlag );    
+    AMT_MAP_SET_VALUE_IF( node && node->iWindow && MWsWindowTreeObserver::EVisible == flag,
+                          iBoolMap, 
+                          node->iWindow->WsInfo().iClientSideId.iWindowIdentifer,
+                          newValue,
+                          EAlfModuleTestTypeHierarchyModelChangeWindowVisibility ); 
     }
 
 // ---------------------------------------------------------------------------
@@ -1152,7 +1168,7 @@
         USER_INVARIANT(); // attribute change for unexpected node type. new code needed!
         }
 
-    AMT_INC_COUNTER_IF(node, iTotalNodeAttributeChangedCount );    
+    AMT_INC_COUNTER_IF(node, iTotalNodeAttributeChangedCount );
     }
     
 // ---------------------------------------------------------------------------
--- a/uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfnodes.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -214,9 +214,13 @@
 	if ( iParent->iType != MWsWindowTreeNode::EWinTreeNodeRoot)
 		{
 		CAlfNode* parentGroupNode = iModel->FindNode( aParentId );
+		aNodes.Append(parentGroupNode); 
 		for (CAlfNode::TIter iter( parentGroupNode ); iter.Current() != NULL;  iter.Next()) 
 			{ 
-			aNodes.Append(iter.Current()); 
+			if (iter.Current() != parentGroupNode )
+			    {
+			    aNodes.Append(iter.Current());
+			    }
 			}
 		}
 	else
@@ -1716,20 +1720,21 @@
     ResolveParent( iNodeWindowConstructionStruct.iParentId, iId );
     CreateWindowL( iNodeWindowConstructionStruct.iWindowGroupHandle, iNodeWindowConstructionStruct.iWindowHandle, iNodeWindowConstructionStruct.iParentId );
     UpdateOrdinalPosition();
+    
+    AMT_MAP_STREAMER_NODE_WINDOW_CONSTRUCT();
 	}
 
 // ---------------------------------------------------------------------------
 // MoveToWindowGroup
-// !!!! THIS METHOD HAS NOT BEEN TESTED AT ALL!!!!!! EXPECT TROUBLE!!!!
 // ---------------------------------------------------------------------------
 //
 void CAlfNodeWindow::MoveToWindowGroup( TUint32 aNewGroupId )
 	{
-	__ALFLOGSTRING("CAlfNodeWindow::MoveToWindowGroup, THIS METHOD IS UNTESTED. EXPECT TROUBLE!");
+	__ALFLOGSTRING3("CAlfNodeWindow::MoveToWindowGroup moving nodeID 0x%x from group 0x%x to 0x%x",iId, iParent->iId, aNewGroupId );
 	CAlfNodeGroup* newGroup = (CAlfNodeGroup*)iModel->FindNode( aNewGroupId );
 	if ( newGroup )
 		{
-		// collect my children in my old group
+		// collect my children in my old group (inclucing me)
 		RPointerArray<CAlfNode> myChildNodes;
 		GetAllChildrenInGroup( myChildNodes, iId );
 			    
@@ -1743,20 +1748,22 @@
 			{
 			previous->iSibling = iSibling; // there was the a previous child. update the link to my next sibling (which might be NULL)
 			}
-		TUint32 oldGroupId = iParent->iId;
-		iParent = newGroup;
-		SetFirstChild();
-		
+
 		// yippii, new parent, 		
 		// add me as the first child of the new group
-		// TODO: Move the nodes to the new group?
+		iParent = newGroup;
+		iSibling = NULL;
+		SetFirstChild();
+
+		TUint32 screenNumber = iScreenNumber;
+
 		TInt i = myChildNodes.Count();
 		while( --i >=0 ) // update groupid and send new location to appui 
-			{
-			iModel->Server().Bridge()->AddData( EAlfDSMoveWindowToNewGroup, 
-					myChildNodes[i]->iId, 
-					oldGroupId, 
-					(TAny*)aNewGroupId );
+		    {
+		    iModel->Server().Bridge()->AddData( EAlfDSMoveWindowToNewGroup, 
+		            myChildNodes[i]->iId, 
+		            screenNumber, 
+		            (TAny*)aNewGroupId );
 			myChildNodes[i]->iGroupId = aNewGroupId;
 			}
 	  
@@ -1895,6 +1902,8 @@
             iGroupId, 
             iId, 
             (TAny*)offset );
+    
+    AMT_MAP_STREAMER_NODE_GROUP_CONSTRUCT();
 	}
 
 // ---------------------------------------------------------------------------
@@ -2128,6 +2137,8 @@
             (TAny*)offset );
     
     UpdateOrdinalPosition();
+    
+    AMT_MAP_STREAMER_TEXT_CURSOR_CONSTRUCT();
     }
 
 // ---------------------------------------------------------------------------
@@ -2146,6 +2157,8 @@
 
 void CAlfNodeTextCursor::AttributeChangedL( RMemReadStream* aStream )
     {
+    AMT_MAP_BRIDGE_ADD_TEXT_CURSOR();
+    
     // TODO: PASS FORWARD!!!
     TInt attribute = aStream->ReadInt32L();
     switch ( attribute )
@@ -2184,6 +2197,8 @@
                iGroupId, 
                iId, 
                (TAny*)offset );
+       
+   AMT_MAP_STREAMER_TEXT_CURSOR_CHANGE();
     }
 CAlfNodeTextCursor::~CAlfNodeTextCursor( )
     {
--- a/uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfstreamerserver.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -161,9 +161,13 @@
 // NewSessionL
 // ---------------------------------------------------------------------------
 //   
-CSession2* CAlfStreamerServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
+CSession2* CAlfStreamerServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& aMessage) const
     {
-	CSession2* newSession = new(ELeave) CAlfStreamerServerSession();
+    RThread t;    
+    aMessage.Client(t);
+    CleanupClosePushL(t);
+	CSession2* newSession = new(ELeave) CAlfStreamerServerSession(t.Id());
+    CleanupStack::PopAndDestroy();
     iSessions++;
     
     return newSession;   
@@ -188,9 +192,13 @@
 // HandleClientExit
 // ---------------------------------------------------------------------------
 //   
-void CAlfStreamerServer::HandleClientExit(const CSession2* /*aClient*/)
+void CAlfStreamerServer::HandleClientExit(const CAlfStreamerServerSession* aClient)
     {
     iSessions--;
+    if (WindowMgr())
+        {
+        WindowMgr()->HandleClientExit(aClient->ThreadId());
+        }
     if (!iSessions)
         {
         // CActiveScheduler::Stop(); // TODO: lets not die, if client dies.
@@ -539,7 +547,7 @@
         }
     
     if ( aOp == KAlfCompositionLowOnGraphicsMemory ||  aOp == KAlfCompositionGoodOnGraphicsMemory 
-		|| aOp == KAlfCompositionTargetHidden ||aOp == KAlfCompositionTargetVisible)
+		|| aOp == KAlfCompositionTargetHidden ||aOp == KAlfCompositionTargetVisible  || aOp == KAlfCompositionLayoutSwitchComplete)
         {
         aMessage.Complete(KErrNone);
         QueueRequestAllSessionsL(KNullDesC8(), aOp, ETrue);    
@@ -688,7 +696,7 @@
 // constructor
 // ---------------------------------------------------------------------------
 //   
-CAlfStreamerServerSession::CAlfStreamerServerSession() : iScreenNumber(KErrNotFound)
+CAlfStreamerServerSession::CAlfStreamerServerSession(const TThreadId& aThreadId) : iScreenNumber(KErrNotFound), iThreadId(aThreadId)
     {
     }
 
@@ -968,6 +976,7 @@
     case KAlfCompositionTargetHidden:
     case KAlfCompositionTargetVisible:
     case KAlfCompositionTargetCreated:
+    case KAlfCompositionLayoutSwitchComplete:
         {
         aServer->HandleCompositionEventL(this, aOp, aMessage);
         break;
--- a/uiacceltk/hitchcock/ServerCore/Src/alfwindowfxplugin.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfwindowfxplugin.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -101,3 +101,10 @@
         }
     return 0;
     }
+
+
+EXPORT_C void CAlfWindowFxPlugin::ClientAboutToExit(TThreadId)
+    {
+    }
+
+
--- a/uiacceltk/hitchcock/ServerCore/Src/alfwindowmanager.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfwindowmanager.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -681,3 +681,15 @@
     *windowCommandBuffer = empty;
     return windowCommandBuffer;
     }
+
+
+void CAlfWindowManager::HandleClientExit(TThreadId aThreadId)
+    {
+    for (TInt i = iData->iPlugins.Count()-1; i >= 0 ; i--)
+        { // assuming that plugins won't actually change the order on this message 
+          //(i.e. they may destroy them selves but not the plugine inserted before them)
+        iData->iPlugins[i].iPlugin->ClientAboutToExit(aThreadId);
+        } 
+    }
+
+
--- a/uiacceltk/hitchcock/ServerCore/eabi/alfappservercoreu.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/ServerCore/eabi/alfappservercoreu.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -547,4 +547,5 @@
 	_ZN18CAlfStreamerBridge15FindWgForAppUidE4TUid @ 546 NONAME
 	_ZN18CAlfStreamerBridge17FindAppUidForWgIdEi @ 547 NONAME
 	_ZN10CAlfWindow21SetLayerUsesAplhaFlagEi @ 548 NONAME
+	_ZN18CAlfWindowFxPlugin17ClientAboutToExitE9TThreadId @ 549 NONAME
 
--- a/uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/BWINS/hitchcocku.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -1592,4 +1592,8 @@
 	?SetShape@CHuiCanvasVisual@@QAEXABVTPoint@@ABVTRegion@@@Z @ 1591 NONAME ; void CHuiCanvasVisual::SetShape(class TPoint const &, class TRegion const &)
 	?CommandBufferCoverage@CHuiCanvasVisual@@QAE?AVTRect@@H@Z @ 1592 NONAME ; class TRect CHuiCanvasVisual::CommandBufferCoverage(int)
 	?CopyScreenToBitmapL@CHuiDisplay@@QAEXPAVCFbsBitmap@@@Z @ 1593 NONAME ; void CHuiDisplay::CopyScreenToBitmapL(class CFbsBitmap *)
+	?SecureId@CHuiControlGroup@@QAEHXZ @ 1594 NONAME ; int CHuiControlGroup::SecureId(void)
+	?SetSecureId@CHuiControlGroup@@QAEXH@Z @ 1595 NONAME ; void CHuiControlGroup::SetSecureId(int)
+	?HasTransParentClear@CHuiCanvasVisual@@QBEHXZ @ 1596 NONAME ; int CHuiCanvasVisual::HasTransParentClear(void) const
+	?AddEffectToGroup@CHuiFxEngine@@QAEHH@Z @ 1597 NONAME ; int CHuiFxEngine::AddEffectToGroup(int)
 
--- a/uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/eabi/hitchcocku.DEF	Wed Mar 31 23:03:58 2010 +0300
@@ -1993,4 +1993,8 @@
 	_ZNK16CHuiCanvasVisual14HasCustomShapeEv @ 1992 NONAME
 	_ZN16CHuiCanvasVisual21CommandBufferCoverageEi @ 1993 NONAME
 	_ZN11CHuiDisplay19CopyScreenToBitmapLEP10CFbsBitmap @ 1994 NONAME
+	_ZN16CHuiControlGroup11SetSecureIdEi @ 1995 NONAME
+	_ZN16CHuiControlGroup8SecureIdEv @ 1996 NONAME
+	_ZNK16CHuiCanvasVisual19HasTransParentClearEv @ 1997 NONAME
+	_ZN12CHuiFxEngine16AddEffectToGroupEi @ 1998 NONAME
 
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffect.h	Wed Mar 31 23:03:58 2010 +0300
@@ -40,7 +40,10 @@
 /** Effect is not applied to children visuals. */
 const TInt KHuiFxEffectExcludeChildrenFlag = 0x4;
 
-/** Effect is grouped and syncronized with other effect(s)*/
+/** Effect is grouped and syncronized with other effect(s)
+ * 
+ *  Indicates that the EndGroup event has not yet been received.
+ */
 const TInt KHuiFxWaitGroupSyncronization = 0x8;
 
 /** Effect duration is started after it has first time been drawn. */
@@ -61,6 +64,16 @@
 /** Background pixels are not read for every frame (only once in a while), thus background content looks frozen if it is visible. */
 const TInt KHuiFxFrozenBackground = 0x200;
 
+/** 
+ * EndGroup request has been received, but this effect has not yet drawn itself.
+ */
+const TInt KHuiFxWaitGroupToStartSyncronized = 0x400;
+
+/** EndGroup request has been received and this effect has drawn itself once and it is
+ *  now waiting for the others in the group to be drawn.
+ */
+const TInt KHuiFxReadyAndWaitingGroupToStartSyncronized = 0x800;
+
 class MAlfGfxEffectObserver
     {
     public:
@@ -98,6 +111,9 @@
     IMPORT_C void SetEngine( CHuiFxEngine *aEngine );
 
     IMPORT_C void SetEffectFlags( TInt aFlags );
+    void SetEffectFlag( TInt aFlag );
+    void ClearEffectFlag( TInt aFlag );
+    
     IMPORT_C void SetEffectGroup(TInt aGroupId);
     IMPORT_C TInt EffectFlags();
     IMPORT_C TInt GroupId();
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEffectCache.h	Wed Mar 31 23:03:58 2010 +0300
@@ -88,7 +88,7 @@
 {
 public:
      CHuiFxEffectCacheEffectNode(const TDesC &aFileName, CHuiFxEffect *&aEffect, MHuiEffectable *aVisual, TRect *extRect, CHuiFxEngine *aEngine) 
-	: iFileName(aFileName.AllocL()), iEffect(aEffect), iVisual(aVisual), iExtRect(extRect), iEffectCached(0), iEngine(aEngine), iRefCount(0), iParser(0) { }
+	: iFileName(aFileName.AllocL()), iEffect(aEffect), iVisual(aVisual), iExtRect(extRect), iEffectCached(0), iEngine(aEngine), iRefCount(0), iParser(0), iGroup(KErrNotFound) { }
      IMPORT_C ~CHuiFxEffectCacheEffectNode();
      void SetEffectEndObserver( MAlfGfxEffectObserver* aEffectEndObserver, TInt aHandle );
      void SetEffectFlags( TInt aFlags );
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiFxEngine.h	Wed Mar 31 23:03:58 2010 +0300
@@ -126,10 +126,10 @@
 	 * time.
 	 */
 	IMPORT_C void BeginGroupEffect(TInt aGroup);
-
     
     IMPORT_C TInt ActiveGroupEffect();
     
+    IMPORT_C TBool AddEffectToGroup(TInt aGroup);
     /*
 	 * StartGroupEffect
 	 *
@@ -147,6 +147,14 @@
     
     IMPORT_C void SetMemoryLevel(THuiMemoryLevel aLevel);
     
+	/**
+	 * Group effects wait until each effect has been drawn once. 
+	 *
+	 * Group effects are set into motion by NotifyEffectReady, when all effects in
+	 * the group have been drawn at least once.
+	 */
+    void NotifyEffectReady(TInt aGroupId);
+    
 protected:
     IMPORT_C void AddEffectL(CHuiFxEffect* aEffect);
     IMPORT_C void RemoveEffect(CHuiFxEffect* aEffect);
@@ -157,6 +165,7 @@
 private:
     
     TBool FxmlUsesInput1(CHuiFxEffect& aEffect);
+    TInt FindEffectGroup(TInt aGroup);
     
 private:
     // Render buffer management --- native implementations
@@ -189,7 +198,22 @@
     TRect                        iExtRect;
     CHuiFxEffectCache *iCache;
     TInt iLowGraphicsMemoryMode;
-    RArray<TInt> iActiveEffectGroups;
+    
+    NONSHARABLE_STRUCT(TEffectGroupStruct)
+        {
+    public:
+            
+        TEffectGroupStruct(TInt aGroup) : iGroup(aGroup), iWaiting(0), iEndCalled(EFalse){};
+
+        TInt iGroup;
+        TInt iWaiting;
+        TBool iEndCalled;
+        };
+    
+	/**
+	 * Only one simultanious effect group is supported
+	 */
+    RArray<TEffectGroupStruct> iActiveEffectGroups;
     };
 
 #endif /*HUIFXENGINE_H_*/
--- a/uiacceltk/hitchcock/coretoolkit/inc/HuiRosterImpl.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/HuiRosterImpl.h	Wed Mar 31 23:03:58 2010 +0300
@@ -28,6 +28,7 @@
 #include "uiacceltk/HuiRealPoint.h"
 #include "uiacceltk/HuiRealPoint.h"
 #include "uiacceltk/HuiGc.h"
+#include "uiacceltk/huilowmemoryobserver.h"
 #include "huieffectable.h"
 
 /* Forward declarations. */
@@ -53,7 +54,8 @@
  *
  * @see CHuiRoster
  */
-NONSHARABLE_CLASS(CHuiRosterImpl) : public CHuiRoster, MHuiEffectable
+NONSHARABLE_CLASS(CHuiRosterImpl) : public CHuiRoster, private MHuiEffectable, 
+        private MHuiMemoryLevelObserver
 	{
 public:
 
@@ -330,6 +332,10 @@
     void SetLoadingEffect(TBool aLoading);
     void EffectSetSource( TBool aIsInput1 );
     TBool EffectGetSource() const;	
+    
+    // From MHuiMemoryLevelObserver
+    void SetMemoryLevel(THuiMemoryLevel aLevel);
+    
 protected:
 
     /* Methods. */
@@ -451,6 +457,11 @@
      */
 	void DrawBoundaries( CHuiGc& aGc, CHuiVisual* aVisual, TBool aDrawOutline ) const;
 
+    /**
+     * Returns true if render buffer can be used for freeze.
+     */
+    TBool UseRenderBufferForFreeze() const;
+    
 private:
 
     /** Area occupied by the roster. */
@@ -498,6 +509,9 @@
     CHuiCanvasGc* iCanvasGc;
     CHuiCanvasRenderBuffer* iCanvasRenderBuffer;
     CHuiGc::TOrientation iCanvasRenderBufferOrientation;
+	
+	TBool iRosterIsFrozen;
+	TBool iMonitorMemoryLevel;
 	};
 
 #endif  // __HUIROSTERIMPL_H__
--- a/uiacceltk/hitchcock/coretoolkit/inc/huicanvaspainter.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huicanvaspainter.h	Wed Mar 31 23:03:58 2010 +0300
@@ -49,6 +49,7 @@
     
     /** Flag to say wheter buffer really contains somethign that really draws something */
     EHuiCanvasBufferContainsDrawing = 0x8000,
+    EHuiCanvasBufferContainsTransparentClear = 0x10000,
     /** All flags, can be used for clearing all flags */
     EHuiCanvasBufferStatusAll = 0xFFFFFFFF
     };
--- a/uiacceltk/hitchcock/coretoolkit/inc/huicanvaswspainter.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huicanvaswspainter.h	Wed Mar 31 23:03:58 2010 +0300
@@ -158,6 +158,7 @@
      */
     virtual CHuiCanvasGc& CanvasGc() const;
     CHuiCanvasWsGc *CanvasWsGc() const { return iCanvasWsGc; }
+
 private:
 
     /**
@@ -321,6 +322,8 @@
     TRect iTestFullDisplayRect;
     #endif
 	
+	TRgb iBrushColor;
+	
 	// Stream read optimizations
     struct TStructBitBlitRect
         {
--- a/uiacceltk/hitchcock/coretoolkit/inc/huiextension.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huiextension.h	Wed Mar 31 23:03:58 2010 +0300
@@ -83,4 +83,7 @@
     TInt iErrorCode;
     };
 
+// Uid for Release Cached Textures extension for CHuiSkin.
+const TUid KHuiSkinReleaseCachedTextures = { 0x2002E6D4 };
+
 #endif // __HUIEXTENSION_H__
--- a/uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/inc/huistatictlsdata.h	Wed Mar 31 23:03:58 2010 +0300
@@ -22,6 +22,14 @@
 #define __HUISTATICTLSDATA_H__
 
 
+// For testing purposes, insert additional test data into TLS.
+// Notice, that TTlsData object is inserted into TLS. So, test
+// object needs to be added into TTLSData and not inserted directly
+// into TLS.
+#define AMT_CONTROL() static_cast<TTlsData*>(Dll::Tls())->iAlfModuleTestDataControl
+#include "alfmoduletest.h"
+
+
 LOCAL_D const TInt KMaxClocks = 10;
 
 
@@ -109,7 +117,12 @@
     RFs* iFs;
     
     CAppFwProxy* iAppFwProxy;
-   
+
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // For testing purposes, test data needs to be included into TLS object.
+    CAlfModuleTestDataControl* iAlfModuleTestDataControl;
+#endif
+
     CWsScreenDevice* WsScreenDevice(TInt aScreenNumber)
         {
         if (aScreenNumber < iScreenDevices.Count())
@@ -138,6 +151,13 @@
                 
      void DoInitL()
         {
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // For testing purposes, test data needs to be included into TTlsData object because
+    // TTlsData object itself is inserted into TLS.
+    iAlfModuleTestDataControl = new(ELeave) CAlfModuleTestDataControl();
+    User::LeaveIfError( iAlfModuleTestDataControl->OpenGlobalObjects() );
+#endif
+
         CCoeEnv* coe = CCoeEnv::Static();
         if (coe)
             {
@@ -206,6 +226,11 @@
         iFs = 0;
 
         RFbsSession::Disconnect();
+        
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+        delete iAlfModuleTestDataControl;
+        iAlfModuleTestDataControl = NULL;
+#endif        
         }
     };
 
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/inc/HuiVg10Gc.h	Wed Mar 31 23:03:58 2010 +0300
@@ -495,7 +495,7 @@
                                 TReal32 aRightBorderWidth, 
                                 TReal32 aTopBorderHeight,
                                 TReal32 aBottomBorderHeight, 
-                                const THuiImage* aImage);
+                                const THuiImage* aImage) __SOFTFP;
     
     
     void CreateVgObjectsL();
--- a/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10Gc.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -1872,7 +1872,7 @@
                                         TReal32 aRightBorderWidth, 
                                         TReal32 aTopBorderHeight,
                                         TReal32 aBottomBorderHeight, 
-                                        const THuiImage* aImage)
+                                        const THuiImage* aImage) __SOFTFP
     {
     // If there is no image, draw a solid border
     if (!aImage || !aImage->HasTexture())
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasTextureCache.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -1932,7 +1932,18 @@
         {
         // For PC-lint
         }
-
+    if (aFirst.iTextBoxMaxSize.iHeight < aSecond.iTextBoxMaxSize.iHeight)
+           {
+           return -1; // less than
+           }
+       else if (aFirst.iTextBoxMaxSize.iHeight > aSecond.iTextBoxMaxSize.iHeight)
+           {
+           return 1; // more than  
+           }
+       else
+           {
+           // For PC-lint
+           }
     // Text content
     TInt textcompare = KErrNotFound;
     if ( aFirst.iFindTextPtr )
@@ -2089,7 +2100,7 @@
 CHuiCanvasTextureCache::CHuiCanvasTextureCache()
     {
     SetMemoryLevel(EHuiMemoryLevelNormal);
-    CHuiStatic::Env().AddLowMemoryObserver(this);
+    CHuiStatic::Env().AddMemoryLevelObserver(this);
     }
 
 // ---------------------------------------------------------------------------
@@ -2098,7 +2109,7 @@
 //
 CHuiCanvasTextureCache::~CHuiCanvasTextureCache()
     {
-    CHuiStatic::Env().RemoveLowMemoryObserver(this);
+    CHuiStatic::Env().RemoveMemoryLevelObserver(this);
     iCachedTexts.ResetAndDestroy();
     iCachedImages.ResetAndDestroy();        
     iRecycledTextures.ResetAndDestroy();
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiCanvasVisual.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -80,6 +80,9 @@
 
     RRegionBuf<5> iShapeRegion;
     TPoint iShapeOrigin;
+
+    // Flag to indicate if this has received commands while inactive
+    TBool iCommandsReceivedWhileNoCache;
     };
 
 EXPORT_C CHuiCanvasVisual* CHuiCanvasVisual::AddNewL(CHuiControl& aOwnerControl,
@@ -125,6 +128,8 @@
     
     iCanvasVisualData->iShapeOrigin = TPoint();
     
+    iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+    
     // subwindow effects
     //EnableBrushesL(ETrue);
     }
@@ -274,6 +279,15 @@
 
 void CHuiCanvasVisual::HandleBuffer(TRect& aDisplayRect, TInt aAction, CHuiGc* aGc) const
     {
+    TBool touchCountWasEnabled = EFalse;
+    if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+        {
+        // Commands were received while this visual didn't keep cache. 
+        // So it's possible that some images are still in texture cache but haven't been updated.
+        touchCountWasEnabled = Env().CanvasTextureCache().IsTouchCountCheckEnabled();
+        Env().CanvasTextureCache().EnableTouchCountCheck();
+        }
+        
     if (iCanvasVisualData->iCommandSetType == ECommandBufferWs || iCanvasVisualData->iCommandSetType == ECommandBufferAlf)
         {
         TRAPD(err, iCanvasVisualData->iCanvasPainter->HandleBufferL(aDisplayRect, aAction, *this, aGc, DisplayRect().iTl.Round()));  
@@ -287,6 +301,14 @@
         // do nothing    
         }                
     
+    if (iCanvasVisualData->iCommandsReceivedWhileNoCache)
+        {
+        Env().CanvasTextureCache().EnableTouchCountCheck( touchCountWasEnabled );
+        if ( !KeepNoCache() && aAction == EDrawBuffer )
+            {
+            iCanvasVisualData->iCommandsReceivedWhileNoCache = EFalse;
+            }   
+        }
     }
 
 
@@ -320,27 +342,37 @@
     
 TBool CHuiCanvasVisual::CanSkipDrawing() const
     {
-    TBool semiTranparentEffectActive = (Effect() && Effect()->IsSemitransparent());
-    TBool childWindowEffectActive = (Effect() && EffectIsAppliedToChildren());
-    TBool invisible = (iOpacity.Now() <= EPSILON && !semiTranparentEffectActive);
-    TBool effectAppliedToSurfacePixels = (Effect() && (Effect()->EffectFlags() & KHuiFxEnableBackgroundInAllLayers));
-    
-    if( invisible || 
-        (!HasCommandBuffers(ETrue /*include children*/) && 
-         !childWindowEffectActive &&
-         !IsBackgroundDrawingEnabled() && 
-         !IsExternalContentDrawingEnabled()&&
-         !IsExternalContentDrawingEnabled(ETrue /*include children*/) &&
-         !effectAppliedToSurfacePixels
-         
-        ))
+    if (Effect())
         {
-        return ETrue;
+        TBool semiTranparentEffectActive = Effect()->IsSemitransparent();
+        if ((iOpacity.Now() <= EPSILON && !semiTranparentEffectActive))
+            {
+            return ETrue;
+            }
+        TBool childWindowEffectActive = EffectIsAppliedToChildren();
+        TBool effectAppliedToSurfacePixels = (Effect()->EffectFlags() & KHuiFxEnableBackgroundInAllLayers);
+        if( !childWindowEffectActive &&
+            !effectAppliedToSurfacePixels &&
+            !HasCommandBuffers(ETrue /*include children*/) && 
+            !IsBackgroundDrawingEnabled() &&
+            !IsExternalContentDrawingEnabled()&&
+            !IsExternalContentDrawingEnabled(ETrue /*include children*/))
+            {
+            return ETrue;
+            }
         }
     else
         {
-        return EFalse;
+        if (iOpacity.Now() <= EPSILON ||
+            (!HasCommandBuffers(ETrue /*include children*/) && 
+            !IsBackgroundDrawingEnabled() &&
+            !IsExternalContentDrawingEnabled() &&
+            !IsExternalContentDrawingEnabled(ETrue /*include children*/)) )
+            {
+            return ETrue;
+            }
         }
+    return EFalse;
     }
 
 void CHuiCanvasVisual::Draw(CHuiGc& aGc) const
@@ -762,13 +794,9 @@
 	TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->SetCommandSetL(aCommands));	
 
 	// Memory optimization. Do not prepare cache if visual is inactive.
-    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
-    TBool inactive = EFalse; 
-    inactive |= Flags() & EHuiVisualFlagInactive;
-    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
-    if (rosterFrozen || inactive)
+    if (KeepNoCache())
         {
+        iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
         ClearCache();
         }
     else
@@ -836,13 +864,9 @@
     TRAP_IGNORE(iCanvasVisualData->iCanvasPainter->AddCommandSetL(aMoreCommands));
     
     // Memory optimization. Do not prepare cache if visual is inactive.
-    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
-    TBool inactive = EFalse; 
-    inactive |= Flags() & EHuiVisualFlagInactive;
-    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
-
-    if (rosterFrozen || inactive)
+    if (KeepNoCache())
         {
+        iCanvasVisualData->iCommandsReceivedWhileNoCache = ETrue;
         ClearCache();
         }
     else
@@ -988,7 +1012,11 @@
                 background.iPaintedRect = DisplayRect();
                 background.iPaintType = /*(iCanvasVisualData->iBackground->BackgroundColor().Alpha() == 255) ?*/ EHuiCanvasPaintTypeOpaque;// : EHuiCanvasPaintTypeTransparent; 
                 return background;
-                }                
+                }          
+            else 
+                {
+                aIndex--;
+                }
             }                                            
         }
 
@@ -1529,4 +1557,17 @@
     return iCanvasVisualData->iCanvasPainter->CommandBufferCoverage(aOrientation); 
     }
 
+EXPORT_C TBool CHuiCanvasVisual::HasTransParentClear() const
+    {
+    return iCanvasVisualData->iCanvasPainter->HasCommandBuffers(EHuiCanvasBufferContainsTransparentClear);
+    }
 
+TBool CHuiCanvasVisual::KeepNoCache() const
+    {
+    TBool rosterFrozen = Display() && Display()->Roster().IsVisibleContentFrozen();
+    TBool inactive = EFalse; 
+    inactive |= Flags() & EHuiVisualFlagInactive;
+    inactive |= Flags() & EHuiVisualFlagUnderOpaqueHint;
+    
+    return rosterFrozen || inactive;
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiControlGroup.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiControlGroup.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -230,6 +230,15 @@
     iAcceptInput = aAcceptInput;
     }
 
+EXPORT_C void CHuiControlGroup::SetSecureId(TInt aSecureId)
+    {
+    iSecureId = aSecureId;
+    }
+EXPORT_C TInt CHuiControlGroup::SecureId()
+    {
+    return iSecureId;
+    }
+
 
 TBool CHuiControlGroup::Changed() const
     {
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiDisplay.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -638,6 +638,12 @@
         return EFalse;
         }
     
+    if (!iForegroundTextureTransparency && iForegroundTexture)
+        {
+        // When we can blit foreground texture, we shouldn't need any textures in skin side.
+        iEnv.Skin().ReleaseCachedTextures();
+        }
+    
     TBool useDirtyRects = (RenderSurface().Flags() & MHuiRenderSurface::EFlagUseDirtyRects) 
     					  == MHuiRenderSurface::EFlagUseDirtyRects;
  	
@@ -851,7 +857,7 @@
         iGc->PushClip();
         iGc->Clip(dirtyRect);        
         
-        if ( iForegroundBitmapGc )
+        if ( iForegroundBitmapGc && !RosterImpl().IsVisibleContentFrozen() )
             {
             // If we are in SW rendering mode, then SW bitmap may be blended.
             // However, it's possible that nothing is drawn below, so clear
@@ -1628,6 +1634,12 @@
 EXPORT_C void CHuiDisplay::SetForegroundTextureOptions(TBool aTransparency)
     {
     iForegroundTextureTransparency = aTransparency;
+
+    if (!iForegroundTextureTransparency && iForegroundTexture)
+        {
+        // When we can blit foreground texture, we shouldn't need any textures in skin side.
+        iEnv.Skin().ReleaseCachedTextures();
+        }
     }
 
 void CHuiDisplay::UpdateForegroundTexture(const TRect& aRect)
@@ -1657,7 +1669,7 @@
 
 void CHuiDisplay::DrawForegroundTexture()
     {
-    if (iForegroundTexture)
+    if (iForegroundTexture && !RosterImpl().IsVisibleContentFrozen() )
         {
         THuiQuality originalQuality = iGc->Quality();
         if ( originalQuality != EHuiQualityFast )
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiEnv.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiEnv.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -346,6 +346,9 @@
 
 CHuiEnv::~CHuiEnv()
     {
+    iSynchObservers.Close();
+    iSynchIds.Close();
+    
     iActionObservers.Close();
 
     // Destroy groups in reverse order so that references will be removed
@@ -1772,9 +1775,17 @@
 
 EXPORT_C void CHuiEnv::Synchronize(TInt aId, MHuiSynchronizationObserver* aObserver)
     {
-    iSynchObserver = aObserver;
-    iSynchId = aId;
-    
+    TInt err = iSynchObservers.Append(aObserver);
+    if(err)
+        {
+        return;
+        }
+    err = iSynchIds.Append(aId);
+    if(err )
+        {
+        iSynchObservers.Remove(iSynchObservers.Count()-1);
+        return;
+        }
     if ( aObserver )
         {
         ContinueRefresh();
@@ -1783,7 +1794,7 @@
 
 void CHuiEnv::DoSynchronize()
     {
-    if ( !iSynchObserver )
+    if ( iSynchObservers.Count() == 0)
         {
         return;
         }
@@ -1799,8 +1810,13 @@
             }
         }
 
-    iSynchObserver->Synchronized( iSynchId );
-    iSynchObserver = NULL;
+    TUint observersCount = iSynchObservers.Count()-1;
+    for(TInt u = observersCount; u >= 0 ; u-- )
+        {
+        iSynchObservers[u]->Synchronized( iSynchIds[u] );
+        iSynchObservers.Remove(u);
+        iSynchIds.Remove(u);
+        }
     }
 
 void CHuiEnv::RemoveTheControlGroup(TInt aId)
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEffect.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -82,6 +82,13 @@
     ReleaseCachedRenderTarget();
     
     iEngine->RemoveEffect(this);
+    if (iEngine && iGroupId != KErrNotFound)
+        {
+        // if effect was deleted before it was drawn, the group must be notified. If this was the last effect in the group
+        // the group will be removed by the EffectReadyToStart
+        iEngine->NotifyEffectReady(iGroupId);
+        }
+    
 #ifdef HUIFX_TRACE    
     RDebug::Print(_L("CHuiFxEffect::~CHuiFxEffect - 0x%x"), this);
 #endif
@@ -308,7 +315,9 @@
                 }
             
             // Write cached buffer to the display
-            iEngine->Composite(aGc, *iCachedRenderTarget, targetRect.iTl, aOpaque && !(EffectFlags() & KHuiFxAlwaysBlend), aAlpha);
+           
+	       iEngine->Composite(aGc, *iCachedRenderTarget, targetRect.iTl, aOpaque && !(EffectFlags() & KHuiFxAlwaysBlend), aAlpha);
+           
 
             if (aClipRegion.Count())
                 {
@@ -442,6 +451,16 @@
     iFlags = aFlags;
     }
 
+void CHuiFxEffect::SetEffectFlag( TInt aFlag )
+    {
+    iFlags |= aFlag;
+    }
+
+void CHuiFxEffect::ClearEffectFlag( TInt aFlag )
+    {
+    iFlags &= ~aFlag;
+    }
+
 EXPORT_C void CHuiFxEffect::SetEffectGroup(TInt aGroupId)
     {
     iGroupId = aGroupId;
@@ -462,16 +481,31 @@
     if (iFlags & KHuiFxDelayRunUntilFirstFrameHasBeenDrawn)
         {
         if (iFramesDrawn)
-            {
+            { 
+            if (iFlags & KHuiFxReadyAndWaitingGroupToStartSyncronized)
+                {
+	            // this has drawn atleast once, but all the effect in this group have not drawn. Must hang on little more.
+                return;
+                }
+        
+            if (iFlags & KHuiFxWaitGroupToStartSyncronized)
+                {
+				// Group has been started, waiting the others in the group to be drawn
+                SetEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+                ClearEffectFlag(KHuiFxWaitGroupToStartSyncronized);
+				// NotifyEffectReady will clear KHuiFxReadyAndWaitingGroupToStartSyncronized flag
+				// if all items in the group are ready.
+                iEngine->NotifyEffectReady(iGroupId);
+                return;
+                }
+
             if (iFramesDrawn == 1)
                 {
                 aElapsedTime = 0;
                 iFramesDrawn++;
                 }
-            iRoot->AdvanceTime(aElapsedTime);
-            }
-        else
-            {
+            
+                iRoot->AdvanceTime(aElapsedTime);
             }
         }
     else
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiFxEngine.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -66,6 +66,7 @@
 #endif
 #endif
     CHuiStatic::Env().AddMemoryLevelObserver(this);
+    iActiveEffectGroups.Reserve(2);
     }
 
 EXPORT_C TBool CHuiFxEngine::FxmlUsesInput1(const TDesC &aFileName)
@@ -302,6 +303,7 @@
 // the effect will be removed, and will no longer be part of iActiveEffects set.
 // We must check if the effect is still in our list, but the indices change
 // if something is removed from the middle of the list
+    TInt skipGroup = KErrNotFound;
     for ( i = iActiveEffects.Count() - 1; i >= 0; i-- )
         {
         CHuiFxEffect* effect = iActiveEffects[i];
@@ -309,10 +311,24 @@
             {
             refreshRequired = ETrue;
             }
-        if ( i < iActiveEffects.Count() && effect == iActiveEffects[i] && !(effect->EffectFlags() & KHuiFxWaitGroupSyncronization))
+        TInt flags = effect->EffectFlags();
+        if ( !(flags & KHuiFxWaitGroupSyncronization) 
+                && (skipGroup == KErrNotFound || skipGroup != effect->GroupId()))
             {
             // The effect is still in its place, it did not go away yet
+            TBool waitingGroupBefore = flags & KHuiFxWaitGroupToStartSyncronized;
             effect->AdvanceTime(aElapsedTime);
+            
+            if (waitingGroupBefore)
+                {
+                flags = effect->EffectFlags();
+                if (!(flags & KHuiFxReadyAndWaitingGroupToStartSyncronized) && !(flags & KHuiFxWaitGroupToStartSyncronized))
+                    {
+                    // effects in this group are all ready to start drawing. Skip this group in AdvanceTime, 
+					// that they can start syncronized on the next round
+                    skipGroup = effect->GroupId();
+                    }
+                }
             }
         }
     
@@ -626,48 +642,123 @@
     
     ASSERT(iBuffersInCache == 0);    
     }
-	
+
+TInt CHuiFxEngine::FindEffectGroup(TInt aGroup)
+    {
+    for (TInt i=0 ; i < iActiveEffectGroups.Count();i++)
+        {
+        if (iActiveEffectGroups[i].iGroup == aGroup)
+            {
+            return i; 
+            }
+        }
+    return KErrNotFound;
+    }
+
 EXPORT_C void CHuiFxEngine::BeginGroupEffect(TInt aGroup)
 	{
-	TInt index = iActiveEffectGroups.Find(aGroup);
+	// Multiple grouped effects at the same time are not supported. 
+    // Same visual might participate different groups, which will mess up the effect
+    if (iActiveEffectGroups.Count()>0)
+        {
+        // delete previous groups
+        while(iActiveEffectGroups.Count())
+            {
+            TInt groupId = iActiveEffectGroups[0].iGroup;
+            for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
+                {
+                if (iActiveEffects[i]->GroupId() == groupId)
+                    {
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxWaitGroupToStartSyncronized);
+                    iActiveEffects[i]->ClearEffectFlag(KHuiFxWaitGroupSyncronization);
+                    }
+                
+                }
+            iActiveEffectGroups.Remove(0);
+            }
+        }
+	
+	TInt index = FindEffectGroup(aGroup);
+	
 	if (index == KErrNotFound)
 		{
-		iActiveEffectGroups.Append(aGroup);
-		}
-	else
-		{
-		// group already exists
+        const TEffectGroupStruct item(aGroup);
+		iActiveEffectGroups.Append(item);
 		}
 	}
 
+// This will add effect to this group. Do not call this function more than once for single effect 
 EXPORT_C TInt CHuiFxEngine::ActiveGroupEffect()
 	{
-	if (iActiveEffectGroups.Count() > 0)
-		{
-		return iActiveEffectGroups[iActiveEffectGroups.Count()-1];
-		}
-	else
-		{
-		return KErrNotFound;
-		}
+	TInt index = iActiveEffectGroups.Count();
+	if (index == 0)
+	    {
+        return KErrNotFound;
+	    }
+	while(--index >= 0)
+        {
+		// group is alive until all its effects have been drawn once. .iEndCalled is to prevent
+		// another effect entering into this group
+        const TEffectGroupStruct& item = iActiveEffectGroups[index];
+        if (!item.iEndCalled) 
+            { 
+			return iActiveEffectGroups[index].iGroup;
+            }
+        }
+    return KErrNotFound;
 	}
 
+EXPORT_C TBool CHuiFxEngine::AddEffectToGroup(TInt aGroup)
+    {
+    TInt index = FindEffectGroup(aGroup);
+    if (index != KErrNotFound)
+        {
+        // keep count of effects in this group. All must draw atleast once, before
+        // syncronized group effect may start
+        iActiveEffectGroups[index].iWaiting++;
+        return ETrue;
+        }
+    return EFalse;
+    }
+
 EXPORT_C void CHuiFxEngine::StartGroupEffect(TInt aGroup)
 	{
-	TInt index = iActiveEffectGroups.Find(aGroup);
+	TInt index = FindEffectGroup(aGroup);
 	if (index != KErrNotFound)
 		{
-		iActiveEffectGroups.Remove(index);
-	
+		iActiveEffectGroups[index].iEndCalled = ETrue; // this group will not take any more participants
 		for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
 			{
 			CHuiFxEffect* effect = iActiveEffects[i];
 			TInt flags = effect->EffectFlags();
 			if ((flags & KHuiFxWaitGroupSyncronization) && (effect->GroupId() == aGroup))
 				{
-				flags &= ~KHuiFxWaitGroupSyncronization;
-				effect->SetEffectFlags(flags);
+                effect->ClearEffectFlag(KHuiFxWaitGroupSyncronization);
+                effect->SetEffectFlag(KHuiFxWaitGroupToStartSyncronized);
 				}
 			}
 		}
 	}
+
+void CHuiFxEngine::NotifyEffectReady(TInt aGroupId)
+    {
+    TInt index = FindEffectGroup(aGroupId);
+    if (index != KErrNotFound)
+        {
+        if (--iActiveEffectGroups[iActiveEffectGroups.Count()-1].iWaiting == 0)
+            {
+            // set in motion all effects in this group
+	        iActiveEffectGroups.Remove(index);
+            for ( TInt i = iActiveEffects.Count() - 1; i >= 0; i-- )
+                {
+                CHuiFxEffect* effect = iActiveEffects[i];
+                TInt flags = effect->EffectFlags();
+                if ((flags & KHuiFxReadyAndWaitingGroupToStartSyncronized) && (effect->GroupId() == aGroupId))
+                    {
+                    effect->ClearEffectFlag(KHuiFxReadyAndWaitingGroupToStartSyncronized);
+                    }
+                }
+            }
+        }
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiRosterImpl.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -60,6 +60,11 @@
 
 CHuiRosterImpl::~CHuiRosterImpl()
     {
+    if (iDisplay)
+        {
+        iDisplay->Env().RemoveMemoryLevelObserver(this);
+        }
+
     FreezeVisibleContentL(EFalse);
     
     delete iLongTapDetector;
@@ -530,7 +535,7 @@
     
     ASSERT(display!=NULL);
 
-    if (iCanvasRenderBuffer && iCanvasGc)
+    if (IsVisibleContentFrozen())
         {
         DrawSelfFrozen(aGc, display);
         return;
@@ -1621,19 +1626,30 @@
 
 void CHuiRosterImpl::FreezeVisibleContentL(TBool aEnable)
     {
+    iRosterIsFrozen = aEnable;
+    
+    if (aEnable && !iMonitorMemoryLevel && iDisplay)
+        {
+        iDisplay->Env().AddMemoryLevelObserver(this);
+        iMonitorMemoryLevel = ETrue;
+        }
+    
     if (aEnable)
         {    
-        if (!iCanvasGc)
+        if (UseRenderBufferForFreeze())
             {
-            CHuiRenderPlugin& renderplugin = CHuiStatic::Renderer();
-            iCanvasGc = renderplugin.CreateCanvasGcL();
-            }    
-        if (!iCanvasRenderBuffer)
-            {
-            iCanvasRenderBuffer = iCanvasGc->CreateRenderBufferL(TSize(0,0));
-            iCanvasRenderBuffer->InitializeL(CHuiStatic::Env().Display(0).VisibleArea().Size());
-            iCanvasRenderBuffer->Copy(TPoint(0,0));    
-            iCanvasRenderBufferOrientation = CHuiStatic::Env().Display(0).Orientation();
+            if (!iCanvasGc)
+                {
+                CHuiRenderPlugin& renderplugin = CHuiStatic::Renderer();
+                iCanvasGc = renderplugin.CreateCanvasGcL();
+                }    
+            if (!iCanvasRenderBuffer)
+                {
+                iCanvasRenderBuffer = iCanvasGc->CreateRenderBufferL(TSize(0,0));
+                iCanvasRenderBuffer->InitializeL(CHuiStatic::Env().Display(0).VisibleArea().Size());
+                iCanvasRenderBuffer->Copy(TPoint(0,0));    
+                iCanvasRenderBufferOrientation = CHuiStatic::Env().Display(0).Orientation();
+                }
             }
         }
     else
@@ -1648,7 +1664,7 @@
 
 TBool CHuiRosterImpl::IsVisibleContentFrozen() const
     {
-    return ((iCanvasRenderBuffer != NULL) && (iCanvasGc != NULL));
+    return iRosterIsFrozen;
     }
     
 void CHuiRosterImpl::EffectSetEffect(CHuiFxEffect* aEffect)
@@ -1707,3 +1723,20 @@
     {
     return iIsInput1;
     }
+
+void CHuiRosterImpl::SetMemoryLevel(THuiMemoryLevel /*aLevel*/)
+    {
+    if ( IsVisibleContentFrozen() && !UseRenderBufferForFreeze() )
+        {
+        // Release render buffer if we are not supposed to use.
+        delete iCanvasGc;
+        iCanvasGc = NULL;        
+        delete iCanvasRenderBuffer;
+        iCanvasRenderBuffer = NULL;        
+        }
+    }
+
+TBool CHuiRosterImpl::UseRenderBufferForFreeze() const
+    {
+    return !iDisplay || !( iDisplay->Env().MemoryLevel() <= EHuiMemoryLevelLowest );
+    }
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiS60Skin.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -32,7 +32,7 @@
 #include <AknUtils.h>
 
 #include "huiskinbackroundlayout.h"
-
+#include "huiextension.h"
 
 struct TBackgroundTexture
     {
@@ -188,12 +188,19 @@
 
 EXPORT_C void CHuiS60Skin::SkinContentChanged()
     {
-    FreeAllBackgroundTextureResources();
+    
     }
 
 EXPORT_C void CHuiS60Skin::SkinConfigurationChanged(
     const TAknsSkinStatusConfigurationChangeReason aReason )
     {
+    if (aReason == EAknsSkinStatusConfigurationDeployed)
+        {
+        FreeAllBackgroundTextureResources();
+        Env().NotifySkinChangedL();
+        Env().TextStyleManager().NotifyDisplaySizeChangedL();
+        ReloadBgTexturesL();
+        }
     
     }
 
@@ -250,11 +257,8 @@
 EXPORT_C void CHuiS60Skin::NotifyDisplaySizeChangedL()
     {
     // The background is now different.
-    SkinContentChanged(); // to delete old contents
+     SkinConfigurationChanged(EAknsSkinStatusConfigurationDeployed);
     
-    Env().NotifySkinChangedL();
-    Env().TextStyleManager().NotifyDisplaySizeChangedL();
-    ReloadBgTexturesL();
     }
 
 
@@ -292,7 +296,14 @@
 
 EXPORT_C void CHuiS60Skin::SkinExtension(const TUid& aExtensionUid, TAny** aExtensionParameters)
     {
-    CHuiSkin::SkinExtension(aExtensionUid,aExtensionParameters);
+    if (aExtensionUid == KHuiSkinReleaseCachedTextures)
+        {
+        FreeAllBackgroundTextureResources();
+        }
+    else
+        {        
+        CHuiSkin::SkinExtension(aExtensionUid, aExtensionParameters);
+        }
     }
     
 EXPORT_C THuiSkinOrientation CHuiS60Skin::Orientation() const
@@ -509,7 +520,7 @@
         bgTexture = ((TPrivData*)(iSpare))->iBackgrounds[index];
         if (bgTexture.iID == aID)
             {
-            if(!bgTexture.iBackgroundTexture && !bgTexture.iBackgroundTexture->HasContent())
+            if(!bgTexture.iBackgroundTexture || !bgTexture.iBackgroundTexture->HasContent())
                 {
                 delete bgTexture.iBackgroundTexture;
                 bgTexture.iBackgroundTexture = NULL;
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiSkin.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -27,6 +27,7 @@
 #include "uiacceltk/HuiUtil.h"
 #include "uiacceltk/HuiPanic.h"
 #include "uiacceltk/HuiDisplay.h" 
+#include "huiextension.h"
 
 CHuiSkin::CHuiSkin(CHuiEnv& aEnv)
         : iEnv(aEnv)
@@ -192,6 +193,10 @@
     return err;
     }
 
+void CHuiSkin::ReleaseCachedTextures()
+    {
+    SkinExtension(KHuiSkinReleaseCachedTextures, NULL);
+    }
 
 void CHuiSkin::PrepareShadowTextureL(CHuiTexture& aTexture)
     {
--- a/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiStatic.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -390,6 +390,14 @@
     iChangeNotifier->Start();
 #ifndef __WINSCW__
     globalWriteableData = *iData;
+    #ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+        // For testing purposes, test data needs to be included into TLS
+        // because test cases require information stored in TLS.
+        if ( !Dll::Tls() )
+            {
+            Dll::SetTls( iData );    
+            }
+    #endif    
 #else
     Dll::SetTls(iData);
 #endif
@@ -417,7 +425,7 @@
         }
     iChangeNotifier->Cancel();
     delete iChangeNotifier;
-#ifdef __WINSCW__
+#if defined( __WINSCW__ ) || defined( USE_MODULE_TEST_HOOKS_FOR_ALF )
     Dll::FreeTls();
 #endif
     delete iData;
--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvasgc.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -34,6 +34,15 @@
 
 #include <e32math.h>
 
+#include "alfmoduletestconf.h"
+#ifdef USE_MODULE_TEST_HOOKS_FOR_ALF
+    // Provides TLS object data for test cases.
+    // This is used only if module test hooks are set on.
+    #include "huistatictlsdata.h"
+#endif // USE_MODULE_TEST_HOOKS_FOR_ALF
+// Provides module test hook defines.
+#include "alfmoduletestdefines.h"
+
 
 EXPORT_C CHuiCanvasGc::CHuiCanvasGc():
     iPenColor(KRgbBlack),
@@ -44,7 +53,7 @@
     iHorizontalTextAlign(EHuiAlignHLeft),
     iTextStyleId(EHuiTextStyleNormal),
     iEffectiveOpacityEnabled(ETrue)
-    {	    
+    {
     }
 
 EXPORT_C CHuiCanvasGc::~CHuiCanvasGc()
@@ -673,6 +682,10 @@
         	    {
       		  	iGc->DrawRect(rect);
         	    }
+        	
+            AMT_MAP_INC_VALUE_IF( iVisual, iIntMap, 
+                                  AMT_MAP_CPTR_TO_KEY_CAST( iVisual ),
+                                  EAlfModuleTestTypeCoreToolkitDrawWindow );
 		    }    	    
 		}            
 	}
@@ -1346,7 +1359,11 @@
 
     DisableDelayedClippingIfNeeded(); 
 
-    Cleanup();       
+    Cleanup();
+    
+    AMT_MAP_INC_VALUE_IF( iVisual, iIntMap, 
+                          AMT_MAP_CPTR_TO_KEY_CAST( iVisual ), 
+                          EAlfModuleTestTypeCoreToolkitDrawFromRenderBuffer );
     }
 
 EXPORT_C void CHuiCanvasGc::ClearRenderBuffer( CHuiCanvasRenderBuffer& aImage, const TRect & aRect )
--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvaswshwgc.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvaswshwgc.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -557,8 +557,8 @@
         else if (iWsBrushStyle == MWsGraphicsContext::EPatternedBrush)
             {
             iCanvasGc->SetPolygonDrawMode( EHuiFillEvenOdd );
-            iCanvasGc->SetPenColor(iWsPenColor);                    
-            iCanvasGc->SetOpacity(TReal32(iWsPenColor.Alpha() / 255.f));       
+            iCanvasGc->SetPenColor(iWsBrushColor);                    
+            iCanvasGc->SetOpacity(TReal32(iWsBrushColor.Alpha() / 255.f));       
             UseBrushPattern();
             iCanvasGc->SetDrawMode(SelectCanvasDrawMode(iWsDrawMode));        
             iCanvasGc->DrawRoundRect( THuiRealRect(aRect), THuiRealSize( aPoint.iX*2, aPoint.iY*2 ));
@@ -731,8 +731,8 @@
         else if (iWsBrushStyle == MWsGraphicsContext::EPatternedBrush)
             {
             iCanvasGc->SetPolygonDrawMode( EHuiFillEvenOdd );
-            iCanvasGc->SetPenColor(iWsPenColor);                    
-            iCanvasGc->SetOpacity(TReal32(iWsPenColor.Alpha() / 255.f));       
+            iCanvasGc->SetPenColor(iWsBrushColor);                    
+            iCanvasGc->SetOpacity(TReal32(iWsBrushColor.Alpha() / 255.f));       
             UseBrushPattern();
             iCanvasGc->SetDrawMode(SelectCanvasDrawMode(iWsDrawMode));        
             iCanvasGc->DrawEllipse(destRect);
@@ -881,8 +881,8 @@
         else if (iWsBrushStyle == MWsGraphicsContext::EPatternedBrush)
             {
             iCanvasGc->SetPolygonDrawMode( EHuiFillEvenOdd );
-            iCanvasGc->SetPenColor(iWsPenColor);                    
-            iCanvasGc->SetOpacity(TReal32(iWsPenColor.Alpha() / 255.f));       
+            iCanvasGc->SetPenColor(iWsBrushColor);                    
+            iCanvasGc->SetOpacity(TReal32(iWsBrushColor.Alpha() / 255.f));       
             UseBrushPattern();
             iCanvasGc->SetDrawMode(SelectCanvasDrawMode(iWsDrawMode));        
             iCanvasGc->DrawRects(rects);
--- a/uiacceltk/hitchcock/coretoolkit/src/huicanvaswspainter.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/coretoolkit/src/huicanvaswspainter.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -925,6 +925,12 @@
             case EAlfClearRect:
                 {
                 commandBuffer->SetStatusFlags(EHuiCanvasBufferContainsDrawing);
+                TRgb transpclearcolor(KRgbWhite);
+                transpclearcolor.SetAlpha(0);
+                if (iBrushColor == transpclearcolor)
+                    {
+                    commandBuffer->SetStatusFlags(EHuiCanvasBufferContainsTransparentClear);                    
+                    }
                 WsClearRectL();
                 break;
                 }
@@ -1892,6 +1898,7 @@
 	#ifdef __ALF_SYMBIAN_RWINDOW_CLEARING_BUG_WORKAROUND__
 	iTestBrushColor.SetInternal(0);
 	#endif	
+	iBrushColor.SetInternal(0);
     }
 
 void CHuiCanvasWsPainter::WsSetBrushColorL()
@@ -1903,6 +1910,7 @@
 	#ifdef __ALF_SYMBIAN_RWINDOW_CLEARING_BUG_WORKAROUND__
 	iTestBrushColor = color;    	  	                            	
 	#endif
+	iBrushColor = color;
     }
 
 void CHuiCanvasWsPainter::WsSetBrushOriginL()
--- a/uiacceltk/hitchcock/goommonitor/data/goomconfig.xml	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/data/goomconfig.xml	Wed Mar 31 23:03:58 2010 +0300
@@ -27,7 +27,7 @@
 -->
 	<app_specific_thresholds>
 
-  <app uid="101F857A" low_ram_threshold="5000" good_ram_threshold="26000" skip_plugin="2002B3AE"></app> <!-- Camera --> 
+  <app uid="101F857A" low_ram_threshold="1000" good_ram_threshold="30000" skip_plugin="2002B3AE"></app> <!-- Camera --> 
   <app uid="200159B2" low_ram_threshold="5000" good_ram_threshold="10000" skip_plugin="2002B3AE"></app> <!-- MPlayer -->
   <app uid="102824CD" low_ram_threshold="5000" good_ram_threshold="10000" skip_plugin="2002B3AE"></app> <!-- Embedded mplayer -->
   <app uid="200009EE" low_ram_threshold="3637" good_ram_threshold="10000" target_free_on_startup="15000"></app> <!-- Photos -->
--- a/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/inc/goomrunplugin.inl	Wed Mar 31 23:03:58 2010 +0300
@@ -31,7 +31,12 @@
 
 inline TBool CGOomRunPlugin::IsRunning()
     {
-    return iPluginWaiter->IsActive();
+    if(iPluginWaiter)
+        {
+        return iPluginWaiter->IsActive();
+        }
+    
+    return EFalse;
     }
 
 inline void CGOomRunPlugin::WaitCompleted()
--- a/uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/src/goomactionlist.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -324,7 +324,7 @@
 
     if (iFreeingMemory)
             {
-            TRACES("OOMWATCHER:CGOomActionList::FreeMemory Memory is currently being freed, do not start any more actions");
+            TRACES("GOOMWATCHER:CGOomActionList::FreeMemory Memory is currently being freed, do not start any more actions");
             return;
             }
     
@@ -339,6 +339,8 @@
 
     TInt memoryEstimate = iMonitor.GetFreeMemory(); // The amount of free memory we expect to be free after the currently initiated operations
 
+    TRACES2("GOOMWATCHER:CGOomActionList::FreeMemory Memory currentActionIndex %d iActionrefsCount %d", iCurrentActionIndex, iActionRefs.Count());
+    
     while (iCurrentActionIndex < iActionRefs.Count())
         {
         if(iActionRefs[iCurrentActionIndex].Priority() > aMaxPriority)
@@ -360,6 +362,8 @@
             
             TInt32 fgApp = wgName->AppUid().iUid;
             TInt32 appId = iMonitor.GetWindowGroupList()->AppIdfromWgId(ref.WgId(), ETrue);
+            
+            CleanupStack::PopAndDestroy();
             if(appId == fgApp)
                 {
                 TRACES1("Foreground App wgid %x, spared by GOOM", appId);
@@ -404,11 +408,18 @@
             // Also check if we estimate that we have already freed enough memory (assuming that the sync mode is "estimate"
             {
             // Return from the loop - we will be called back (in CGOomActionList::StateChanged()) when the running actions complete
+            iCurrentActionIndex++;
             TRACES("CGOomActionList::FreeMemory: Exiting run action loop");
             return;
             }
         // ... otherwise continue running actions, don't wait for any existing ones to complete
         iCurrentActionIndex++;
+        
+        if (iCurrentActionIndex >= iActionRefs.Count())
+            {
+            StateChanged();
+            return;
+            }
         }
 
 
@@ -610,7 +621,6 @@
             {            
             TRACES2("CGOomActionList::StateChanged: Finished Action %d out of %d",iCurrentActionIndex, iActionRefs.Count());
             
-            iCurrentActionIndex++;
             
             if (iCurrentActionIndex >= iActionRefs.Count())
                 {
--- a/uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/src/goommemorymonitor.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -231,7 +231,7 @@
         TRACES1("FreeMemThresholdCrossedL : crossed low threshold %d", iLowThreshold);
         iMemAllocationsGrowing->Stop();
         iMemAllocationsGoingDown->Continue();
-        if(iTrigger == EGOomTriggerNone)
+        if((iTrigger == EGOomTriggerNone) && !NeedToPostponeMemGood() && !iSynchTimer->IsActive() )
             StartFreeSomeRamL(iGoodThreshold, EGOomTriggerThresholdCrossed);
         }
 #endif
@@ -251,9 +251,11 @@
 
     // Refresh the low and good memory thresholds as they may have changed due to the new foreground application
     RefreshThresholds(aForegroundAppUid);
-    // Not very elegant, now we poll on each window group change
-    // Should have better trigger e.g. from window server 
-	StartFreeSomeRamL(iCurrentTarget, EGOomTriggerFocusChanged);
+    
+    if(iCurrentTarget)
+        {
+        StartFreeSomeRamL(iCurrentTarget, EGOomTriggerFocusChanged);
+        }
      }
 
 void CMemoryMonitor::StartFreeSomeRamL(TInt aTargetFree, TInt aMaxPriority, TGOomTrigger aTrigger) // The maximum priority of action to run
@@ -379,8 +381,8 @@
     // Calculate the desired good threshold, this could be the globally configured value...
     iGoodThreshold = CMemoryMonitor::GlobalConfig().iGoodRamThreshold;
     iLowThreshold = CMemoryMonitor::GlobalConfig().iLowRamThreshold;
-    if(iCurrentTarget < iLowThreshold)
-        iCurrentTarget = iLowThreshold;
+    //if(iCurrentTarget < iLowThreshold)
+    //    iCurrentTarget = iLowThreshold;
         
     TRACES2("CMemoryMonitor::RefreshThresholds: Global Good Threshold = %d, Global Low Threshold = %d", iGoodThreshold, iLowThreshold);
 
--- a/uiacceltk/hitchcock/goommonitor/src/goommemorymonitorsession.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/src/goommemorymonitorsession.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -94,6 +94,7 @@
                 if (err)
                     {
                     // completes the message if that was left to pending
+                    TRACES1("Error in RequestFreeMemory %d", err);
                     CloseAppsFinished(0, EFalse);
                     }
                 }
--- a/uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/src/goomrunplugin.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -52,7 +52,10 @@
     iFreeMemoryCalled = ETrue;
 
     // Wait for the required time before we signal completion.
-    iPluginWaiter->Start();
+    if(iPluginWaiter)
+        {
+        iPluginWaiter->Start();
+        }
     }
 
 // Call the memory good function on the plugin but...
@@ -86,13 +89,15 @@
 
     TInt waitDuration = CMemoryMonitor::GlobalConfig().iDefaultWaitAfterPlugin;
 
-    if (aPluginConfig.WaitAfterPluginDefined())
+    if(aPluginConfig.iSyncMode == ECheckRam)
         {
-        // If the wait duration for this plugin is overridden then use the overridden value
-        waitDuration = aPluginConfig.WaitAfterPlugin();
+        if (aPluginConfig.WaitAfterPluginDefined())
+            {
+            // If the wait duration for this plugin is overridden then use the overridden value
+            waitDuration = aPluginConfig.WaitAfterPlugin();
+            }
+         iPluginWaiter = CGOomPluginWaiter::NewL(waitDuration, *this);
         }
-
-    iPluginWaiter = CGOomPluginWaiter::NewL(waitDuration, *this);
     }
 
 TUint CGOomRunPlugin::Id()
--- a/uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/goommonitor/src/goomwindowgrouplist.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -76,12 +76,13 @@
     User::LeaveIfError(iAlfClient.GetListOfInactiveWindowGroupsWSurfaces(&iLowOnMemWgs));
 
     RArray<TInt>& inactiveSurfaces = iLowOnMemWgs;
-      
+    TRACES1("Inactive surfaces count %d", inactiveSurfaces.Count());     
     RArray<TUint64> processIds;
     RArray<TUint> privMemUsed;
+    RArray<TUint64> sparedProcessIds;
     
-    if (inactiveSurfaces.Count() == 1) // ALF only 
-        {
+   //if (inactiveSurfaces.Count() == 1) // ALF only 
+   //     {
         NOK_resource_profiling eglQueryProfilingData = (NOK_resource_profiling)eglGetProcAddress("eglQueryProfilingDataNOK");
     
         if (!eglQueryProfilingData)
@@ -93,9 +94,6 @@
         EGLint data_count;
         EGLint* prof_data;
         TInt i(0);
-        RArray<TUint64> processIds;
-        RArray<TUint> privMemUsed;
-        RArray<TUint64> systemProcessIds;
         
         EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
 
@@ -148,6 +146,8 @@
                     TRACES1("Memory Usage by app is %d", mem);
                     if(mem > KAllowedMemUsageForApps)
                         processIds.Append(process_id);
+                    else
+                        sparedProcessIds.Append(process_id);
                 
                     i++;
                     break;
@@ -181,7 +181,7 @@
         // Optimization, no need to construct list if ALF is the only one
         ///////////////////////////////////////////////////////////////////
     
-        if (processIds.Count() == 1)
+        if( (processIds.Count() == 1) && (inactiveSurfaces.Count() == 1))
             {
             RProcess process;
             TInt err =  process.Open(processIds[0]);
@@ -192,12 +192,13 @@
                 if(secureId == 0x10003B20) // magic, wserv 
                     {
                     processIds.Close();
+                    privMemUsed.Close();
                     TRACES("Only WServ using GFX mem, no need for app actions");
                     return;
                     }
                 }
             }
-        }
+     //   }
                 
     // Refresh window group list
     // get all window groups, with info about parents
@@ -250,11 +251,12 @@
     while (index--)
         {
         //Remove if process is not in list of processes using gfx mem
+        TUint secureId = AppId(index,ETrue);
         TBool found = 0;
-        TInt i = 0;    
+        TInt i = 0;
+        //todo - do we really need to check this list , when we have all ids in inactiveSurfaces[]
         for(i = 0; i < processIds.Count(); i++)
             {
-            TUint secureId = AppId(index,ETrue);
             RProcess process;
             TInt er =  process.Open(processIds[i]);
             if(er != KErrNone)
@@ -274,31 +276,59 @@
                 }
             process.Close();
             }
-        TRACES1("Checking WG ID : %d", iWgIds[index].iId);             
-        for(TInt ii = 0; ii < inactiveSurfaces.Count(); ii++)
-           {
-            if (iWgIds[index].iId == inactiveSurfaces[ii] )
-               {
-               AppId(index,EFalse); // update iWgName for found only 
-               found = ETrue;
-               TRACES2("Found %d isSystem: %d",inactiveSurfaces[ii], iWgName->IsSystem())            
-               }     
+        
+        if(!found)
+            {
+            TRACES1("Checking WG ID : %d", iWgIds[index].iId);             
+            for(TInt ii = 0; ii < inactiveSurfaces.Count(); ii++)
+                {
+                if (iWgIds[index].iId == inactiveSurfaces[ii] )
+                    {
+                    found = ETrue;
+                    TRACES3("Found %d , AppId %x, isSystem: %d",inactiveSurfaces[ii], secureId, iWgName->IsSystem())            
+                    }     
+                }
             }
         
-        if(!found || iWgName->IsSystem())
+        if(!found)
             {
             iWgIds.Remove(index);
             continue;
             }
+      
+        //check if it is system app
+        if(iWgName->IsSystem() /*|| iWgName->Hidden()*/)
+            {
+            TRACES3("System/Hidden app found %x, ISystem %d, IsHidden %d",secureId, iWgName->IsSystem()?1:0, iWgName->Hidden()?1:0);  
+            sparedProcessIds.Append(secureId);
+            }
+      
         }
-		
     
-	processIds.Close();
+    inactiveSurfaces.Close();
+    //CleanupStack::PopAndDestroy(); //   CleanupClosePushL(inactiveSurfaces);
+    processIds.Close();
     privMemUsed.Close();      
     
+    //check if any system apps are included
     index = iWgIds.Count();
     while (index--)
         {
+        TBool skipped = EFalse;
+        for(TInt i = 0; i < sparedProcessIds.Count(); i++)
+            {
+            if(AppId(index,ETrue) == sparedProcessIds[i])
+                {
+                TRACES2("WgId %d belongs to system app %x. Removing from Kill List",iWgIds[index].iId, sparedProcessIds[i]);
+                iWgIds.Remove(index);
+                skipped = ETrue;
+                break;
+                }
+            }
+        
+        if(skipped)
+            continue;
+        
         // See if there is a tick count entry for each window in the list
         TGOomWindowGroupProperties* wgProperties = iWgToPropertiesMapping.Find(iWgIds[index].iId);
         
@@ -311,6 +341,7 @@
             }
         }
     TRACES1("Number of applications using graphics mem: %d", iWgIds.Count());    
+    sparedProcessIds.Close();
     }
 
 
--- a/uiacceltk/hitchcock/group/bld.inf	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/group/bld.inf	Wed Mar 31 23:03:58 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:   Build information file for project alfappserver
-*  Version     : %version: tr1sido#128.1.9 %
+*  Version     : %version: tr1sido#128.1.10 %
 *
 */
 
@@ -39,7 +39,7 @@
 // separate keyword definitions for appear and disappera effects for control transitions.
 // After effect system is complete and aknskins has taken over the correct 101f84b9.sel file
 // and manifest.mf file, we should no longer export these files.
-
+#ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 ../coretoolkit/data/101f84b9.sel /epoc32/data/z/resource/skins/101f84b9/101f84b9.sel
 ../coretoolkit/data/101f84b9.sel /epoc32/release/winscw/udeb/z/resource/skins/101f84b9/101f84b9.sel
 ../coretoolkit/data/101f84b9.sel /epoc32/release/winscw/urel/z/resource/skins/101f84b9/101f84b9.sel
@@ -60,6 +60,8 @@
 // /resource/effects/ directory.
 // These files can be changed any time and reregistered by changing the skin
 
+#endif // #ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+
 // backround animation shaders
 ../backgroundanim/refplugin/data/refvertexshader.vsh /epoc32/data/z/private/200286D3/refvertexshader.vsh
 ../backgroundanim/refplugin/data/reffragmentshader.fsh /epoc32/data/z/private/200286D3/reffragmentshader.fsh
@@ -84,9 +86,12 @@
 ../AlfHintPlugin/group/AlfHintPlugin.mmp
 ../AlfHintPlugin/group/AlfHintPluginDrawer.mmp
 
+#ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 ../plugins/alftranseffect/alftranseffectplugin/group/alftranseffectplugin.mmp
 ../plugins/alftranseffect/alftfxserverplugin/group/AlfTfxSrvPlugin.mmp
 ../plugins/alftranseffect/alfgfxtransadapter/group/gfxtransenginetfx.mmp
+#endif // #ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
+
 ../plugins/alfoogmplugin/group/alfoogmplugin.mmp
 ../plugins/alfcrpplugin/group/alfcrpplugin.mmp
 
--- a/uiacceltk/hitchcock/group/core_exports.inc	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/group/core_exports.inc	Wed Mar 31 23:03:58 2010 +0300
@@ -3,7 +3,7 @@
 *  Name        : core_exports.inc
 *  Part of     : Alfred UI Toolkit
 *  Description : Exported header files.
-*  Version     : %version: tr1sido#8.1.31 %
+*  Version     : %version: tr1sido#8.1.34 %
 *
 *  Copyright © 2006-2007 Nokia.  All rights reserved.
 *  This material, including documentation and any related computer
@@ -19,7 +19,7 @@
 
 PRJ_EXPORTS
 
-
+#ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 // Effect definitions are considered as differentiating SW and thus not available for foundation.
 #ifndef ALF_USE_OPENWF_COMPOSITION
 
@@ -33,7 +33,8 @@
 
 // for EMULATOR UREL
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/release/winscw/urel/z/resource/effects/activeidle_viewswitch_left.fxml
@@ -85,6 +86,10 @@
 ../coretoolkit/data/optionsmenu_cascade_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/optionsmenu_cascade_appear.fxml
 ../coretoolkit/data/optionsmenu_cascade_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/optionsmenu_cascade_disappear.fxml
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/optionsmenu_disappear.fxml
+../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_fullscreen_close.fxml
+../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_fullscreen_open.fxml
+../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_gridview_disappear.fxml
+../coretoolkit/data/photos_gridview_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/photos_gridview_appear.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/release/winscw/urel/z/resource/effects/popup_disappear_screenshot.fxml
@@ -117,7 +122,8 @@
 
 // for EMULATOR UDEB
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/release/winscw/udeb/z/resource/effects/activeidle_viewswitch_left.fxml
@@ -169,6 +175,10 @@
 ../coretoolkit/data/optionsmenu_cascade_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_cascade_appear.fxml
 ../coretoolkit/data/optionsmenu_cascade_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_cascade_disappear.fxml
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/optionsmenu_disappear.fxml
+../coretoolkit/data/photos_gridview_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_gridview_appear.fxml
+../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_gridview_disappear.fxml
+../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_close.fxml
+../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/release/winscw/udeb/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/release/winscw/udeb/z/resource/effects/popup_disappear_screenshot.fxml
@@ -201,7 +211,8 @@
 
 // For ROM
 ../coretoolkit/data/activeidle_viewswitch_add_page.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_add_page.fxml
-../coretoolkit/data/activeidle_viewswitch_bg_appear.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_appear.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_anim_to_image.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_anim_to_image.fxml
+../coretoolkit/data/activeidle_viewswitch_bg_image_to_image.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_bg_image_to_image.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_editmode.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_close_editmode.fxml
 ../coretoolkit/data/activeidle_viewswitch_close_widgetmanager.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_close_widgetmanager.fxml
 ../coretoolkit/data/activeidle_viewswitch_left.fxml /epoc32/data/z/resource/effects/activeidle_viewswitch_left.fxml
@@ -253,6 +264,10 @@
 ../coretoolkit/data/optionsmenu_cascade_appear.fxml /epoc32/data/z/resource/effects/optionsmenu_cascade_appear.fxml
 ../coretoolkit/data/optionsmenu_cascade_disappear.fxml /epoc32/data/z/resource/effects/optionsmenu_cascade_disappear.fxml
 ../coretoolkit/data/optionsmenu_disappear.fxml /epoc32/data/z/resource/effects/optionsmenu_disappear.fxml
+../coretoolkit/data/photos_gridview_appear.fxml /epoc32/data/z/resource/effects/photos_gridview_appear.fxml
+../coretoolkit/data/photos_gridview_disappear.fxml /epoc32/data/z/resource/effects/photos_gridview_disappear.fxml
+../coretoolkit/data/photos_fullscreen_close.fxml /epoc32/data/z/resource/effects/photos_fullscreen_close.fxml
+../coretoolkit/data/photos_fullscreen_open.fxml /epoc32/data/z/resource/effects/photos_fullscreen_open.fxml
 ../coretoolkit/data/popup_appear.fxml /epoc32/data/z/resource/effects/popup_appear.fxml
 ../coretoolkit/data/popup_disappear.fxml /epoc32/data/z/resource/effects/popup_disappear.fxml
 ../coretoolkit/data/popup_disappear_screenshot.fxml /epoc32/data/z/resource/effects/popup_disappear_screenshot.fxml
@@ -286,4 +301,4 @@
 
 // Effect definitions are considered as differentiating SW and thus not available for foundation.
 #endif // ifndef ALF_USE_OPENWF_COMPOSITION
-
+#endif // #ifndef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -456,12 +456,11 @@
 		case EPreBeginCapture:
 		    break;
 		case EPostBeginCapture:
-		    // If we get KGfxControlAppearAction, it is followed by StartTransition,
-		    // but disappear action is not. Therefore we must handle it byself
-		    // We use begin capture as trigger, as we assume that the control is still present
-		    // at that time. After EPostBeginCapture it will probably be already gone.
-		    // If we don't have plugin yet, there will be no transitions.
-		    if ( action == KGfxControlDisappearAction && iHasPlugin && aKey && aKey->DrawableWindow())
+			// Send control effect request to ALf. This is done immediately after call of 
+			// GfxTransEffect::Begin(). This makes it possible (NOT QUARANTEENED)
+			// that effect request arrives to Alf before possible visiblity changes are made to 
+			// the control.
+		    if ( iHasPlugin && aKey && aKey->DrawableWindow())
 		        {
 		        // We must generate our own transition as we won't be sending 
 		        // iClient->TransitionFinished back.
@@ -743,15 +742,7 @@
 
 	if( err == KErrNone ) 
 		{
-    	if ( transdata->iAction != KGfxControlDisappearAction )
-    	    {
-    	    // Disappear action was started by EPostBeginCapture event
-    		TRAP( err, DoStartTransitionL( aHandle, transdata ) );
-    	    }
-    	else
-    	    {
-            __ALFFXLOGSTRING( "CGfxTransAdapterTfx::StartTransition called for disappear action" );
-    	    }
+       __ALFFXLOGSTRING( "CGfxTransAdapterTfx::StartTransition called for disappear action. Do nothing." );
 		}
 		
     // always finish the caller		
@@ -1264,7 +1255,7 @@
 
 void CGfxTransAdapterTfx::GenerateTransitionL( const CCoeControl* aKey, const CTransitionData* aTransData)
     {
-    __ALFFXLOGSTRING("CGfxTransAdapterTfx::GenerateTransitionL >>");
+
     // We generate a transition call from begin capture for control exit transitions
 	TPtr8 inPtr = iTransferBuffer->Des();
 	inPtr.Zero();
@@ -1275,6 +1266,13 @@
     TInt windowGroup = aKey->DrawableWindow()->WindowGroupId();
     TInt windowHandle = aKey->DrawableWindow()->ClientHandle(); 
     
+    __ALFFXLOGSTRING4("CGfxTransAdapterTfx::GenerateTransitionL - Operation: MAlfGfxEffectPlugin::EBeginComponentTransition Action: %d,  Uid: 0x%x, WindowGroup: %d, WindowHandle: %d  >>",
+        aTransData->iAction,
+        aTransData->iUid.iUid,
+        windowGroup,
+        windowHandle
+        );
+    
     inBuf.WriteInt32L( op );
     inBuf.WriteUint32L( aTransData->iAction );
     inBuf.WriteInt32L( aTransData->iUid.iUid );
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfgfxeffects.h	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/inc/alfgfxeffects.h	Wed Mar 31 23:03:58 2010 +0300
@@ -73,6 +73,9 @@
 
         /** Cancel asynch message(s) from client */    
         void CancelMessage(TInt aMessageId);
+        
+        /** release message(s) from client */  
+        void ClientAboutToExit(TThreadId aClientId);
 
 		/**
 		* From CAlfWindowManager - not implemented
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp	Mon Mar 15 12:43:37 2010 +0200
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alftranseffectplugin/src/alfgfxeffects.cpp	Wed Mar 31 23:03:58 2010 +0300
@@ -250,6 +250,13 @@
 #endif    
                 
                 uid1 = TUid::Uid( inStream.ReadInt32L() );
+                // hack to keep disapear viewswitch transitions popping on top of everything
+				// TODO: Remove when HS complies
+                if ((uid1.iUid == 0x102750F1 || uid1.iUid == 0x102750F2 ) && action == 4)
+                    {
+                    action = 5;
+                    }
+                
                 TInt windowGroup = inStream.ReadInt32L();
                 TInt windowHandle = inStream.ReadInt32L();
                 TBool nLayered = inStream.ReadInt32L();
@@ -983,4 +990,15 @@
     delete buffer; 
     }
 #endif
+
+void CAlfGfxEffects::ClientAboutToExit(TThreadId aClientId)
+    {
+    if (iPolicyHandler)
+        {
+        iPolicyHandler->RemoveClient( aClientId );
+        }   
+    }
+
+
+
 //  End of File